Расширение Chrome Gmail не работает при определенных обстоятельствах. Почему? - PullRequest
1 голос
/ 06 октября 2019

Я работаю над расширением Chrome. Когда в Chrome открывается локальный файл PDF, щелкнув значок расширения, он открывает новую вкладку с gmail.com (и создает представление) и присоединяет открытый файл к новому письму.

С помощью ""нормальная" учетная запись Gmail, работает нормально. Проблема в том, что, если я использую учетную запись с псевдонимами отправителей (например, личные и служебные), присоединение не всегда происходит. Иногда он прикрепляет файл, иногда нет. Если это не удается, в консоли появляется следующее сообщение об ошибке: www.inboxsdk.com/build/platform-implementation.js:18 Ошибка в журнале: Ошибка: не удалось найти dropzone

Что не так с кодом?

app.js

var content = {
init() {
    //this is gmail page
    InboxSDK.load(2, 'sdk_Add-Attachment_df7347fce8').then((sdk) => {
        chrome.runtime.sendMessage({
            message: "getFile",
        }, (response) => {
            if (response.file != 'No File Found') {
                sdk.Compose.registerComposeViewHandler((composeView) => {
                    chrome.runtime.sendMessage({
                        message: "getFile",
                    }, (response) => {
                        console.log("uploaded file", response.file);
                        if (response.file != 'No File Found') {
                            var fileData = content.base64ToArrayBuffer(response.file);
                            var file = new File([fileData], response.fileName, {
                                type: response.fileType
                            });
                            composeView.attachFiles([file]);
                            chrome.runtime.sendMessage({
                                message: "deleteFile",
                            });
                        }
                    });
                });
                sdk.Compose.openNewComposeView().then((composeView) => {
                    console.log("composeView is", composeView);
                });
            } else {
                console.log("No file to add");
            }
        });
    });
},
base64ToArrayBuffer(base64) {
    var binaryString = window.atob(base64);
    var binaryLen = binaryString.length;
    var bytes = new Uint8Array(binaryLen);
    for (var i = 0; i < binaryLen; i++) {
        var ascii = binaryString.charCodeAt(i);
        bytes[i] = ascii;
    }
    return bytes;
}
};
$(document).ready(() => {
    content.init();
})

background.js:

chrome.browserAction.onClicked.addListener(function(tab) {
if (tab.url.indexOf("file://") != -1) {
    //this is file page
    localStorage.setItem('FileUrl', tab.url);
    console.log('Saved file to be attached', tab.url);
    window.open('https://mail.google.com');
} else {
    alert("Please open tab with url beginning with file:// and try again.");
}
});

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
    if (request.message == "getFile") {
        var request = new XMLHttpRequest();
        var fileUrl = localStorage.getItem('FileUrl');
        if (fileUrl != 'undefined' && fileUrl != null) {
            var fileName = fileUrl.split('/').pop();
            request.open('GET', fileUrl, true);
            request.responseType = 'blob';
            request.onload = function() {
                var reader = new FileReader();
                reader.readAsDataURL(request.response);
                reader.onload = function(e) {
                    console.log('DataURL:', e.target.result);
                    const byteString = atob(e.target.result.split('base64,')[1]);
                    const ab = new ArrayBuffer(byteString.length);
                    const ia = new Uint8Array(ab);
                    for (let i = 0; i < byteString.length; i += 1) {
                        ia[i] = byteString.charCodeAt(i);
                    }
                    const newBlob = new Blob([ab], {
                        type: 'application/pdf'
                    });
                    sendResponse({
                        file: e.target.result.split('base64,')[1],
                        fileName: fileName,
                        fileType: 'application/pdf'
                    });
                };
            };
            request.send();
        } else {
            sendResponse({
                file: 'No File Found'
            });
        }
        return true;
    } else if (request.message == "deleteFile") {
        localStorage.removeItem('FileUrl');
        return true;
    }
});

1 Ответ

0 голосов
/ 19 октября 2019

Вместо composeView.attachFiles ([file]) используйте это:

composeView.getBodyElement().focus();
setTimeout(function() {composeView.attachFiles([file])}, 1000);

Или, альтернативно:

composeView.attachInlineFiles([file]);
...