From c4e75038a9705242c27d165934e2400875f7e3ec Mon Sep 17 00:00:00 2001 From: syr1ne <167830358+syr1ne@users.noreply.github.com> Date: Tue, 21 Apr 2026 22:08:59 +0530 Subject: [PATCH] made it undeprecated (using AI) --- chrome/background.js | 193 ++++++++++++++++++--------------- chrome/content_script.js | 228 --------------------------------------- chrome/inject.js | 205 +++++++++++++++++++++++++++++++++++ chrome/manifest.json | 44 ++++---- chrome/popup.js | 2 +- 5 files changed, 340 insertions(+), 332 deletions(-) create mode 100644 chrome/inject.js diff --git a/chrome/background.js b/chrome/background.js index dfaefdb..a050a1b 100644 --- a/chrome/background.js +++ b/chrome/background.js @@ -1,97 +1,122 @@ -var tab_listeners = {}; -var tab_push = {}, tab_lasturl = {}; -var selectedId = -1; +let selectedId = -1; -function refreshCount() { - txt = tab_listeners[selectedId] ? tab_listeners[selectedId].length : 0; - chrome.tabs.get(selectedId, function() { - if (!chrome.runtime.lastError) { - chrome.browserAction.setBadgeText({"text": ''+txt, tabId: selectedId}); - if(txt > 0) { - chrome.browserAction.setBadgeBackgroundColor({ color: [255, 0, 0, 255]}); - } else { - chrome.browserAction.setBadgeBackgroundColor({ color: [0, 0, 255, 0] }); - } - } - }); +async function getStorage() { + const data = await chrome.storage.local.get(['tab_listeners', 'tab_push', 'tab_lasturl']); + return { + tab_listeners: data.tab_listeners || {}, + tab_push: data.tab_push || {}, + tab_lasturl: data.tab_lasturl || {} + }; } -function logListener(data) { - chrome.storage.sync.get({ - log_url: '' - }, function(items) { - log_url = items.log_url; - if(!log_url.length) return; - data = JSON.stringify(data); - try { - fetch(log_url, { - method: 'post', - headers: { - "Content-type": "application/json; charset=UTF-8" - }, - body: data - }); - } catch(e) { } - }); +async function updateStorage(changes) { + await chrome.storage.local.set(changes); } -chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) { - console.log('message from cs', msg); - tabId = sender.tab.id; - if(msg.listener) { - if(msg.listener == 'function () { [native code] }') return; - msg.parent_url = sender.tab.url; - if(!tab_listeners[tabId]) tab_listeners[tabId] = []; - tab_listeners[tabId][tab_listeners[tabId].length] = msg; - logListener(msg); - } - if(msg.pushState) { - tab_push[tabId] = true; - } - if(msg.changePage) { - delete tab_lasturl[tabId]; - } - if(msg.log) { - console.log(msg.log); - } else { - refreshCount(); - } +async function refreshCount() { + if (selectedId === -1) return; + const { tab_listeners } = await getStorage(); + const txt = tab_listeners[selectedId] ? tab_listeners[selectedId].length : 0; + + try { + const tab = await chrome.tabs.get(selectedId); + if (tab) { + chrome.action.setBadgeText({ text: '' + (txt || ''), tabId: selectedId }); + if (txt > 0) { + chrome.action.setBadgeBackgroundColor({ color: [255, 0, 0, 255], tabId: selectedId }); + } else { + chrome.action.setBadgeBackgroundColor({ color: [0, 0, 255, 0], tabId: selectedId }); + } + } + } catch (e) { + // Tab might be gone + } +} + +async function logListener(data) { + const items = await chrome.storage.sync.get({ log_url: '' }); + const log_url = items.log_url; + if (!log_url.length) return; + + try { + await fetch(log_url, { + method: 'POST', + headers: { + "Content-type": "application/json; charset=UTF-8" + }, + body: JSON.stringify(data) + }); + } catch (e) { } +} + +chrome.runtime.onMessage.addListener(async (msg, sender) => { + if (!sender.tab) return; + const tabId = sender.tab.id; + let { tab_listeners, tab_push, tab_lasturl } = await getStorage(); + + if (msg.listener) { + if (msg.listener === 'function () { [native code] }') return; + msg.parent_url = sender.tab.url; + if (!tab_listeners[tabId]) tab_listeners[tabId] = []; + tab_listeners[tabId].push(msg); + await updateStorage({ tab_listeners }); + logListener(msg); + } + + if (msg.pushState) { + tab_push[tabId] = true; + await updateStorage({ tab_push }); + } + + if (msg.changePage) { + delete tab_lasturl[tabId]; + await updateStorage({ tab_lasturl }); + } + + if (msg.log) { + console.log(msg.log); + } else { + await refreshCount(); + } }); -chrome.tabs.onUpdated.addListener(function(tabId, props) { - console.log(props); - if (props.status == "complete") { - if(tabId == selectedId) refreshCount(); - } else if(props.status) { - if(tab_push[tabId]) { - //this was a pushState, ignore - delete tab_push[tabId]; - } else { - //if(props.url && tab_lasturl[tabId] && props.url.split('#')[0] == tab_lasturl[tabId]) { - //same url as before, only a hash change, ignore - //} else - if(!tab_lasturl[tabId]) { - //wipe on other statuses, but only if lastpage is not set (aka, changePage did not run) - tab_listeners[tabId] = []; - } - } - } - if(props.status == "loading") - tab_lasturl[tabId] = true; +chrome.tabs.onUpdated.addListener(async (tabId, props) => { + if (props.status === "complete") { + if (tabId === selectedId) await refreshCount(); + } else if (props.status) { + let { tab_listeners, tab_push, tab_lasturl } = await getStorage(); + if (tab_push[tabId]) { + delete tab_push[tabId]; + await updateStorage({ tab_push }); + } else { + if (!tab_lasturl[tabId]) { + tab_listeners[tabId] = []; + await updateStorage({ tab_listeners }); + } + } + } + if (props.status === "loading") { + let { tab_lasturl } = await getStorage(); + tab_lasturl[tabId] = true; + await updateStorage({ tab_lasturl }); + } }); -chrome.tabs.onActivated.addListener(function(activeInfo) { - selectedId = activeInfo.tabId; - refreshCount(); +chrome.tabs.onActivated.addListener((activeInfo) => { + selectedId = activeInfo.tabId; + refreshCount(); }); -chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { - selectedId = tabs[0].id; - refreshCount(); +chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { + if (tabs[0]) { + selectedId = tabs[0].id; + refreshCount(); + } }); -chrome.extension.onConnect.addListener(function(port) { - port.onMessage.addListener(function(msg) { - port.postMessage({listeners:tab_listeners}); - }); -}) \ No newline at end of file +chrome.runtime.onConnect.addListener((port) => { + port.onMessage.addListener(async (msg) => { + const { tab_listeners } = await getStorage(); + port.postMessage({ listeners: tab_listeners }); + }); +}); \ No newline at end of file diff --git a/chrome/content_script.js b/chrome/content_script.js index aa5aed4..6239ef9 100644 --- a/chrome/content_script.js +++ b/chrome/content_script.js @@ -1,220 +1,3 @@ -/* -History is needed to hijack pushState-changes -addEventListener to hijack the message-handlers getting registered -defineSetter to handle old way of setting onmessage -beforeunload to track page changes (since we see no diff btw fragmentchange/pushstate and real location change - -we also look for event.dispatch.apply in the listener, if it exists, we find a earlier stack-row and use that one -also, we look for jQuery-expandos to identify events being added later on by jQuery's dispatcher -*/ -var injectedJS = function(pushstate, msgeventlistener, msgporteventlistener) { - var loaded = false; - var originalFunctionToString = Function.prototype.toString; - var m = function(detail) { - var storeEvent = new CustomEvent('postMessageTracker', {'detail':detail}); - document.dispatchEvent(storeEvent); - }; - var h = function(p) { - var hops=""; - try { - if(!p) p=window; - if(p.top != p && p.top == window.top) { - var w = p; - while(top != w) { - var x = 0; - for(var i = 0; i < w.parent.frames.length; i++) { - if(w == w.parent.frames[i]) x=i; - }; - hops="frames["+x+"]" + (hops.length?'.':'') + hops; - w=w.parent; - }; - hops="top"+(hops.length?'.'+hops:'') - } else { - hops=p.top == window.top ? "top" : "diffwin"; - } - } catch(e) { - - } - return hops; - }; - var jq = function(instance) { - if(!instance || !instance.message || !instance.message.length) return; - var j = 0; while(e = instance.message[j++]) { - listener = e.handler; if(!listener) return; - m({window:window.top==window?'top':window.name,hops:h(),domain:document.domain,stack:'jQuery',listener:listener.toString()}); - }; - }; - var l = function(listener, pattern_before, additional_offset) { - offset = 3 + (additional_offset||0) - try { throw new Error(''); } catch (error) { stack = error.stack || ''; } - stack = stack.split('\n').map(function (line) { return line.trim(); }); - fullstack = stack.slice(); - if(pattern_before) { - nextitem = false; - stack = stack.filter(function(e){ - if(nextitem) { nextitem = false; return true; } - if(e.match(pattern_before)) - nextitem = true; - return false; - }); - stack = stack[0]; - } else { - stack = stack[offset]; - } - listener_str = listener.__postmessagetrackername__ || listener.toString(); - m({window:window.top==window?'top':window.name,hops:h(),domain:document.domain,stack:stack,fullstack:fullstack,listener:listener_str}); - }; - var jqc = function(key) { - m({log:['Found key', key, typeof window[key], window[key] ? window[key].toString(): window[key]]}); - if(typeof window[key] == 'function' && typeof window[key]._data == 'function') { - m({log:['found jq function', window[key].toString()]}); - ev = window[key]._data(window, 'events'); - jq(ev); - } else if(window[key] && (expando = window[key].expando)) { - m({log:['Use expando', expando]}); - var i=1; while(instance = window[expando + i++]) { - jq(instance.events); - } - } else if(window[key]) { - m({log:['Use events directly', window[key].toString()]}); - jq(window[key].events); - } - }; - var j = function() { - m({log:'Run jquery fetcher'}); - var all = Object.getOwnPropertyNames(window); - var len = all.length; - for(var i = 0; i < len; i++) { - var key = all[i]; - if(key.indexOf('jQuery') !== -1) { - jqc(key); - } - } - loaded = true; - }; - History.prototype.pushState = function(state, title, url) { - m({pushState:true}); - return pushstate.apply(this, arguments); - }; - var original_setter = window.__lookupSetter__('onmessage'); - window.__defineSetter__('onmessage', function(listener) { - if(listener) { - l(listener.toString()); - } - original_setter(listener); - }); - var c = function(listener) { - var listener_str = originalFunctionToString.apply(listener) - if(listener_str.match(/\.deep.*apply.*captureException/s)) return 'raven'; - else if(listener_str.match(/arguments.*(start|typeof).*err.*finally.*end/s) && listener["nr@original"] && typeof listener["nr@original"] == "function") return 'newrelic'; - else if(listener_str.match(/rollbarContext.*rollbarWrappedError/s) && listener._isWrap && - (typeof listener._wrapped == "function" || typeof listener._rollbar_wrapped == "function")) return 'rollbar'; - else if(listener_str.match(/autoNotify.*(unhandledException|notifyException)/s) && typeof listener.bugsnag == "function") return 'bugsnag'; - else if(listener_str.match(/call.*arguments.*typeof.*apply/s) && typeof listener.__sentry_original__ == "function") return 'sentry'; - else if(listener_str.match(/function.*function.*\.apply.*arguments/s) && typeof listener.__trace__ == "function") return 'bugsnag2'; - return false; - } - - var onmsgport = function(e){ - var p = (e.ports.length?'%cport'+e.ports.length+'%c ':''); - var msg = '%cport%c→%c' + h(e.source) + '%c ' + p + (typeof e.data == 'string'?e.data:'j '+JSON.stringify(e.data)); - if (p.length) { - console.log(msg, "color: blue", '', "color: red", '', "color: blue", ''); - } else { - console.log(msg, "color: blue", '', "color: red", ''); - } - }; - var onmsg = function(e){ - var p = (e.ports.length?'%cport'+e.ports.length+'%c ':''); - var msg = '%c' + h(e.source) + '%c→%c' + h() + '%c ' + p + (typeof e.data == 'string'?e.data:'j '+JSON.stringify(e.data)); - if (p.length) { - console.log(msg, "color: red", '', "color: green", '', "color: blue", ''); - } else { - console.log(msg, "color: red", '', "color: green", ''); - } - }; - window.addEventListener('message', onmsg) - MessagePort.prototype.addEventListener = function(type, listener, useCapture) { - if (!this.__postmessagetrackername__) { - this.__postmessagetrackername__ = true; - this.addEventListener('message', onmsgport); - } - return msgporteventlistener.apply(this, arguments); - } - - Window.prototype.addEventListener = function(type, listener, useCapture) { - if(type=='message') { - var pattern_before = false, offset = 0; - if(listener.toString().indexOf('event.dispatch.apply') !== -1) { - m({log:'We got a jquery dispatcher'}); - pattern_before = /init\.on|init\..*on\]/; - if(loaded) { setTimeout(j, 100); } - } -//console.log('yo') -//debugger; - var unwrap = function(listener) { - found = c(listener); -//console.log('found', found) - if(found == 'raven') { - var fb = false, ff = false, v = null; - for(key in listener) { - var v = listener[key]; - if(typeof v == "function") { ff++; f = v; } - if(typeof v == "boolean") fb++; - } - if(ff == 1 && fb == 1) { - m({log:'We got a raven wrapper'}); - offset++; - listener = unwrap(f); - } - } else if(found == 'newrelic') { - m({log:'We got a newrelic wrapper'}); - offset++; - listener = unwrap(listener["nr@original"]); - } else if(found == 'sentry') { - m({log:'We got a sentry wrapper'}); - offset++; - listener = unwrap(listener["__sentry_original__"]); - } else if(found == 'rollbar') { - m({log:'We got a rollbar wrapper'}); - offset+=2; - } else if(found == 'bugsnag') { - offset++; - var clr = null; - try { clr = arguments.callee.caller.caller.caller } catch(e) { } - if(clr && !c(clr)) { //dont care if its other wrappers - m({log:'We got a bugsnag wrapper'}); - listener.__postmessagetrackername__ = clr.toString(); - } else if(clr) { offset++ } - } else if(found == 'bugsnag2') { - offset++; - var clr = null; - try { clr = arguments.callee.caller.caller.arguments[1]; } catch(e) { } - if(clr && !c(clr)) { //dont care if its other wrappers - listener = unwrap(clr); - m({log:'We got a bugsnag2 wrapper'}); - listener.__postmessagetrackername__ = clr.toString(); - } else if(clr) { offset++; } - } - if(listener.name.indexOf('bound ') === 0) { - listener.__postmessagetrackername__ = listener.name; - } - return listener; - }; - - if(typeof listener == "function") { - listener = unwrap(listener); - l(listener, pattern_before, offset); - } - } - return msgeventlistener.apply(this, arguments); - }; - window.addEventListener('load', j); - window.addEventListener('postMessageTrackerUpdate', j); -}; -injectedJS = '(' + injectedJS.toString() + ')'+ - '(History.prototype.pushState, Window.prototype.addEventListener, MessagePort.prototype.addEventListener)'; - document.addEventListener('postMessageTracker', function(event) { chrome.runtime.sendMessage(event.detail); }); @@ -224,14 +7,3 @@ window.addEventListener('beforeunload', function(event) { var storeEvent = new CustomEvent('postMessageTracker', {'detail':{changePage:true}}); document.dispatchEvent(storeEvent); }); - -(function() { - switch(document.contentType) { - case 'application/xml': - return; - } - var script = document.createElement("script"); - script.setAttribute('type', 'text/javascript') - script.appendChild(document.createTextNode(injectedJS)); - document.documentElement.appendChild(script); -})(); diff --git a/chrome/inject.js b/chrome/inject.js new file mode 100644 index 0000000..8354c86 --- /dev/null +++ b/chrome/inject.js @@ -0,0 +1,205 @@ +(function(pushstate, msgeventlistener, msgporteventlistener) { + var loaded = false; + var originalFunctionToString = Function.prototype.toString; + var m = function(detail) { + var storeEvent = new CustomEvent('postMessageTracker', {'detail':detail}); + document.dispatchEvent(storeEvent); + }; + var h = function(p) { + var hops=""; + try { + if(!p) p=window; + if(p.top != p && p.top == window.top) { + var w = p; + while(top != w) { + var x = 0; + for(var i = 0; i < w.parent.frames.length; i++) { + if(w == w.parent.frames[i]) x=i; + }; + hops="frames["+x+"]" + (hops.length?'.':'') + hops; + w=w.parent; + }; + hops="top"+(hops.length?'.'+hops:'') + } else { + hops=p.top == window.top ? "top" : "diffwin"; + } + } catch(e) { + + } + return hops; + }; + var jq = function(instance) { + if(!instance || !instance.message || !instance.message.length) return; + var j = 0; while(e = instance.message[j++]) { + listener = e.handler; if(!listener) return; + m({window:window.top==window?'top':window.name,hops:h(),domain:document.domain,stack:'jQuery',listener:listener.toString()}); + }; + }; + var l = function(listener, pattern_before, additional_offset) { + offset = 3 + (additional_offset||0) + try { throw new Error(''); } catch (error) { stack = error.stack || ''; } + stack = stack.split('\n').map(function (line) { return line.trim(); }); + fullstack = stack.slice(); + if(pattern_before) { + nextitem = false; + stack = stack.filter(function(e){ + if(nextitem) { nextitem = false; return true; } + if(e.match(pattern_before)) + nextitem = true; + return false; + }); + stack = stack[0]; + } else { + stack = stack[offset]; + } + listener_str = listener.__postmessagetrackername__ || listener.toString(); + m({window:window.top==window?'top':window.name,hops:h(),domain:document.domain,stack:stack,fullstack:fullstack,listener:listener_str}); + }; + var jqc = function(key) { + m({log:['Found key', key, typeof window[key], window[key] ? window[key].toString(): window[key]]}); + if(typeof window[key] == 'function' && typeof window[key]._data == 'function') { + m({log:['found jq function', window[key].toString()]}); + ev = window[key]._data(window, 'events'); + jq(ev); + } else if(window[key] && (expando = window[key].expando)) { + m({log:['Use expando', expando]}); + var i=1; while(instance = window[expando + i++]) { + jq(instance.events); + } + } else if(window[key]) { + m({log:['Use events directly', window[key].toString()]}); + jq(window[key].events); + } + }; + var j = function() { + m({log:'Run jquery fetcher'}); + var all = Object.getOwnPropertyNames(window); + var len = all.length; + for(var i = 0; i < len; i++) { + var key = all[i]; + if(key.indexOf('jQuery') !== -1) { + jqc(key); + } + } + loaded = true; + }; + History.prototype.pushState = function(state, title, url) { + m({pushState:true}); + return pushstate.apply(this, arguments); + }; + var original_setter = window.__lookupSetter__('onmessage'); + window.__defineSetter__('onmessage', function(listener) { + if(listener) { + l(listener.toString()); + } + original_setter(listener); + }); + var c = function(listener) { + var listener_str = originalFunctionToString.apply(listener) + if(listener_str.match(/\.deep.*apply.*captureException/s)) return 'raven'; + else if(listener_str.match(/arguments.*(start|typeof).*err.*finally.*end/s) && listener["nr@original"] && typeof listener["nr@original"] == "function") return 'newrelic'; + else if(listener_str.match(/rollbarContext.*rollbarWrappedError/s) && listener._isWrap && + (typeof listener._wrapped == "function" || typeof listener._rollbar_wrapped == "function")) return 'rollbar'; + else if(listener_str.match(/autoNotify.*(unhandledException|notifyException)/s) && typeof listener.bugsnag == "function") return 'bugsnag'; + else if(listener_str.match(/call.*arguments.*typeof.*apply/s) && typeof listener.__sentry_original__ == "function") return 'sentry'; + else if(listener_str.match(/function.*function.*\.apply.*arguments/s) && typeof listener.__trace__ == "function") return 'bugsnag2'; + return false; + } + + var onmsgport = function(e){ + var p = (e.ports.length?'%cport'+e.ports.length+'%c ':''); + var msg = '%cport%c→%c' + h(e.source) + '%c ' + p + (typeof e.data == 'string'?e.data:'j '+JSON.stringify(e.data)); + if (p.length) { + console.log(msg, "color: blue", '', "color: red", '', "color: blue", ''); + } else { + console.log(msg, "color: blue", '', "color: red", ''); + } + }; + var onmsg = function(e){ + var p = (e.ports.length?'%cport'+e.ports.length+'%c ':''); + var msg = '%c' + h(e.source) + '%c→%c' + h() + '%c ' + p + (typeof e.data == 'string'?e.data:'j '+JSON.stringify(e.data)); + if (p.length) { + console.log(msg, "color: red", '', "color: green", '', "color: blue", ''); + } else { + console.log(msg, "color: red", '', "color: green", ''); + } + }; + window.addEventListener('message', onmsg) + MessagePort.prototype.addEventListener = function(type, listener, useCapture) { + if (!this.__postmessagetrackername__) { + this.__postmessagetrackername__ = true; + this.addEventListener('message', onmsgport); + } + return msgporteventlistener.apply(this, arguments); + } + + Window.prototype.addEventListener = function(type, listener, useCapture) { + if(type=='message') { + var pattern_before = false, offset = 0; + if(listener.toString().indexOf('event.dispatch.apply') !== -1) { + m({log:'We got a jquery dispatcher'}); + pattern_before = /init\.on|init\..*on\]/; + if(loaded) { setTimeout(j, 100); } + } +//console.log('yo') +//debugger; + var unwrap = function(listener) { + found = c(listener); +//console.log('found', found) + if(found == 'raven') { + var fb = false, ff = false, v = null; + for(key in listener) { + var v = listener[key]; + if(typeof v == "function") { ff++; f = v; } + if(typeof v == "boolean") fb++; + } + if(ff == 1 && fb == 1) { + m({log:'We got a raven wrapper'}); + offset++; + listener = unwrap(f); + } + } else if(found == 'newrelic') { + m({log:'We got a newrelic wrapper'}); + offset++; + listener = unwrap(listener["nr@original"]); + } else if(found == 'sentry') { + m({log:'We got a sentry wrapper'}); + offset++; + listener = unwrap(listener["__sentry_original__"]); + } else if(found == 'rollbar') { + m({log:'We got a rollbar wrapper'}); + offset+=2; + } else if(found == 'bugsnag') { + offset++; + var clr = null; + try { clr = arguments.callee.caller.caller.caller } catch(e) { } + if(clr && !c(clr)) { //dont care if its other wrappers + m({log:'We got a bugsnag wrapper'}); + listener.__postmessagetrackername__ = clr.toString(); + } else if(clr) { offset++ } + } else if(found == 'bugsnag2') { + offset++; + var clr = null; + try { clr = arguments.callee.caller.caller.arguments[1]; } catch(e) { } + if(clr && !c(clr)) { //dont care if its other wrappers + listener = unwrap(clr); + m({log:'We got a bugsnag2 wrapper'}); + listener.__postmessagetrackername__ = clr.toString(); + } else if(clr) { offset++; } + } + if(listener.name.indexOf('bound ') === 0) { + listener.__postmessagetrackername__ = listener.name; + } + return listener; + }; + + if(typeof listener == "function") { + listener = unwrap(listener); + l(listener, pattern_before, offset); + } + } + return msgeventlistener.apply(this, arguments); + }; + window.addEventListener('load', j); + window.addEventListener('postMessageTrackerUpdate', j); +})(History.prototype.pushState, Window.prototype.addEventListener, MessagePort.prototype.addEventListener); diff --git a/chrome/manifest.json b/chrome/manifest.json index 2d6f321..b1bb493 100644 --- a/chrome/manifest.json +++ b/chrome/manifest.json @@ -1,36 +1,42 @@ { - "manifest_version": 2, + "manifest_version": 3, "name": "postMessage-tracker", "description": "Monitors and indicates postMessage-listeners in the current window.", "version": "1.0.0", + "background": { - "scripts": [ - "background.js" - ] + "service_worker": "background.js" }, + "content_scripts": [ { - "matches": [ - "" - ], - "js": [ - "content_script.js" - ], + "matches": [""], + "js": ["content_script.js"], "run_at": "document_start", "all_frames": true + }, + { + "matches": [""], + "js": ["inject.js"], + "run_at": "document_start", + "all_frames": true, + "world": "MAIN" } ], - "options_ui": { - "page": "options.html", - "chrome_style": true - }, - "browser_action": { + + "options_page": "options.html", + + "action": { "default_popup": "popup.html" }, + "permissions": [ "tabs", - "storage", - "http:\/\/*\/", - "https:\/\/*\/" + "storage" + ], + + "host_permissions": [ + "http://*/*", + "https://*/*" ] -} \ No newline at end of file +} diff --git a/chrome/popup.js b/chrome/popup.js index 617236a..61bd54b 100644 --- a/chrome/popup.js +++ b/chrome/popup.js @@ -1,4 +1,4 @@ -var port = chrome.extension.connect({ +var port = chrome.runtime.connect({ name: "Sample Communication" });