pretty code

2020年3月11日 星期三

Chrome Extension 訊息傳遞

popup.script 和 content.script 之間可以透過訊息傳遞機制來交換資料。

兩者都可以透過 chrome.runtime.onMessage.addListener 接收訊息,比較特別的是,popup.script 需要透過 chrome.tabs.sendMessage 才能傳遞訊息給 content.script。
另外,popup.script 在傳遞訊息時,content.script  必須已經存在,大部分會有問題都是因為 content.script 是透過 chrome.tabs.executeScript 來執行 content.script,故應該使用以下的方法才能確保先後順序。

chrome.tabs.executeScript(null, {
    file: "js/gethtml.js"
}, function() {
    if (chrome.runtime.lastError) {
        let errorMsg = chrome.runtime.lastError.message;
        showMessage('error : \n' + errorMsg);
    } else {
        chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) {    
            chrome.tabs.sendMessage(tabs[0].id, {action: 'getIgnored', ignored: ignored});
        });   
    }
});

不過根據實測似乎會有一些問題,我遇到的問題是我有發送 ajax request,但會收到莫名其妙的 ajax response,待驗證。

2020/03/12 更新

如果只是要簡單的交換資料,其實在 content.script 裡面直接使用 storage API 應該是比較簡單。之前試的時候不成功,但今天卻是正常的。

2020/03/17 更新

改成在 manifest.json 直接加入 content.script,並指定執行時間為 "document_end",目前測試起來一切正常。

"content_scripts": [
    {
        "matches": ["https://member.readmoo.com/order"],
        "js": ["js/gethtml.js"],
        "run_at": "document_end"
    }
]

沒有留言: