我想構建一個示例擴展插件,可以將來自連接到計算機的串行設備的傳入消息放入並影響屏幕上的UI元素。
讓我的腦袋圍繞Chrome應用程序和擴展消息與特定的安裝程序
例如,比方說,擴展程序是瀏覽頁面時遇到的總圖像的運行記錄。該擴展在右上角顯示一個小框,用於保存遇到的圖像數量。因此,對於我打開的每個選項卡或導航到的每個頁面,擴展框(不是彈出窗口,而是作爲每個頁面上的疊加層顯示)都有一個數字,不斷增加。該擴展程序有一個background.js腳本,用於偵聽來自chrome串行應用程序的外部消息,然後將該信息轉發給內容腳本。
然後我有一個串口設備通過USB連接到電腦。例如,我正在使用this guy's chrome serial app來讀取一些正在進入的序列號。我希望這些數字減少擴展UI圖像計數器中的總數。
我已經通讀了Chrome消息API,並認爲我可以弄清楚如何在Chrome應用程序和Chrome擴展之間發送這些消息。
放置在收到一些信息從內容腳本有關傳入串行讀數的Chrome應用串行的背景JS如下:
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
sendResponse("Got something!");
console.log(request);
var comPort = chrome.runtime.connect(extId);
comPort.postMessage(request);
})
然後,從我的理解,我需要有background.js偵聽來自廣播的消息在Chrome串行應用程序再往前就是一起使用下面的代碼運行的內容腳本(tabs.connect):
chrome.runtime.onConnectExternal.addListener(function(port) {
port.onMessage.addListener(function(msg) {
console.log(msg);
//relay the decrement amount
chrome.tabs.query({active:true, currentWindow:true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, msg, function(response) {
console.log("sent" + msg);
});
});
});
});
最後,設置在內容腳本一個監聽器監聽即將通過的數量。
chrome.runtime.onConnect.addListener(function(port) {
port.onMessage.addListener(function(msg) {
console.log(msg)
// decrement the value in the ui box
});
})
確實如此。什麼都沒有發生。該代碼似乎檢查出來,但沒有從串行chrome應用程序到擴展的通信。
任何有識之士將不勝感激。
編輯: 我有序列的一面運行良好。串行應用程序的後臺js正在與內容腳本聊天。現在,我只是想把事情傳遞給沒有任何東西可以通過的擴展。
編輯#2:
通過它。慢慢到達那裏。我似乎被舉在chrome.tabs.sendMessage ...
它扔我「不能讀取未定義的屬性'id'」。儘管我發誓我以正確的方式寫這篇文章。 ***愚蠢的是,通過使用currentWindow定義chrome.tabs.query查詢信息:true,並且在調試過程中,保持開發工具窗口處於活動狀態,我阻止自己獲取實際的選項卡信息。愚蠢的錯誤...瞭解到,here!
'comPort.postMessage({serialReading});'是一個語法錯誤。你應該從調試你的代碼開始 - 例如,從'chrome:// inspect /#apps'開始。 – Xan
謝謝Xan。是的,我想通了,併發布了編輯。我似乎被困在chrome.tabs.sendMessage,因爲它不斷給我一個錯誤的標籤是未定義的。 – Chaz
它不是'onConnect',它是最後階段的'onMessage'。我想我可以發表一個答案,但你的問題演變得如此之多,我不知道該回答什麼,以及它是否有用。 – Xan