diff --git a/src/drivers/npm/npm-shrinkwrap.json b/src/drivers/npm/npm-shrinkwrap.json index 445bbc609..26c32eed6 100644 --- a/src/drivers/npm/npm-shrinkwrap.json +++ b/src/drivers/npm/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "wappalyzer", - "version": "5.7.2", + "version": "5.7.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/drivers/webextension/js/content.js b/src/drivers/webextension/js/content.js index 6111d1830..82713d79b 100644 --- a/src/drivers/webextension/js/content.js +++ b/src/drivers/webextension/js/content.js @@ -1,20 +1,16 @@ /** global: browser */ /** global: XMLSerializer */ -/* global browser, chrome */ +/* global browser */ /* eslint-env browser */ -function sendMessage(id, subject, callback) { - (chrome || browser).runtime.sendMessage({ - id, - subject, - source: 'content.js', - }, callback || (() => {})); -} +const port = browser.runtime.connect({ + name: 'content.js', +}); if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') { try { - sendMessage('init', {}); + port.postMessage({ id: 'init' }); // HTML let html = new XMLSerializer().serializeToString(document); @@ -41,7 +37,7 @@ if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') { .map(script => script.src) .filter(script => script.indexOf('data:text/javascript;') !== 0); - sendMessage('analyze', { html, scripts }); + port.postMessage({ id: 'analyze', subject: { html, scripts } }); // JavaScript variables const script = document.createElement('script'); @@ -54,31 +50,38 @@ if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') { window.removeEventListener('message', onMessage); - sendMessage('analyze', { js: event.data.js }); + port.postMessage({ id: 'analyze', subject: { js: event.data.js } }); script.remove(); }; window.addEventListener('message', onMessage); - sendMessage('get_js_patterns', {}, (response) => { - if (response) { - postMessage({ - id: 'patterns', - patterns: response.patterns, - }, window.location.href); - } - }); + port.postMessage({ id: 'get_js_patterns' }); }; script.setAttribute('src', browser.extension.getURL('js/inject.js')); document.body.appendChild(script); - } catch (e) { - sendMessage('log', e); + } catch (error) { + port.postMessage({ id: 'log', subject: error }); } } +port.onMessage.addListener((message) => { + switch (message.id) { + case 'get_js_patterns': + postMessage({ + id: 'patterns', + patterns: message.response.patterns, + }, window.location.href); + + break; + default: + // Do nothing + } +}); + // https://stackoverflow.com/a/44774834 // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/executeScript#Return_value undefined; // eslint-disable-line no-unused-expressions diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index 5d8962f17..327d31717 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -134,67 +134,74 @@ browser.webRequest.onCompleted.addListener(async (request) => { } }, { urls: ['http://*/*', 'https://*/*'], types: ['main_frame'] }, ['responseHeaders']); -// Listen for messages -browser.runtime.onMessage.addListener(async (message, sender) => { - if (message.id === undefined) { - return Promise.resolve(); - } - - if (message.id !== 'log') { - wappalyzer.log(`Message${message.source ? ` from ${message.source}` : ''}: ${message.id}`, 'driver'); - } - - const pinnedCategory = await getOption('pinnedCategory'); - - const url = wappalyzer.parseUrl(sender.tab ? sender.tab.url : ''); - - const cookies = await browser.cookies.getAll({ domain: `.${url.hostname}` }); - - let response; - - switch (message.id) { - case 'log': - wappalyzer.log(message.subject, message.source); - - break; - case 'init': - wappalyzer.analyze(url, { cookies }, { tab: sender.tab }); - - break; - case 'analyze': - wappalyzer.analyze(url, message.subject, { tab: sender.tab }); +browser.runtime.onConnect.addListener((port) => { + port.onMessage.addListener(async (message) => { + if (message.id === undefined) { + return; + } - await setOption('hostnameCache', wappalyzer.hostnameCache); + if (message.id !== 'log') { + wappalyzer.log(`Message from ${port.name}: ${message.id}`, 'driver'); + } - break; - case 'ad_log': - wappalyzer.cacheDetectedAds(message.subject); + const pinnedCategory = await getOption('pinnedCategory'); - break; - case 'get_apps': - response = { - tabCache: tabCache[message.tab.id], - apps: wappalyzer.apps, - categories: wappalyzer.categories, - pinnedCategory, - termsAccepted: userAgent() === 'chrome' || await getOption('termsAccepted', false), - }; + const url = wappalyzer.parseUrl(port.sender.tab ? port.sender.tab.url : ''); - break; - case 'set_option': - await setOption(message.key, message.value); + const cookies = await browser.cookies.getAll({ domain: `.${url.hostname}` }); - break; - case 'get_js_patterns': - response = { - patterns: wappalyzer.jsPatterns, - }; + let response; - break; - default: - } + switch (message.id) { + case 'log': + wappalyzer.log(message.subject, message.source); + + break; + case 'init': + wappalyzer.analyze(url, { cookies }, { tab: port.sender.tab }); + + break; + case 'analyze': + wappalyzer.analyze(url, message.subject, { tab: port.sender.tab }); + + await setOption('hostnameCache', wappalyzer.hostnameCache); + + break; + case 'ad_log': + wappalyzer.cacheDetectedAds(message.subject); + + break; + case 'get_apps': + response = { + tabCache: tabCache[message.tab.id], + apps: wappalyzer.apps, + categories: wappalyzer.categories, + pinnedCategory, + termsAccepted: userAgent() === 'chrome' || await getOption('termsAccepted', false), + }; + + break; + case 'set_option': + await setOption(message.key, message.value); + + break; + case 'get_js_patterns': + response = { + patterns: wappalyzer.jsPatterns, + }; + + break; + default: + // Do nothing + } - return Promise.resolve(response); + if (response) { + port.postMessage({ + id: message.id, + response, + }); + } + }); }); wappalyzer.driver.document = document; @@ -205,7 +212,7 @@ wappalyzer.driver.document = document; wappalyzer.driver.log = (message, source, type) => { const log = ['warn', 'error'].indexOf(type) !== -1 ? type : 'log'; - console[log](`[wappalyzer ${type}]`, `[${source}]`, message); + console[log](`[wappalyzer ${type}]`, `[${source}]`, message); // eslint-disable-line no-console }; /** @@ -372,10 +379,14 @@ wappalyzer.driver.ping = async (hostnameCache = {}, adCache = []) => { try { const tabs = await browser.tabs.query({ url: ['http://*/*', 'https://*/*'] }); - tabs.forEach((tab) => { - browser.tabs.executeScript(tab.id, { - file: '../js/content.js', - }); + tabs.forEach(async (tab) => { + try { + await browser.tabs.executeScript(tab.id, { + file: '../js/content.js', + }); + } catch (error) { + // + } }); } catch (error) { wappalyzer.log(error, 'driver', 'error'); diff --git a/src/drivers/webextension/js/lib/network.js b/src/drivers/webextension/js/lib/network.js index ebae3bc7a..fc0a22d16 100644 --- a/src/drivers/webextension/js/lib/network.js +++ b/src/drivers/webextension/js/lib/network.js @@ -780,9 +780,11 @@ ifTrackingEnabled( sender.tab, () => { + console.log('enabled'); try { sendResponse({ tracking_enabled: true }); } catch (err) {} }, () => { + console.log('not enabled'); try { sendResponse({ tracking_enabled: false }); } catch (err) {} }, ); diff --git a/src/drivers/webextension/js/popup.js b/src/drivers/webextension/js/popup.js index 58d14867e..42ed70089 100644 --- a/src/drivers/webextension/js/popup.js +++ b/src/drivers/webextension/js/popup.js @@ -1,13 +1,16 @@ /* eslint-env browser */ -/* global browser, chrome, jsonToDOM */ +/* global browser, jsonToDOM */ -/** global: chrome */ /** global: browser */ /** global: jsonToDOM */ let pinnedCategory = null; let termsAccepted = false; +const port = browser.runtime.connect({ + name: 'popup.js', +}); + function slugify(string) { return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, ''); } @@ -51,7 +54,7 @@ function replaceDom(domTemplate) { pinnedCategory = categoryId; } - (chrome || browser).runtime.sendMessage({ + port.postMessage({ id: 'set_option', key: 'pinnedCategory', value: pinnedCategory, @@ -186,39 +189,58 @@ function appsToDomTemplate(response) { return template; } -const func = (tabs) => { - (chrome || browser).runtime.sendMessage({ - id: 'get_apps', - tab: tabs[0], - source: 'popup.js', - }, (response) => { - pinnedCategory = response.pinnedCategory; - termsAccepted = response.termsAccepted; +async function getApps() { + try { + const tabs = await browser.tabs.query({ + active: true, + currentWindow: true, + }); - if (termsAccepted) { - replaceDomWhenReady(appsToDomTemplate(response)); - } else { - i18n(); + port.postMessage({ + id: 'get_apps', + tab: tabs[0], + }); + } catch (error) { + console.error(error); // eslint-disable-line no-console + } +} - const wrapper = document.querySelector('.terms__wrapper'); +function displayApps(response) { + pinnedCategory = response.pinnedCategory; // eslint-disable-line prefer-destructuring + termsAccepted = response.termsAccepted; // eslint-disable-line prefer-destructuring - document.querySelector('.terms__accept').addEventListener('click', () => { - (chrome || browser).runtime.sendMessage({ - id: 'set_option', - key: 'termsAccepted', - value: true, - }); + if (termsAccepted) { + replaceDomWhenReady(appsToDomTemplate(response)); + } else { + i18n(); - wrapper.classList.remove('terms__wrapper--active'); + const wrapper = document.querySelector('.terms__wrapper'); - func(tabs); + document.querySelector('.terms__accept').addEventListener('click', () => { + port.postMessage({ + id: 'set_option', + key: 'termsAccepted', + value: true, }); - wrapper.classList.add('terms__wrapper--active'); - } - }); -}; + wrapper.classList.remove('terms__wrapper--active'); + + getApps(); + }); + + wrapper.classList.add('terms__wrapper--active'); + } +} + +port.onMessage.addListener((message) => { + switch (message.id) { + case 'get_apps': + displayApps(message.response); + + break; + default: + // Do nothing + } +}); -browser.tabs.query({ active: true, currentWindow: true }) - .then(func) - .catch(console.error); +getApps(); diff --git a/src/drivers/webextension/npm-shrinkwrap.json b/src/drivers/webextension/npm-shrinkwrap.json index 7dfcf7d96..9934b3a1c 100644 --- a/src/drivers/webextension/npm-shrinkwrap.json +++ b/src/drivers/webextension/npm-shrinkwrap.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "webextension-polyfill": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.3.1.tgz", - "integrity": "sha512-ISB42vlgMyM7xE1u6pREeCqmmXjLsYu/nqAR8Dl/gIAnylb+KpRpvKbVkUYNFePhhXn0Obkkc3jasOII9ztUtg==" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.4.0.tgz", + "integrity": "sha512-oreMp+EoAo1pzRMigx4jB5jInIpx6NTCySPSjGyLLee/dCIPiRqowCEfbFP8o20wz9SOtNwSsfkaJ9D/tRgpag==" } } } diff --git a/src/drivers/webextension/package.json b/src/drivers/webextension/package.json index 19c18bd9a..837c5acf8 100644 --- a/src/drivers/webextension/package.json +++ b/src/drivers/webextension/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "webextension-polyfill": "^0.3.1" + "webextension-polyfill": "^0.4.0" } }