| /* |
| * Copyright (C) 2022 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| import {defer} from '../base/deferred'; |
| |
| enum WebContentScriptMessageType { |
| UNKNOWN, |
| CONVERT_OBJECT_URL, |
| CONVERT_OBJECT_URL_RESPONSE, |
| } |
| |
| const ANDROID_BUG_TOOL_EXTENSION_ID = 'mbbaofdfoekifkfpgehgffcpagbbjkmj'; |
| |
| interface Attachment { |
| name: string; |
| objectUrl: string; |
| restrictionSeverity: number; |
| } |
| |
| interface ConvertObjectUrlResponse { |
| action: WebContentScriptMessageType.CONVERT_OBJECT_URL_RESPONSE; |
| attachments: Attachment[]; |
| issueAccessLevel: string; |
| issueId: string; |
| issueTitle: string; |
| } |
| |
| export interface TraceFromBuganizer { |
| issueId: string; |
| issueTitle: string; |
| file: File; |
| } |
| |
| export function loadAndroidBugToolInfo(): Promise<TraceFromBuganizer> { |
| const deferred = defer<TraceFromBuganizer>(); |
| |
| // Request to convert the blob object url "blob:chrome-extension://xxx" |
| // the chrome extension has to a web downloadable url "blob:http://xxx". |
| chrome.runtime.sendMessage( |
| ANDROID_BUG_TOOL_EXTENSION_ID, |
| {action: WebContentScriptMessageType.CONVERT_OBJECT_URL}, |
| async (response: ConvertObjectUrlResponse) => { |
| switch (response.action) { |
| case WebContentScriptMessageType.CONVERT_OBJECT_URL_RESPONSE: |
| if (response.attachments?.length > 0) { |
| const filesBlobPromises = response.attachments.map( |
| async (attachment) => { |
| const fileQueryResponse = await fetch(attachment.objectUrl); |
| const blob = await fileQueryResponse.blob(); |
| // Note: The blob's media type is always set to "image/png". |
| // Clone blob to clear media type. |
| return new File([blob], attachment.name); |
| }, |
| ); |
| const files = await Promise.all(filesBlobPromises); |
| deferred.resolve({ |
| issueId: response.issueId, |
| issueTitle: response.issueTitle, |
| file: files[0], |
| }); |
| } else { |
| throw new Error('Got no attachements from extension'); |
| } |
| break; |
| default: |
| throw new Error( |
| `Received unhandled response code (${response.action}) from extension.`, |
| ); |
| } |
| }, |
| ); |
| return deferred; |
| } |