Merge pull request #1 from AliasIO/master

Sync
main
Daniel Zdziebko 8 years ago committed by GitHub
commit 0cfe3157eb

@ -7,6 +7,20 @@ before_install:
- export WAPPALYZER_NODE_PATH=$TRAVIS_BUILD_DIR
- export PATH=$PATH:$TRAVIS_BUILD_DIR/bin
- ln -s docker/node/package.json package.json
before_script: npm i -g manifoldjs
after_success:
- sha256sum build/* > build/SHA256SUMS
- cat build/SHA256SUMS
deploy:
provider: releases
api_key:
secure: mco1ycbfGXZEiBywOmM5A50Y1QPFawj4i0gdB9JDkXDvY7N2kPZyCdAeOQOMEJuetGT3HvJuTG0Ll47sithZfPqq6wx/4EeP8YQYYFIyoOlsIGi5MDR1kS5ZOqKDWGe5+x+/rUZbmuMHvgHWNSjPG8mBrp5xWmON6ETkLWfVB0c=
file_glob: true
file: build/*
skip_cleanup: true
on:
repo: AliasIO/Wappalyzer
tags: true
after_script: ls -l --block-size=kB build
cache:
directories:

@ -1,4 +1,4 @@
# Wappalyzer [![Travis](https://img.shields.io/travis/AliasIO/Wappalyzer.svg?style=flat-square)](https://travis-ci.org/AliasIO/Wappalyzer/)
# Wappalyzer [![Travis](https://img.shields.io/travis/AliasIO/Wappalyzer.svg)](https://travis-ci.org/AliasIO/Wappalyzer/) [![Scrutinizer](https://scrutinizer-ci.com/g/AliasIO/Wappalyzer/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/AliasIO/Wappalyzer/?branch=master)
[Wappalyzer](https://wappalyzer.com/) is a
[cross-platform](https://github.com/AliasIO/Wappalyzer/wiki/Drivers) utility that uncovers the

@ -55,13 +55,42 @@ wappalyzer links
# WebExtension
echo "Building WebExtension driver..."
pushd $WAPPALYZER_ROOT/src/drivers/webextension > /dev/null
webextension_dir=$WAPPALYZER_ROOT/src/drivers/webextension
zip -qr $WAPPALYZER_ROOT/build/wappalyzer_webextension.zip . -x manifest.edge.json
pushd $webextension_dir > /dev/null
zip -qr $WAPPALYZER_ROOT/build/wappalyzer_webextension.edge.zip . -x manifest.json
zip -qr $WAPPALYZER_ROOT/build/wappalyzer_webextension.zip .
printf "@ manifest.edge.json\n@=manifest.json\n" | zipnote -w $WAPPALYZER_ROOT/build/wappalyzer_webextension.edge.zip
popd > /dev/null
# Edge
pushd $WAPPALYZER_ROOT/build > /dev/null
mv $webextension_dir/manifest.json $webextension_dir/manifest.webextension.json
mv $webextension_dir/manifest.edge.json $webextension_dir/manifest.json
manifoldjs -l debug -p edgeextension -f edgeextension -m $webextension_dir/manifest.json
mv $webextension_dir/manifest.json $webextension_dir/manifest.edge.json
mv $webextension_dir/manifest.webextension.json $webextension_dir/manifest.json
manifest_dir="Wappalyzer/edgeextension/manifest"
sed -i 's/INSERT-YOUR-PACKAGE-IDENTITY-NAME-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml
sed -i 's/INSERT-YOUR-PACKAGE-IDENTITY-PUBLISHER-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml
sed -i 's/INSERT-YOUR-PACKAGE-PROPERTIES-PUBLISHERDISPLAYNAME-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml
sed -i 's/Version="0.\([^"]\+\)/Version="\1.0/' $manifest_dir/appxmanifest.xml
cp $webextension_dir/images/icon_44.png $manifest_dir/Assets/Square44x44Logo.png
cp $webextension_dir/images/icon_150.png $manifest_dir/Assets/Square150x150Logo.png
cp $webextension_dir/images/icon_50.png $manifest_dir/Assets/StoreLogo.png
manifoldjs -l debug -p edgeextension package $manifest_dir
mv Wappalyzer/edgeextension/package/edgeExtension.appx wappalyzer_edge.appx
rm -rf Wappalyzer
popd > /dev/null

@ -12,43 +12,43 @@ var
for (app in json.apps) {
(function(app) {
var basePath = process.env.WAPPALYZER_ROOT + '/src/icons/';
var iconPath = json.apps[app].icon;
var path = basePath + iconPath;
var type;
if (path.substr(path.length - 4) === '.png') {
type = "PNG";
}
else if (path.substr(path.length - 4) === '.svg') {
type = "SVG";
}
else {
var err = new Error('Icon file extension specified for app "' + app + '" is not ".png" or ".svg": src/icons/' + iconPath);
throw err;
}
var iconPath = json.apps[app].icon || 'default.svg';
var path = basePath + iconPath;
var type;
if (path.substr(path.length - 4) === '.png') {
type = "PNG";
}
else if (path.substr(path.length - 4) === '.svg') {
type = "SVG";
}
else {
var err = new Error('Icon file extension specified for app "' + app + '" is not ".png" or ".svg": src/icons/' + iconPath);
throw err;
}
fs.exists(path, function(exists) {
if (exists) {
if (type === "PNG") {
var buffer = fileType(readChunk.sync(path, 0, 262));
if (buffer === null) {
var err = new Error('Unknown mimetype or bad file for "' + app + '": src/icons/' + iconPath);
throw err;
}
else if (buffer.mime !== 'image/png') {
var err = new Error('Incorrect mimetype "' + buffer.mime + '" when expected PNG for app "' + app + '": src/icons/' + iconPath);
throw err;
}
}
else if (type === "SVG") {
if (!isSvg(fs.readFileSync(path))) {
var err = new Error('Incorrect mimetype when expected SVG for app "' + app + '": src/icons/' + iconPath);
throw err;
}
}
if (type === "PNG") {
var buffer = fileType(readChunk.sync(path, 0, 262));
if (buffer === null) {
var err = new Error('Unknown mimetype or bad file for "' + app + '": src/icons/' + iconPath);
throw err;
}
else if (buffer.mime !== 'image/png') {
var err = new Error('Incorrect mimetype "' + buffer.mime + '" when expected PNG for app "' + app + '": src/icons/' + iconPath);
throw err;
}
}
else if (type === "SVG") {
if (!isSvg(fs.readFileSync(path))) {
var err = new Error('Incorrect mimetype when expected SVG for app "' + app + '": src/icons/' + iconPath);
throw err;
}
}
} else {
var err = new Error('Missing file for app "' + app + '": src/icons/' + iconPath);
throw err;
throw err;
}
});
}(app));

@ -8,11 +8,19 @@ ENV WAPPALYZER_ROOT /home/wappalyzer/synced
ENV WAPPALYZER_NODE_PATH /home/wappalyzer/node
# Install packages
RUN sed -i 's/^deb-src\ /\#deb-src\ /g' /etc/apt/sources.list
RUN sed -i 's/archive\.ubuntu\.com/au.archive.ubuntu.com/g' /etc/apt/sources.list
RUN apt-get update && apt-get install -y sudo curl
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash -
RUN apt-get install -y nodejs bzip2 zip libfreetype6 libfontconfig rsync
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN sed -i 's/security\.ubuntu\.com/au.archive.ubuntu.com/g' /etc/apt/sources.list
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - && \
apt-get install -y \
nodejs \
bzip2 \
zip \
libfreetype6 \
libfontconfig \
rsync && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Add user
@ -42,6 +50,8 @@ ADD node/package.json $WAPPALYZER_NODE_PATH/package.json
RUN su wappalyzer -c "cd $WAPPALYZER_NODE_PATH && npm i"
RUN npm i -g manifoldjs
# SSH
RUN rm -f /etc/service/sshd/down

@ -85,8 +85,7 @@
"required": true
},
"icon": {
"type": "string",
"required": true
"type": "string"
}
}
}

@ -865,7 +865,6 @@
"3"
],
"html": "<!-- <h1>BigDump: Staggered MySQL Dump Importer ver\\. ([\\d.b]+)\\;version:\\1",
"icon": "default.svg",
"implies": [
"MySQL",
"PHP"
@ -950,14 +949,12 @@
"headers": {
"Server": "Boa\\/?([\\d\\.a-z]+)?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://www.boa.org"
},
"Boba.js": {
"cats": [
"12"
],
"icon": "default.svg",
"implies": "Google Analytics",
"script": "boba(?:\\.min)?\\.js",
"website": "http://boba.space150.com"
@ -993,6 +990,19 @@
"implies": "CodeIgniter",
"website": "http://cibonfire.com"
},
"Bootstrap Table": {
"cats": [
"12"
],
"html": "<link[^>]+href=\"[^>]*bootstrap-table(?:\\.min)?\\.css",
"icon": "Bootstrap Table.svg",
"implies": [
"Bootstrap",
"jQuery"
],
"script": "bootstrap-table(?:\\.min)?\\.js",
"website": "http://bootstrap-table.wenzhixin.net.cn/"
},
"Bounce Exchange": {
"cats": [
"32"
@ -1135,7 +1145,6 @@
"cats": [
"1"
],
"icon": "default.svg",
"implies": "PHP",
"meta": {
"generator": "CMSimple( [\\d.]+)?\\;version:\\1"
@ -1431,6 +1440,15 @@
"icon": "Clientexec.png",
"website": "http://www.clientexec.com"
},
"Clipboard.js": {
"cats": [
"19"
],
"env": "^Clipboard$",
"icon": "Clipboard.js.svg",
"script": "clipboard(?:\\.min)?\\.js",
"website": "https://clipboardjs.com/"
},
"CloudCart": {
"cats": [
"6"
@ -1655,7 +1673,7 @@
"X-Powered-By": "CppCMS/([\\d.]+)\\;version:\\1"
},
"icon": "CppCMS.png",
"implies": "C++",
"implies": "C\\+\\+",
"website": "http://cppcms.com"
},
"Craft CMS": {
@ -1724,7 +1742,7 @@
],
"env": "^d3$",
"icon": "D3.png",
"script": "d3(?:\\. v\\d+)?(?:\\.min)?\\.js",
"script": "/d3(?:\\. v\\d+)?(?:\\.min)?\\.js",
"website": "http://d3js.org"
},
"DHTMLX": {
@ -1873,7 +1891,6 @@
"headers": {
"Server": "DECORUM(?:/([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://example.com"
},
"DedeCMS": {
@ -2349,7 +2366,6 @@
"25"
],
"html": "<link[^>]+?href=\"[^\"]+epoch(?:\\.min)?\\.css",
"icon": "default.svg",
"implies": "D3",
"script": "epoch(?:\\.min)?\\.js",
"website": "http://fastly.github.io/epoch"
@ -2546,7 +2562,6 @@
"headers": {
"Server": "FlashCom/?([\\d\\.]+)?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://example.com"
},
"Flask": {
@ -2578,8 +2593,7 @@
},
"FlexSlider": {
"cats": [
"5",
"7"
"5"
],
"icon": "FlexSlider.png",
"implies": "jQuery",
@ -2877,7 +2891,6 @@
"<!-- gitphp web interface ([\\d.]+)\\;version:\\1",
"<a href=\"http://www.gitphp.org/\" target=\"_blank\">GitPHP by Chris Han"
],
"icon": "default.svg",
"implies": "PHP",
"website": "http://gitphp.org"
},
@ -2886,7 +2899,6 @@
"47"
],
"html": "Powered by <a href=\"https://gerrit.googlesource.com/gitiles/\">Gitiles<",
"icon": "default.svg",
"implies": [
"Java",
"git"
@ -3269,7 +3281,6 @@
"headers": {
"Server": "^http-kit"
},
"icon": "default.svg",
"implies": "Java",
"website": "http://http-kit.org"
},
@ -3280,7 +3291,6 @@
"headers": {
"Server": "(?:^|[^-])\bHTTP-Server(?: ?/?V?([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://example.com"
},
"HTTP/2": {
@ -3299,7 +3309,6 @@
"4"
],
"html": "<p>Produced by <a href=\"http://www.haskell.org/haddock/\">Haddock</a> version ([0-9.]+)</p>\\;version:\\1",
"icon": "default.svg",
"script": "haddock-util\\.js",
"website": "http://www.haskell.org/haddock/"
},
@ -3329,7 +3338,6 @@
"headers": {
"Server": "Happy ICS Server(?:/([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"implies": "OmniTouch 8660 My Teamwork",
"website": "http://example.com"
},
@ -3388,6 +3396,14 @@
"script": "highcharts.*\\.js",
"website": "http://highcharts.com"
},
"Highlight.js": {
"cats": [
"19"
],
"icon": "Highlight.js.png",
"script": "/highlight\\.js/[\\d.]+?/highlight\\.min\\.js",
"website": "https://highlightjs.org/"
},
"Highstock": {
"cats": [
"25"
@ -3417,6 +3433,18 @@
],
"website": "http://twitter.github.com/hogan.js"
},
"Homeland": {
"cats": [
"1",
"2"
],
"headers": {
"Set-Cookie:": "_homeland_"
},
"icon": "Homeland.png",
"implies": "Ruby on Rails",
"website": "https://gethomeland.com"
},
"Hotaru CMS": {
"cats": [
"1"
@ -3623,7 +3651,6 @@
"1"
],
"html": "<(?:link|a href) [^>]+ndxz-studio",
"icon": "default.svg",
"implies": [
"PHP",
"Apache",
@ -3652,7 +3679,6 @@
"headers": {
"Server": "Indy(?:/([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://indyproject.org"
},
"InfernoJS": {
@ -4181,7 +4207,6 @@
"headers": {
"X-Powered-By": "Kolibri"
},
"icon": "default.svg",
"meta": {
"generator": "Kolibri"
},
@ -4276,7 +4301,6 @@
"cats": [
"12"
],
"icon": "default.svg",
"script": "lazy(?:\\.browser)?(?:\\.min)?\\.js",
"website": "http://danieltao.com/lazy.js"
},
@ -4335,7 +4359,6 @@
},
"Lightbox": {
"cats": [
"7",
"12"
],
"html": "<link [^>]*href=\"[^\"]+lightbox(?:\\.min)?\\.css",
@ -4974,7 +4997,6 @@
"headers": {
"Server": "MiniServ\\/?([\\d\\.]+)?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://sourceforge.net/projects/miniserv"
},
"Mint": {
@ -5020,7 +5042,6 @@
"headers": {
"Server": "MochiWeb(?:/([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://github.com/mochi/mochiweb"
},
"Modernizr": {
@ -5191,7 +5212,6 @@
"headers": {
"Server": "Motion-httpd(?:/([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://lavrsen.dk/foswiki/bin/view/Motion"
},
"MotoCMS": {
@ -5360,6 +5380,17 @@
"icon": "Nepso.png",
"website": "http://nepso.com"
},
"Netlify": {
"cats": [
"22",
"31"
],
"headers": {
"Server": "Netlify"
},
"icon": "Netlify.svg",
"website": "https://www.netlify.com/"
},
"Netmonitor": {
"cats": [
"10"
@ -5445,8 +5476,7 @@
},
"OWL Carousel": {
"cats": [
"5",
"7"
"5"
],
"html": "<link [^>]*href=\"[^\"]+owl.carousel(?:\\.min)?\\.css",
"icon": "OWL Carousel.png",
@ -5860,7 +5890,7 @@
"Set-Cookie": "PHPSESSID",
"X-Powered-By": "php/?([\\d.]+)?\\;version:\\1"
},
"icon": "PHP.png",
"icon": "PHP.svg",
"url": "\\.php(?:$|\\?)",
"website": "http://php.net"
},
@ -5920,7 +5950,6 @@
"cats": [
"25"
],
"icon": "default.svg",
"script": "paths(?:\\.min)?\\.js",
"website": "http://github.com/andreaferretti/paths-js"
},
@ -6224,6 +6253,10 @@
"^priceDisplayMethod$\\;confidence:25",
"^priceDisplayPrecision$\\;confidence:25"
],
"headers": {
"Powered-By": "^Prestashop$",
"Set-Cookie": "^PrestaShop"
},
"html": [
"Powered by <a\\s+[^>]+>PrestaShop",
"<!-- /Block [a-z ]+ module (?:HEADER|TOP)?\\s?-->",
@ -6269,7 +6302,6 @@
"25"
],
"env": "^protovis$",
"icon": "default.svg",
"script": "protovis.*\\.js",
"website": "http://mbostock.github.com/protovis"
},
@ -6404,7 +6436,6 @@
"headers": {
"Server": "RAID HTTPServer(?:/([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://example.com"
},
"RBS Change": {
@ -6514,7 +6545,6 @@
"headers": {
"Server": "Rapid Logic(?:/([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://example.com"
},
"React": {
@ -6599,7 +6629,8 @@
],
"env": "^Reveal$",
"icon": "Reveal.js.png",
"script": "reveal(?:\\.min)?\\.js",
"implies": "Highlight.js",
"script": "(?:^|/)reveal(?:\\.min)?\\.js",
"website": "http://lab.hakim.se/reveal-js"
},
"Revel": {
@ -6618,7 +6649,6 @@
"25"
],
"env": "^Rickshaw$",
"icon": "default.svg",
"implies": "D3",
"script": "rickshaw(?:\\.min)?\\.js",
"website": "http://code.shutterstock.com/rickshaw/"
@ -6953,6 +6983,16 @@
],
"website": "http://schneider-electric.com"
},
"Scholica": {
"cats": [
"21"
],
"headers": {
"X-Scholica-Version": ""
},
"icon": "Scholica.svg",
"website": "http://scholica.com"
},
"Scientific Linux": {
"cats": [
"28"
@ -6978,7 +7018,6 @@
"cats": [
"12"
],
"icon": "default.svg",
"implies": "jQuery",
"script": "select2.*\\.js",
"website": "http://select2.github.io"
@ -7197,7 +7236,6 @@
"headers": {
"Server": "SimpleHTTP(?:/([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://example.com"
},
"Site Meter": {
@ -7270,7 +7308,6 @@
},
"Slimbox": {
"cats": [
"7",
"12"
],
"html": "<link [^>]*href=\"[^/]*slimbox(?:-rtl)?\\.css",
@ -7281,7 +7318,6 @@
},
"Slimbox 2": {
"cats": [
"7",
"12"
],
"html": "<link [^>]*href=\"[^/]*slimbox2(?:-rtl)?\\.css",
@ -7644,7 +7680,6 @@
},
"Supersized": {
"cats": [
"7",
"25"
],
"icon": "Supersized.png",
@ -8053,7 +8088,6 @@
"25"
],
"env": "^twemoji$",
"icon": "default.svg",
"script": "twemoji(?:\\.min)?\\.js",
"website": "http://twitter.github.io/twemoji/"
},
@ -8087,6 +8121,15 @@
"url": "typepad\\.com",
"website": "http://www.typepad.com"
},
"Typecho": {
"cats": [
"11"
],
"icon": "typecho.svg",
"implies": "PHP",
"url": "/admin/login\\.php?referer=http%3A%2F%2F",
"website": "http://typecho.org/"
},
"Typekit": {
"cats": [
"17"
@ -8357,6 +8400,18 @@
"icon": "Vimeo.png",
"website": "http://vimeo.com"
},
"Vinala": {
"cats": [
"18"
],
"headers": {
"Set-Cookie": "vinala_version"
},
"icon": "Vinala.png",
"implies": "PHP",
"website": "https://github.com/vinala/vinala"
},
"Virata EmWeb": {
"cats": [
"22"
@ -8364,7 +8419,6 @@
"headers": {
"Server": "Virata-EmWeb(?:/(R?[\\d._]+))?\\;version:\\1"
},
"icon": "default.svg",
"implies": [
"HP"
],
@ -8671,7 +8725,6 @@
"Server": "Winstone Servlet (?:Container|Engine) v?([\\d.]+)?\\;version:\\1",
"X-Powered-By": "Winstone(?:.([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://winstone.sourceforge.net"
},
"Wix": {
@ -9259,7 +9312,6 @@
"headers": {
"Server": "dwhttpd\\/?([\\d\\.a-z]+)?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://example.com"
},
"e107": {
@ -9292,7 +9344,6 @@
"headers": {
"Server": "\beHTTP(?: v?([\\d\\.]+))?\\;version:\\1"
},
"icon": "default.svg",
"implies": "HP ProCurve",
"website": "http://example.com"
},
@ -9354,7 +9405,6 @@
"47"
],
"html": "<p>Powered by <a[^>]+>GitList ([\\d.]+)\\;version:\\1",
"icon": "default.svg",
"implies": [
"PHP",
"git"
@ -9489,7 +9539,6 @@
"cats": [
"25"
],
"icon": "default.svg",
"implies": "jQuery",
"script": "jquery\\.sparkline.*\\.js",
"website": "http://omnipotent.net/jquery.sparkline/"
@ -9874,7 +9923,6 @@
},
"prettyPhoto": {
"cats": [
"7",
"12"
],
"env": "pp_(?:alreadyInitialized|descriptions|images|titles)",
@ -9935,20 +9983,9 @@
"25"
],
"env": "^Shine$",
"icon": "default.svg",
"script": "shine(?:\\.min)?\\.js",
"website": "http://bigspaceship.github.io/shine.js/"
},
"spin.js": {
"cats": [
"12",
"25"
],
"env": "^Spinner$",
"icon": "spin.js.png",
"script": "spin(?:\\.min)?\\.js",
"website": "http://fgnass.github.io/spin.js/"
},
"swift.engine": {
"cats": [
"1"
@ -10053,19 +10090,8 @@
"1"
],
"html": "powered by <a href=\"[^>]+viennacms",
"icon": "default.svg",
"website": "http://www.viennacms.nl"
},
"vis.js": {
"cats": [
"25"
],
"env": "^vis$",
"html": "<link[^>]+?href=\"[^\"]+vis(?:\\.min)?\\.css",
"icon": "vis.js.png",
"script": "vis(?:\\.min)?\\.js",
"website": "http://visjs.org"
},
"webEdition": {
"cats": [
"1"
@ -10107,7 +10133,6 @@
],
"env": "^xChart$",
"html": "<link[^>]* href=\"[^\"]*xcharts(?:\\.min)?\\.css",
"icon": "default.svg",
"implies": "D3",
"script": "xcharts\\.js",
"website": "http://tenxer.github.io/xcharts/"

@ -1,7 +1,10 @@
/**
* Bookmarklet driver
* WebExtension driver
*/
/** global: wappalyzer */
/** global: XMLHttpRequest */
(function() {
if ( typeof wappalyzer === 'undefined' ) {
return;
@ -112,7 +115,7 @@
'<div class="wappalyzer-app' + ( first ? ' wappalyzer-first' : '' ) + '">' +
'<a target="_blank" class="wappalyzer-application" href="' + w.config.websiteURL + 'applications/' + app.toLowerCase().replace(/ /g, '-').replace(/[^a-z0-9-]/g, '') + '">' +
'<strong>' +
'<img src="' + w.config.websiteURL + 'images/icons/' + w.apps[app].icon + '" width="16" height="16"/> ' + app +
'<img src="' + w.config.websiteURL + 'images/icons/' + (w.apps[app].icon || 'default.svg') + '" width="16" height="16"/> ' + app +
'</strong>' +
'</a>';

@ -1,3 +1,10 @@
/**
* PhantomJS driver
*/
/** global: phantom */
/** global: wappalyzer */
(function() {
var
url,
@ -15,8 +22,10 @@
require('fs').changeWorkingDirectory(scriptDir);
require('system').args.forEach(function(arg, i) {
var arr = /^(--[^=]+)=(.+)$/.exec(arg);
require('system').args.forEach(function(arg) {
var
value,
arr = /^(--[^=]+)=(.+)$/.exec(arg);
if ( arr && arr.length === 3 ) {
arg = arr[1];
@ -35,7 +44,9 @@
break;
case '--resource-timeout':
resourceTimeout = value;
if ( value ) {
resourceTimeout = value;
}
break;
default:
@ -73,31 +84,28 @@
displayApps: function() {
var
app, cats,
apps = [],
count = wappalyzer.detected[url] ? Object.keys(wappalyzer.detected[url]).length : 0;
apps = [];
wappalyzer.log('driver.displayApps');
if ( count ) {
for ( app in wappalyzer.detected[url] ) {
cats = [];
wappalyzer.apps[app].cats.forEach(function(cat) {
cats.push(wappalyzer.categories[cat].name);
});
apps.push({
name: app,
confidence: wappalyzer.detected[url][app].confidenceTotal.toString(),
version: wappalyzer.detected[url][app].version,
icon: wappalyzer.apps[app].icon,
website: wappalyzer.apps[app].website,
categories: cats
});
}
wappalyzer.driver.sendResponse(apps);
for ( app in wappalyzer.detected[url] ) {
cats = [];
wappalyzer.apps[app].cats.forEach(function(cat) {
cats.push(wappalyzer.categories[cat].name);
});
apps.push({
name: app,
confidence: wappalyzer.detected[url][app].confidenceTotal.toString(),
version: wappalyzer.detected[url][app].version,
icon: wappalyzer.apps[app].icon || 'default.svg',
website: wappalyzer.apps[app].website,
categories: cats
});
}
wappalyzer.driver.sendResponse(apps);
},
/**
@ -115,7 +123,7 @@
init: function() {
var
page, hostname,
headers = {};
headers = {},
a = document.createElement('a'),
json = JSON.parse(require('fs').read('apps.json'));
@ -167,7 +175,7 @@
};
page.open(url, function(status) {
var html, environmentVars;
var html, environmentVars = '';
if ( status === 'success' ) {
html = page.content;
@ -178,7 +186,7 @@
// Collect environment variables
environmentVars = page.evaluate(function() {
var i, environmentVars;
var i, environmentVars = '';
for ( i in window ) {
environmentVars += i + ' ';

@ -2,7 +2,7 @@
"name": "wappalyzer",
"description": "Uncovers the technologies used on websites",
"homepage": "https://github.com/AliasIO/Wappalyzer",
"version": "3.0.9",
"version": "3.0.10",
"author": "Elbert Alias",
"license": "GPL-3.0",
"repository": {

@ -6,6 +6,7 @@
"optionsSave": { "message": "Ρυθμίσεις αποθήκευσης" },
"optionsSaved": { "message": "Αποθηκεύτηκε" },
"optionUpgradeMessage": { "message": "Ενημερώστε με για αναβαθμίσεις" },
"optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
"optionTracking": { "message": "Ανώνυμη αποστολή αναφορών για εντοπισμένες εφαρμογές στο wappalyzer.com για έρευνα" },
"nothingToDo": { "message": "Καμία ενέργεια." },
"noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." },

@ -6,6 +6,7 @@
"optionsSave": { "message": "Save options" },
"optionsSaved": { "message": "Saved" },
"optionUpgradeMessage": { "message": "Tell me about upgrades" },
"optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
"optionTracking": { "message": "Anonymously send reports on detected applications to wappalyzer.com for research" },
"nothingToDo": { "message": "Nothing to do here." },
"noAppsDetected": { "message": "No applications detected." },
@ -14,6 +15,10 @@
"categoryName3": { "message": "Database Manager" },
"categoryName4": { "message": "Documentation Tool" },
"categoryName5": { "message": "Widget" },
"categoryName6": { "message": "Ecommerce" },
"categoryName7": { "message": "Photo Galleries" },
"categoryName8": { "message": "Wikis" },
"categoryName9": { "message": "Hostin Panels" },
"categoryName10": { "message": "Analytics" },
"categoryName11": { "message": "Blog" },
"categoryName12": { "message": "JavaScript Framework" },

@ -6,6 +6,7 @@
"optionsSave": { "message": "Guardar opciones" },
"optionsSaved": { "message": "Guardado" },
"optionUpgradeMessage": { "message": "Indicarme actualizaciones" },
"optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
"optionTracking": { "message": "Enviar informes anónimos sobre las aplicaciones detectadas a wappalyzer.com para análisis" },
"nothingToDo": { "message": "Nada que hacer aquí." },
"noAppsDetected": { "message": "Aplicaciones no detectadas." },

@ -4,6 +4,7 @@
"nothingToDo": { "message": "Rien à faire ici." },
"optionTracking": { "message": "Envoyer anonymement des rapports sur les applications détectées à wappalyzer.com pour la recherche" },
"optionUpgradeMessage": { "message": "M'afficher les mises à jour" },
"optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
"options": { "message": "Options" },
"optionsSave": { "message": "Sauver les options" },
"optionsSaved": { "message": "Sauvé" },

@ -6,6 +6,7 @@
"optionsSave": { "message": "Ρυθμίσεις αποθήκευσης" },
"optionsSaved": { "message": "Αποθηκεύτηκε" },
"optionUpgradeMessage": { "message": "Ενημερώστε με για αναβαθμίσεις" },
"optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
"optionTracking": { "message": "Ανώνυμη αποστολή αναφορών για εντοπισμένες εφαρμογές στο wappalyzer.com για έρευνα" },
"nothingToDo": { "message": "Καμία ενέργεια." },
"noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." },

@ -6,6 +6,7 @@
"optionsSave": { "message": "Salva opzioni" },
"optionsSaved": { "message": "Salvato" },
"optionUpgradeMessage": { "message": "Parlami dell'upgrade" },
"optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
"optionTracking": { "message": "Inviare anonimamente un report sulle applicazioni rilevate a wappalyzer.com per l'analisi" },
"nothingToDo": { "message": "Niente da fare qui." },
"noAppsDetected": { "message": "Nessuna applicazione rilevata." },

@ -6,6 +6,7 @@
"optionsSave": { "message": "Zapisz opcje" },
"optionsSaved": { "message": "Zapisano" },
"optionUpgradeMessage": { "message": "Powiadamiaj mnie o aktualizacjach" },
"optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
"optionTracking": { "message": "Przesyłaj anonimowe statystyki aplikacji wykrytych przez Wappalyzer do twórców" },
"nothingToDo": { "message": "Nic tu nie ma." },
"noAppsDetected": { "message": "Nie wykryto żadnych aplikacji." },

@ -6,6 +6,7 @@
"optionsSave": { "message": "Salvează opțiuni" },
"optionsSaved": { "message": "Salvat" },
"optionUpgradeMessage": { "message": "Anunță-mă dacă sunt actualizări" },
"optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
"optionTracking": { "message": "Trimite rapoarte anonime despre aplicațiile detectate către wappalyzer.com pentru cercetare" },
"nothingToDo": { "message": "Nimic de făcut pe pagina curentă." },
"noAppsDetected": { "message": "Nici o aplicație detectată." },

@ -83,7 +83,7 @@ a:active {
#about {
border-top: 1px solid #dbdbdb;
margin-top: 2.5rem;
margin-top: 1.5rem;
padding: 1.5rem 0 0 0;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

@ -1,3 +1,5 @@
/** global: browser */
(function() {
var c = {
init: function() {

@ -1,5 +0,0 @@
var defaults = {
autoAnalyzeHeaders: 0,
upgradeMessage: 1,
tracking: 1
};

@ -1,7 +1,12 @@
/**
* Chrome driver
* WebExtension driver
*/
/** global: browser */
/** global: chrome */
/** global: wappalyzer */
/** global: XMLHttpRequest */
(function() {
if ( wappalyzer == null ) {
return;
@ -24,6 +29,26 @@
console.log('[wappalyzer ' + args.type + '] ' + args.message);
},
/**
* Get a value from localStorage
*/
getOption: function(name, defaultValue, callback) {
browser.storage.local.get(name).then(function(item) {
callback(item.hasOwnProperty(name) ? item[name] : defaultValue);
});
},
/**
* Set a value in localStorage
*/
setOption: function(name, value) {
var option = {};
option[name] = value;
browser.storage.local.set(option);
},
/**
* Initialize
*/
@ -54,19 +79,27 @@
try {
var version = browser.runtime.getManifest().version;
if ( localStorage['version'] == null ) {
firstRun = true;
// Set defaults
for ( var option in defaults ) {
localStorage[option] = defaults[option];
w.driver.getOption('version', null, function(previousVersion) {
if ( previousVersion === null ) {
w.driver.goToURL({
url: w.config.websiteURL + 'installed'
});
} else if ( version !== previousVersion ) {
w.driver.getOption('upgradeMessage', true, function(upgradeMessage) {
if ( upgradeMessage ) {
w.driver.goToURL({
url: w.config.websiteURL + 'upgraded',
background: true
});
}
});
}
} else if ( version !== localStorage['version'] && parseInt(localStorage['upgradeMessage'], 10) ) {
upgraded = true;
}
localStorage['version'] = version;
} catch(e) { }
w.driver.setOption('version', version);
});
} catch(e) {
// Do nothing
}
if ( typeof chrome === 'undefined' ) {
browser.runtime.onMessage.addListener(w.driver.onMessage);
@ -74,13 +107,19 @@
chrome.runtime.onMessage.addListener(w.driver.onMessage);
}
browser.tabs.query({}).then(function(tabs) {
var callback = function(tabs) {
tabs.forEach(function(tab) {
if ( tab.url.match(/^https?:\/\//) ) {
browser.tabs.executeScript(tab.id, { file: 'js/content.js' });
}
})
});
};
try {
browser.tabs.query({}).then(callback);
} catch ( e ) {
browser.tabs.query({}, callback);
}
browser.tabs.onRemoved.addListener(function(tabId) {
w.log('remove tab');
@ -109,7 +148,9 @@
}
for ( var header in responseHeaders ) {
headersCache[uri][header] = responseHeaders[header];
if ( responseHeaders.hasOwnProperty(header) ) {
headersCache[uri][header] = responseHeaders[header];
}
}
}
@ -170,6 +211,7 @@
};
break;
default:
}
sendResponse(response);
@ -177,10 +219,14 @@
},
/**
* Open a tab
*/
goToURL: function(args) {
var url = args.url + ( typeof args.medium === 'undefined' ? '' : '?pk_campaign=chrome&pk_kwd=' + args.medium);
browser.tabs.create({ url: url, active: args.background === undefined || !args.background });
browser.tabs.create({
url: args.url,
active: args.background === undefined || !args.background
});
},
/**
@ -202,33 +248,42 @@
tabCache[tab.id].appsDetected = w.detected[url];
if ( count > 0 ) {
// Find the main application to display
var appName, found = false;
w.driver.getOption('dynamicIcon', true, function(dynamicIcon) {
var appName, found = false;
w.driver.categoryOrder.forEach(function(match) {
for ( appName in w.detected[url] ) {
w.apps[appName].cats.forEach(function(cat) {
var icon = w.apps[appName].icon;
// Find the main application to display
w.driver.categoryOrder.forEach(function(match) {
for ( appName in w.detected[url] ) {
w.apps[appName].cats.forEach(function(cat) {
var icon = w.apps[appName].icon || 'default.svg';
if ( cat == match && !found ) {
if ( /\.svg$/i.test(icon) ) {
icon = 'converted/' + icon + '.png';
if ( !dynamicIcon ) {
icon = 'default.svg';
}
browser.pageAction.setIcon({ tabId: tab.id, path: 'images/icons/' + icon });
if ( cat === match && !found ) {
if ( /\.svg$/i.test(icon) ) {
icon = 'converted/' + icon + '.png';
}
found = true;
}
});
browser.pageAction.setIcon({
tabId: tab.id,
path: 'images/icons/' + icon
});
found = true;
}
});
}
});
if ( typeof chrome !== 'undefined' ) {
// Browser polyfill doesn't seem to work here
chrome.pageAction.show(tab.id);
} else {
browser.pageAction.show(tab.id);
}
});
if ( typeof chrome !== 'undefined' ) {
// Browser polyfill doesn't seem to work here
chrome.pageAction.show(tab.id);
} else {
browser.pageAction.show(tab.id);
}
};
},
@ -236,17 +291,19 @@
* Anonymously track detected applications for research purposes
*/
ping: function() {
if ( Object.keys(w.ping.hostnames).length && parseInt(localStorage['tracking'], 10) ) {
w.driver.post('http://ping.wappalyzer.com/v2/', w.ping);
w.driver.getOption('tracking', true, function(tracking) {
if ( Object.keys(w.ping.hostnames).length && tracking ) {
w.driver.post('http://ping.wappalyzer.com/v2/', w.ping);
w.log('w.driver.ping: ' + JSON.stringify(w.ping));
w.log('w.driver.ping: ' + JSON.stringify(w.ping));
w.ping = { hostnames: {} };
w.ping = { hostnames: {} };
w.driver.post('https://ad.wappalyzer.com/log/wp/', w.adCache);
w.driver.post('https://ad.wappalyzer.com/log/wp/', w.adCache);
w.adCache = [];
}
w.adCache = [];
}
});
},
/**
@ -259,7 +316,7 @@
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = function(e) {
xhr.onreadystatechange = function() {
if ( xhr.readyState == 4 ) {
w.log('w.driver.post: status ' + xhr.status + ' (' + url + ')');
}

@ -1,11 +1,13 @@
/** global: browser */
document.addEventListener('DOMContentLoaded', function() {
var
i, value,
nodes = document.getElementsByTagName('*');
nodes = document.querySelector('*');
for ( i = 0; i < nodes.length; i ++ ) {
if ( attr = nodes[i].dataset.i18n ) {
nodes[i].innerHTML = browser.i18n.getMessage(attr);
if ( value = nodes[i].dataset.i18n ) {
nodes[i].innerHTML = browser.i18n.getMessage(value);
}
}
});

File diff suppressed because it is too large Load Diff

@ -10,5 +10,7 @@
document.getElementById('wappalyzerData').appendChild(document.createComment(environmentVars));
document.getElementById('wappalyzerData').dispatchEvent(e);
} catch(e) { }
} catch(e) {
// Fail quietly
}
}());

@ -0,0 +1,846 @@
if (!Range.prototype["intersectsNode"]) {
Range.prototype["intersectsNode"] = function (node) {
let range = document.createRange();
range.selectNode(node);
return 0 > this.compareBoundaryPoints(Range.END_TO_START, range)
&& 0 < this.compareBoundaryPoints(Range.START_TO_END, range);
};
}
var getExtensionProtocol = function () {
if (typeof browser == "undefined") {
if (typeof chrome !== "undefined")
return "chrome-extension://";
}
else {
return "ms-browser-extension://";
}
};
class FakeEvent {
addListener(callback) { }
addRules(rules, callback) { }
getRules(ruleIdentifiers, callback) { }
hasListener(callback) { return false; }
hasListeners() { return false; }
removeRules(ruleIdentifiers, callback) { }
removeListener(callback) { }
}
class EdgeBridgeHelper {
constructor() {
this.fakeEvent = new FakeEvent();
}
toAbsolutePath(relativePath) {
if (relativePath.indexOf("ms-browser-extension://") == 0) {
return relativePath.replace(myBrowser.runtime.getURL(""), "");
}
else if (relativePath.indexOf("/") != 0) {
var absolutePath = "";
var documentPath = document.location.pathname;
absolutePath = documentPath.substring(0, documentPath.lastIndexOf("/") + 1);
absolutePath += relativePath;
return absolutePath;
}
return relativePath;
}
}
var bridgeHelper = new EdgeBridgeHelper();
class EdgeBridgeDebugLog {
constructor() {
this.CatchOnException = true;
this.VerboseLogging = true;
this.FailedCalls = {};
this.SuccededCalls = {};
this.DeprecatedCalls = {};
this.BridgedCalls = {};
this.UnavailableApis = {};
this.EdgeIssues = {};
}
log(message) {
try {
if (this.VerboseLogging) {
console.log(message);
}
}
catch (e) {
}
}
info(message) {
try {
if (this.VerboseLogging) {
console.info(message);
}
}
catch (e) {
}
}
warn(message) {
try {
if (this.VerboseLogging) {
console.warn(message);
}
}
catch (e) {
}
}
error(message) {
try {
if (this.VerboseLogging) {
console.error(message);
}
}
catch (e) {
}
}
DoActionAndLog(action, name, deprecatedTo, bridgedTo) {
var result;
try {
result = action();
this.AddToCalledDictionary(this.SuccededCalls, name);
if (typeof deprecatedTo !== "undefined" && typeof deprecatedTo !== "null") {
this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!");
this.AddToCalledDictionary(this.DeprecatedCalls, name);
}
if (typeof bridgedTo !== "undefined" && typeof bridgedTo !== "null") {
this.info("API Call '" + name + "' has been bridged to another Edge API: " + bridgedTo);
this.AddToCalledDictionary(this.BridgedCalls, name);
}
return result;
}
catch (ex) {
this.AddToCalledDictionary(this.FailedCalls, name);
if (this.CatchOnException)
this.error("API Call Failed: " + name + " - " + ex);
else
throw ex;
}
}
LogEdgeIssue(name, message) {
this.warn(message);
this.AddToCalledDictionary(this.EdgeIssues, name);
}
LogUnavailbleApi(name, deprecatedTo) {
this.warn("API Call '" + name + "' is not supported in Edge");
this.AddToCalledDictionary(this.UnavailableApis, name);
if (typeof deprecatedTo !== "undefined" && typeof deprecatedTo !== "null") {
this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!");
this.AddToCalledDictionary(this.DeprecatedCalls, name);
}
}
AddToCalledDictionary(dictionary, name) {
if (typeof dictionary[name] !== "undefined") {
dictionary[name]++;
}
else {
dictionary[name] = 1;
}
}
}
var bridgeLog = new EdgeBridgeDebugLog();
class EdgeChromeAppBridge {
getDetails() {
return bridgeLog.DoActionAndLog(() => {
return EdgeChromeRuntimeBridge.prototype.getManifest();
}, "app.getManifest", undefined, "runtime.getManifest");
}
get isInstalled() { return bridgeLog.DoActionAndLog(() => { throw "app.isInstalled is not available in Edge"; }, "app.isInstalled"); }
getIsInstalled() { return bridgeLog.DoActionAndLog(() => { throw "app.getIsInstalled is not available in the Edge"; }, "app.getIsInstalled"); }
installState() { return bridgeLog.DoActionAndLog(() => { throw "app.installState is not available in Edge"; }, "app.installState"); }
runningState() { return bridgeLog.DoActionAndLog(() => { throw "app.runningState is not available in Edge"; }, "app.runningState"); }
}
class EdgeBrowserActionBridge {
get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.browserAction.onClicked; }, "browserAction.onClicked"); }
disable(tabId) {
bridgeLog.DoActionAndLog(() => {
myBrowser.browserAction.disable(tabId);
}, "browserAction.disable");
}
enable(tabId) {
bridgeLog.DoActionAndLog(() => {
if (typeof tabId !== "undefined" && typeof tabId !== "null") {
myBrowser.browserAction.enable(tabId);
}
else {
myBrowser.browserAction.enable();
}
}, "browserAction.Enable");
}
getBadgeBackgroundColor(details, callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.browserAction.getBadgeBackgroundColor(details, callback);
}, "browserAction.getBadgeBackgroundColor");
}
getBadgeText(details, callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.browserAction.getBadgeText(details, callback);
}, "browserAction.getBadgeText");
}
setBadgeBackgroundColor(details) {
bridgeLog.DoActionAndLog(() => {
myBrowser.browserAction.setBadgeBackgroundColor(details);
}, "browserAction.setBadgeBackgroundColor");
}
setBadgeText(details) {
bridgeLog.DoActionAndLog(() => {
myBrowser.browserAction.setBadgeText(details);
}, "browserAction.setBadgeText");
}
setIcon(details, callback) {
bridgeLog.DoActionAndLog(() => {
if (typeof details.path !== "undefined") {
if (typeof details.path === "object") {
for (var key in details.path) {
if (details.path.hasOwnProperty(key)) {
details.path[key] = bridgeHelper.toAbsolutePath(details.path[key]);
}
}
}
else {
details.path = bridgeHelper.toAbsolutePath(details.path);
}
}
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.browserAction.setIcon(details, callback);
}
else {
myBrowser.browserAction.setIcon(details);
}
}, "browserAction.setIcon", undefined, "browserAction.setIcon with absolute path");
}
setPopup(details) {
bridgeLog.DoActionAndLog(() => {
myBrowser.browserAction.setPopup(details);
}, "browserAction.setPopup");
}
}
class EdgeChromeBrowserActionBridge extends EdgeBrowserActionBridge {
getPopup(details, callback) {
bridgeLog.LogUnavailbleApi("browserAction.getPopup");
}
getTitle(details, callback) {
bridgeLog.LogUnavailbleApi("browserAction.getTitle");
}
setTitle(details) {
bridgeLog.LogUnavailbleApi("browserAction.setTitle");
}
}
class EdgeContextMenusBridge {
get ACTION_MENU_TOP_LEVEL_LIMIT() { return bridgeLog.DoActionAndLog(() => { return myBrowser.contextMenus.ACTION_MENU_TOP_LEVEL_LIMIT; }, "contextMenus.ACTION_MENU_TOP_LEVEL_LIMIT"); }
get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.contextMenus.onClicked; }, "contextMenus.onClicked"); }
create(createProperties, callback) {
bridgeLog.DoActionAndLog(() => {
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.contextMenus.create(createProperties, callback);
}
else {
myBrowser.contextMenus.create(createProperties);
}
}, "contextMenus.create");
}
remove(menuItemId, callback) {
bridgeLog.DoActionAndLog(() => {
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.contextMenus.remove(menuItemId, callback);
}
else {
myBrowser.contextMenus.remove(menuItemId);
}
}, "contextMenus.remove");
}
removeAll(callback) {
bridgeLog.DoActionAndLog(() => {
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.contextMenus.removeAll(callback);
}
else {
myBrowser.contextMenus.removeAll();
}
}, "contextMenus.removeAll");
}
update(id, updateProperties, callback) {
bridgeLog.DoActionAndLog(() => {
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.contextMenus.update(id, updateProperties, callback);
}
else {
myBrowser.contextMenus.update(id, updateProperties);
}
}, "contextMenus.update");
}
}
class EdgeCookiesBridge {
get(details, callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.cookies.get(details, callback);
}, "cookies.get");
}
getAll(details, callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.cookies.getAll(details, callback);
}, "cookies.getAll");
}
remove(details, callback) {
bridgeLog.DoActionAndLog(() => {
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.cookies.remove(details, callback);
}
else {
myBrowser.cookies.remove(details);
}
}, "cookies.remove");
}
set(details, callback) {
bridgeLog.DoActionAndLog(() => {
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.cookies.set(details, callback);
}
else {
myBrowser.cookies.set(details);
}
}, "cookies.set");
}
}
class EdgeChromeCookiesBridge extends EdgeCookiesBridge {
get onChanged() { bridgeLog.LogUnavailbleApi("cookies.onChanged"); return bridgeHelper.fakeEvent; }
}
class EdgeExtensionBridge {
getBackgroundPage() {
return bridgeLog.DoActionAndLog(() => {
return myBrowser.extension.getBackgroundPage();
}, "extension.getBackgroundPage");
}
getURL(path) {
return bridgeLog.DoActionAndLog(() => {
return myBrowser.extension.getURL(path);
}, "extension.getURL");
}
getViews(fetchProperties) {
return bridgeLog.DoActionAndLog(() => {
return myBrowser.extension.getViews(fetchProperties);
}, "extension.getViews");
}
}
class EdgeChromeExtensionBridge extends EdgeExtensionBridge {
get onConnect() { return bridgeLog.DoActionAndLog(() => { return EdgeRuntimeBridge.prototype.onConnect; }, "extension.onConnect", "runtime.onConnect", "runtime.onConnect"); }
get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onMessage", "runtime.onMessage", "runtime.onMessage"); }
get onRequest() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onRequest", "runtime.onMessage", "runtime.onMessage"); }
get onRequestExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "extension.onRequestExternal", "runtime.onMessageExternal", "runtime.onMessageExternal"); }
get inIncognitoContext() { return bridgeLog.DoActionAndLog(() => { return myBrowser.extension["inPrivateContext"]; }, "extension.inIncognitoContext", undefined, "extension.inPrivateContext"); }
get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "extension.lastError", undefined, "runtime.lastError"); }
connect(extensionId, connectInfo) {
return bridgeLog.DoActionAndLog(() => {
return EdgeRuntimeBridge.prototype.connect(extensionId, connectInfo);
}, "extension.connect", "runtime.connect", "runtime.connect");
}
sendMessage(message, responseCallback) {
return bridgeLog.DoActionAndLog(() => {
return EdgeRuntimeBridge.prototype.sendMessage(message, responseCallback, undefined, undefined);
}, "extension.sendMessage", "runtime.sendMessage", "runtime.sendMessage");
}
sendRequest(extensionId, message, options, responseCallback) {
return bridgeLog.DoActionAndLog(() => {
return EdgeRuntimeBridge.prototype.sendMessage(extensionId, message, options, responseCallback);
}, "extension.sendRequest", "runtime.sendMessage", "runtime.sendMessage");
}
isAllowedFileSchemeAccess(callback) {
bridgeLog.LogUnavailbleApi("extension.isAllowedFileSchemeAccess");
}
isAllowedIncognitoAccess(callback) {
bridgeLog.LogUnavailbleApi("extension.isAllowedIncognitoAccess");
}
setUpdateUrlData(data) {
bridgeLog.LogUnavailbleApi("extension.setUpdateUrlData");
}
}
class EdgeHistoryBridge {
get onVisited() { bridgeLog.LogUnavailbleApi("history.onVisited"); return bridgeHelper.fakeEvent; }
get onVisitRemoved() { bridgeLog.LogUnavailbleApi("history.onVisitRemoved"); return bridgeHelper.fakeEvent; }
addUrl(details, callback) {
bridgeLog.LogUnavailbleApi("history.addUrl");
}
deleteAll(callback) {
bridgeLog.LogUnavailbleApi("history.deleteAll");
}
deleteRange(range, callback) {
bridgeLog.LogUnavailbleApi("history.deleteRange");
}
deleteUrl(details, callback) {
bridgeLog.LogUnavailbleApi("history.deleteUrl");
}
getVisits(details, callback) {
bridgeLog.LogUnavailbleApi("history.getVisits");
}
search(query, callback) {
bridgeLog.LogUnavailbleApi("history.search");
}
}
class EdgeI18nBridge {
getAcceptLanguages(callback) {
return bridgeLog.DoActionAndLog(() => {
return myBrowser.i18n.getAcceptLanguages(callback);
}, "i18n.getAcceptLanguages");
}
getMessage(messageName, substitutions) {
return bridgeLog.DoActionAndLog(() => {
if (messageName.indexOf("@@extension_id") > -1) {
return myBrowser.runtime.id;
}
if (typeof substitutions !== "undefined" && typeof substitutions !== "null") {
return myBrowser.i18n.getMessage(messageName, substitutions);
}
else {
return myBrowser.i18n.getMessage(messageName);
}
}, "i18n.getMessage");
}
getUILanguage() {
return bridgeLog.DoActionAndLog(() => {
return myBrowser.i18n.getUILanguage();
}, "i18n.getUILanguage");
}
}
class EdgeNotificationBridge {
get onButtonClicked() { bridgeLog.LogUnavailbleApi("notifications.onButtonClicked"); return bridgeHelper.fakeEvent; }
get onClicked() { bridgeLog.LogUnavailbleApi("notifications.onClicked"); return bridgeHelper.fakeEvent; }
get onClosed() { bridgeLog.LogUnavailbleApi("notifications.onClosed"); return bridgeHelper.fakeEvent; }
get onPermissionLevelChanged() { bridgeLog.LogUnavailbleApi("notifications.onPermissionLevelChanged"); return bridgeHelper.fakeEvent; }
get onShowSettings() { bridgeLog.LogUnavailbleApi("notifications.onShowSettings"); return bridgeHelper.fakeEvent; }
clear(notificationId, callback) {
bridgeLog.LogUnavailbleApi("notifications.clear");
}
create(notificationId, options, callback) {
bridgeLog.LogUnavailbleApi("notifications.create");
}
getAll(callback) {
bridgeLog.LogUnavailbleApi("notifications.getAll");
}
getPermissionLevel(callback) {
bridgeLog.LogUnavailbleApi("notifications.getPermissionLevel");
}
update(notificationId, options, callback) {
bridgeLog.LogUnavailbleApi("notifications.update");
}
}
class EdgePageActionBridge {
get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.pageAction.onClicked; }, "pageAction.onClicked"); }
getPopup(details, callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.pageAction.getPopup(details, callback);
}, "pageAction.getPopup");
}
getTitle(details, callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.pageAction.getTitle(details, callback);
}, "pageAction.getTitle");
}
hide(tabId) {
bridgeLog.DoActionAndLog(() => {
myBrowser.pageAction.hide(tabId);
}, "pageAction.hide");
}
setTitle(details) {
bridgeLog.DoActionAndLog(() => {
myBrowser.pageAction.setTitle(details);
}, "pageAction.setTitle");
}
setIcon(details, callback) {
bridgeLog.DoActionAndLog(() => {
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.pageAction.setIcon(details, callback);
}
else {
myBrowser.pageAction.setIcon(details, callback);
}
}, "pageAction.setIcon");
}
setPopup(details) {
bridgeLog.DoActionAndLog(() => {
myBrowser.pageAction.setPopup(details);
}, "pageAction.setPopup");
}
show(tabId) {
bridgeLog.DoActionAndLog(() => {
myBrowser.pageAction.show(tabId);
}, "pageAction.show");
}
}
class EdgePermissionsBridge {
get onAdded() { bridgeLog.LogUnavailbleApi("permissions.onAdded"); return bridgeHelper.fakeEvent; }
get onRemoved() { bridgeLog.LogUnavailbleApi("permissions.onRemoved"); return bridgeHelper.fakeEvent; }
contains(permissions, callback) {
bridgeLog.LogUnavailbleApi("permissions.contains");
}
getAll(callback) {
bridgeLog.LogUnavailbleApi("permissions.getAll");
}
remove(permissions, callback) {
bridgeLog.LogUnavailbleApi("permissions.remove");
}
request(permissions, callback) {
bridgeLog.LogUnavailbleApi("permissions.request");
}
}
class EdgeRuntimeBridge {
get id() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.id; }, "runtime.id"); }
get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "runtime.lastError"); }
get onConnect() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onConnect; }, "runtime.onConnect"); }
get onInstalled() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onInstalled; }, "runtime.onInstalled"); }
get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "runtime.onMessage"); }
get onMessageExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "runtime.onMessageExternal"); }
connect(extensionId, connectInfo) {
return bridgeLog.DoActionAndLog(() => {
if (typeof connectInfo !== "undefined" && typeof connectInfo !== "null") {
return myBrowser.runtime.connect(extensionId, connectInfo);
}
else {
return myBrowser.runtime.connect(extensionId);
}
}, "runtime.connect");
}
getBackgroundPage(callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.runtime.getBackgroundPage(callback);
}, "runtime.getBackgroundPage");
}
getManifest() {
return bridgeLog.DoActionAndLog(() => {
return myBrowser.runtime.getManifest();
}, "runtime.getManifest");
}
getURL(path) {
return bridgeLog.DoActionAndLog(() => {
return myBrowser.runtime.getURL(path);
}, "runtime.getURL");
}
sendMessage(extensionId, message, options, responseCallback) {
bridgeLog.DoActionAndLog(() => {
if (typeof responseCallback !== "undefined" && typeof responseCallback !== "null") {
myBrowser.runtime.sendMessage(extensionId, message, options, responseCallback);
}
else if (typeof options !== "undefined" && typeof options !== "null") {
myBrowser.runtime.sendMessage(extensionId, message, options);
}
else if (typeof message !== "undefined" && typeof message !== "null") {
myBrowser.runtime.sendMessage(extensionId, message);
}
else {
myBrowser.runtime.sendMessage(undefined, extensionId);
}
}, "runtime.sendMessage");
}
}
class EdgeChromeRuntimeBridge extends EdgeRuntimeBridge {
get onConnectExternal() { bridgeLog.LogUnavailbleApi("runtime.onConnectExternal"); return bridgeHelper.fakeEvent; }
get onRestartRequired() { bridgeLog.LogUnavailbleApi("runtime.onRestartRequired"); return bridgeHelper.fakeEvent; }
get onStartup() { bridgeLog.LogUnavailbleApi("runtime.onStartup"); return bridgeHelper.fakeEvent; }
get onSuspend() { bridgeLog.LogUnavailbleApi("runtime.onSuspend"); return bridgeHelper.fakeEvent; }
get onSuspendCanceled() { bridgeLog.LogUnavailbleApi("runtime.onSuspendCanceled"); return bridgeHelper.fakeEvent; }
get onUpdateAvailable() { bridgeLog.LogUnavailbleApi("runtime.onUpdateAvailable"); return bridgeHelper.fakeEvent; }
openOptionsPage(callback) {
bridgeLog.DoActionAndLog(() => {
var optionsPage = myBrowser.runtime.getManifest()["options_page"];
var optionsPageUrl = myBrowser.runtime.getURL(optionsPage);
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.tabs.create({ url: optionsPageUrl }, callback);
}
else {
myBrowser.tabs.create({ url: optionsPageUrl });
}
}, "runtime.openOptionsPage", undefined, "tabs.create({ url: optionsPageUrl })");
}
connectNative(application) {
bridgeLog.LogUnavailbleApi("runtime.connectNative");
return null;
}
getPackageDirectoryEntry(callback) {
bridgeLog.LogUnavailbleApi("runtime.getPackageDirectoryEntry");
}
getPlatformInfo(callback) {
bridgeLog.LogUnavailbleApi("runtime.getPlatformInfo");
}
reload() {
bridgeLog.LogUnavailbleApi("runtime.reload");
}
requestUpdateCheck(callback) {
bridgeLog.LogUnavailbleApi("runtime.requestUpdateCheck");
}
restart() {
bridgeLog.LogUnavailbleApi("runtime.restart");
}
setUninstallURL(url, callback) {
bridgeLog.LogUnavailbleApi("runtime.setUninstallURL");
}
sendNativeMessage(application, message, responseCallback) {
bridgeLog.LogUnavailbleApi("runtime.sendNativeMessage");
}
}
class EdgeStorageBridge {
get local() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.local"); }
get onChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.onChanged; }, "storage.onChanged"); }
}
class EdgeChromeStorageBridge extends EdgeStorageBridge {
get managed() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.managed", undefined, "storage.local"); }
get sync() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.sync", undefined, "storage.local"); }
}
class EdgeTabsBridge {
get onActivated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onActivated; }, "tabs.onActivated"); }
get onCreated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onCreated; }, "tabs.onCreated"); }
get onRemoved() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onRemoved; }, "tabs.onRemoved"); }
get onReplaced() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onReplaced; }, "tabs.onReplaced"); }
get onUpdated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onUpdated; }, "tabs.onUpdated"); }
create(createProperties, callback) {
bridgeLog.DoActionAndLog(() => {
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.tabs.create(createProperties, callback);
}
else {
myBrowser.tabs.create(createProperties);
}
}, "tabs.create");
}
detectLanguage(tabId, callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.tabs.detectLanguage(tabId, callback);
}, "tabs.detectLanguage");
}
executeScript(tabId, details, callback) {
bridgeLog.DoActionAndLog(() => {
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.tabs.executeScript(tabId, details, callback);
}
else {
myBrowser.tabs.executeScript(tabId, details);
}
}, "tabs.executeScript");
}
get(tabId, callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.tabs.get(tabId, callback);
}, "tabs.get");
}
getCurrent(callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.tabs.getCurrent(callback);
}, "tabs.getCurrent");
}
insertCSS(tabId, details, callback) {
bridgeLog.DoActionAndLog(() => {
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.tabs.insertCSS(tabId, details, callback);
}
else {
myBrowser.tabs.insertCSS(tabId, details);
}
}, "tabs.insertCSS");
}
query(queryInfo, callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.tabs.query(queryInfo, callback);
}, "tabs.query");
}
remove(tabId, callback) {
bridgeLog.DoActionAndLog(() => {
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.tabs.remove(tabId, callback);
}
else {
myBrowser.tabs.remove(tabId);
}
}, "tabs.remove");
}
sendMessage(tabId, message, responseCallback) {
bridgeLog.DoActionAndLog(() => {
if (typeof responseCallback !== "undefined" && typeof responseCallback !== "null") {
myBrowser.tabs.sendMessage(tabId, message, responseCallback);
}
else {
myBrowser.tabs.sendMessage(tabId, message);
}
}, "tabs.sendMessage");
}
update(tabId, updateProperties, callback) {
bridgeLog.DoActionAndLog(() => {
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.tabs.update(tabId, updateProperties, callback);
}
else {
myBrowser.tabs.update(tabId, updateProperties);
}
}, "tabs.update");
}
}
class EdgeChromeTabsBridge extends EdgeTabsBridge {
get onAttached() { bridgeLog.LogUnavailbleApi("tabs.onAttached"); return bridgeHelper.fakeEvent; }
get onDetached() { bridgeLog.LogUnavailbleApi("tabs.onDetached"); return bridgeHelper.fakeEvent; }
get onHighlighted() { bridgeLog.LogUnavailbleApi("tabs.onHighlighted"); return bridgeHelper.fakeEvent; }
get onMoved() { bridgeLog.LogUnavailbleApi("tabs.onMoved"); return bridgeHelper.fakeEvent; }
get onSelectionChanged() {
return bridgeLog.DoActionAndLog(() => {
var fakeEvent = bridgeHelper.fakeEvent;
fakeEvent.addListener = (callback) => {
myBrowser.tabs.onActivated.addListener((activeInfo) => {
callback(activeInfo.tabId, { windowId: activeInfo.windowId });
});
};
return fakeEvent;
}, "tabs.onSelectionChanged", "tabs.onActivated", "tabs.onActivated");
}
duplicate(tabId, callback) {
bridgeLog.DoActionAndLog(() => {
this.get(tabId, function (tab) {
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.tabs.create({ url: tab.url }, callback);
}
else {
myBrowser.tabs.create({ url: tab.url });
}
});
}, "tabs.duplicate", undefined, "tabs.create");
}
getAllInWindow(windowId, callback) {
bridgeLog.DoActionAndLog(() => {
this.query({ windowId: windowId }, callback);
}, "tabs.getAllInWindow", "tabs.query", "tabs.query");
}
getSelected(windowId, callback) {
bridgeLog.DoActionAndLog(() => {
this.query({ active: true }, (tabs) => callback(tabs[0]));
}, "tabs.getSelected", "tabs.query", "tabs.query");
}
sendRequest(tabId, request, responseCallback) {
bridgeLog.DoActionAndLog(() => {
this.sendMessage(tabId, request, responseCallback);
}, "tabs.sendRequest", "tabs.sendMessage", "tabs.sendMessage");
}
captureVisibleTab(windowId, options, callback) {
bridgeLog.LogUnavailbleApi("tabs.captureVisibleTab");
}
connect(tabId, connectInfo) {
bridgeLog.LogUnavailbleApi("tabs.connect");
return null;
}
highlight(highlightInfo, callback) {
bridgeLog.LogUnavailbleApi("tabs.highlight");
}
move(tabId, moveProperties, callback) {
bridgeLog.LogUnavailbleApi("tabs.move");
}
reload(tabId, reloadProperties, callback) {
bridgeLog.LogUnavailbleApi("tabs.reload");
}
}
class EdgeWebNavigationBridge {
get onBeforeNavigate() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onBeforeNavigate; }, "webNavigation.onBeforeNavigate"); }
get onCommitted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onCommitted; }, "webNavigation.onCommitted"); }
get onCompleted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onCompleted; }, "webNavigation.onCompleted"); }
get onCreatedNavigationTarget() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onCreatedNavigationTarget; }, "webNavigation.onCreatedNavigationTarget"); }
get onDOMContentLoaded() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onDOMContentLoaded; }, "webNavigation.onDOMContentLoaded"); }
get onErrorOccurred() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onErrorOccurred; }, "webNavigation.onErrorOccurred"); }
get onHistoryStateUpdated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onHistoryStateUpdated; }, "webNavigation.onHistoryStateUpdated"); }
get onReferenceFragmentUpdated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onReferenceFragmentUpdated; }, "webNavigation.onReferenceFragmentUpdated"); }
get onTabReplaced() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onTabReplaced; }, "webNavigation.onTabReplaced"); }
getAllFrames(details, callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.webNavigation.getAllFrames(details, callback);
}, "webNavigation.getAllFrames");
}
getFrame(details, callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.webNavigation.getFrame(details, callback);
}, "webNavigation.getFrame");
}
}
class EdgeWebRequestBridge {
get MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES; }, "webNavigation.MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES"); }
get onAuthRequired() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onAuthRequired; }, "webNavigation.onAuthRequired"); }
get onBeforeRedirect() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onBeforeRedirect; }, "webNavigation.onBeforeRedirect"); }
get onBeforeRequest() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onBeforeRequest; }, "webNavigation.onBeforeRequest"); }
get onBeforeSendHeaders() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onBeforeSendHeaders; }, "webNavigation.onBeforeSendHeaders"); }
get onCompleted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onCompleted; }, "webNavigation.onCompleted"); }
get onErrorOccurred() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onErrorOccurred; }, "webNavigation.onErrorOccurred"); }
get onHeadersReceived() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onHeadersReceived; }, "webNavigation.onHeadersReceived"); }
get onResponseStarted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onResponseStarted; }, "webNavigation.onResponseStarted"); }
get onSendHeaders() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onSendHeaders; }, "webNavigation.onSendHeaders"); }
handlerBehaviorChanged(callback) {
bridgeLog.DoActionAndLog(() => {
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.webRequest.handlerBehaviorChanged(callback);
}
else {
myBrowser.webRequest.handlerBehaviorChanged();
}
}, "webRequest.handlerBehaviorChanged");
}
}
class EdgeWindowsBridge {
get WINDOW_ID_CURRENT() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.WINDOW_ID_CURRENT; }, "windows.WINDOW_ID_CURRENT"); }
get WINDOW_ID_NONE() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.WINDOW_ID_NONE; }, "windows.WINDOW_ID_NONE"); }
get onCreated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onCreated; }, "windows.onCreated"); }
get onFocusChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onFocusChanged; }, "windows.onFocusChanged"); }
get onRemoved() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onRemoved; }, "windows.onRemoved"); }
create(createData, callback) {
bridgeLog.DoActionAndLog(() => {
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.windows.create(createData, callback);
}
else {
myBrowser.windows.create(createData);
}
}, "windows.create");
}
get(windowId, getInfo, callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.windows.get(windowId, getInfo, callback);
}, "windows.get");
}
getAll(getInfo, callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.windows.getAll(getInfo, callback);
}, "windows.getAll");
}
getCurrent(getInfo, callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.windows.getCurrent(getInfo, callback);
}, "windows.getCurrent");
}
getLastFocused(getInfo, callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.windows.getLastFocused(getInfo, callback);
}, "windows.getLastFocused");
}
update(windowId, updateInfo, callback) {
bridgeLog.DoActionAndLog(() => {
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.windows.update(windowId, updateInfo, callback);
}
else {
myBrowser.windows.update(windowId, updateInfo);
}
}, "windows.update");
}
}
class EdgeChromeWindowsBridge extends EdgeWindowsBridge {
remove(windowId, callback) {
bridgeLog.LogUnavailbleApi("windows.remove");
}
}
class EdgeBackgroundBridge {
constructor() {
this.app = new EdgeChromeAppBridge();
this.browserAction = typeof browser.browserAction !== "undefined" ? new EdgeChromeBrowserActionBridge() : undefined;
this.contextMenus = typeof browser.contextMenus !== "undefined" ? new EdgeContextMenusBridge() : undefined;
this.cookies = typeof browser.cookies !== "undefined" ? new EdgeChromeCookiesBridge() : undefined;
this.extension = typeof browser.extension !== "undefined" ? new EdgeChromeExtensionBridge() : undefined;
this.history = typeof browser.history !== "undefined" ? new EdgeHistoryBridge() : undefined;
this.i18n = typeof browser.i18n !== "undefined" ? new EdgeI18nBridge() : undefined;
this.notifications = typeof browser.notifications !== "undefined" ? new EdgeNotificationBridge() : undefined;
this.pageAction = typeof browser.pageAction !== "undefined" ? new EdgePageActionBridge() : undefined;
this.permissions = typeof browser.permissions !== "undefined" ? new EdgePermissionsBridge() : undefined;
this.runtime = typeof browser.runtime !== "undefined" ? new EdgeChromeRuntimeBridge() : undefined;
this.storage = typeof browser.storage !== "undefined" ? new EdgeChromeStorageBridge() : undefined;
this.tabs = typeof browser.tabs !== "undefined" ? new EdgeChromeTabsBridge() : undefined;
this.webNavigation = typeof browser.webNavigation !== "undefined" ? new EdgeWebNavigationBridge() : undefined;
this.webRequest = typeof browser.webRequest !== "undefined" ? new EdgeWebRequestBridge() : undefined;
this.windows = typeof browser.windows !== "undefined" ? new EdgeChromeWindowsBridge() : undefined;
}
}
var myBrowser = browser;
var chrome = new EdgeBackgroundBridge();

@ -0,0 +1,323 @@
if (!Range.prototype["intersectsNode"]) {
Range.prototype["intersectsNode"] = function (node) {
let range = document.createRange();
range.selectNode(node);
return 0 > this.compareBoundaryPoints(Range.END_TO_START, range)
&& 0 < this.compareBoundaryPoints(Range.START_TO_END, range);
};
}
var getExtensionProtocol = function () {
if (typeof browser == "undefined") {
if (typeof chrome !== "undefined")
return "chrome-extension://";
}
else {
return "ms-browser-extension://";
}
};
class FakeEvent {
addListener(callback) { }
addRules(rules, callback) { }
getRules(ruleIdentifiers, callback) { }
hasListener(callback) { return false; }
hasListeners() { return false; }
removeRules(ruleIdentifiers, callback) { }
removeListener(callback) { }
}
class EdgeBridgeHelper {
constructor() {
this.fakeEvent = new FakeEvent();
}
toAbsolutePath(relativePath) {
if (relativePath.indexOf("ms-browser-extension://") == 0) {
return relativePath.replace(myBrowser.runtime.getURL(""), "");
}
else if (relativePath.indexOf("/") != 0) {
var absolutePath = "";
var documentPath = document.location.pathname;
absolutePath = documentPath.substring(0, documentPath.lastIndexOf("/") + 1);
absolutePath += relativePath;
return absolutePath;
}
return relativePath;
}
}
var bridgeHelper = new EdgeBridgeHelper();
class EdgeBridgeDebugLog {
constructor() {
this.CatchOnException = true;
this.VerboseLogging = true;
this.FailedCalls = {};
this.SuccededCalls = {};
this.DeprecatedCalls = {};
this.BridgedCalls = {};
this.UnavailableApis = {};
this.EdgeIssues = {};
}
log(message) {
try {
if (this.VerboseLogging) {
console.log(message);
}
}
catch (e) {
}
}
info(message) {
try {
if (this.VerboseLogging) {
console.info(message);
}
}
catch (e) {
}
}
warn(message) {
try {
if (this.VerboseLogging) {
console.warn(message);
}
}
catch (e) {
}
}
error(message) {
try {
if (this.VerboseLogging) {
console.error(message);
}
}
catch (e) {
}
}
DoActionAndLog(action, name, deprecatedTo, bridgedTo) {
var result;
try {
result = action();
this.AddToCalledDictionary(this.SuccededCalls, name);
if (typeof deprecatedTo !== "undefined" && typeof deprecatedTo !== "null") {
this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!");
this.AddToCalledDictionary(this.DeprecatedCalls, name);
}
if (typeof bridgedTo !== "undefined" && typeof bridgedTo !== "null") {
this.info("API Call '" + name + "' has been bridged to another Edge API: " + bridgedTo);
this.AddToCalledDictionary(this.BridgedCalls, name);
}
return result;
}
catch (ex) {
this.AddToCalledDictionary(this.FailedCalls, name);
if (this.CatchOnException)
this.error("API Call Failed: " + name + " - " + ex);
else
throw ex;
}
}
LogEdgeIssue(name, message) {
this.warn(message);
this.AddToCalledDictionary(this.EdgeIssues, name);
}
LogUnavailbleApi(name, deprecatedTo) {
this.warn("API Call '" + name + "' is not supported in Edge");
this.AddToCalledDictionary(this.UnavailableApis, name);
if (typeof deprecatedTo !== "undefined" && typeof deprecatedTo !== "null") {
this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!");
this.AddToCalledDictionary(this.DeprecatedCalls, name);
}
}
AddToCalledDictionary(dictionary, name) {
if (typeof dictionary[name] !== "undefined") {
dictionary[name]++;
}
else {
dictionary[name] = 1;
}
}
}
var bridgeLog = new EdgeBridgeDebugLog();
class EdgeExtensionBridge {
getBackgroundPage() {
return bridgeLog.DoActionAndLog(() => {
return myBrowser.extension.getBackgroundPage();
}, "extension.getBackgroundPage");
}
getURL(path) {
return bridgeLog.DoActionAndLog(() => {
return myBrowser.extension.getURL(path);
}, "extension.getURL");
}
getViews(fetchProperties) {
return bridgeLog.DoActionAndLog(() => {
return myBrowser.extension.getViews(fetchProperties);
}, "extension.getViews");
}
}
class EdgeChromeExtensionBridge extends EdgeExtensionBridge {
get onConnect() { return bridgeLog.DoActionAndLog(() => { return EdgeRuntimeBridge.prototype.onConnect; }, "extension.onConnect", "runtime.onConnect", "runtime.onConnect"); }
get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onMessage", "runtime.onMessage", "runtime.onMessage"); }
get onRequest() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onRequest", "runtime.onMessage", "runtime.onMessage"); }
get onRequestExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "extension.onRequestExternal", "runtime.onMessageExternal", "runtime.onMessageExternal"); }
get inIncognitoContext() { return bridgeLog.DoActionAndLog(() => { return myBrowser.extension["inPrivateContext"]; }, "extension.inIncognitoContext", undefined, "extension.inPrivateContext"); }
get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "extension.lastError", undefined, "runtime.lastError"); }
connect(extensionId, connectInfo) {
return bridgeLog.DoActionAndLog(() => {
return EdgeRuntimeBridge.prototype.connect(extensionId, connectInfo);
}, "extension.connect", "runtime.connect", "runtime.connect");
}
sendMessage(message, responseCallback) {
return bridgeLog.DoActionAndLog(() => {
return EdgeRuntimeBridge.prototype.sendMessage(message, responseCallback, undefined, undefined);
}, "extension.sendMessage", "runtime.sendMessage", "runtime.sendMessage");
}
sendRequest(extensionId, message, options, responseCallback) {
return bridgeLog.DoActionAndLog(() => {
return EdgeRuntimeBridge.prototype.sendMessage(extensionId, message, options, responseCallback);
}, "extension.sendRequest", "runtime.sendMessage", "runtime.sendMessage");
}
isAllowedFileSchemeAccess(callback) {
bridgeLog.LogUnavailbleApi("extension.isAllowedFileSchemeAccess");
}
isAllowedIncognitoAccess(callback) {
bridgeLog.LogUnavailbleApi("extension.isAllowedIncognitoAccess");
}
setUpdateUrlData(data) {
bridgeLog.LogUnavailbleApi("extension.setUpdateUrlData");
}
}
class EdgeI18nBridge {
getAcceptLanguages(callback) {
return bridgeLog.DoActionAndLog(() => {
return myBrowser.i18n.getAcceptLanguages(callback);
}, "i18n.getAcceptLanguages");
}
getMessage(messageName, substitutions) {
return bridgeLog.DoActionAndLog(() => {
if (messageName.indexOf("@@extension_id") > -1) {
return myBrowser.runtime.id;
}
if (typeof substitutions !== "undefined" && typeof substitutions !== "null") {
return myBrowser.i18n.getMessage(messageName, substitutions);
}
else {
return myBrowser.i18n.getMessage(messageName);
}
}, "i18n.getMessage");
}
getUILanguage() {
return bridgeLog.DoActionAndLog(() => {
return myBrowser.i18n.getUILanguage();
}, "i18n.getUILanguage");
}
}
class EdgeRuntimeBridge {
get id() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.id; }, "runtime.id"); }
get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "runtime.lastError"); }
get onConnect() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onConnect; }, "runtime.onConnect"); }
get onInstalled() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onInstalled; }, "runtime.onInstalled"); }
get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "runtime.onMessage"); }
get onMessageExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "runtime.onMessageExternal"); }
connect(extensionId, connectInfo) {
return bridgeLog.DoActionAndLog(() => {
if (typeof connectInfo !== "undefined" && typeof connectInfo !== "null") {
return myBrowser.runtime.connect(extensionId, connectInfo);
}
else {
return myBrowser.runtime.connect(extensionId);
}
}, "runtime.connect");
}
getBackgroundPage(callback) {
bridgeLog.DoActionAndLog(() => {
myBrowser.runtime.getBackgroundPage(callback);
}, "runtime.getBackgroundPage");
}
getManifest() {
return bridgeLog.DoActionAndLog(() => {
return myBrowser.runtime.getManifest();
}, "runtime.getManifest");
}
getURL(path) {
return bridgeLog.DoActionAndLog(() => {
return myBrowser.runtime.getURL(path);
}, "runtime.getURL");
}
sendMessage(extensionId, message, options, responseCallback) {
bridgeLog.DoActionAndLog(() => {
if (typeof responseCallback !== "undefined" && typeof responseCallback !== "null") {
myBrowser.runtime.sendMessage(extensionId, message, options, responseCallback);
}
else if (typeof options !== "undefined" && typeof options !== "null") {
myBrowser.runtime.sendMessage(extensionId, message, options);
}
else if (typeof message !== "undefined" && typeof message !== "null") {
myBrowser.runtime.sendMessage(extensionId, message);
}
else {
myBrowser.runtime.sendMessage(undefined, extensionId);
}
}, "runtime.sendMessage");
}
}
class EdgeChromeRuntimeBridge extends EdgeRuntimeBridge {
get onConnectExternal() { bridgeLog.LogUnavailbleApi("runtime.onConnectExternal"); return bridgeHelper.fakeEvent; }
get onRestartRequired() { bridgeLog.LogUnavailbleApi("runtime.onRestartRequired"); return bridgeHelper.fakeEvent; }
get onStartup() { bridgeLog.LogUnavailbleApi("runtime.onStartup"); return bridgeHelper.fakeEvent; }
get onSuspend() { bridgeLog.LogUnavailbleApi("runtime.onSuspend"); return bridgeHelper.fakeEvent; }
get onSuspendCanceled() { bridgeLog.LogUnavailbleApi("runtime.onSuspendCanceled"); return bridgeHelper.fakeEvent; }
get onUpdateAvailable() { bridgeLog.LogUnavailbleApi("runtime.onUpdateAvailable"); return bridgeHelper.fakeEvent; }
openOptionsPage(callback) {
bridgeLog.DoActionAndLog(() => {
var optionsPage = myBrowser.runtime.getManifest()["options_page"];
var optionsPageUrl = myBrowser.runtime.getURL(optionsPage);
if (typeof callback !== "undefined" && typeof callback !== "null") {
myBrowser.tabs.create({ url: optionsPageUrl }, callback);
}
else {
myBrowser.tabs.create({ url: optionsPageUrl });
}
}, "runtime.openOptionsPage", undefined, "tabs.create({ url: optionsPageUrl })");
}
connectNative(application) {
bridgeLog.LogUnavailbleApi("runtime.connectNative");
return null;
}
getPackageDirectoryEntry(callback) {
bridgeLog.LogUnavailbleApi("runtime.getPackageDirectoryEntry");
}
getPlatformInfo(callback) {
bridgeLog.LogUnavailbleApi("runtime.getPlatformInfo");
}
reload() {
bridgeLog.LogUnavailbleApi("runtime.reload");
}
requestUpdateCheck(callback) {
bridgeLog.LogUnavailbleApi("runtime.requestUpdateCheck");
}
restart() {
bridgeLog.LogUnavailbleApi("runtime.restart");
}
setUninstallURL(url, callback) {
bridgeLog.LogUnavailbleApi("runtime.setUninstallURL");
}
sendNativeMessage(application, message, responseCallback) {
bridgeLog.LogUnavailbleApi("runtime.sendNativeMessage");
}
}
class EdgeStorageBridge {
get local() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.local"); }
get onChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.onChanged; }, "storage.onChanged"); }
}
class EdgeChromeStorageBridge extends EdgeStorageBridge {
get managed() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.managed", undefined, "storage.local"); }
get sync() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.sync", undefined, "storage.local"); }
}
class EdgeContentBridge {
constructor() {
this.extension = typeof browser.extension !== "undefined" ? new EdgeChromeExtensionBridge() : undefined;
this.i18n = typeof browser.i18n !== "undefined" ? new EdgeI18nBridge() : undefined;
this.runtime = typeof browser.runtime !== "undefined" ? new EdgeChromeRuntimeBridge() : undefined;
this.storage = typeof browser.storage !== "undefined" ? new EdgeChromeStorageBridge() : undefined;
}
}
var myBrowser = browser;
var chrome = new EdgeContentBridge();

@ -1,784 +0,0 @@
'use strict';
(function() {
function isChrome() {
return (typeof chrome !== 'undefined' &&
window.navigator.userAgent.match(/Chrom(?:e|ium)\/([0-9\.]+)/));
}
var browserProxy;
if ( isChrome() ) {
browserProxy = chrome;
} else {
browserProxy = browser;
}
var MIN_FF_MAJOR_VERSION = 51;
var requiredBrowserApis = [
browserProxy.webNavigation,
browserProxy.tabs,
browserProxy.webRequest,
browserProxy.runtime
];
var areListenersRegistered = false;
var secBefore = 2000;
var secAfter = 5000;
var secBetweenDupAssets = 10e3;
var minVidSize = 500e3;
var maxVidSize = 25e6;
var maxContentRange = 25e6;
var videoExtensions = [
'af', '3gp', 'asf', 'avchd', 'avi', 'cam', 'dsh', 'flv', 'm1v', 'm2v',
'fla', 'flr', 'sol', 'm4v', 'mkv', 'wrap', 'mng', 'mov', 'mpeg', 'mpg',
'mpe', 'mp4', 'mxf', 'nsv', 'ogg', 'rm', 'svi', 'smi', 'wmv', 'webm'
];
var extensionsReg = new RegExp('\\.' + videoExtensions.join('$|\\.') + '$');
var videoContentTypesPrefixes = ['binary/octet-stream', 'video/', 'flv-application/', 'media'];
var bannedContentTypes = ['video/mp2t','video/f4m','video/f4f'];
var bannedFiletypes = ['ts'];
var bannedFiletypesReg = new RegExp('\\.' + bannedFiletypes.join('$|\\.') + '$');
var whitelistReqTypes = ['object', 'xmlhttprequest', 'other'];
var topVideoAssetDomains = [
'2mdn.net',
'adap.tv',
'adnxs.com',
'adsrvr.org',
'btrll.com',
'celtra.com',
'flashtalking.com',
'flite.com',
'innovid.com',
'jivox.com',
'mixpo.com',
'nytimes.com',
'playwire.com',
'selectmedia.asia',
'serving-sys.com',
'solvemedia.com',
'spotible.com',
'teads.tv',
'tribalfusion.com',
'tubemogul.com',
'videologygroup.com',
'washingtonpost.com'
];
if ( !String.prototype.endsWith ) {
String.prototype.endsWith = function(searchString, position) {
var subjectString = this.toString();
if ( typeof position !== 'number' || !isFinite(position) ||
Math.floor(position) !== position || position > subjectString.length) {
position = subjectString.length;
}
position -= searchString.length;
var lastIndex = subjectString.indexOf(searchString, position);
return lastIndex !== -1 && lastIndex === position;
};
}
function getFrame(getFrameDetails, callback) {
if ( typeof chrome !== 'undefined' ) {
chrome.webNavigation.getFrame(getFrameDetails, callback);
} else if ( typeof browser !== 'undefined' ) {
var gettingFrame = browser.webNavigation.getFrame(getFrameDetails);
gettingFrame.then(callback);
}
}
function ifBrowserValid(callback, elseCallback) {
if ( isChrome() ) {
callback();
} else if ( typeof browser !== 'undefined' ) {
try {
var gettingInfo = browser.runtime.getBrowserInfo();
gettingInfo.then(function(browserInfo) {
var browserVersion = parseInt(browserInfo.version.split('.')[0]);
if ( browserInfo.name === 'Firefox' &&
browserVersion >= MIN_FF_MAJOR_VERSION) {
callback();
} else {
elseCallback();
}
});
} catch (err) {
elseCallback();
}
} else {
elseCallback();
}
}
function isTrackingEnabled() {
return parseInt(localStorage.tracking, 10);
}
function isPixelRequest(request) {
return (request.type === 'image' || request.responseStatus === 204) &&
request.size <= 1000;
}
function isVpaidOrVastRequest(request) {
var lowerCaseUrl = request.url.toLowerCase();
return lowerCaseUrl.indexOf('vpaid') !== -1 || lowerCaseUrl.indexOf('vast') !== -1;
}
function hasValidRequestType(request) {
return whitelistReqTypes.indexOf(request.type) >= 0;
}
function stripQueryParams(url) {
return url.split('?', 1)[0];
}
function parseHostnameFromUrl(url) {
var parser = document.createElement('a');
parser.href = url;
return parser.hostname;
}
function hasDomain(url, domain) {
return parseHostnameFromUrl(url).endsWith(domain);
}
function findHeader(headers, key) {
var header;
for ( var i = 0; i < headers.length; i += 1 ) {
header = headers[i];
if ( header.name.toLowerCase() === key ) {
return header;
}
}
return null;
}
function validVideoType(vtype) {
var goodType = videoContentTypesPrefixes.some(function(prefix) {
return vtype.indexOf(prefix) === 0;
});
return goodType;
}
function assetMsgKey(assetReq) {
var url = stripQueryParams(assetReq.url);
var key = assetReq.frameId + '-' + url;
return key;
}
var PageNetworkTrafficCollector = function(tabId) {
this.tabId = tabId;
this.displayAdFound = false;
this.requests = {};
this.msgsBeingSent = {};
this.assetsSeen = {};
this.allRedirects = {};
};
var globalPageContainer = {
collectors: {},
dyingCollectors: {},
cleanupCollector: function(tabId) {
if ( tabId in this.collectors ) {
delete globalPageContainer.collectors[tabId];
}
},
onNewNavigation: function(details) {
var tabId = details.tabId;
this.cleanupCollector(tabId);
if ( isTrackingEnabled() ) {
if ( !areListenersRegistered ) {
registerListeners();
}
this.collectors[tabId] = new PageNetworkTrafficCollector(tabId);
} else {
if ( areListenersRegistered ) {
unregisterListeners();
}
}
},
onNavigationCommitted: function(details) {
},
onNavigationCompleted: function(details) {
},
onTabClose: function(tabId, closeInfo) {
this.cleanupCollector(tabId);
delete this.collectors[tabId];
},
onDisplayAdFound: function(tabId) {
this.collectors[tabId].displayAdFound = true;
},
getRandId: function() {
return String(Math.floor(Math.random() * 1e9));
},
getCollector: function(tabId) {
if ( this.collectors.hasOwnProperty(tabId) ) {
return this.collectors[tabId];
}
return null;
},
forwardCall: function(details, collectorMemberFunction) {
var collector = this.getCollector(details.tabId);
if ( collector !== null ) {
collectorMemberFunction.apply(collector, [details]);
}
}
};
PageNetworkTrafficCollector.prototype.sendLogMessageToTabConsole = function() {
var logMessage = Array.from(arguments).join(' ');
var message = {message: logMessage, event: 'console-log-message'};
browserProxy.tabs.sendMessage(this.tabId, message);
};
PageNetworkTrafficCollector.prototype.sendToTab = function(assetReq, reqs, curPageUrl, isValidAd) {
var msg = {};
msg.assets = [];
msg.event_data = {};
if ( isValidAd ) {
msg.event = 'new-video-ad';
msg.requests = reqs;
msg.requests.sort(function(reqA, reqB) {return reqA.requestTimestamp - reqB.requestTimestamp;});
if ( assetReq ) {
msg.assets = [assetReq];
}
} else {
msg.requests = reqs.map(function(request) {
return parseHostnameFromUrl(request.url);
});
msg.assets = [{
url: parseHostnameFromUrl(assetReq.url),
contentType: assetReq.contentType,
size: assetReq.size
}];
msg.event = 'new-invalid-video-ad';
}
msg.origUrl = curPageUrl;
msg.displayAdFound = this.displayAdFound;
browserProxy.tabs.sendMessage(this.tabId, msg);
};
PageNetworkTrafficCollector.prototype.getRedirKey = function(url, frameId) {
return url + ':' + frameId;
};
PageNetworkTrafficCollector.prototype.seenBefore = function(request) {
var oldTime = this.assetsSeen[assetMsgKey(request)];
if ( oldTime && (request.requestTimestamp-oldTime < secBetweenDupAssets)){
return true;
}
return false;
};
PageNetworkTrafficCollector.prototype.recordSeenAsset = function(request) {
this.assetsSeen[assetMsgKey(request)] = request.requestTimestamp;
};
PageNetworkTrafficCollector.prototype.onBeforeRequest = function(details) {
var req = {
url: details.url,
type: details.type,
httpMethod: details.method,
frameId: details.frameId,
parentFrameId: details.parentFrameId,
requestTimestamp: details.timeStamp,
};
this.requests[details.requestId] = req;
};
PageNetworkTrafficCollector.prototype.onSendHeaders = function(details) {
var request, header;
request = this.requests[details.requestId];
header = request && findHeader(details.requestHeaders, 'x-requested-with');
if ( header && header.value.toLowerCase().indexOf('flash') > -1 ) {
request.from_flash = true;
}
};
PageNetworkTrafficCollector.prototype.onHeadersReceived = function(details) {
var getFrameDetails = {
tabId: details.tabId,
processId: null,
frameId: details.frameId
};
var pageNetworkTrafficController = this;
getFrame(getFrameDetails, function(frameDetails) {
if ( frameDetails && frameDetails.url ) {
pageNetworkTrafficController._onHeadersReceived(details, frameDetails);
}
});
};
PageNetworkTrafficCollector.prototype._onHeadersReceived = function(details, frameDetails) {
var contentSize, contentRange;
var request = this.requests[details.requestId];
if ( request ) {
var redirParent = this.allRedirects[this.getRedirKey(details.url, details.frameId)];
var header = request && findHeader(details.responseHeaders, 'content-type');
var contentType = header && header.value.toLowerCase();
if ( contentType){
request.contentType = contentType;
}
header = request && findHeader(details.responseHeaders, 'content-length');
contentSize = header && header.value;
if ( contentSize ) {
request.size = request.size || 0;
request.size += parseInt(contentSize);
}
header = request && findHeader(details.responseHeaders, 'content-range');
contentRange = header && header.value;
if ( contentRange ) {
request.contentRange = parseInt(contentRange.split('/')[1]);
}
var frameUrl = null;
if ( frameDetails && frameDetails.url ) {
frameUrl = frameDetails.url;
}
if ( !this.bannedRequest(request) &&
(this.isVideoReq(frameUrl, request) || (redirParent && redirParent.isVideo))) {
request.isVideo = true;
}
}
};
PageNetworkTrafficCollector.prototype.onBeforeRedirect = function(details) {
var request = this.requests[details.requestId];
if ( request ) {
if ( request.redirects ) {
request.redirects.push(details.redirectUrl);
} else {
request.redirects = [details.redirectUrl];
}
this.allRedirects[this.getRedirKey(details.redirectUrl, details.frameId)] = request;
}
};
PageNetworkTrafficCollector.prototype.isYoutubeMastheadRequest = function(url) {
var re = /video_masthead/;
return this.hasYoutubeDomain(url) && re.test(url);
};
PageNetworkTrafficCollector.prototype.isYoutubeVideoRequest = function(srcUrl, destUrl) {
if ( !this.hasYoutubeDomain(srcUrl) ) {
return false;
}
var re = /https?:\/\/r.*?\.googlevideo\.com\/videoplayback\?/;
return re.test(destUrl);
};
PageNetworkTrafficCollector.prototype.processResponse = function(requestDetails, frameDetails) {
var request;
if ( requestDetails ) {
request = this.requests[requestDetails.requestId];
if ( request ) {
request.responseStatus = requestDetails.statusCode;
request.responseTimestamp = requestDetails.timeStamp;
var frameUrl = null;
if ( frameDetails && frameDetails.url ) {
frameUrl = frameDetails.url;
}
var requestUrl = null;
if ( request.url ) {
requestUrl = request.url;
}
if ( this.isYoutubeAdReq(frameUrl, requestUrl) ) {
var videoId = this.parseYoutubeVideoIdFromUrl(requestUrl);
if ( videoId ) {
request.isYoutubeAd = true;
request.isVideo = true;
request.url = 'https://www.youtube.com/watch?v=' + this.parseYoutubeVideoIdFromUrl(requestUrl);
}
} else if ( !this.bannedRequest(request) &&
(this.isVideo || this.isVideoReq(frameUrl, request))) {
request.isVideo = true;
}
if ( request.isVideo ) {
var msgKey = assetMsgKey(request);
this.msgsBeingSent[msgKey] = request;
if ( !this.seenBefore(request) ) {
this.sendMsgWhenQuiet(msgKey);
}
this.recordSeenAsset(request);
}
}
}
};
PageNetworkTrafficCollector.prototype.onResponseStarted = function(responseDetails) {
if ( responseDetails.frameId < 0 ) {
responseDetails.frameId = 99999;
}
var getFrameDetails = {
tabId: responseDetails.tabId,
processId: null,
frameId: responseDetails.frameId
};
var pageNetworkTrafficController = this;
getFrame(getFrameDetails, function(frameDetails) {
if ( frameDetails && frameDetails.url ) {
pageNetworkTrafficController.processResponse(responseDetails, frameDetails);
}
});
};
PageNetworkTrafficCollector.prototype.hasBannedFiletype = function(request) {
var url = stripQueryParams(request.url);
if ( bannedFiletypesReg.exec(url) ) {
return true;
} else {
return false;
}
};
PageNetworkTrafficCollector.prototype.checkContentHeaders = function(request) {
if ( request.contentType && validVideoType(request.contentType) ) {
return true;
}
return false;
};
PageNetworkTrafficCollector.prototype.checkUrlExtension = function(request) {
var url = stripQueryParams(request.url);
if ( extensionsReg.exec(url) ) {
return true;
} else {
return false;
}
};
PageNetworkTrafficCollector.prototype.isVideoReq = function(srcUrl, request) {
if ( this.isYoutubeVideoRequest(srcUrl, request.url) ) {
return false;
}
return this.checkUrlExtension(request) || this.checkContentHeaders(request);
};
PageNetworkTrafficCollector.prototype.hasYoutubeDomain = function(url) {
var hostname = parseHostnameFromUrl(url) ;
if ( hostname === 'www.youtube.com' ) {
return true;
}
return false;
};
PageNetworkTrafficCollector.prototype.parseYoutubeVideoIdFromUrl = function(url) {
var re = /^https?:\/\/www\.youtube\.com\/get_video_info.*(?:\?|&)video_id=(.*?)(?:$|&)/;
var match = re.exec(url);
if ( match && match.length > 1 ) {
return match[1];
}
re = /^https?:\/\/www\.youtube\.com\/embed\/(.*?)(?:$|\?)/;
match = re.exec(url);
if ( match && match.length > 1 ) {
return match[1];
}
re = /^https?:\/\/www\.youtube\.com\/watch\?v=(.*$)/;
match = re.exec(url);
if ( match && match.length > 1 ) {
return match[1];
}
return null;
};
PageNetworkTrafficCollector.prototype.isYoutubeGetVideoInfoReq = function(url) {
var re = /^https?:\/\/www\.youtube\.com\/get_video_info\?/;
return re.test(url);
};
PageNetworkTrafficCollector.prototype.isYoutubeAdReq = function(srcUrl, destUrl) {
if ( !this.hasYoutubeDomain(srcUrl) ||
!this.isYoutubeGetVideoInfoReq(destUrl)) {
return false;
}
if ( this.parseYoutubeVideoIdFromUrl(srcUrl) ===
this.parseYoutubeVideoIdFromUrl(destUrl) &&
!this.isYoutubeMastheadRequest(destUrl)) {
return false;
}
return true;
};
PageNetworkTrafficCollector.prototype.bannedRequest = function(request) {
return this.bannedVideoType(request) || this.hasBannedFiletype(request) || this.bannedVideoSize(request);
};
PageNetworkTrafficCollector.prototype.bannedVideoType = function(request) {
var badType = false;
if ( request.contentType ) {
badType = bannedContentTypes.some(function(prefix) {
return request.contentType.indexOf(prefix) >= 0;
});
}
return badType;
};
PageNetworkTrafficCollector.prototype.bannedVideoSize = function(request) {
if ( request.size !== null ) {
if ( request.size < minVidSize || request.size > maxVidSize || request.contentRange > maxContentRange ) {
return true;
}
}
return false;
};
PageNetworkTrafficCollector.prototype.grabTagReqs = function(tabRequests, assetRequest) {
var minTimestamp, maxTimestamp;
minTimestamp = assetRequest.requestTimestamp - secBefore;
maxTimestamp = assetRequest.requestTimestamp + secAfter;
var filteredRequests = tabRequests.filter(function(request) {
return (request.requestTimestamp > minTimestamp &&
request.requestTimestamp < maxTimestamp &&
request.frameId === assetRequest.frameId &&
request.url !== assetRequest.url &&
(hasValidRequestType(request) ||
isPixelRequest(request)));
});
return filteredRequests;
};
PageNetworkTrafficCollector.prototype.isValidVideoAd = function(assetRequest, tagRequests) {
var hasVpaidOrVastRequest = tagRequests.some(function(tagRequest) {
return isVpaidOrVastRequest(tagRequest);
});
if ( assetRequest.isYoutubeAd ) {
return true;
}
if ( hasVpaidOrVastRequest ) {
return true;
}
var hasTopVideoAssetDomain = topVideoAssetDomains.some(function(assetDomain) {
return hasDomain(assetRequest.url, assetDomain);
});
return hasTopVideoAssetDomain;
};
PageNetworkTrafficCollector.prototype.sendMsgWhenQuiet = function(msgKey) {
var _this = this,
origPageUrl, msgAssetReq;
msgAssetReq = this.msgsBeingSent[msgKey];
browserProxy.tabs.get(this.tabId, function(tab) {origPageUrl = tab.url;});
setTimeout(function() {
var rawRequests = [];
if ( globalPageContainer.collectors[_this.tabId] === _this ) {
for ( var reqId in _this.requests ) {
rawRequests.push(_this.requests[reqId]);
}
var tagReqs = _this.grabTagReqs(rawRequests, msgAssetReq);
if ( _this.isValidVideoAd(msgAssetReq, tagReqs) ) {
_this.sendToTab(msgAssetReq, tagReqs, origPageUrl, true);
} else {
_this.sendToTab(msgAssetReq, tagReqs, origPageUrl, false);
}
} else {
}
delete _this.msgsBeingSent[msgKey];
}, secAfter+secBefore);
};
PageNetworkTrafficCollector.prototype.existingMessage = function(candidateRequest) {
var frameMsg = this.msgsBeingSent[candidateRequest.frameId];
if ( frameMsg ) {
return frameMsg;
} else {
return null;
}
};
function onBeforeRequestListener(details) {
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRequest);
}
function onSendHeadersListener(details) {
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onSendHeaders);
}
function onHeadersReceivedListener(details) {
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onHeadersReceived);
}
function onBeforeRedirectListener(details) {
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRedirect);
}
function onResponseStartedListener(details) {
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onResponseStarted);
}
function onCommittedListener(details) {
if ( details.frameId === 0 ) {
globalPageContainer.onNavigationCommitted(details);
}
}
function onCompletedListener(details) {
if ( details.frameId === 0 ) {
globalPageContainer.onNavigationCompleted(details);
}
}
function onRemovedListener(tabId, closeInfo) {
globalPageContainer.onTabClose(tabId, closeInfo);
}
function onMessageListener(message, sender, sendResponse) {
if ( message.event === 'new-ad' && message.data.event === 'ad' ) {
var tabId = sender.tab.id;
if ( tabId ) {
globalPageContainer.onDisplayAdFound(tabId);
}
}
}
function registerListeners() {
browserProxy.webRequest.onBeforeRequest.addListener(
onBeforeRequestListener,
{urls: ['http://*/*', 'https://*/*']},
[]
);
browserProxy.webRequest.onSendHeaders.addListener(
onSendHeadersListener,
{urls: ['http://*/*', 'https://*/*']},
['requestHeaders']
);
browserProxy.webRequest.onHeadersReceived.addListener(
onHeadersReceivedListener,
{urls: ['http://*/*', 'https://*/*']},
['responseHeaders']
);
browserProxy.webRequest.onBeforeRedirect.addListener(
onBeforeRedirectListener,
{urls: ['http://*/*', 'https://*/*']},
[]
);
browserProxy.webRequest.onResponseStarted.addListener(
onResponseStartedListener,
{urls: ['http://*/*', 'https://*/*']},
['responseHeaders']
);
browserProxy.webNavigation.onCommitted.addListener(onCommittedListener);
browserProxy.webNavigation.onCompleted.addListener(onCompletedListener);
browserProxy.tabs.onRemoved.addListener(onRemovedListener);
browserProxy.runtime.onMessage.addListener(onMessageListener);
areListenersRegistered = true;
}
function unregisterListeners() {
browserProxy.webRequest.onBeforeRequest.removeListener(
onBeforeRequestListener
);
browserProxy.webRequest.onSendHeaders.removeListener(
onSendHeadersListener
);
browserProxy.webRequest.onHeadersReceived.removeListener(
onHeadersReceivedListener
);
browserProxy.webRequest.onBeforeRedirect.removeListener(
onBeforeRedirectListener
);
browserProxy.webRequest.onResponseStarted.removeListener(
onResponseStartedListener
);
browserProxy.webNavigation.onCommitted.removeListener(onCommittedListener);
browserProxy.webNavigation.onCompleted.removeListener(onCompletedListener);
browserProxy.tabs.onRemoved.removeListener(onRemovedListener);
browserProxy.runtime.onMessage.removeListener(onMessageListener);
areListenersRegistered = false;
}
function areRequiredBrowserApisAvailable() {
return requiredBrowserApis.every(function(api) {
return typeof api !== 'undefined';
});
}
if ( areRequiredBrowserApisAvailable() ) {
ifBrowserValid(
function() {
browserProxy.webNavigation.onBeforeNavigate.addListener(
function(details) {
if ( details.frameId === 0 ) {
globalPageContainer.onNewNavigation(details);
}
},
{
url: [{urlMatches: 'http://*/*'}, {urlMatches: 'https://*/*'}]
}
);
}, function() {
}
);
}
browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if ( request === 'is_browser_valid' ) {
ifBrowserValid(
sendResponse({'browser_valid': true}),
sendResponse({'browser_valid': false})
);
}
});
browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if ( request === 'is_tracking_enabled' ) {
sendResponse({'tracking_enabled': isTrackingEnabled()});
}
});
})();

@ -1,52 +1,70 @@
/** global: browser */
/** global: wappalyzer */
document.addEventListener('DOMContentLoaded', function() {
var d = document;
var options = {
opts: defaults,
init: function() {
options.load();
d.getElementById('github' ).addEventListener('click', function() { window.open(wappalyzer.config.githubURL); });
d.getElementById('twitter' ).addEventListener('click', function() { window.open(wappalyzer.config.twitterURL); });
d.getElementById('wappalyzer').addEventListener('click', function() { window.open(wappalyzer.config.websiteURL + '?pk_campaign=chrome&pk_kwd=options'); });
d.querySelector('#github').addEventListener('click', function() {
open(wappalyzer.config.githubURL);
});
d.querySelector('#twitter').addEventListener('click', function() {
open(wappalyzer.config.twitterURL);
});
d.getElementById('options-save').addEventListener('click', options.save);
d.querySelector('#wappalyzer').addEventListener('click', function() {
open(wappalyzer.config.websiteURL);
});
},
load: function() {
var option, value;
get: function(name, defaultValue, callback) {
browser.storage.local.get(name).then(function(item) {
callback(item.hasOwnProperty(name) ? item[name] : defaultValue);
});
},
for ( option in options.opts ) {
if ( value = localStorage[option] ) {
options.opts[option] = value;
}
}
set: function(name, value) {
var option = {};
if ( parseInt(options.opts.upgradeMessage) ) {
d.getElementById('option-upgrade-message').setAttribute('checked', 'checked');
}
option[name] = value;
if ( parseInt(options.opts.tracking) ) {
d.getElementById('option-tracking').setAttribute('checked', 'checked');
}
browser.storage.local.set(option);
},
save: function() {
var option;
load: function() {
options.get('upgradeMessage', true, function(value) {
var el = d.querySelector('#option-upgrade-message');
el.checked = value;
el.addEventListener('change', function() {
options.set('upgradeMessage', el.checked);
});
});
options.get('dynamicIcon', true, function(value) {
var el = d.querySelector('#option-dynamic-icon');
el.checked = value;
options.opts.upgradeMessage = d.getElementById('option-upgrade-message').checked ? 1 : 0;
options.opts.tracking = d.getElementById('option-tracking' ).checked ? 1 : 0;
el.addEventListener('change', function() {
options.set('dynamicIcon', el.checked);
});
});
for ( option in options.opts ) {
localStorage[option] = options.opts[option];
}
options.get('tracking', true, function(value) {
var el = d.querySelector('#option-tracking');
d.getElementById('options-saved').style.display = 'inline';
el.checked = value;
setTimeout(function(){
d.getElementById('options-saved').style.display = 'none';
}, 2000);
el.addEventListener('change', function() {
options.set('tracking', el.checked);
});
});
}
};

@ -1,3 +1,6 @@
/** global: chrome */
/** global: browser */
document.addEventListener('DOMContentLoaded', function() {
var
slugify, popup,
@ -10,13 +13,21 @@ document.addEventListener('DOMContentLoaded', function() {
popup = {
init: function() {
browser.tabs.query({ active: true, currentWindow: true }).then(function(tabs) {
var callback = function(tabs) {
if ( tabs[0].url.match(/https?:\/\//) ) {
detectedApps.innerHTML = '<div class="empty">' + browser.i18n.getMessage('noAppsDetected') + '</div>';
} else {
detectedApps.innerHTML = '<div class="empty">' + browser.i18n.getMessage('nothingToDo') + '</div>';
}
});
};
try {
// Chrome, Firefox
browser.tabs.query({ active: true, currentWindow: true }).then(callback);
} catch ( e ) {
// Edge
browser.tabs.query({ active: true, currentWindow: true }, callback);
}
popup.displayApps();
},
@ -24,8 +35,10 @@ document.addEventListener('DOMContentLoaded', function() {
displayApps: function() {
var appName, confidence, version;
browser.tabs.query({ active: true, currentWindow: true }).then(function(tabs) {
var callback = function(tabs) {
function sendGetApps(response) {
var html;
if ( response.tabCache && response.tabCache.count > 0 ) {
detectedApps.innerHTML = '';
@ -36,7 +49,7 @@ document.addEventListener('DOMContentLoaded', function() {
html =
'<div class="detected-app">' +
'<a target="_blank" href="https://wappalyzer.com/applications/' + slugify(appName) + '">' +
'<img src="images/icons/' + response.apps[appName].icon + '"/>' +
'<img src="images/icons/' + (response.apps[appName].icon || 'default.svg') + '"/>' +
'<span class="label"><span class="name">' + appName + '</span>' + ( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '' ) + '</span>' +
'</a>';
@ -60,7 +73,15 @@ document.addEventListener('DOMContentLoaded', function() {
} else {
chrome.runtime.sendMessage({ id: 'get_apps', tab: tabs[0] }, sendGetApps);
}
});
};
try {
// Chrome, Firefox
browser.tabs.query({ active: true, currentWindow: true }).then(callback);
} catch ( e ) {
// Edge
browser.tabs.query({ active: true, currentWindow: true }, callback);
}
}
};

@ -1,44 +1,51 @@
{
"name": "Wappalyzer",
"short_name": "Wappalyzer",
"author": "Elbert Alias",
"short_name": "Wappalyzer",
"author": "Elbert Alias",
"homepage_url": "https://wappalyzer.com/",
"description": "Identify web technologies",
"version": "4",
"version": "4.0.1",
"default_locale": "en",
"manifest_version": 2,
"icons": {
"16": "images/icon_16.png",
"19": "images/icon_19.png",
"32": "images/icon_32.png",
"38": "images/icon_38.png",
"16": "images/icon_16.png",
"19": "images/icon_19.png",
"32": "images/icon_32.png",
"38": "images/icon_38.png",
"128": "images/icon_128.png"
},
"page_action": {
"default_icon": {
"16": "images/icon_16.png",
"19": "images/icon_19.png",
"32": "images/icon_32.png",
"38": "images/icon_38.png",
"128": "images/icon_128.png"
},
"16": "images/icon_16.png",
"19": "images/icon_19.png",
"32": "images/icon_32.png",
"38": "images/icon_38.png",
"128": "images/icon_128.png"
},
"default_title": "Wappalyzer",
"default_popup": "popup.html"
},
"background": {
"page": "background.html",
"persistent": true
"persistent": true
},
"content_scripts": [
{
"matches": [ "http://*/*", "https://*/*" ],
"matches": [
"http://*/*",
"https://*/*"
],
"js": [
"js/browser-polyfill.js",
"js/content.js"
],
"run_at": "document_idle"
}, {
"matches": [ "http://*/*", "https://*/*" ],
},
{
"matches": [
"http://*/*",
"https://*/*"
],
"js": [
"js/browser-polyfill.js",
"js/iframe.js"
@ -50,7 +57,7 @@
"web_accessible_resources": [
"js/inject.js"
],
"options_page": "options.html",
"options_page": "options.html",
"permissions": [
"tabs",
"webRequest",
@ -58,5 +65,9 @@
"http://*/*",
"https://*/*"
],
"content_security_policy": "script-src 'self'; object-src 'self'"
"content_security_policy": "script-src 'self'; object-src 'self'",
"-ms-preload": {
"backgroundScript": "js/ms_background_scripts_api_bridge.js",
"contentScript": "js/ms_content_scripts_api_bridge.js"
}
}

@ -1,27 +1,27 @@
{
"name": "Wappalyzer",
"short_name": "Wappalyzer",
"author": "Elbert Alias",
"short_name": "Wappalyzer",
"author": "Elbert Alias",
"homepage_url": "https://wappalyzer.com/",
"description": "Identify web technologies",
"version": "4.0.1",
"default_locale": "en",
"manifest_version": 2,
"icons": {
"16": "images/icon_16.png",
"19": "images/icon_19.png",
"32": "images/icon_32.png",
"38": "images/icon_38.png",
"16": "images/icon_16.png",
"19": "images/icon_19.png",
"32": "images/icon_32.png",
"38": "images/icon_38.png",
"128": "images/icon_128.png"
},
"page_action": {
"default_icon": {
"16": "images/icon_16.png",
"19": "images/icon_19.png",
"32": "images/icon_32.png",
"38": "images/icon_38.png",
"128": "images/icon_128.png"
},
"16": "images/icon_16.png",
"19": "images/icon_19.png",
"32": "images/icon_32.png",
"38": "images/icon_38.png",
"128": "images/icon_128.png"
},
"default_title": "Wappalyzer",
"default_popup": "popup.html"
},
@ -31,14 +31,21 @@
},
"content_scripts": [
{
"matches": [ "http://*/*", "https://*/*" ],
"matches": [
"http://*/*",
"https://*/*"
],
"js": [
"js/browser-polyfill.js",
"js/content.js"
],
"run_at": "document_idle"
}, {
"matches": [ "http://*/*", "https://*/*" ],
},
{
"matches": [
"http://*/*",
"https://*/*"
],
"js": [
"js/browser-polyfill.js",
"js/iframe.js"
@ -50,12 +57,13 @@
"web_accessible_resources": [
"js/inject.js"
],
"options_page": "options.html",
"options_page": "options.html",
"options_ui": {
"page": "options.html",
"open_in_tab": false
},
"page": "options.html",
"open_in_tab": false
},
"permissions": [
"storage",
"tabs",
"webRequest",
"webNavigation",
@ -64,3 +72,4 @@
],
"content_security_policy": "script-src 'self'; object-src 'self'"
}

@ -29,13 +29,10 @@
<p>
<label for="option-upgrade-message"><input id="option-upgrade-message" type="checkbox"> <span data-i18n="optionUpgradeMessage">Tell me about upgrades</span></label>
<label for="option-dynamic-icon"><input id="option-dynamic-icon" type="checkbox"> <span data-i18n="optionDynamicIcon">Use application icon instead of Wappalyzer logo</span></label>
<label for="option-tracking"><input id="option-tracking" type="checkbox"> <span data-i18n="optionTracking">Anonymously send reports on detected applications to wappalyzer.com for research</span></label>
</p>
<p>
<button id="options-save" data-i18n="optionsSave">Save options</button> <span id="options-saved" data-i18n="optionsSaved">Saved</span>
</p>
<div id="about">
<p>
<button id="github"><img src="images/github.png" width="16" height="16" alt=""/> <span data-i18n="github" >Fork Wappalyzer on GitHub!</span></button><!--

@ -0,0 +1,4 @@
<svg width="250" height="250" xmlns="http://www.w3.org/2000/svg">
<rect rx="30" height="250" width="250" y="0" x="0" stroke-width="3" stroke="#ffffff" fill="#6f5499"/>
<text transform="matrix(3.1,0,0,3.5,0,0)" font-family="Helvetica, Arial, sans-serif" font-size="60" y="56.5" x="0.5" fill="#ffffff">BT</text>
</svg>

After

Width:  |  Height:  |  Size: 319 B

@ -0,0 +1,3 @@
<svg height="1024" width="896" fill="#00C2A1" xmlns="http://www.w3.org/2000/svg">
<path d="M128 768h256v64H128v-64z m320-384H128v64h320v-64z m128 192V448L384 640l192 192V704h320V576H576z m-288-64H128v64h160v-64zM128 704h160v-64H128v64z m576 64h64v128c-1 18-7 33-19 45s-27 18-45 19H64c-35 0-64-29-64-64V192c0-35 29-64 64-64h192C256 57 313 0 384 0s128 57 128 128h192c35 0 64 29 64 64v320h-64V320H64v576h640V768zM128 256h512c0-35-29-64-64-64h-64c-35 0-64-29-64-64s-29-64-64-64-64 29-64 64-29 64-64 64h-64c-35 0-64 29-64 64z" />
</svg>

After

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 772 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 822 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="800" height="400"><path fill="#465283" d="M63.3 84.34h118.644c34.825.294 60.06 10.28 75.7 29.956 15.643 19.677 20.808 46.55 15.496 80.617-2.066 15.566-6.64 30.837-13.724 45.815-6.788 14.978-16.233 28.488-28.332 40.53-14.757 15.27-30.547 24.962-47.37 29.074-16.822 4.112-34.235 6.167-52.238 6.167H78.353L61.53 400.2H-.005L63.3 84.34m51.797 50.22L88.535 266.72c1.77.293 3.54.44 5.312.44h6.198c28.332.293 51.943-2.496 70.832-8.37 18.888-6.167 31.578-27.606 38.072-64.318 5.31-30.837-.002-48.604-15.94-53.304-15.64-4.7-35.267-6.9-58.877-6.608-3.542.294-6.936.44-10.182.44h-9.296l.443-.44M343.253.223h61.093L387.08 84.365h54.895c30.104.587 52.533 6.755 67.29 18.502 15.052 11.748 19.48 34.068 13.28 66.96l-29.66 146.697h-61.977l28.332-140.088c2.95-14.684 2.066-25.11-2.656-31.278-4.722-6.167-14.905-9.25-30.546-9.25l-49.14-.442-36.3 181.058h-61.093L343.253.224M588.157 84.34H706.8c34.826.294 60.06 10.28 75.702 29.956 15.64 19.677 20.807 46.55 15.494 80.617-2.066 15.566-6.64 30.837-13.723 45.815-6.79 14.978-16.233 28.488-28.333 40.53-14.757 15.27-30.546 24.962-47.37 29.074-16.82 4.112-34.234 6.167-52.237 6.167H603.21l-16.823 83.7H524.85l63.307-315.86m51.796 50.22L613.39 266.72c1.772.293 3.543.44 5.314.44h6.197c28.334.293 51.944-2.496 70.833-8.37 18.888-6.167 31.58-27.606 38.072-64.318 5.312-30.837 0-48.604-15.937-53.304-15.642-4.7-35.27-6.9-58.88-6.608-3.54.294-6.935.44-10.18.44h-9.298l.443-.44"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="170px" height="139px" viewBox="0 0 170 139" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 3.6.1 (26313) - http://www.bohemiancoding.com/sketch -->
<title>logo-green-icon</title>
<desc>Created with Sketch.</desc>
<defs>
<path d="M95.4468436,69.3626204 L95.4592285,69.3626204 C95.4592285,69.3626204 95.457159,69.3679348 95.4530363,69.3784554 C95.4532988,69.3791286 95.4534302,69.3794661 95.4534302,69.3794661 C95.0391633,70.4343838 75.2163095,120.683062 50.8674558,120.683062 C26.2644774,120.683062 21.1714061,102.459391 19.9642374,69.3794661 C21.1682129,36.2888823 26.2603015,18.0602652 50.8674558,18.0602652 C75.2163064,18.0602652 95.0334809,68.3077156 95.4468436,69.3626204 Z M118.092311,69.3716637 L139.000268,113.03658 L144.17019,102.546345 L169.529456,102.546345 L149.922143,135.56783 L124.272418,135.56783 C124.272418,135.56783 108.042969,101.468151 104.972924,91.5307203 C104.972924,91.5307203 90.9533928,122.642048 74.4201896,132.958455 C57.8869865,143.274861 34.1487053,136.647908 34.1487053,136.647908 C34.1487053,136.647908 9.24831463,130.042439 2.51589276,97.2982984 C0.635071049,88.1506408 -0.142736189,78.6540611 0.0213285458,69.3716637 C-0.142736189,60.0892664 0.635071049,50.5926866 2.51589276,41.445029 C9.24831463,8.70088837 34.1487053,2.09541962 34.1487053,2.09541962 C34.1487053,2.09541962 57.8869865,-4.5315335 74.4201896,5.78487275 C90.9533928,16.101279 104.972924,47.2126071 104.972924,47.2126071 C108.042969,37.2751764 124.272418,3.17549775 124.272418,3.17549775 L149.922143,3.17549775 L169.529456,36.1969821 L144.17019,36.1969821 L139.000268,25.7067477 L118.092311,69.3716637 Z" id="path-1"></path>
<linearGradient x1="90.5349364%" y1="23.0926676%" x2="50%" y2="68.9046334%" id="linearGradient-3">
<stop stop-color="#000000" stop-opacity="0.199190444" offset="0%"></stop>
<stop stop-color="#000000" stop-opacity="0" offset="100%"></stop>
</linearGradient>
</defs>
<g id="Logo" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Exports" transform="translate(-1407.000000, -158.000000)">
<g id="logo-green-icon" transform="translate(1407.000000, 158.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="Mask" fill="#4DC997" xlink:href="#path-1"></use>
<path d="M95.6611328,69.2988281 L104.922852,91.4794922 L97.1796875,112.716797 L76.9003906,87.5185547 L95.6611328,69.2988281 Z" id="Path-17" fill="url(#linearGradient-3)" opacity="0.2" mask="url(#mask-2)"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="110px" height="26px" viewBox="0 0 110 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
<title>typecho-logo</title>
<description>Created with Sketch (http://www.bohemiancoding.com/sketch)</description>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
<path d="M34.75,5.288 C34.288,6.542 33.76,7.73 32.22,7.862 L32,9.468 L33.562,9.468 L33.562,15.342 C33.562,16.882 33.54,18.994 36.972,18.994 C38.006,18.994 39.106,18.686 39.766,18.224 L39.106,16.53 C38.754,16.75 38.204,16.992 37.61,16.992 C36.708,16.992 36.18,16.596 36.18,15.254 L36.18,9.468 L38.886,9.468 L39.106,7.62 L36.18,7.62 L36.18,5.288 L34.75,5.288 Z M48.258,18.268 C48.258,20.27 47.444,21.502 45.42,21.502 C44.76,21.502 44.276,21.436 43.858,21.282 C43.462,21.128 43.352,20.908 43.352,20.49 L43.352,19.434 L41.262,19.61 L41.262,22.668 C42.186,23.13 44.012,23.394 45.398,23.394 C48.676,23.394 50.502,21.898 50.502,18.268 L50.502,7.62 L46.63,7.62 L46.63,9.424 L47.334,9.468 C47.752,9.468 47.884,9.644 47.884,10.128 L47.884,14.11 C47.884,15.254 47.07,16.288 45.53,16.288 C44.122,16.288 43.902,15.276 43.902,13.934 L43.902,7.62 L40.03,7.62 L40.03,9.424 L40.734,9.468 C41.108,9.49 41.284,9.622 41.284,10.084 L41.284,14.506 C41.284,17.102 42.494,18.312 44.694,18.312 C46.146,18.312 47.488,17.696 48.258,16.596 L48.258,18.268 Z M54,20.776 C54,21.326 53.78,21.458 53.362,21.502 L52.636,21.568 L52.636,23.24 L58.312,23.24 L58.312,21.502 L56.53,21.414 L56.53,18.378 C57.102,18.73 58.026,19.016 58.884,19.016 C61.788,19.016 63.702,16.926 63.702,12.878 C63.702,8.94 62.162,7.29 59.72,7.29 C57.85,7.29 56.64,8.302 56.244,9.05 L56.244,7.62 L52.526,7.62 L52.526,9.402 L53.45,9.468 C53.868,9.468 54,9.644 54,10.128 L54,20.776 Z M60.974,13.098 C60.974,15.012 60.336,16.926 58.466,16.926 C57.894,16.926 57.102,16.75 56.53,16.376 L56.53,11.316 C56.53,10.304 57.498,9.424 58.752,9.424 C59.918,9.424 60.974,10.172 60.974,13.098 Z M70.786,7.29 C67.178,7.29 65.352,10.15 65.352,13.406 C65.352,16.684 66.804,18.972 70.544,18.972 C72.612,18.972 74.064,18.048 74.416,17.74 L73.58,15.958 C73.052,16.332 72.106,16.926 70.808,16.926 C68.938,16.926 68.19,15.76 68.102,14.33 C70.698,14.308 74.372,13.736 74.372,10.348 C74.372,8.39 72.942,7.29 70.786,7.29 Z M71.952,10.392 C71.952,12.086 69.642,12.46 68.014,12.482 C68.08,10.854 68.872,9.16 70.632,9.16 C71.424,9.16 71.952,9.578 71.952,10.392 Z M81.192,16.97 C79.234,16.97 78.354,15.43 78.354,13.032 C78.354,10.59 79.256,9.27 81.016,9.27 C81.346,9.27 81.61,9.314 81.874,9.402 C82.27,9.534 82.336,9.732 82.336,10.15 L82.336,11.206 L84.36,11.052 L84.36,8.192 C83.304,7.62 82.248,7.29 80.928,7.29 C78.442,7.29 75.692,8.83 75.692,13.296 C75.692,16.948 77.606,18.994 80.84,18.994 C82.468,18.994 83.81,18.422 84.668,17.718 L83.722,16.024 C82.82,16.684 82.05,16.97 81.192,16.97 Z M87.286,16.222 C87.286,16.772 87.066,16.904 86.648,16.948 L85.922,17.014 L85.922,18.686 L91.158,18.686 L91.158,16.926 L89.904,16.86 L89.904,11.536 C89.904,10.392 90.718,9.314 92.258,9.314 C93.666,9.314 93.974,10.348 93.974,11.69 L93.974,16.222 C93.974,16.772 93.754,16.904 93.336,16.948 L92.61,17.014 L92.61,18.686 L97.846,18.686 L97.846,16.926 L96.592,16.86 L96.592,11.118 C96.592,8.522 95.294,7.29 93.094,7.29 C91.642,7.29 90.542,7.972 89.882,8.918 L89.882,3 L85.966,3 L85.966,4.826 L86.736,4.87 C87.154,4.892 87.286,5.024 87.286,5.508 L87.286,16.222 Z M98.924,13.142 C98.924,17.124 100.86,19.016 103.808,19.016 C106.712,19.016 109.066,17.08 109.066,12.856 C109.066,7.796 105.788,7.29 104.16,7.29 C101.894,7.29 98.924,8.566 98.924,13.142 Z M103.984,17.08 C101.872,17.08 101.586,14.88 101.586,12.834 C101.586,10.722 102.29,9.226 104.028,9.226 C105.788,9.226 106.382,10.744 106.382,13.208 C106.382,15.496 105.7,17.08 103.984,17.08 Z" id="typecho" fill="#000000" sketch:type="MSShapeGroup"></path>
<path d="M13,26 C3.36833333,26 0,22.631 0,13 C0,3.36866667 3.36833333,0 13,0 C22.6316667,0 26,3.36866667 26,13 C26,22.631 22.6316667,26 13,26 Z M6,9 L20,9 L20,7 L6,7 L6,9 Z M6,14 L16,14 L16,12 L6,12 L6,14 Z M6,19 L18,19 L18,17 L6,17 L6,19 Z" id="icon" fill="#000000" sketch:type="MSShapeGroup"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 698 B

@ -1,5 +1,5 @@
/**
* Wappalyzer v2
* Wappalyzer v4
*
* Created by Elbert Alias <elbert@alias.io>
*
@ -102,33 +102,6 @@ var wappalyzer = (function() {
}
};
var Profiler = function() {
this.regexCount = 0;
this.startTime = new Date().getTime();
this.lastTime = new Date().getTime();
this.slowest = { duration: null, app: '', type: '', pattern: '' };
this.timedOut = false;
};
Profiler.prototype = {
checkPoint: function(app, type, regex) {
var duration = new Date().getTime() - this.lastTime;
if ( !this.slowest.duration || duration > this.slowest.duration ) {
this.slowest.duration = duration;
this.slowest.app = app;
this.slowest.type = type;
this.slowest.regex = regex;
}
this.regexCount++;
this.lastTime = new Date().getTime();
this.timedOut = this.lastTime - this.startTime > w.driver.timeout;
}
};
/**
* Call driver functions
*/
@ -149,42 +122,61 @@ var wappalyzer = (function() {
/**
* Parse apps.json patterns
*/
var parse = function(patterns) {
var parsePatterns = function(patterns) {
var
attrs,
parsed = [];
key,
parsed = {};
// Convert single patterns to an array
// Convert array to object containing array
if ( patterns instanceof Array ) {
patterns = { main: patterns }
}
// Convert string to object containing array containing string
if ( typeof patterns === 'string' ) {
patterns = [ patterns ];
patterns = { main: [ patterns ] };
}
patterns.forEach(function(pattern) {
attrs = {};
for ( key in patterns ) {
parsed[key] = [];
pattern.split('\\;').forEach(function(attr, i) {
if ( i ) {
// Key value pairs
attr = attr.split(':');
// Convert string to array containing string
if ( typeof patterns[key] === 'string' ) {
patterns[key] = [ patterns[key] ];
}
if ( attr.length > 1 ) {
attrs[attr.shift()] = attr.join(':');
}
} else {
attrs.string = attr;
patterns[key].forEach(function(pattern) {
var attrs = {};
pattern.split('\\;').forEach(function(attr, i) {
if ( i ) {
// Key value pairs
attr = attr.split(':');
try {
attrs.regex = new RegExp(attr.replace('/', '\/'), 'i'); // Escape slashes in regular expression
} catch (e) {
attrs.regex = new RegExp();
if ( attr.length > 1 ) {
attrs[attr.shift()] = attr.join(':');
}
} else {
attrs.string = attr;
try {
attrs.regex = new RegExp(attr.replace('/', '\/'), 'i'); // Escape slashes in regular expression
} catch (e) {
attrs.regex = new RegExp();
w.log(e + ': ' + attr, 'error');
w.log(e + ': ' + attr, 'error');
}
}
}
});
parsed[key].push(attrs);
});
}
parsed.push(attrs);
});
// Convert back to array if the original pattern list was an array (or string)
if ( parsed.hasOwnProperty('main') ) {
parsed = parsed.main;
}
return parsed;
};
@ -242,165 +234,75 @@ var wappalyzer = (function() {
*/
analyze: function(hostname, url, data) {
var
i, app, confidence, type, regexMeta, regexScript, match, content, meta, header, version, id,
profiler = new Profiler(),
apps = {},
excludes = [],
checkImplies = true;
app,
apps = {};
w.log('w.analyze');
// Remove hash from URL
data.url = url = url.split('#')[0];
if ( w.apps === undefined || w.categories === undefined ) {
w.log('apps.json not loaded, check for syntax errors');
return;
}
// Remove hash from URL
data.url = url = url.split('#')[0];
if ( typeof data.html !== 'string' ) {
data.html = '';
}
if ( w.detected[url] === undefined ) {
w.detected[url] = {};
}
for ( app in w.apps ) {
// Exit loop after one second to prevent CPU hogging
// Remaining patterns will not be evaluated
if ( profiler.timedOut ) {
w.log('Timeout, exiting loop');
break;
}
apps[app] = w.detected[url] && w.detected[url][app] ? w.detected[url][app] : new Application(app);
for ( type in w.apps[app] ) {
switch ( type ) {
case 'url':
parse(w.apps[app][type]).forEach(function(pattern) {
if ( pattern.regex.test(url) ) {
apps[app].setDetected(pattern, type, url);
}
profiler.checkPoint(app, type, pattern.regex);
});
break;
case 'html':
if ( typeof data[type] !== 'string' || !data.html ) {
break;
}
parse(w.apps[app][type]).forEach(function(pattern) {
if ( pattern.regex.test(data[type]) ) {
apps[app].setDetected(pattern, type, data[type]);
}
profiler.checkPoint(app, type, pattern.regex);
});
break;
case 'script':
if ( typeof data.html !== 'string' || !data.html ) {
break;
}
regexScript = new RegExp('<script[^>]+src=("|\')([^"\']+)', 'ig');
parse(w.apps[app][type]).forEach(function(pattern) {
while ( match = regexScript.exec(data.html) ) {
if ( pattern.regex.test(match[2]) ) {
apps[app].setDetected(pattern, type, match[2]);
}
}
profiler.checkPoint(app, type, pattern.regex);
});
break;
case 'meta':
if ( typeof data.html !== 'string' || !data.html ) {
break;
}
regexMeta = /<meta[^>]+>/ig;
while ( match = regexMeta.exec(data.html) ) {
for ( meta in w.apps[app][type] ) {
profiler.checkPoint(app, type, regexMeta);
if ( new RegExp('(name|property)=["\']' + meta + '["\']', 'i').test(match) ) {
content = match.toString().match(/content=("|')([^"']+)("|')/i);
parse(w.apps[app].meta[meta]).forEach(function(pattern) {
if ( content && content.length === 4 && pattern.regex.test(content[2]) ) {
apps[app].setDetected(pattern, type, content[2], meta);
}
profiler.checkPoint(app, type, pattern.regex);
});
}
}
}
break;
case 'headers':
if ( typeof data[type] !== 'object' || !data[type] ) {
break;
}
for ( header in w.apps[app].headers ) {
parse(w.apps[app][type][header]).forEach(function(pattern) {
if ( data[type][header.toLowerCase()] instanceof Array ) {
data[type][header.toLowerCase()].forEach(function(el) {
if ( typeof el === 'string' && pattern.regex.test(el) ) {
apps[app].setDetected(pattern, type, data[type][header.toLowerCase()], header);
}
});
} else {
if ( typeof data[type][header.toLowerCase()] === 'string' && pattern.regex.test(data[type][header.toLowerCase()]) ) {
apps[app].setDetected(pattern, type, data[type][header.toLowerCase()], header);
}
}
profiler.checkPoint(app, type, pattern.regex);
});
}
break;
case 'env':
if ( typeof data[type] !== 'object' || !data[type] ) {
break;
}
parse(w.apps[app][type]).forEach(function(pattern) {
for ( i in data[type] ) {
if ( url ) {
w.analyzeUrl(apps[app], url);
}
if ( pattern.regex.test(data[type][i]) ) {
apps[app].setDetected(pattern, type, data[type][i]);
}
}
if ( data.html ) {
w.analyzeHtml(apps[app], data.html);
w.analyzeScript(apps[app], data.html);
w.analyzeMeta(apps[app], data.html);
}
profiler.checkPoint(app, type, pattern.regex);
});
if ( data.headers ) {
w.analyzeHeaders(apps[app], data.headers);
}
break;
}
if ( data.env ) {
w.analyzeEnv(apps[app], data.env);
}
}
w.log('[ profiler ] Tested ' + profiler.regexCount + ' regular expressions in ' + ( (new Date().getTime() - profiler.startTime) / 1000 ) + 's');
w.log('[ profiler ] Slowest pattern took ' + ( profiler.slowest.duration / 1000 ) + 's: ' + profiler.slowest.app + ' | ' + profiler.slowest.type + ' | ' + profiler.slowest.regex);
for ( app in apps ) {
if ( !apps[app].detected ) {
delete apps[app];
}
}
w.resolveExcludes(apps);
w.resolveImplies(apps, url);
w.cacheDetectedApps(apps, url);
w.trackDetectedApps(apps, url, hostname, data.html);
w.log(Object.keys(apps).length + ' apps detected: ' + Object.keys(apps).join(', ') + ' on ' + url);
driver('displayApps');
},
resolveExcludes: function(apps) {
var
app,
excludes = [];
// Exclude app in detected apps only
for ( app in apps ) {
if (w.apps[app].excludes ) {
if ( w.apps[app].excludes ) {
if ( typeof w.apps[app].excludes === 'string' ) {
w.apps[app].excludes = [ w.apps[app].excludes ];
}
@ -417,6 +319,13 @@ var wappalyzer = (function() {
delete apps[app];
}
}
},
resolveImplies: function(apps, url) {
var
confidence,
id,
checkImplies = true;
// Implied applications
// Run several passes as implied apps may imply other apps
@ -433,7 +342,7 @@ var wappalyzer = (function() {
}
w.apps[app].implies.forEach(function(implied) {
implied = parse(implied)[0];
implied = parsePatterns(implied)[0];
if ( !w.apps[implied.string] ) {
w.log('Implied application ' + implied.string + ' does not exist', 'warn');
@ -455,13 +364,16 @@ var wappalyzer = (function() {
}
}
}
},
w.log(Object.keys(apps).length + ' apps detected: ' + Object.keys(apps).join(', ') + ' on ' + url);
/**
* Cache detected applications
*/
cacheDetectedApps: function(apps, url) {
var app, id, confidence;
// Keep history of detected apps
for ( app in apps ) {
confidence = apps[app].confidence;
version = apps[app].version;
// Per URL
w.detected[url][app] = apps[app];
@ -469,22 +381,35 @@ var wappalyzer = (function() {
for ( id in confidence ) {
w.detected[url][app].confidence[id] = confidence[id];
}
}
},
/**
* Track detected applications
*/
trackDetectedApps: function(apps, url, hostname, html) {
var app, match;
for ( app in apps ) {
if ( w.detected[url][app].getConfidence() >= 100 ) {
// Per hostname
if ( /(www.)?((.+?)\.(([a-z]{2,3}\.)?[a-z]{2,6}))$/.test(hostname) && !/((local|dev(elopment)?|stag(e|ing)?|test(ing)?|demo(shop)?|admin|google|cache)\.|\/admin|\.local)/.test(url) ) {
if ( !w.ping.hostnames.hasOwnProperty(hostname) ) {
w.ping.hostnames[hostname] = { applications: {}, meta: {} };
w.ping.hostnames[hostname] = {
applications: {},
meta: {}
};
}
if ( !w.ping.hostnames[hostname].applications.hasOwnProperty(app) ) {
w.ping.hostnames[hostname].applications[app] = { hits: 0 };
w.ping.hostnames[hostname].applications[app] = {
hits: 0
};
}
w.ping.hostnames[hostname].applications[app].hits ++;
if ( version ) {
w.ping.hostnames[hostname].applications[app].version = version;
if ( apps[app].version ) {
w.ping.hostnames[hostname].applications[app].version = apps[app].version;
}
} else {
w.log('Ignoring hostname "' + hostname + '"');
@ -494,23 +419,133 @@ var wappalyzer = (function() {
// Additional information
if ( w.ping.hostnames.hasOwnProperty(hostname) ) {
if ( typeof data.html === 'string' && data.html ) {
match = data.html.match(/<html[^>]*[: ]lang="([a-z]{2}((-|_)[A-Z]{2})?)"/i);
match = html.match(/<html[^>]*[: ]lang="([a-z]{2}((-|_)[A-Z]{2})?)"/i);
if ( match && match.length ) {
w.ping.hostnames[hostname].meta['language'] = match[1];
}
if ( match && match.length ) {
w.ping.hostnames[hostname].meta['language'] = match[1];
}
}
if ( Object.keys(w.ping.hostnames).length >= 50 || w.adCache.length >= 50 ) {
driver('ping');
}
},
apps = null;
data = null;
/**
* Analyze URL
*/
analyzeUrl: function(app, url) {
var patterns = parsePatterns(w.apps[app.app].url);
driver('displayApps');
if ( patterns.length ) {
patterns.forEach(function(pattern) {
if ( pattern.regex.test(url) ) {
app.setDetected(pattern, 'url', url);
}
});
}
},
/**
* Analyze HTML
*/
analyzeHtml: function(app, html) {
var patterns = parsePatterns(w.apps[app.app].html);
if ( patterns.length ) {
patterns.forEach(function(pattern) {
if ( pattern.regex.test(html) ) {
app.setDetected(pattern, 'html', html);
}
});
}
},
/**
* Analyze script tag
*/
analyzeScript: function(app, html) {
var
regex = new RegExp('<script[^>]+src=("|\')([^"\']+)', 'ig'),
patterns = parsePatterns(w.apps[app.app].script);
if ( patterns.length ) {
patterns.forEach(function(pattern) {
var match;
while ( match = regex.exec(html) ) {
if ( pattern.regex.test(match[2]) ) {
app.setDetected(pattern, 'script', match[2]);
}
}
});
}
},
/**
* Analyze meta tag
*/
analyzeMeta: function(app, html) {
var
content, match, meta,
regex = /<meta[^>]+>/ig,
patterns = parsePatterns(w.apps[app.app].meta);
if ( patterns.length ) {
while ( match = regex.exec(html) ) {
for ( meta in patterns ) {
if ( new RegExp('(name|property)=["\']' + meta + '["\']', 'i').test(match) ) {
content = match.toString().match(/content=("|')([^"']+)("|')/i);
patterns[meta].forEach(function(pattern) {
if ( content && content.length === 4 && pattern.regex.test(content[2]) ) {
app.setDetected(pattern, 'meta', content[2], meta);
}
});
}
}
}
}
},
/**
* analyze response headers
*/
analyzeHeaders: function(app, headers) {
var
header,
patterns = parsePatterns(w.apps[app.app].headers);
if ( patterns.length && headers ) {
for ( header in patterns ) {
patterns[header].forEach(function(pattern) {
header = header.toLowerCase();
if ( headers.hasOwnProperty(header) && pattern.regex.test(headers[header]) ) {
app.setDetected(pattern, 'headers', headers[header], header);
}
});
}
}
},
/**
* Analyze environment variables
*/
analyzeEnv: function(app, envs) {
var patterns = parsePatterns(w.apps[app.app].env);
if ( patterns.length ) {
patterns.forEach(function(pattern) {
var env;
for ( env in envs ) {
if ( pattern.regex.test(envs[env]) ) {
app.setDetected(pattern, 'env', envs[env]);
}
}
});
}
}
};