Merge remote-tracking branch 'upstream/master'

main
Maxwell 8 years ago
commit a02ca19968

@ -2,20 +2,29 @@ language: node_js
node_js:
- "node"
sudo: false
dist: trusty
before_install:
- export WAPPALYZER_ROOT=$TRAVIS_BUILD_DIR
- 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:
- node_modules
env:
- CXX=g++-4.8
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.8

@ -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

@ -41,7 +41,7 @@ do
rm "$dest"
fi
#node $WAPPALYZER_NODE_PATH/node_modules/svg2png/bin/svg2png-cli "$svg" --width=32 --height=32 --output "$dest" || true
node $WAPPALYZER_NODE_PATH/node_modules/svg2png/bin/svg2png-cli "$svg" --width=32 --height=32 --output "$dest" || true
done
IFS="$OIFS"
@ -52,32 +52,45 @@ node $WAPPALYZER_NODE_PATH/node_modules/imagemin-cli/cli.js $WAPPALYZER_ROOT/src
wappalyzer links
# Mozilla Firefox
echo "Building Firefox driver..."
# WebExtension
echo "Building WebExtension driver..."
pushd $WAPPALYZER_ROOT/src/drivers/firefox > /dev/null
webextension_dir=$WAPPALYZER_ROOT/src/drivers/webextension
node $WAPPALYZER_NODE_PATH/node_modules/jpm/bin/jpm xpi && mv *.xpi $WAPPALYZER_ROOT/build/wappalyzer_firefox.xpi
pushd $webextension_dir > /dev/null
zip -qr $WAPPALYZER_ROOT/build/wappalyzer_webextension.zip .
popd > /dev/null
# Google Chrome
echo "Building Chrome driver..."
# Edge
pushd $WAPPALYZER_ROOT/src/drivers/chrome > /dev/null
pushd $WAPPALYZER_ROOT/build > /dev/null
zip -qr $WAPPALYZER_ROOT/build/wappalyzer_chrome.zip .
mv $webextension_dir/manifest.json $webextension_dir/manifest.webextension.json
mv $webextension_dir/manifest.edge.json $webextension_dir/manifest.json
# WebExtension
echo "Building WebExtension driver..."
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
pushd $WAPPALYZER_ROOT/src/drivers/webextension > /dev/null
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
zip -qr $WAPPALYZER_ROOT/build/wappalyzer_webextension.zip . -x manifest.edge.json
manifoldjs -l debug -p edgeextension package $manifest_dir
zip -qr $WAPPALYZER_ROOT/build/wappalyzer_webextension.edge.zip . -x manifest.json
mv Wappalyzer/edgeextension/package/edgeExtension.appx wappalyzer_edge.appx
printf "@ manifest.edge.json\n@=manifest.json\n" | zipnote -w $WAPPALYZER_ROOT/build/wappalyzer_webextension.edge.zip
rm -rf Wappalyzer
popd > /dev/null

@ -30,26 +30,11 @@ echo "Creating hard links..."
ln -f $path/wappalyzer.js $path/drivers/phantomjs
ln -f $path/apps.json $path/drivers/phantomjs
ln -f $path/wappalyzer.js $path/drivers/firefox
ln -f $path/apps.json $path/drivers/firefox/data
ln -f $path/icons/*.png $path/drivers/firefox/data/images/icons
ln -f $path/icons/*.svg $path/drivers/firefox/data/images/icons
ln -f $path/utils/iframe.js $path/drivers/firefox/data/js
ln -f $path/wappalyzer.js $path/drivers/chrome/js
ln -f $path/apps.json $path/drivers/chrome
ln -f $path/icons/*.png $path/drivers/chrome/images/icons
ln -f $path/icons/*.svg $path/drivers/chrome/images/icons
ln -f $path/utils/*.js $path/drivers/chrome/js
if [ "$(compgen -G "$path/icons/converted/*.png" | head -n1)" ]; then
ln -f $path/icons/converted/*.png $path/drivers/chrome/images/icons/converted
fi
ln -f $path/wappalyzer.js $path/drivers/webextension/js
ln -f $path/apps.json $path/drivers/webextension
ln -f $path/icons/*.png $path/drivers/webextension/images/icons
ln -f $path/icons/*.svg $path/drivers/webextension/images/icons
ln -f $path/utils/*.js $path/drivers/webextension/js
if [ "$(compgen -G "$path/icons/converted/*.png" | head -n1)" ]; then
ln -f $path/icons/converted/*.png $path/drivers/webextension/images/icons/converted

@ -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"
}
}
}

@ -587,6 +587,26 @@
"implies": "Java",
"website": "http://wicket.apache.org"
},
"ApexPages": {
"cats": [
"51"
],
"headers": {
"X-Powered-By": "Salesforce.com ApexPages"
},
"icon": "ApexPages.png",
"implies": "Salesforce",
"website": "https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_intro.htm"
},
"Apostrophe CMS": {
"cats": [
"1"
],
"html": "<[^>]+data-apos-refreshable[^>]",
"icon": "apostrophecms.svg",
"implies": "Node.js",
"website": "http://apostrophecms.org"
},
"AppNexus": {
"cats": [
"36"
@ -845,7 +865,6 @@
"3"
],
"html": "<!-- <h1>BigDump: Staggered MySQL Dump Importer ver\\. ([\\d.b]+)\\;version:\\1",
"icon": "default.svg",
"implies": [
"MySQL",
"PHP"
@ -930,18 +949,24 @@
"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"
},
"Bold Chat": {
"cats": [
"52"
],
"icon": "BoldChat.png",
"script": "^https?://vmss\\.boldchat\\.com/aid/\\d{18}/bc\\.vms4/vms\\.js",
"website": "https://www.boldchat.com/"
},
"Bolt": {
"cats": [
"1"
@ -965,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"
@ -1107,7 +1145,6 @@
"cats": [
"1"
],
"icon": "default.svg",
"implies": "PHP",
"meta": {
"generator": "CMSimple( [\\d.]+)?\\;version:\\1"
@ -1403,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"
@ -1627,7 +1673,7 @@
"X-Powered-By": "CppCMS/([\\d.]+)\\;version:\\1"
},
"icon": "CppCMS.png",
"implies": "C++",
"implies": "C\\+\\+",
"website": "http://cppcms.com"
},
"Craft CMS": {
@ -1696,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": {
@ -1845,7 +1891,6 @@
"headers": {
"Server": "DECORUM(?:/([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://example.com"
},
"DedeCMS": {
@ -2003,6 +2048,9 @@
"cats": [
"1"
],
"headers": {
"X-Dotclear-Static-Cache": ""
},
"icon": "Dotclear.png",
"implies": "PHP",
"website": "http://dotclear.org"
@ -2318,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"
@ -2466,7 +2513,7 @@
],
"icon": "FancyBox.png",
"implies": "jQuery",
"script": "jquery\\.fancybox\\.pack\\.js$",
"script": "jquery\\.fancybox\\.pack\\.js(?:\\?v=([\\d.]+))?$\\;version:\\1",
"website": "http://fancyapps.com/fancybox"
},
"Fat-Free Framework": {
@ -2515,7 +2562,6 @@
"headers": {
"Server": "FlashCom/?([\\d\\.]+)?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://example.com"
},
"Flask": {
@ -2545,6 +2591,17 @@
},
"website": "http://www.flexcmp.com/cms/home"
},
"FlexSlider": {
"cats": [
"5"
],
"icon": "FlexSlider.png",
"implies": "jQuery",
"script": [
"jquery\\.flexslider(?:\\.min)?\\.js$"
],
"website": "https://woocommerce.com/flexslider/"
},
"FluxBB": {
"cats": [
"2"
@ -2577,6 +2634,17 @@
"icon": "Font Awesome.png",
"website": "http://fontawesome.io"
},
"Fork CMS": {
"cats": [
"1"
],
"icon": "ForkCMS.png",
"implies": "Symfony",
"meta": {
"generator": "^Fork CMS$"
},
"website": "http://www.fork-cms.com/"
},
"Fortune3": {
"cats": [
"6"
@ -2632,8 +2700,9 @@
"24"
],
"icon": "Froala.svg",
"html": "<[^>]+class=\"[^\"]*(?:fr-view|fr-box)",
"implies": [
"jQuery"
"jQuery", "Font Awesome"
],
"website": "http://froala.com/wysiwyg-editor"
},
@ -2724,7 +2793,10 @@
"47"
],
"env": "^gerrit_",
"html": "<(?:div|style) id=\"gerrit_",
"html": [
">Gerrit Code Review</a>\\s*\"\\s*\\(([0-9.]+)\\)\\;version:\\1",
"<(?:div|style) id=\"gerrit_"
],
"icon": "gerrit.svg",
"implies": [
"Java",
@ -2790,7 +2862,6 @@
},
"html": [
"<meta content=\"https?://[^/]+/assets/gitlab_logo-",
"GitLab</title>",
"<header class=\"navbar navbar-fixed-top navbar-gitlab with-horizontal-nav\">"
],
"icon": "GitLab.svg",
@ -2821,7 +2892,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"
},
@ -2830,7 +2900,6 @@
"47"
],
"html": "Powered by <a href=\"https://gerrit.googlesource.com/gitiles/\">Gitiles<",
"icon": "default.svg",
"implies": [
"Java",
"git"
@ -2998,6 +3067,17 @@
"script": "apis\\.google\\.com/js/[a-z]*\\.js",
"website": "http://plus.google.com"
},
"Google Search Appliance": {
"cats": [
"22",
"29"
],
"headers": {
"Server": "^Google\\sSearch\\sAppliance$"
},
"icon": "Google Search Appliance.png",
"website": "https://enterprise.google.com/search"
},
"Google Sites": {
"cats": [
"1"
@ -3213,7 +3293,6 @@
"headers": {
"Server": "^http-kit"
},
"icon": "default.svg",
"implies": "Java",
"website": "http://http-kit.org"
},
@ -3224,7 +3303,6 @@
"headers": {
"Server": "(?:^|[^-])\bHTTP-Server(?: ?/?V?([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://example.com"
},
"HTTP/2": {
@ -3243,7 +3321,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/"
},
@ -3273,7 +3350,6 @@
"headers": {
"Server": "Happy ICS Server(?:/([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"implies": "OmniTouch 8660 My Teamwork",
"website": "http://example.com"
},
@ -3332,6 +3408,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"
@ -3361,6 +3445,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"
@ -3375,6 +3471,18 @@
},
"website": "http://hotarucms.org"
},
"Hotjar": {
"cats": [
"10"
],
"env": [
"^HotLeadfactory$",
"^HotleadController$"
],
"icon": "Hotjar.png",
"script": "^//static\\.hotjar\\.com/c/hotjar-",
"website": "https://www.hotjar.com"
},
"HubSpot": {
"cats": [
"32"
@ -3555,7 +3663,6 @@
"1"
],
"html": "<(?:link|a href) [^>]+ndxz-studio",
"icon": "default.svg",
"implies": [
"PHP",
"Apache",
@ -3584,7 +3691,6 @@
"headers": {
"Server": "Indy(?:/([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://indyproject.org"
},
"InfernoJS": {
@ -4113,7 +4219,6 @@
"headers": {
"X-Powered-By": "Kolibri"
},
"icon": "default.svg",
"meta": {
"generator": "Kolibri"
},
@ -4130,6 +4235,14 @@
},
"website": "http://www.komodocms.com"
},
"Kontaktify": {
"cats": [
"5"
],
"icon": "Kontaktify.png",
"script": "//(?:www\\.)?kontaktify\\.com/embed.js",
"website": "https://www.kontaktify.com"
},
"Koobi": {
"cats": [
"1"
@ -4200,7 +4313,6 @@
"cats": [
"12"
],
"icon": "default.svg",
"script": "lazy(?:\\.browser)?(?:\\.min)?\\.js",
"website": "http://danieltao.com/lazy.js"
},
@ -4259,7 +4371,6 @@
},
"Lightbox": {
"cats": [
"7",
"12"
],
"html": "<link [^>]*href=\"[^\"]+lightbox(?:\\.min)?\\.css",
@ -4373,6 +4484,14 @@
"url": "\\.livejournal\\.com",
"website": "http://www.livejournal.com"
},
"LivePerson": {
"cats": [
"52"
],
"icon": "LivePerson.png",
"script": "^https?://lptag\\.liveperson\\.net/tag/tag\\.js",
"website": "https://www.liveperson.com/"
},
"LiveStreet CMS": {
"cats": [
"1"
@ -4747,6 +4866,18 @@
},
"website": "http://www.mediawiki.org"
},
"Medium": {
"cats": [
"1"
],
"headers": {
"X-Powered-By": "Medium"
},
"icon": "Medium.svg",
"script": "medium\\.com",
"url": "^(?:www\\.)?medium\\.com",
"website": "https://medium.com"
},
"Meebo": {
"cats": [
"5"
@ -4771,9 +4902,17 @@
"cats": [
"12"
],
"env": "^Meteor$",
"env": [
"^Meteor$",
"^METEOR_VERSION$"
],
"html": "<link[^>]+__meteor-css__",
"icon": "Meteor.png",
"implies": [
"MongoDB",
"Node.js",
"jQuery"
],
"website": "http://meteor.com"
},
"Methode": {
@ -4870,7 +5009,6 @@
"headers": {
"Server": "MiniServ\\/?([\\d\\.]+)?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://sourceforge.net/projects/miniserv"
},
"Mint": {
@ -4916,7 +5054,6 @@
"headers": {
"Server": "MochiWeb(?:/([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://github.com/mochi/mochiweb"
},
"Modernizr": {
@ -5087,7 +5224,6 @@
"headers": {
"Server": "Motion-httpd(?:/([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://lavrsen.dk/foswiki/bin/view/Motion"
},
"MotoCMS": {
@ -5256,6 +5392,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"
@ -5327,10 +5474,21 @@
"icon": "node.js.png",
"website": "http://nodejs.org"
},
"NodeBB": {
"cats": [
"2"
],
"headers": {
"X-Powered-By": "^NodeBB$"
},
"icon": "NodeBB.png",
"implies": "Node.js",
"script": "^/nodebb\\.min\\.js\\?",
"website": "https://nodebb.org"
},
"OWL Carousel": {
"cats": [
"5",
"7"
"5"
],
"html": "<link [^>]*href=\"[^\"]+owl.carousel(?:\\.min)?\\.css",
"icon": "OWL Carousel.png",
@ -5390,6 +5548,14 @@
"script": "/web/js/(?:web\\.assets_common/|website\\.assets_frontend/)\\;confidence:25",
"website": "http://odoo.com"
},
"Olark": {
"cats": [
"52"
],
"icon": "Olark.png",
"script": "^https?:\\/\\/static\\.olark\\.com\\/jsclient\\/loader1\\.js",
"website": "https://www.olark.com/"
},
"OmniTouch 8660 My Teamwork": {
"cats": [
"19"
@ -5736,7 +5902,7 @@
"Set-Cookie": "PHPSESSID",
"X-Powered-By": "php/?([\\d.]+)?\\;version:\\1"
},
"icon": "PHP.png",
"icon": "PHP.svg",
"url": "\\.php(?:$|\\?)",
"website": "http://php.net"
},
@ -5796,7 +5962,6 @@
"cats": [
"25"
],
"icon": "default.svg",
"script": "paths(?:\\.min)?\\.js",
"website": "http://github.com/andreaferretti/paths-js"
},
@ -6100,6 +6265,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?-->",
@ -6145,7 +6314,6 @@
"25"
],
"env": "^protovis$",
"icon": "default.svg",
"script": "protovis.*\\.js",
"website": "http://mbostock.github.com/protovis"
},
@ -6280,7 +6448,6 @@
"headers": {
"Server": "RAID HTTPServer(?:/([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://example.com"
},
"RBS Change": {
@ -6390,7 +6557,6 @@
"headers": {
"Server": "Rapid Logic(?:/([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://example.com"
},
"React": {
@ -6475,7 +6641,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": {
@ -6494,7 +6661,6 @@
"25"
],
"env": "^Rickshaw$",
"icon": "default.svg",
"implies": "D3",
"script": "rickshaw(?:\\.min)?\\.js",
"website": "http://code.shutterstock.com/rickshaw/"
@ -6779,6 +6945,18 @@
"implies": "Express",
"website": "http://sailsjs.org"
},
"Salesforce": {
"cats": [
"53"
],
"env": "^SFDC(?:App|Cmp|Page|SessionVars)$",
"headers": {
"Set-Cookie": "com\\.salesforce\\."
},
"html": "<[^>]+=\"brandQuaternaryFgrs\"",
"icon": "Salesforce.svg",
"website": "https://www.salesforce.com"
},
"Sarka-SPIP": {
"cats": [
"1"
@ -6817,6 +6995,16 @@
],
"website": "http://schneider-electric.com"
},
"Scholica": {
"cats": [
"21"
],
"headers": {
"X-Scholica-Version": ""
},
"icon": "Scholica.svg",
"website": "http://scholica.com"
},
"Scientific Linux": {
"cats": [
"28"
@ -6842,7 +7030,6 @@
"cats": [
"12"
],
"icon": "default.svg",
"implies": "jQuery",
"script": "select2.*\\.js",
"website": "http://select2.github.io"
@ -7061,7 +7248,6 @@
"headers": {
"Server": "SimpleHTTP(?:/([\\d.]+))?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://example.com"
},
"Site Meter": {
@ -7134,7 +7320,6 @@
},
"Slimbox": {
"cats": [
"7",
"12"
],
"html": "<link [^>]*href=\"[^/]*slimbox(?:-rtl)?\\.css",
@ -7145,7 +7330,6 @@
},
"Slimbox 2": {
"cats": [
"7",
"12"
],
"html": "<link [^>]*href=\"[^/]*slimbox2(?:-rtl)?\\.css",
@ -7261,6 +7445,18 @@
"script": "^https?://api\\.solvemedia\\.com/",
"website": "http://solvemedia.com"
},
"SonarQubes": {
"cats": [
"47"
],
"env": "^Sonar(?:Measures|Request)$",
"meta": {
"application-name": "^SonarQubes$"
},
"html": "<title>SonarQube</title>",
"icon": "sonar.png",
"website": "https://www.sonarqube.org/"
},
"SoundManager": {
"cats": [
"12"
@ -7288,6 +7484,17 @@
},
"website": "http://spidercontrol.net/ininet"
},
"SpinCMS": {
"cats": [
"1"
],
"headers": {
"Set-Cookie": "spincms_session"
},
"icon": "SpinCMS.png",
"implies": "PHP",
"website": "http://www.spin.cw"
},
"Splunk": {
"cats": [
"19"
@ -7497,7 +7704,6 @@
},
"Supersized": {
"cats": [
"7",
"25"
],
"icon": "Supersized.png",
@ -7630,7 +7836,10 @@
],
"env": "^TEALIUMENABLED$",
"icon": "Tealium.png",
"script": "//tags\\.tiqcdn\\.com/",
"script": [
"^//tags\\.tiqcdn\\.com/",
"/tealium/utag\\.js$"
],
"website": "http://tealium.com"
},
"TeamCity": {
@ -7652,9 +7861,12 @@
"cats": [
"1"
],
"env": "Telescope",
"env": "^Telescope$",
"icon": "Telescope.png",
"implies": "Meteor",
"implies": [
"Meteor",
"React"
],
"website": "http://telescopeapp.org"
},
"Tengine": {
@ -7900,7 +8112,6 @@
"25"
],
"env": "^twemoji$",
"icon": "default.svg",
"script": "twemoji(?:\\.min)?\\.js",
"website": "http://twitter.github.io/twemoji/"
},
@ -7934,6 +8145,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"
@ -8204,6 +8424,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"
@ -8211,7 +8443,6 @@
"headers": {
"Server": "Virata-EmWeb(?:/(R?[\\d._]+))?\\;version:\\1"
},
"icon": "default.svg",
"implies": [
"HP"
],
@ -8518,7 +8749,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": {
@ -9106,7 +9336,6 @@
"headers": {
"Server": "dwhttpd\\/?([\\d\\.a-z]+)?\\;version:\\1"
},
"icon": "default.svg",
"website": "http://example.com"
},
"e107": {
@ -9139,7 +9368,6 @@
"headers": {
"Server": "\beHTTP(?: v?([\\d\\.]+))?\\;version:\\1"
},
"icon": "default.svg",
"implies": "HP ProCurve",
"website": "http://example.com"
},
@ -9201,7 +9429,6 @@
"47"
],
"html": "<p>Powered by <a[^>]+>GitList ([\\d.]+)\\;version:\\1",
"icon": "default.svg",
"implies": [
"PHP",
"git"
@ -9336,7 +9563,6 @@
"cats": [
"25"
],
"icon": "default.svg",
"implies": "jQuery",
"script": "jquery\\.sparkline.*\\.js",
"website": "http://omnipotent.net/jquery.sparkline/"
@ -9721,7 +9947,6 @@
},
"prettyPhoto": {
"cats": [
"7",
"12"
],
"env": "pp_(?:alreadyInitialized|descriptions|images|titles)",
@ -9782,20 +10007,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"
@ -9882,24 +10096,26 @@
},
"website": "http://www.vbulletin.com"
},
"vibecommerce": {
"cats": [
"6"
],
"excludes": "PrestaShop",
"icon": "vibecommerce.png",
"implies": "PHP",
"meta": {
"designer": "vibecommerce",
"generator": "vibecommerce"
},
"website": "http://vibecommerce.com.br"
},
"viennaCMS": {
"cats": [
"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"
@ -9919,13 +10135,28 @@
"icon": "webpack.svg",
"website": "http://webpack.github.io"
},
"wpCache": {
"cats": [
"23"
],
"headers": {
"X-Powered-By": "wpCache(?:/([\\d.]+))?\\;version:\\1"
},
"html": "<!--[^>]+wpCache",
"icon": "wpCache.png",
"implies": "PHP",
"meta": {
"generator": "wpCache",
"keywords": "wpCache"
},
"website": "http://wpcache.co"
},
"xCharts": {
"cats": [
"25"
],
"env": "^xChart$",
"html": "<link[^>]* href=\"[^\"]*xcharts(?:\\.min)?\\.css",
"icon": "default.svg",
"implies": "D3",
"script": "xcharts\\.js",
"website": "http://tenxer.github.io/xcharts/"
@ -10160,6 +10391,10 @@
"52": {
"name": "Live Chat",
"priority": "9"
},
"53": {
"name": "CRM",
"priority": "9"
}
}
}
}

@ -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,7 +0,0 @@
apps.json
images/icons/converted/*.png
images/icons/*.png
images/icons/*.svg
js/wappalyzer.js
js/iframe.js
js/network.js

@ -1,60 +0,0 @@
{
"github": { "message": "Κάνε fork το Wappalyzer στο GitHub!" },
"twitter": { "message": "Ακολούθησε το Wappalyzer στο Twitter" },
"website": { "message": "Πήγαινε στο wappalyzer.com" },
"options": { "message": "Ρυθμίσεις Wappalyzer" },
"optionsSave": { "message": "Ρυθμίσεις αποθήκευσης" },
"optionsSaved": { "message": "Αποθηκεύτηκε" },
"optionUpgradeMessage": { "message": "Ενημερώστε με για αναβαθμίσεις" },
"optionTracking": { "message": "Ανώνυμη αποστολή αναφορών για εντοπισμένες εφαρμογές στο wappalyzer.com για έρευνα" },
"nothingToDo": { "message": "Καμία ενέργεια." },
"noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Διαδικτυακό Φόρουμ" },
"categoryName3": { "message": "Διαχειριστής Βάσης Δεδομένων" },
"categoryName4": { "message": "Εργαλείο Τεκμηρίωσης" },
"categoryName5": { "message": "Widget" },
"categoryName10": { "message": "Analytics" },
"categoryName11": { "message": "Blog" },
"categoryName12": { "message": "Framework της JavaScript" },
"categoryName13": { "message": "Issue Tracker" },
"categoryName14": { "message": "Πρόγραμμα αναπαραγωγής Βίντεο" },
"categoryName15": { "message": "Σύστημα Σχολίων" },
"categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Script Γραμματοσειράς" },
"categoryName18": { "message": "Framework Διαδικτύου" },
"categoryName19": { "message": "Διάφορα" },
"categoryName20": { "message": "Επεξεργαστής Κειμένου" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Διακομιστής Διαδικτύου" },
"categoryName23": { "message": "Εργαλείο Μνήμης Cache" },
"categoryName24": { "message": "Επεξεργαστής Εμπλουτισμένου Κειμένου" },
"categoryName25": { "message": "Γραφικά JavaScript" },
"categoryName26": { "message": "Framework για Κινητά" },
"categoryName27": { "message": "Γλώσσα Προγραμματισμού" },
"categoryName28": { "message": "Λειτουργικό Σύστημα" },
"categoryName29": { "message": "Μηχανή Αναζήτησης" },
"categoryName30": { "message": "Web Mail" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Αυτοματοποίηση Marketing" },
"categoryName33": { "message": "Επέκταση Διακομιστή Διαδικτύου" },
"categoryName34": { "message": "Βάση Δεδομένων" },
"categoryName35": { "message": "Χάρτης" },
"categoryName36": { "message": "Δίκτυο Διαφημίσεων" },
"categoryName37": { "message": "Υπηρεσία Δικτύου" },
"categoryName38": { "message": "Διακομιστής Πολυμέσων" },
"categoryName39": { "message": "Διαδικτυακή κάμερα" },
"categoryName40": { "message": "Εκτυπωτής" },
"categoryName41": { "message": "Σύστημα Επεξεργασίας Πληρωμών" },
"categoryName42": { "message": "Σύστημα Διαχείρισης Tags" },
"categoryName43": { "message": "Paywall" },
"categoryName44": { "message": "Σύστημα Build/CI" },
"categoryName45": { "message": "Σύστημα SCADA" },
"categoryName46": { "message": "Απομακρυσμένη Πρόσβαση" },
"categoryName47": { "message": "Εργαλείο Ανάπτυξης" },
"categoryName48": { "message": "Δικτυακός Αποθηκευτικός Χώρος" },
"categoryName49": { "message": "Feed Readers" },
"categoryName50": { "message": "Συστήματα Διαχειρίσης Εγγράφων" },
"categoryName51": { "message": "Σύστημα Κατασκευής Σελίδων Υποδοχής" },
"categoryName52": { "message": "Live Chat" }
}

@ -1,60 +0,0 @@
{
"github": { "message": "Fork Wappalyzer on GitHub!" },
"twitter": { "message": "Follow Wappalyzer on Twitter" },
"website": { "message": "Go to wappalyzer.com" },
"options": { "message": "Wappalyzer Options" },
"optionsSave": { "message": "Save options" },
"optionsSaved": { "message": "Saved" },
"optionUpgradeMessage": { "message": "Tell me about upgrades" },
"optionTracking": { "message": "Anonymously send reports on detected applications to wappalyzer.com for research" },
"nothingToDo": { "message": "Nothing to do here." },
"noAppsDetected": { "message": "No applications detected." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Message Board" },
"categoryName3": { "message": "Database Manager" },
"categoryName4": { "message": "Documentation Tool" },
"categoryName5": { "message": "Widget" },
"categoryName10": { "message": "Analytics" },
"categoryName11": { "message": "Blog" },
"categoryName12": { "message": "JavaScript Framework" },
"categoryName13": { "message": "Issue Tracker" },
"categoryName14": { "message": "Video Player" },
"categoryName15": { "message": "Comment System" },
"categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Font Script" },
"categoryName18": { "message": "Web Framework" },
"categoryName19": { "message": "Miscellaneous" },
"categoryName20": { "message": "Editor" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Web Server" },
"categoryName23": { "message": "Cache Tool" },
"categoryName24": { "message": "Rich Text Editor" },
"categoryName25": { "message": "JavaScript Graphics" },
"categoryName26": { "message": "Mobile Framework" },
"categoryName27": { "message": "Programming Language" },
"categoryName28": { "message": "Operating System" },
"categoryName29": { "message": "Search Engine" },
"categoryName30": { "message": "Web Mail" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Marketing Automation" },
"categoryName33": { "message": "Web Server Extension" },
"categoryName34": { "message": "Database" },
"categoryName35": { "message": "Map" },
"categoryName36": { "message": "Advertising Network" },
"categoryName37": { "message": "Network Service" },
"categoryName38": { "message": "Media Server" },
"categoryName39": { "message": "Webcam" },
"categoryName40": { "message": "Printer" },
"categoryName41": { "message": "Payment Processor" },
"categoryName42": { "message": "Tag Manager" },
"categoryName43": { "message": "Paywall" },
"categoryName44": { "message": "Build/CI System" },
"categoryName45": { "message": "SCADA System" },
"categoryName46": { "message": "Remote Access" },
"categoryName47": { "message": "Development Tool" },
"categoryName48": { "message": "Network Storage" },
"categoryName49": { "message": "Feed Readers" },
"categoryName50": { "message": "Document Management Systems" },
"categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Live Chat" }
}

@ -1,64 +0,0 @@
{
"github": { "message": "¡Forkea Wappalyzer en GitHub!" },
"twitter": { "message": "Sigue Wappalyzer en Twitter" },
"website": { "message": "Ir a wappalyzer.com" },
"options": { "message": "Opciones de Wappalyzer" },
"optionsSave": { "message": "Guardar opciones" },
"optionsSaved": { "message": "Guardado" },
"optionUpgradeMessage": { "message": "Indicarme actualizaciones" },
"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." },
"categoryName1": { "message": "Gestor de Contenido" },
"categoryName2": { "message": "Foro" },
"categoryName3": { "message": "Gestor de Bases de Datos" },
"categoryName4": { "message": "Herramienta de Documentación" },
"categoryName5": { "message": "Widget" },
"categoryName6": { "message": "Tienda Web" },
"categoryName7": { "message": "Galería fotográfica" },
"categoryName8": { "message": "Wiki" },
"categoryName9": { "message": "Panel de Hosting" },
"categoryName10": { "message": "Analítica" },
"categoryName11": { "message": "Blog" },
"categoryName12": { "message": "Framework JavaScript" },
"categoryName13": { "message": "Gestor de Incidencias" },
"categoryName14": { "message": "Reproductor de Vídeo" },
"categoryName15": { "message": "Sistema de Comentarios" },
"categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Tipografía" },
"categoryName18": { "message": "Framework Web" },
"categoryName19": { "message": "Miscelánea" },
"categoryName20": { "message": "Editor" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Servidor Web" },
"categoryName23": { "message": "Herramienta de Cache" },
"categoryName24": { "message": "Editor de Texto Enriquecido" },
"categoryName25": { "message": "Gráficos JavaScript" },
"categoryName26": { "message": "Framework Móvil" },
"categoryName27": { "message": "Lenguaje de programación" },
"categoryName28": { "message": "Sistema Operativo" },
"categoryName29": { "message": "Motor de Búsqueda" },
"categoryName30": { "message": "Correo Web" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Automatización de Marketing" },
"categoryName33": { "message": "Extensión de Servidor Web" },
"categoryName34": { "message": "Base de Datos" },
"categoryName35": { "message": "Mapa" },
"categoryName36": { "message": "Red de Publicidad" },
"categoryName37": { "message": "Network Sevice" },
"categoryName38": { "message": "Media Server" },
"categoryName39": { "message": "Webcam" },
"categoryName40": { "message": "Printer" },
"categoryName41": { "message": "Payment Processor" },
"categoryName42": { "message": "Tag Manager" },
"categoryName43": { "message": "Paywall" },
"categoryName44": { "message": "Build/CI System" },
"categoryName45": { "message": "SCADA System" },
"categoryName46": { "message": "Remote Access" },
"categoryName47": { "message": "Development Tool" },
"categoryName48": { "message": "Network Storage" },
"categoryName49": { "message": "Feed Readers" },
"categoryName50": { "message": "Document Management Systems" },
"categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Live Chat" }
}

@ -1,64 +0,0 @@
{
"github": { "message": "Forker Wappalyzer sur GitHub !" },
"noAppsDetected": { "message": "Aucune application détectée." },
"nothingToDo": { "message": "Rien à faire ici." },
"optionTracking": { "message": "Envoyer anonymement des rapports sur les applications détectées à wappalyzer.com pour recherche" },
"optionUpgradeMessage": { "message": "M'informer des mises à jour" },
"options": { "message": "Options de Wappalyzer" },
"optionsSave": { "message": "Sauvegarder les options" },
"optionsSaved": { "message": "Sauvegardé" },
"twitter": { "message": "Suivre Wappalyzer sur Twitter" },
"website": { "message": "Aller sur wappalyzer.com" },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Forum" },
"categoryName3": { "message": "Gestionnaire de base de données" },
"categoryName4": { "message": "Outil de documentation" },
"categoryName5": { "message": "Widget" },
"categoryName6": { "message": "Boutique en ligne" },
"categoryName7": { "message": "Galerie photo" },
"categoryName8": { "message": "Wiki" },
"categoryName9": { "message": "Gestionnaires de serveur" },
"categoryName10": { "message": "Outil de statistiques" },
"categoryName11": { "message": "Blog" },
"categoryName12": { "message": "Framework JavaScript" },
"categoryName13": { "message": "Outil de suivi de problèmes" },
"categoryName14": { "message": "Lecteur de vidéos" },
"categoryName15": { "message": "Système de commentaires" },
"categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Script de police" },
"categoryName18": { "message": "Framework web" },
"categoryName19": { "message": "Divers" },
"categoryName20": { "message": "Editeur" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Serveur web" },
"categoryName23": { "message": "Outil de cache" },
"categoryName24": { "message": "Editeur WYSIWYG" },
"categoryName25": { "message": "Graphismes JavaScript" },
"categoryName26": { "message": "Framework pour mobiles" },
"categoryName27": { "message": "Language de programmation" },
"categoryName28": { "message": "Système d'exploitation" },
"categoryName29": { "message": "Moteur de recherche" },
"categoryName30": { "message": "Web Mail" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Logiciel de marketing" },
"categoryName33": { "message": "Extension de serveur web" },
"categoryName34": { "message": "Base de données" },
"categoryName35": { "message": "Carte" },
"categoryName36": { "message": "Réseau publicitaire" },
"categoryName37": { "message": "Périphérique réseau" },
"categoryName38": { "message": "Serveur multimédia" },
"categoryName39": { "message": "Webcam" },
"categoryName40": { "message": "Imprimante" },
"categoryName41": { "message": "Service de paiement" },
"categoryName42": { "message": "Tag Manager" },
"categoryName43": { "message": "Paywall" },
"categoryName44": { "message": "Système CI" },
"categoryName45": { "message": "Système SCADA" },
"categoryName46": { "message": "Accès à distance" },
"categoryName47": { "message": "Outil de développement" },
"categoryName48": { "message": "Stockage réseau" },
"categoryName49": { "message": "Lecteur RSS" },
"categoryName50": { "message": "Système de gestion de documents" },
"categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Chat en direct" }
}

@ -1,60 +0,0 @@
{
"github": { "message": "Κάνε fork το Wappalyzer στο GitHub!" },
"twitter": { "message": "Ακολούθησε το Wappalyzer στο Twitter" },
"website": { "message": "Πήγαινε στο wappalyzer.com" },
"options": { "message": "Ρυθμίσεις Wappalyzer" },
"optionsSave": { "message": "Ρυθμίσεις αποθήκευσης" },
"optionsSaved": { "message": "Αποθηκεύτηκε" },
"optionUpgradeMessage": { "message": "Ενημερώστε με για αναβαθμίσεις" },
"optionTracking": { "message": "Ανώνυμη αποστολή αναφορών για εντοπισμένες εφαρμογές στο wappalyzer.com για έρευνα" },
"nothingToDo": { "message": "Καμία ενέργεια." },
"noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Διαδικτυακό Φόρουμ" },
"categoryName3": { "message": "Διαχειριστής Βάσης Δεδομένων" },
"categoryName4": { "message": "Εργαλείο Τεκμηρίωσης" },
"categoryName5": { "message": "Widget" },
"categoryName10": { "message": "Analytics" },
"categoryName11": { "message": "Blog" },
"categoryName12": { "message": "Framework της JavaScript" },
"categoryName13": { "message": "Issue Tracker" },
"categoryName14": { "message": "Πρόγραμμα αναπαραγωγής Βίντεο" },
"categoryName15": { "message": "Σύστημα Σχολίων" },
"categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Script Γραμματοσειράς" },
"categoryName18": { "message": "Framework Διαδικτύου" },
"categoryName19": { "message": "Διάφορα" },
"categoryName20": { "message": "Επεξεργαστής Κειμένου" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Διακομιστής Διαδικτύου" },
"categoryName23": { "message": "Εργαλείο Μνήμης Cache" },
"categoryName24": { "message": "Επεξεργαστής Εμπλουτισμένου Κειμένου" },
"categoryName25": { "message": "Γραφικά JavaScript" },
"categoryName26": { "message": "Framework για Κινητά" },
"categoryName27": { "message": "Γλώσσα Προγραμματισμού" },
"categoryName28": { "message": "Λειτουργικό Σύστημα" },
"categoryName29": { "message": "Μηχανή Αναζήτησης" },
"categoryName30": { "message": "Web Mail" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Αυτοματοποίηση Marketing" },
"categoryName33": { "message": "Επέκταση Διακομιστή Διαδικτύου" },
"categoryName34": { "message": "Βάση Δεδομένων" },
"categoryName35": { "message": "Χάρτης" },
"categoryName36": { "message": "Δίκτυο Διαφημίσεων" },
"categoryName37": { "message": "Υπηρεσία Δικτύου" },
"categoryName38": { "message": "Διακομιστής Πολυμέσων" },
"categoryName39": { "message": "Διαδικτυακή κάμερα" },
"categoryName40": { "message": "Εκτυπωτής" },
"categoryName41": { "message": "Σύστημα Επεξεργασίας Πληρωμών" },
"categoryName42": { "message": "Σύστημα Διαχείρισης Tags" },
"categoryName43": { "message": "Paywall" },
"categoryName44": { "message": "Σύστημα Build/CI" },
"categoryName45": { "message": "Σύστημα SCADA" },
"categoryName46": { "message": "Απομακρυσμένη Πρόσβαση" },
"categoryName47": { "message": "Εργαλείο Ανάπτυξης" },
"categoryName48": { "message": "Δικτυακός Αποθηκευτικός Χώρος" },
"categoryName49": { "message": "Feed Readers" },
"categoryName50": { "message": "Συστήματα Διαχειρίσης Εγγράφων" },
"categoryName51": { "message": "Σύστημα Κατασκευής Σελίδων Υποδοχής" },
"categoryName52": { "message": "Live Chat" }
}

@ -1,65 +0,0 @@
{
"github": { "message": "Fork Wappalyzer su GitHub!" },
"twitter": { "message": "Follow Wappalyzer su Twitter" },
"website": { "message": "Vai su wappalyzer.com" },
"options": { "message": "Opzioni Wappalyzer" },
"optionsSave": { "message": "Salva opzioni" },
"optionsSaved": { "message": "Salvato" },
"optionUpgradeMessage": { "message": "Parlami dell'upgrade" },
"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." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Forum" },
"categoryName3": { "message": "Gestore di Database" },
"categoryName4": { "message": "Strumento di documentazione" },
"categoryName5": { "message": "Widget" },
"categoryName6": { "message": "eCommerce" },
"categoryName7": { "message": "Galleria fotografica" },
"categoryName8": { "message": "Wiki" },
"categoryName9": { "message": "Pannello Hosting" },
"categoryName10": { "message": "Analytics" },
"categoryName11": { "message": "Blog" },
"categoryName12": { "message": "Framework JavaScript" },
"categoryName13": { "message": "Issue Tracker" },
"categoryName14": { "message": "Player Video" },
"categoryName15": { "message": "Sistema di commenti" },
"categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Font Script" },
"categoryName18": { "message": "Framework Web" },
"categoryName19": { "message": "Miscellanea" },
"categoryName20": { "message": "Editor" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Web Server" },
"categoryName23": { "message": "Cache Tool" },
"categoryName24": { "message": "Editor di Testo Ricco" },
"categoryName25": { "message": "JavaScript Graphics" },
"categoryName26": { "message": "Framework Mobile" },
"categoryName27": { "message": "Linguaggio di programmazione" },
"categoryName28": { "message": "Sistema Operativo" },
"categoryName29": { "message": "Motore di Ricerca" },
"categoryName30": { "message": "Web Mail" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Marketing Automation" },
"categoryName33": { "message": "Estensione Web Server" },
"categoryName34": { "message": "Database" },
"categoryName35": { "message": "Mappa" },
"categoryName36": { "message": "Network Pubblicitario" },
"categoryName37": { "message": "Network Service" },
"categoryName38": { "message": "Media Server" },
"categoryName39": { "message": "Webcam" },
"categoryName40": { "message": "Stampante" },
"categoryName41": { "message": "Payment Processor" },
"categoryName42": { "message": "Tag Manager" },
"categoryName43": { "message": "Paywall" },
"categoryName44": { "message": "Sistema Build/CI" },
"categoryName45": { "message": "SCADA System" },
"categoryName46": { "message": "Accesso" },
"categoryName47": { "message": "Strumenti di Sviluppo" },
"categoryName48": { "message": "Network Storage" },
"categoryName49": { "message": "Lettore di Feed" },
"categoryName50": { "message": "Sistema di Gestione Documenti" },
"categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Live Chat" }
}

@ -1,60 +0,0 @@
{
"github": { "message": "Fork-uiește Wappalyzer pe GitHub!" },
"twitter": { "message": "Urmărește Wappalyzer pe Twitter" },
"website": { "message": "Mergi la wappalyzer.com" },
"options": { "message": "Opțiuni Wappalyzer" },
"optionsSave": { "message": "Salvează opțiuni" },
"optionsSaved": { "message": "Salvat" },
"optionUpgradeMessage": { "message": "Anunță-mă dacă sunt actualizări" },
"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ă." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Forum de discuții" },
"categoryName3": { "message": "Manager baze de date" },
"categoryName4": { "message": "Unealtă pentru documentare" },
"categoryName5": { "message": "Widget" },
"categoryName10": { "message": "Analiză trafic web" },
"categoryName11": { "message": "Blog" },
"categoryName12": { "message": "Framework JavaScript" },
"categoryName13": { "message": "Tracker probleme" },
"categoryName14": { "message": "Player Video" },
"categoryName15": { "message": "Sistem de comentarii" },
"categoryName16": { "message": "Verificare Captcha" },
"categoryName17": { "message": "Script pentru fonturi" },
"categoryName18": { "message": "Framework Web" },
"categoryName19": { "message": "Divers" },
"categoryName20": { "message": "Editor" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Server Web" },
"categoryName23": { "message": "Unealtă Cache" },
"categoryName24": { "message": "Editor Texte Rich" },
"categoryName25": { "message": "Grafică JavaScript" },
"categoryName26": { "message": "Framework Mobile" },
"categoryName27": { "message": "Limbaj de programare" },
"categoryName28": { "message": "Sistem de operare" },
"categoryName29": { "message": "Motor de căutare" },
"categoryName30": { "message": "Poștă electronică" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Automatizare marketing" },
"categoryName33": { "message": "Extensie server web" },
"categoryName34": { "message": "Bază de date" },
"categoryName35": { "message": "Hartă" },
"categoryName36": { "message": "Rețea de advertising" },
"categoryName37": { "message": "Serviciu rețea" },
"categoryName38": { "message": "Server Media" },
"categoryName39": { "message": "Webcam" },
"categoryName40": { "message": "Imprimantă" },
"categoryName41": { "message": "Sistem de plată" },
"categoryName42": { "message": "Manager cuvinte cheie" },
"categoryName43": { "message": "Paywall" },
"categoryName44": { "message": "Build/CI System" },
"categoryName45": { "message": "SCADA System" },
"categoryName46": { "message": "Remote Access" },
"categoryName47": { "message": "Development Tool" },
"categoryName48": { "message": "Network Storage" },
"categoryName49": { "message": "Feed Readers" },
"categoryName50": { "message": "Document Management Systems" },
"categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Live Chat" }
}

@ -1,60 +0,0 @@
{
"categoryName1" : { "message" : "CMS" },
"categoryName2" : { "message" : "Форум" },
"categoryName3" : { "message" : "Менеджер БД" },
"categoryName4" : { "message" : "Документация" },
"categoryName5" : { "message" : "Виджет" },
"categoryName10" : { "message" : "Аналитика" },
"categoryName11" : { "message" : "Блог" },
"categoryName12" : { "message" : "JS фреймворк" },
"categoryName13" : { "message" : "Баг трекер" },
"categoryName14" : { "message" : "Видео плеер" },
"categoryName15" : { "message" : "Система комментариев" },
"categoryName16" : { "message" : "Капча" },
"categoryName17" : { "message" : "Шрифт" },
"categoryName18" : { "message" : "Веб фреймворк" },
"categoryName19" : { "message" : "Прочее" },
"categoryName20" : { "message" : "HTML редактор" },
"categoryName21" : { "message" : "LMS" },
"categoryName22" : { "message" : "Веб сервер" },
"categoryName23" : { "message" : "Кеширование" },
"categoryName24" : { "message" : "WYSIWYG редактор" },
"categoryName25" : { "message" : "JS графика" },
"categoryName26" : { "message" : "Мобильный фреймворк" },
"categoryName27" : { "message" : "Язык программирования" },
"categoryName28" : { "message" : "Операционная система" },
"categoryName29" : { "message" : "Поисковый движок" },
"categoryName30" : { "message" : "Веб почта" },
"categoryName31" : { "message" : "CDN" },
"categoryName32" : { "message" : "Управление маркетингом" },
"categoryName33" : { "message" : "Расширение Веб сервера" },
"categoryName34" : { "message" : "База данных" },
"categoryName35" : { "message" : "Карта" },
"categoryName36" : { "message" : "Рекламная сеть" },
"categoryName37" : { "message" : "Сетевая служба" },
"categoryName38" : { "message" : "Медиа сервер" },
"categoryName39" : { "message" : "Вебкамера" },
"categoryName40" : { "message" : "Принтер" },
"categoryName41" : { "message" : "Провайдер платежей" },
"categoryName42" : { "message" : "Менеджер тэгов" },
"categoryName43" : { "message" : "Paywall" },
"categoryName44" : { "message" : "Система непрерывной интеграции" },
"categoryName45" : { "message" : "Система SCADA" },
"categoryName46" : { "message" : "Удаленное управление" },
"categoryName47" : { "message" : "Утилита для разработчиков" },
"categoryName48" : { "message" : "Сетевое хранилище" },
"categoryName49" : { "message" : "Граббер контента" },
"categoryName50" : { "message" : "Управление документами" },
"categoryName51" : { "message": "Генератор лендингов" },
"categoryName52" : { "message": "Live Chat" },
"github" : { "message" : "Форкнуть на GitHub!" },
"noAppsDetected" : { "message" : "Нет данных о сайте" },
"nothingToDo" : { "message" : "Тут нечего искать" },
"optionTracking" : { "message" : "Анонимно отправлять статистику распознанных данных на сервер (для улучшения расширения)" },
"optionUpgradeMessage" : { "message" : "Оповещать меня о новых обновлениях" },
"options" : { "message" : "Настройки Wappalyzer" },
"optionsSave" : { "message" : "Сохранить" },
"optionsSaved" : { "message" : "Успешно сохранено!" },
"twitter" : { "message" : "Следите за новостями в Твиттере" },
"website" : { "message" : "Перейти на Wappalyzer.com" }
}

@ -1,15 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Background</title>
<script src="js/ga.js"></script>
<script src="js/wappalyzer.js"></script>
<script src="js/defaults.js"></script>
<script src="js/driver.js"></script>
<script src="js/network.js"></script>
</head>
<body>
</body>
</html>

@ -1,65 +0,0 @@
body {
color: #303942;
cursor: default;
font-family: 'DejaVu Sans', Arial, sans-serif; font-size: 75%;
margin: 0 20px;
}
p {
line-height: 1.8em;
}
h1, h2, h3 {
font-weight: normal;
line-height: 1;
}
h1 {
border-bottom: 1px solid #eee;
font-size: 1.5em;
margin: 0;
padding: 21px 0 13px;
}
h2 {
font-size: 1.3em;
margin-bottom: 0.4em;
}
h3 {
color: black;
font-size: 1.2em;
margin-bottom: 0.5em;
}
a {
color: rgb(17, 85, 204);
text-decoration: underline;
}
a:active {
color: rgb(5, 37, 119);
}
#options-saved {
display: none;
-webkit-animation: fadeout 2s;
}
#about {
border-top: 1px solid #eee;
margin-top: 21px;
}
#about img {
vertical-align: middle;
}
#about button {
line-height: 30px;
}
@-webkit-keyframes fadeout {
from { opacity: 1; }
to { opacity: 0; }
}

@ -1,93 +0,0 @@
body {
background: #fff;
color: #000;
font-family: Helvetica, Arial, sans-serif;
font-size: 13px;
line-height: 16px;
margin: 0;
min-width: 200px;
padding: 15px;
}
a:focus {
outline: 0;
}
img {
display: inline-block;
height: 16px;
margin-right: 8px;
vertical-align: top;
width: 16px;
}
.detected-app {
padding: 7px 0;
}
.detected-app:first-child {
padding-top: 0;
}
.detected-app:last-child {
border: none;
padding-bottom: 0;
}
.detected-app a {
color: #000;
display: block;
text-decoration: none;
}
.detected-app a .label .name {
border-bottom: 1px dotted #999;
}
.detected-app a:hover .label .name {
border-bottom: 1px solid #333;
}
.detected-app a .category .name {
border-bottom: 1px solid transparent;
}
.detected-app a:hover .category .name {
border-bottom: 1px solid #999;
}
.label {
font-weight: bold;
}
.category {
color: #999;
display: block;
margin: 5px 0 0 24px;
}
.empty {
color: #999;
font-style: italic;
text-align: center;
}
#footer {
border-top: 1px solid #ccc;
margin-top: 17px;
overflow: hidden;
padding-top: 11px;
}
#footer a {
color: #999;
text-decoration: none;
}
#footer a:hover {
color: #333;
}
#options {
float: right;
}

@ -1,298 +0,0 @@
/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/* This file defines styles for form controls. The order of rule blocks is
* important as there are some rules with equal specificity that rely on order
* as a tiebreaker. These are marked with OVERRIDE.
*/
/* Default state **************************************************************/
button:not(.custom-appearance):not(.link-button),
input[type='button']:not(.custom-appearance):not(.link-button),
input[type='submit']:not(.custom-appearance):not(.link-button),
select,
input[type='checkbox'],
input[type='radio'] {
-webkit-appearance: none;
-webkit-user-select: none;
background-image: -webkit-linear-gradient(#ededed, #ededed 38%, #dedede);
border: 1px solid rgba(0, 0, 0, 0.25);
border-radius: 2px;
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08),
inset 0 1px 2px rgba(255, 255, 255, 0.75);
color: #444;
font: inherit;
margin: 0 1px 0 0;
text-shadow: 0 1px 0 rgb(240, 240, 240);
}
button:not(.custom-appearance):not(.link-button),
input[type='button']:not(.custom-appearance):not(.link-button),
input[type='submit']:not(.custom-appearance):not(.link-button),
select {
min-height: 2em;
min-width: 4em;
}
button:not(.custom-appearance):not(.link-button),
input[type='button']:not(.custom-appearance):not(.link-button),
input[type='submit']:not(.custom-appearance):not(.link-button) {
-webkit-padding-end: 10px;
-webkit-padding-start: 10px;
}
select {
-webkit-appearance: none;
-webkit-padding-end: 20px;
-webkit-padding-start: 6px;
/* OVERRIDE */
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAYAAAAbQcSUAAAAWklEQVQokWNgoAOIAuI0PDiKaJMSgYCZmfkbkPkfHYPEQfJEG/b//3+FBQsWLGRjY/uJbBCIDxIHyRNtGDYDyTYI3UA+Pr4vFBmEbODbt2+bKDYIyUBWYtQBAIRzRP/XKJ//AAAAAElFTkSuQmCC"),
-webkit-linear-gradient(#ededed, #ededed 38%, #dedede);
background-position: right center;
background-repeat: no-repeat;
}
html[dir='rtl'] select {
background-position: center left;
}
input[type='checkbox'] {
bottom: 2px;
height: 13px;
position: relative;
vertical-align: middle;
width: 13px;
}
input[type='radio'] {
/* OVERRIDE */
border-radius: 100%;
bottom: 3px;
height: 15px;
position: relative;
vertical-align: middle;
width: 15px;
}
/* TODO(estade): add more types here? */
input[type='password'],
input[type='search'],
input[type='text'],
input[type='url'],
input:not([type]) {
border: 1px solid #bfbfbf;
border-radius: 2px;
box-sizing: border-box;
color: #444;
font: inherit;
margin: 0;
/* Use min-height to accommodate addditional padding for touch as needed. */
min-height: 2em;
padding: 3px;
}
input[type='search'] {
-webkit-appearance: textfield;
/* NOTE: Keep a relatively high min-width for this so we don't obscure the end
* of the default text in relatively spacious languages (i.e. German). */
min-width: 160px;
}
/* Checked ********************************************************************/
input[type='checkbox']:checked::before {
-webkit-user-select: none;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wDBhYcG79aGIsAAACbSURBVBjTjdFBCkFhFAXgj4fp24PBy0SZ2ICRXRgYGb2xlKzBSEo2YgsiKWVoZgFKMjD5X/2Ux6lb99bpnNO5lKMR5i8MsEQHkhJiEzlS9HCqfiFWMUIt3AfsC3KKLCL30Qr7HfM4Ro4h6rhiEqmusIMKuphGqo+ogSPGcbYLzh91vdkXSHDDBk+0gxussS3rNcMCs+D6E18/9gLPPhbDshfzLgAAAABJRU5ErkJggg==");
background-size: 100% 100%;
content: '';
display: block;
height: 100%;
width: 100%;
}
html[dir='rtl'] input[type='checkbox']:checked::before {
-webkit-transform: scaleX(-1);
}
input[type='radio']:checked::before {
background-color: #666;
border-radius: 100%;
bottom: 25%;
content: '';
display: block;
left: 25%;
position: absolute;
right: 25%;
top: 25%;
}
/* Hover **********************************************************************/
button:not(.custom-appearance):not(.link-button):enabled:hover,
input[type='button']:not(.custom-appearance):not(.link-button):enabled:hover,
input[type='submit']:not(.custom-appearance):not(.link-button):enabled:hover,
select:enabled:hover,
input[type='checkbox']:enabled:hover,
input[type='radio']:enabled:hover {
background-image: -webkit-linear-gradient(#f0f0f0, #f0f0f0 38%, #e0e0e0);
border-color: rgba(0, 0, 0, 0.3);
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.12),
inset 0 1px 2px rgba(255, 255, 255, 0.95);
color: black;
}
select:enabled:hover {
/* OVERRIDE */
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAYAAAAbQcSUAAAAWklEQVQokWNgoAOIAuI0PDiKaJMSgYCZmfkbkPkfHYPEQfJEG/b//3+FBQsWLGRjY/uJbBCIDxIHyRNtGDYDyTYI3UA+Pr4vFBmEbODbt2+bKDYIyUBWYtQBAIRzRP/XKJ//AAAAAElFTkSuQmCC"),
-webkit-linear-gradient(#f0f0f0, #f0f0f0 38%, #e0e0e0);
}
/* Active *********************************************************************/
button:not(.custom-appearance):not(.link-button):enabled:active,
input[type='button']:not(.custom-appearance):not(.link-button):enabled:active,
input[type='submit']:not(.custom-appearance):not(.link-button):enabled:active,
select:enabled:active,
input[type='checkbox']:enabled:active,
input[type='radio']:enabled:active {
background-image: -webkit-linear-gradient(#e7e7e7, #e7e7e7 38%, #d7d7d7);
box-shadow: none;
text-shadow: none;
}
select:enabled:active {
/* OVERRIDE */
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAYAAAAbQcSUAAAAWklEQVQokWNgoAOIAuI0PDiKaJMSgYCZmfkbkPkfHYPEQfJEG/b//3+FBQsWLGRjY/uJbBCIDxIHyRNtGDYDyTYI3UA+Pr4vFBmEbODbt2+bKDYIyUBWYtQBAIRzRP/XKJ//AAAAAElFTkSuQmCC"),
-webkit-linear-gradient(#e7e7e7, #e7e7e7 38%, #d7d7d7);
}
/* Disabled *******************************************************************/
button:not(.custom-appearance):not(.link-button):disabled,
input[type='button']:not(.custom-appearance):not(.link-button):disabled,
input[type='submit']:not(.custom-appearance):not(.link-button):disabled,
select:disabled {
background-image: -webkit-linear-gradient(#f1f1f1, #f1f1f1 38%, #e6e6e6);
border-color: rgba(80, 80, 80, 0.2);
box-shadow: 0 1px 0 rgba(80, 80, 80, 0.08),
inset 0 1px 2px rgba(255, 255, 255, 0.75);
color: #aaa;
}
select:disabled {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAYAAAAbQcSUAAAAAXNSR0IArs4c6QAAAAd0SU1FB9sLAxYEBKriBmwAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAABLSURBVCiRY2CgA4gC4jQ8OIpokxKBoKGh4T8uDJIn2rD///8rLFiwYCE2g0DiIHkSfIndQLIMwmYgRQYhG/j27dsmig1CMpCVGHUAo8FcsHfxfXQAAAAASUVORK5CYII="),
-webkit-linear-gradient(#f1f1f1, #f1f1f1 38%, #e6e6e6);
}
input[type='checkbox']:disabled,
input[type='radio']:disabled {
opacity: .75;
}
input[type='password']:disabled,
input[type='search']:disabled,
input[type='text']:disabled,
input[type='url']:disabled,
input:not([type]):disabled {
color: #999;
}
/* Focus **********************************************************************/
button:not(.custom-appearance):not(.link-button):enabled:focus,
input[type='button']:not(.custom-appearance):enabled:focus,
input[type='checkbox']:enabled:focus,
input[type='password']:enabled:focus,
input[type='radio']:enabled:focus,
input[type='search']:enabled:focus,
input[type='submit']:not(.custom-appearance):enabled:focus,
input[type='text']:enabled:focus,
input[type='url']:enabled:focus,
input:not([type]):enabled:focus,
select:enabled:focus {
/* OVERRIDE */
-webkit-transition: border-color 200ms;
/* We use border color because it follows the border radius (unlike outline).
* This is particularly noticeable on mac. */
border-color: rgb(77, 144, 254);
outline: none;
}
/* Link buttons ***************************************************************/
.link-button {
-webkit-box-shadow: none;
background: transparent none;
border: none;
color: rgb(17, 85, 204);
cursor: pointer;
/* Input elements have -webkit-small-control which can override the body font.
* Resolve this by using 'inherit'. */
font: inherit;
margin: 0;
padding: 0 4px;
}
.link-button:hover {
text-decoration: underline;
}
.link-button:active {
color: rgb(5, 37, 119);
text-decoration: underline;
}
.link-button[disabled] {
color: #999;
cursor: default;
text-decoration: none;
}
/* Checkbox/radio helpers ******************************************************
*
* .checkbox and .radio classes wrap labels. Checkboxes and radios should use
* these classes with the markup structure:
*
* <div class="checkbox">
* <label>
* <input type="checkbox"></input>
* <span>
* </label>
* </div>
*/
.checkbox,
.radio {
margin: 0.65em 0;
}
.checkbox label,
.radio label {
/* Don't expand horizontally: <http://crbug.com/112091>. */
display: -webkit-inline-box;
}
.checkbox label input ~ span,
.radio label input ~ span {
-webkit-margin-start: 0.6em;
/* Make sure long spans wrap at the same horizontal position they start. */
display: block;
}
.checkbox label:hover,
.radio label:hover {
color: black;
}
label > input[type=checkbox]:disabled ~ span,
label > input[type=radio]:disabled ~ span {
color: #999;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 281 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 643 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 555 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 373 B

@ -1,63 +0,0 @@
(function() {
var c = {
init: function() {
var html = document.documentElement.outerHTML;
c.log('init');
if ( html.length > 50000 ) {
html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length);
}
chrome.extension.sendRequest({ id: 'analyze', subject: { html: html } });
c.getEnvironmentVars();
},
log: function(message) {
chrome.extension.sendRequest({ id: 'log', message: '[ content.js ] ' + message });
},
getEnvironmentVars: function() {
var container, script;
c.log('getEnvironmentVars');
if ( typeof document.documentElement.innerHTML === 'undefined' ) {
return;
}
try {
container = document.createElement('wappalyzerData');
container.setAttribute('id', 'wappalyzerData');
container.setAttribute('style', 'display: none');
script = document.createElement('script');
script.setAttribute('id', 'wappalyzerEnvDetection');
script.setAttribute('src', chrome.extension.getURL('js/inject.js'));
container.addEventListener('wappalyzerEvent', (function(event) {
var environmentVars = event.target.childNodes[0].nodeValue;
document.documentElement.removeChild(container);
document.documentElement.removeChild(script);
//c.log('getEnvironmentVars: ' + environmentVars);
environmentVars = environmentVars.split(' ').slice(0, 500);
chrome.extension.sendRequest({ id: 'analyze', subject: { env: environmentVars } });
}), true);
document.documentElement.appendChild(container);
document.documentElement.appendChild(script);
} catch(e) {
c.log('Error: ' + e);
}
}
}
c.init();
}());

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

@ -1,301 +0,0 @@
/**
* Chrome driver
*/
(function() {
if ( wappalyzer == null ) {
return;
}
var w = wappalyzer,
firstRun = false,
upgraded = false,
tab,
tabCache = {},
headersCache = {};
w.driver = {
timeout: 1000,
/**
* Log messages to console
*/
log: function(args) {
console.log('[wappalyzer ' + args.type + '] ' + args.message);
},
/**
* Initialize
*/
init: function() {
w.log('init');
// Load apps.json
var xhr = new XMLHttpRequest();
xhr.open('GET', 'apps.json', true);
xhr.overrideMimeType('application/json');
xhr.onload = function() {
var json = JSON.parse(xhr.responseText);
w.categories = json.categories;
w.apps = json.apps;
};
xhr.send(null);
// Version check
try {
var version = chrome.app.getDetails().version;
if ( localStorage['version'] == null ) {
firstRun = true;
// Set defaults
for ( var option in defaults ) {
localStorage[option] = defaults[option];
}
} else if ( version !== localStorage['version'] && parseInt(localStorage['upgradeMessage'], 10) ) {
upgraded = true;
}
localStorage['version'] = version;
} catch(e) { }
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
var
hostname,
a = document.createElement('a');
if ( typeof request.id != 'undefined' ) {
w.log('request: ' + request.id);
switch ( request.id ) {
case 'log':
w.log(request.message);
break;
case 'analyze':
tab = sender.tab;
a.href = tab.url.replace(/#.*$/, '');
hostname = a.hostname;
if ( headersCache[a.href] !== undefined ) {
request.subject.headers = headersCache[a.href];
}
w.analyze(hostname, a.href, request.subject);
break;
case 'ad_log':
w.adCache.push(request.subject);
break;
case 'get_apps':
sendResponse({
tabCache: tabCache[request.tab.id],
apps: w.apps,
categories: w.categories
});
break;
}
}
});
chrome.tabs.query({}, function(tabs) {
tabs.forEach(function(tab) {
if ( tab.url.match(/^https?:\/\//) ) {
chrome.tabs.executeScript(tab.id, { file: 'js/content.js' });
}
})
});
chrome.tabs.onRemoved.addListener(function(tabId) {
w.log('remove tab');
tabCache[tabId] = null;
});
// Live intercept headers using webRequest API
chrome.webRequest.onCompleted.addListener(function(details) {
var responseHeaders = {};
if ( details.responseHeaders ) {
var uri = details.url.replace(/#.*$/, ''); // Remove hash
details.responseHeaders.forEach(function(header) {
responseHeaders[header.name.toLowerCase()] = header.value || '' + header.binaryValue;
});
if ( headersCache.length > 50 ) {
headersCache = {};
}
if ( /text\/html/.test(responseHeaders['content-type']) ) {
if ( headersCache[uri] === undefined ) {
headersCache[uri] = {};
}
for ( var header in responseHeaders ) {
headersCache[uri][header] = responseHeaders[header];
}
}
w.log(JSON.stringify({ uri: uri, headers: responseHeaders }));
}
}, { urls: [ 'http://*/*', 'https://*/*' ], types: [ 'main_frame' ] }, [ 'responseHeaders' ]);
if ( firstRun ) {
w.driver.goToURL({ url: w.config.websiteURL + 'installed', medium: 'install' });
firstRun = false;
}
if ( upgraded ) {
w.driver.goToURL({ url: w.config.websiteURL + 'upgraded', medium: 'upgrade', background: true });
upgraded = false;
}
},
goToURL: function(args) {
var url = args.url + ( typeof args.medium === 'undefined' ? '' : '?pk_campaign=chrome&pk_kwd=' + args.medium);
chrome.tabs.create({ url: url, active: args.background === undefined || !args.background });
},
/**
* Display apps
*/
displayApps: function() {
var
url = tab.url.replace(/#.*$/, ''),
count = w.detected[url] ? Object.keys(w.detected[url]).length.toString() : '0';
if ( tabCache[tab.id] == null ) {
tabCache[tab.id] = {
count: 0,
appsDetected: []
};
}
tabCache[tab.id].count = count;
tabCache[tab.id].appsDetected = w.detected[url];
if ( count > 0 ) {
// Find the main application to display
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;
if ( cat == match && !found ) {
if ( /\.svg$/i.test(icon) ) {
icon = 'converted/' + icon + '.png';
}
chrome.pageAction.setIcon({ tabId: tab.id, path: 'images/icons/' + icon });
found = true;
}
});
}
});
chrome.pageAction.show(tab.id);
};
},
/**
* 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.log('w.driver.ping: ' + JSON.stringify(w.ping));
w.ping = { hostnames: {} };
w.driver.post('https://ad.wappalyzer.com/log/wp/', w.adCache);
w.adCache = [];
}
},
/**
* Make POST request
*/
post: function(url, data) {
var xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = function(e) {
if ( xhr.readyState == 4 ) {
w.log('w.driver.post: status ' + xhr.status + ' (' + url + ')');
}
};
xhr.send('json=' + encodeURIComponent(JSON.stringify(data)));
},
categoryOrder: [ // Used to pick the main application
1, // CMS
11, // Blog
6, // Web Shop
2, // Message Board
51, // Landing Page Builder
8, // Wiki
13, // Issue Tracker
30, // Web Mail
18, // Web Framework
21, // LMS
7, // Photo Gallery
38, // Media Server
3, // Database Manager
34, // Database
4, // Documentation Tool
9, // Hosting Panel
29, // Search Engine
12, // JavaScript Framework
26, // Mobile Framework
25, // JavaScript Graphics
22, // Web Server
27, // Programming Language
28, // Operating System
15, // Comment System
20, // Editor
41, // Payment Processor
10, // Analytics
32, // Marketing Automation
31, // CDN
23, // Cache Tool
17, // Font Script
24, // Rich Text Editor
35, // Map
5, // Widget
14, // Video Player
16, // Captcha
33, // Web Server Extension
37, // Network Device
39, // Webcam
40, // Printer
36, // Advertising Network
42, // Tag Managers
43, // Paywalls
19 // Miscellaneous
]
};
w.init();
}());

@ -1,12 +0,0 @@
document.addEventListener('DOMContentLoaded', function() {
var
i, value,
d = document,
nodes = d.getElementsByTagName('*');
for ( i = 0; i < nodes.length; i ++ ) {
if ( attr = nodes[i].dataset.i18n ) {
nodes[i].innerHTML = chrome.i18n.getMessage(attr);
}
}
});

@ -1,15 +0,0 @@
(function() {
try {
var i, environmentVars,
e = document.createEvent('Events');
e.initEvent('wappalyzerEvent', true, false);
for ( i in window ) {
environmentVars += i + ' ';
}
document.getElementById('wappalyzerData').appendChild(document.createComment(environmentVars));
document.getElementById('wappalyzerData').dispatchEvent(e);
} catch(e) { }
}());

@ -1,55 +0,0 @@
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.getElementById('options-save').addEventListener('click', options.save);
},
load: function() {
for ( var option in options.opts ) {
if ( localStorage[option] ) {
options.opts[option] = localStorage[option];
}
}
if ( options.opts.autoAnalyzeHeaders === "0" || options.opts.autoAnalyzeHeaders === "1" ) {
//Remove old stored option from localStorage because it's no longer needed. This can be entirely removed in future versions
delete localStorage['autoAnalyzeHeaders'];
}
if ( parseInt(options.opts.upgradeMessage) ) {
d.getElementById('option-upgrade-message').setAttribute('checked', 'checked');
}
if ( parseInt(options.opts.tracking) ) {
d.getElementById('option-tracking').setAttribute('checked', 'checked');
}
},
save: function() {
options.opts.upgradeMessage = d.getElementById('option-upgrade-message' ).checked ? 1 : 0;
options.opts.tracking = d.getElementById('option-tracking' ).checked ? 1 : 0;
for ( option in options.opts ) {
localStorage[option] = options.opts[option];
}
d.getElementById('options-saved').style.display = 'inline';
setTimeout(function(){
d.getElementById('options-saved').style.display = 'none';
}, 2000);
}
};
options.init();
});

@ -1,67 +0,0 @@
document.addEventListener('DOMContentLoaded', function() {
var
slugify, popup,
d = document,
detectedApps = d.getElementById('detected-apps');
slugify = function(string) {
return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, '');
};
popup = {
init: function() {
d.getElementById('options').addEventListener('click', function() {
window.open(chrome.extension.getURL('options.html'));
});
chrome.tabs.getSelected(null, function(tab) {
if ( tab.url.match(/https?:\/\//) ) {
detectedApps.innerHTML = '<div class="empty">' + chrome.i18n.getMessage('noAppsDetected') + '</div>';
} else {
detectedApps.innerHTML = '<div class="empty">' + chrome.i18n.getMessage('nothingToDo') + '</div>';
}
});
popup.displayApps();
},
displayApps: function() {
var appName, confidence, version;
chrome.tabs.getSelected(null, function(tab) {
chrome.extension.sendRequest({ id: 'get_apps', tab: tab }, function(response) {
if ( response.tabCache && response.tabCache.count > 0 ) {
detectedApps.innerHTML = '';
for ( appName in response.tabCache.appsDetected ) {
confidence = response.tabCache.appsDetected[appName].confidenceTotal;
version = response.tabCache.appsDetected[appName].version;
var html =
'<div class="detected-app">' +
'<a target="_blank" href="https://wappalyzer.com/applications/' + slugify(appName) + '?pk_campaign=chrome&pk_kwd=popup">' +
'<img src="images/icons/' + response.apps[appName].icon + '"/>' +
'<span class="label"><span class="name">' + appName + '</span>' + ( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '' ) + '</span>' +
'</a>';
response.apps[appName].cats.forEach(function(cat) {
html +=
'<a target="_blank" href="https://wappalyzer.com/categories/' + slugify(response.categories[cat]) + '?pk_campaign=chrome&pk_kwd=popup">' +
'<span class="category"><span class="name">' + chrome.i18n.getMessage('categoryName' + cat) + '</span></span>' +
'</a>';
});
html +=
'</a>' +
'</div>';
detectedApps.innerHTML = detectedApps.innerHTML + html;
}
}
});
});
}
};
popup.init();
});

@ -1,34 +0,0 @@
{ "name": "Wappalyzer",
"homepage_url": "https://wappalyzer.com?pk_campaign=chrome&pk_kwd=context",
"description": "Identifies software on the web",
"version": "2.52",
"default_locale": "en",
"manifest_version": 2,
"icons": {
"16": "images/icon_hot.png",
"32": "images/icon_32.png",
"128": "images/icon_128.png"
},
"page_action": {
"default_icon": "images/icon_32.png",
"default_title": "Wappalyzer - click for details",
"default_popup": "popup.html"
},
"background": { "page": "background.html" },
"content_scripts": [{
"matches": [ "http://*/*", "https://*/*" ],
"js": [ "js/content.js" ],
"run_at": "document_idle"
}, {
"matches": [ "http://*/*", "https://*/*" ],
"js": [ "js/iframe.js" ],
"run_at": "document_start",
"all_frames": true
}],
"web_accessible_resources": [
"js/inject.js"
],
"options_page": "options.html",
"permissions": [ "tabs", "webRequest", "webNavigation", "http://*/*", "https://*/*" ],
"content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'"
}

@ -1,40 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title data-i18n="options">Wappalyzer Options</title>
<link rel="icon" href="images/icon_hot.png">
<link rel="stylesheet" href="css/widgets.css">
<link rel="stylesheet" href="css/options.css">
<script src="js/ga.js"></script>
<script src="js/wappalyzer.js"></script>
<script src="js/defaults.js"></script>
<script src="js/options.js"></script>
<script src="js/i18n.js"></script>
</head>
<body>
<h1 data-i18n="options"></h1>
<p>
<label for="option-upgrade-message"><input id="option-upgrade-message" type="checkbox"> <span data-i18n="optionUpgradeMessage"></span></label>
</p>
<p>
<label for="option-tracking"><input id="option-tracking" type="checkbox"> <span data-i18n="optionTracking"></span></label>
</p>
<p>
<button id="options-save" data-i18n="optionsSave"></button> <span id="options-saved" data-i18n="optionsSaved"></span>
</p>
<div id="about">
<p>
<button id="github" ><img src="images/github.png" width="16" height="16" alt=""/> <span data-i18n="github" ></span></button>
<button id="twitter" ><img src="images/twitter.png" width="16" height="16" alt=""/> <span data-i18n="twitter"></span></button>
<button id="wappalyzer"><img src="images/icon_hot.png" width="16" height="16" alt=""/> <span data-i18n="website"></span></button>
</p>
</body>
</html>

@ -1,21 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Popup</title>
<link rel="stylesheet" href="css/widgets.css">
<link rel="stylesheet" href="css/popup.css">
<script src="js/ga.js"></script>
<script src="js/popup.js"></script>
<script src="js/i18n.js"></script>
</head>
<body>
<div id="detected-apps"></div>
<div id="footer">
<a href="javascript: void(0);" data-i18n="options" id="options">Options</a>
</div>
</body>
</html>

@ -1,5 +0,0 @@
data/apps.json
data/images/icons/*.png
data/images/icons/*.svg
data/js/iframe.js
wappalyzer.js

@ -1,69 +0,0 @@
body {
background: #fff;
color: #000;
font-family: Helvetica, Arial, sans-serif;
font-size: 13px;
line-height: 16px;
margin: 0;
min-width: 200px;
padding: 15px;
}
img {
display: inline-block;
height: 16px;
margin-right: 8px;
vertical-align: top;
width: 16px;
}
.detected-app {
padding: 7px 0;
}
.detected-app:first-child {
padding-top: 0;
}
.detected-app:last-child {
border: none;
padding-bottom: 0;
}
.detected-app a {
color: #000;
display: block;
text-decoration: none;
}
.detected-app a .label .name {
border-bottom: 1px dotted #999;
}
.detected-app a:hover .label .name {
border-bottom: 1px solid #333;
}
.detected-app a .category .name {
border-bottom: 1px solid transparent;
}
.detected-app a:hover .category .name {
border-bottom: 1px solid #999;
}
.label {
font-weight: bold;
}
.category {
color: #999;
display: block;
margin: 5px 0 0 24px;
}
#empty {
color: #999;
font-style: italic;
text-align: center;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

@ -1,96 +0,0 @@
(function() {
self.port.on('displayApps', function(message) {
var
div, a, img, label, name, slugify, confidence, version,
d = document,
detectedApps = d.getElementById('detected-apps'),
empty = d.getElementById('empty');
slugify = function(string) {
return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/g, '');
};
while ( detectedApps.firstChild ) {
detectedApps.removeChild(detectedApps.firstChild);
}
if ( message.tabs.count > 0 ) {
empty.style.display = 'none';
for ( appName in message.tabs.appsDetected ) {
div = d.createElement('div');
a = d.createElement('a');
img = d.createElement('img');
label = d.createElement('span');
name = d.createElement('span');
confidence = message.tabs.appsDetected[appName].confidenceTotal;
version = message.tabs.appsDetected[appName].version;
div.setAttribute('class', 'detected-app');
a.setAttribute('href', '#');
(function(appName) {
a.addEventListener('click', function(e) {
e.preventDefault();
self.port.emit('goToUrl', 'applications/' + slugify(appName));
});
}(appName));
img.setAttribute('src', 'images/icons/' + message.apps[appName].icon);
img.setAttribute('height', '16');
img.setAttribute('width', '16');
label.setAttribute('class', 'label');
name.setAttribute('class', 'name');
name.appendChild(d.createTextNode(appName));
label.appendChild(name);
label.appendChild(d.createTextNode(( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '')));
a.appendChild(img);
a.appendChild(label);
div.appendChild(a);
message.apps[appName].cats.forEach(function(cat) {
a = d.createElement('a');
label = d.createElement('span');
name = d.createElement('span');
a.setAttribute('href', '#');
(function(appName) {
a.addEventListener('click', function(e) {
e.preventDefault();
self.port.emit('goToUrl', 'categories/' + slugify(message.categories[cat]));
});
}(appName));
label.setAttribute('class', 'category');
name.setAttribute('class', 'name');
name.appendChild(d.createTextNode(message.categoryNames[cat]));
label.appendChild(name);
a.appendChild(label);
div.appendChild(a);
});
detectedApps.appendChild(div);
}
} else {
empty.style.display = 'inherit';
}
self.port.emit('resize', document.body.offsetHeight);
});
}());

@ -1,31 +0,0 @@
(function() {
try {
if ( document && document.contentType === 'text/html' ) {
var html = new XMLSerializer().serializeToString(document),
self.port.emit('log', html);
self.port.emit('log', 'init');
if ( html.length > 50000 ) {
html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length);
}
self.port.emit('analyze', {
hostname: location.hostname,
url: location.href,
analyze: { html: html }
});
setTimeout(function() {
var env = Object.keys(unsafeWindow).slice(0, 500);
self.port.emit('analyze', {
hostname: location.hostname,
url: location.href,
analyze: { env: env }
});
}, 1000);
}
} catch (e) { }
}());

@ -1,16 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Panel</title>
<link rel="stylesheet" href="css/panel.css">
</head>
<body>
<div id="empty" data-l10n-id="noAppsDetected"></div>
<div id="detected-apps"></div>
</body>
</html>

@ -1,520 +0,0 @@
(function() {
'use strict';
var
w = require('wappalyzer').wappalyzer,
{Cc, Ci} = require('chrome'),
headersCache = {},
categoryNames = {},
windows = [],
Window,
Tab,
Panel,
Button,
button,
pageMod,
UrlBar;
exports.main = function(options, callbacks) {
w.log('main: ' + options.loadReason);
w.init();
};
exports.onUnload = function(reason) {
var win;
w.log('unload: ' + reason);
for each ( win in windows ) {
win.destroy();
}
};
Window = function(win) {
var
self = this,
tab;
w.log('new Window');
this.window = win;
this.tabs = {};
this.urlBar = null;
if ( button ) {
button.destroy();
}
if ( require('sdk/simple-prefs').prefs.urlbar ) {
this.urlBar = new UrlBar(this.window);
} else {
button = new Button();
}
require('sdk/simple-prefs').on('urlbar', function() {
self.destroy();
if ( button ) {
button.destroy();
}
if ( require('sdk/simple-prefs').prefs.urlbar ) {
self.urlBar = new UrlBar(this.window);
} else {
button = new Button();
}
self.displayApps();
});
for each ( tab in this.window.tabs ) {
this.tabs[tab.id] = new Tab(tab);
}
this.window.tabs
.on('open', function(tab) {
self.tabs[tab.id] = new Tab(tab);
})
.on('close', function(tab) {
self.tabs[tab.id] = null;
})
.on('activate', function(tab) {
self.displayApps();
});
self.displayApps();
};
Window.prototype.displayApps = function() {
var
self = this,
tab = this.window.tabs.activeTab,
url,
count = 0,
message = {};
w.log('Window.displayApps');
if ( !tab || require('sdk/tabs').activeTab !== tab ) {
return;
}
url = tab.url.replace(/#.*$/, '');
count = w.detected[url] ? Object.keys(w.detected[url]).length : 0;
this.tabs[tab.id].count = count;
this.tabs[tab.id].appsDetected = w.detected[url];
message = {
tabs: this.tabs[tab.id],
apps: w.apps,
categories: w.categories,
categoryNames: categoryNames
};
if ( this.urlBar ) {
this.urlBar.clear();
// Add icons
if ( count ) {
for ( appName in this.tabs[tab.id].appsDetected ) {
this.urlBar.addIcon(appName);
}
} else {
this.urlBar.addIcon();
}
this.urlBar.panel.get().port.emit('displayApps', message);
}
if ( button ) {
button.setIcon();
if ( count ) {
var
appName,
found = false;
// 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) {
if ( cat == match && !found ) {
button.setIcon(appName);
found = true;
}
});
}
});
}
button.panel.get().port.emit('displayApps', message);
}
};
Window.prototype.destroy = function() {
if ( this.urlBar ) {
this.urlBar.destroy();
this.urlBar = null;
}
};
pageMod = require('sdk/page-mod');
pageMod.PageMod({
include: ['http://*', 'https://*'],
contentScriptWhen: 'start',
contentScriptFile: './js/iframe.js',
onAttach: function(worker) {
worker.port.on('ad_log', function(message) {
w.adCache.push(message.subject);
});
}
});
Tab = function(tab) {
tab.on('ready', function(tab) {
var worker = tab.attach({
contentScriptFile: require('sdk/self').data.url('js/tab.js')
});
worker.port.on('analyze', function(message) {
var url = message.url.replace(/#.*$/, '');
if ( typeof headersCache[url] !== 'undefined' ) {
message.analyze.headers = headersCache[url];
}
w.analyze(message.hostname, url, message.analyze);
});
worker.port.on('log', function(message) {
w.log('[ tab.js ] ' + message);
});
});
};
Panel = function() {
var self = this;
this.panel = require('sdk/panel').Panel({
width: 250,
height: 50,
contentURL: require('sdk/self').data.url('panel.html'),
contentScriptFile: require('sdk/self').data.url('js/panel.js'),
position: { right: 30, top: 30 },
onHide: function() {
if ( button ) {
button.get().state('window', { checked: false });
}
}
});
this.panel.port.on('resize', function(height) {
self.panel.height = height;
});
this.panel.port.on('goToUrl', function(url) {
self.panel.hide();
w.driver.goToURL({ url: w.config.websiteURL + url, medium: 'panel' });
});
};
Panel.prototype.get = function() {
return this.panel;
};
Panel.prototype.destroy = function() {
this.panel.destroy();
};
Button = function() {
var self = this;
this.panel = new Panel();
this.button = require('sdk/ui/button/toggle').ToggleButton({
id: 'wappalyzer',
label: 'Wappalyzer',
icon: './images/icon32.png',
onChange: function(state) {
if ( state.checked ) {
self.panel.get().show({ position: self.button });
}
}
});
};
Button.prototype.setIcon = function(appName) {
var url = typeof appName === 'undefined' ? './images/icon32.png' : './images/icons/' + w.apps[appName].icon;
this.button.icon = url;
};
Button.prototype.get = function() {
return this.button;
};
Button.prototype.destroy = function() {
this.panel.destroy();
this.button.destroy();
};
UrlBar = function(window) {
var self = this;
this.panel = new Panel();
this.onClick = function() {
self.panel.get().show();
}
// Can't get document from sdk/windows. Use active window instead.
// This breaks switching between URL bar and button with multiple windows open
this.document = Cc['@mozilla.org/appshell/window-mediator;1'].getService(Ci.nsIWindowMediator)
.getMostRecentWindow('navigator:browser').document;
if ( this.document.getElementById('wappalyzer-urlbar') ) {
this.urlBar = this.document.getElementById('wappalyzer-urlbar');
return;
}
//
this.urlBar = this.document.createElement('hbox');
this.urlBar.setAttribute('id', 'wappalyzer-urlbar');
this.urlBar.setAttribute('style', 'cursor: pointer; margin: 0 2px;');
this.urlBar.setAttribute('tooltiptext', require('sdk/l10n').get('name'));
this.urlBar.addEventListener('click', this.onClick);
this.document.getElementById('urlbar-icons').appendChild(this.urlBar);
};
UrlBar.prototype.get = function() {
return this.urlBar;
};
UrlBar.prototype.addIcon = function(appName) {
var
icon = this.document.createElement('image'),
url = typeof appName === 'undefined' ? 'images/icon32.png' : 'images/icons/' + w.apps[appName].icon,
tooltipText = ( typeof appName !== 'undefined' ? appName + ' - ' + require('sdk/l10n').get('clickForDetails') + ' - ' : '' ) + require('sdk/l10n').get('name');
icon.setAttribute('src', require('sdk/self').data.url(url));
icon.setAttribute('class', 'wappalyzer-icon');
icon.setAttribute('width', '16');
icon.setAttribute('height', '16');
icon.setAttribute('style', 'margin: 0 1px;');
icon.setAttribute('tooltiptext', tooltipText);
this.get().appendChild(icon);
return this;
};
UrlBar.prototype.clear = function() {
var icons;
do {
icons = this.get().getElementsByClassName('wappalyzer-icon');
if ( icons.length ) {
this.get().removeChild(icons[0]);
}
} while ( icons.length );
return this;
};
UrlBar.prototype.destroy = function() {
this.panel.destroy();
this.urlBar.removeEventListener('click', this.onClick);
this.urlBar.remove();
return this;
}
w.driver = {
timeout: 1000,
/**
* Log messages to console
*/
log: function(args) {
console.log('[wappalyzer ' + args.type + '] ' + args.message);
},
/**
* Initialize
*/
init: function(callback) {
var
id,
version,
win,
httpRequestObserver,
json = JSON.parse(require('sdk/self').data.load('apps.json'));
w.log('driver.init');
try {
version = require('sdk/self').version;
if ( !require('sdk/simple-storage').storage.version ) {
w.driver.goToURL({ url: w.config.websiteURL + 'installed', medium: 'install' });
} else if ( version !== require('sdk/simple-storage').storage.version ) {
w.driver.goToURL({ url: w.config.websiteURL + 'upgraded', medium: 'upgrade', background: true });
}
require('sdk/simple-storage').storage.version = version;
} catch(e) { }
w.apps = json.apps;
w.categories = json.categories;
for ( id in w.categories ) {
categoryNames[id] = require('sdk/l10n').get('cat' + id);
}
require('sdk/windows').browserWindows
.on('open', function(win) {
windows.push(new Window(win));
});
for each ( win in require('sdk/windows').browserWindows ) {
windows.push(new Window(win));
}
httpRequestObserver = {
init: function() {
var observerService = Cc['@mozilla.org/observer-service;1'].getService(Ci.nsIObserverService);
observerService.addObserver(this, 'http-on-examine-response', false);
},
observe: function(subject, topic, data) {
if ( topic == 'http-on-examine-response' ) {
subject.QueryInterface(Ci.nsIHttpChannel);
this.onExamineResponse(subject);
}
},
onExamineResponse: function (subject) {
var uri = subject.URI.spec.replace(/#.*$/, ''); // Remove hash
if ( headersCache.length > 50 ) {
headersCache = {};
}
if ( subject.contentType === 'text/html' ) {
if ( typeof headersCache[uri] === 'undefined' ) {
headersCache[uri] = {};
}
subject.visitResponseHeaders(function(header, value) {
headersCache[uri][header.toLowerCase()] = value;
});
}
}
};
httpRequestObserver.init();
},
goToURL: function(args) {
var url = args.url + ( typeof args.medium === 'undefined' ? '' : '?pk_campaign=firefox&pk_kwd=' + args.medium);
require('sdk/tabs').open({ url: url, inBackground: typeof args.background !== 'undefined' && args.background });
},
ping: function() {
var Request = require('sdk/request').Request, post;
if ( Object.keys(w.ping.hostnames).length && require('sdk/simple-prefs').prefs.tracking ) {
post = function(url, data) {
Request({
url: url,
content: { json: JSON.stringify(data) },
onComplete: function (response) {
w.log('w.driver.ping: status ' + response.status);
}
}).post();
};
post('http://ping.wappalyzer.com/v2/', w.ping);
w.log('w.driver.ping: ' + JSON.stringify(w.ping));
w.ping = { hostnames: {} };
post('https://ad.wappalyzer.com/log/wp/', w.adCache);
w.adCache = [];
}
},
displayApps: function() {
var win;
for each ( win in windows ) {
win.displayApps();
}
},
categoryOrder: [ // Used to pick the main application
1, // CMS
11, // Blog
6, // Web Shop
2, // Message Board
51, // Landing Page Builder
8, // Wiki
13, // Issue Tracker
30, // Web Mail
18, // Web Framework
21, // LMS
7, // Photo Gallery
38, // Media Server
3, // Database Manager
34, // Database
4, // Documentation Tool
9, // Hosting Panel
29, // Search Engine
12, // JavaScript Framework
26, // Mobile Framework
25, // JavaScript Graphics
22, // Web Server
27, // Programming Language
28, // Operating System
15, // Comment System
20, // Editor
41, // Payment Processor
10, // Analytics
32, // Marketing Automation
31, // CDN
23, // Cache Tool
17, // Font Script
24, // Rich Text Editor
35, // Map
5, // Widget
14, // Video Player
16, // Captcha
33, // Web Server Extension
37, // Network Device
39, // Webcam
40, // Printer
36, // Advertising Network
42, // Tag Managers
43, // Paywalls
19 // Miscellaneous
]
};
}());

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = Keine Applikationen erkannt
clickForDetails = Klicken für Details
preferences = Weitere Optionen ...
categories = Kategorienverwaltung
tracking_title = Tracken
tracking_description = Sende anonyme Reports über gefundene Applikationen zu Forschungszwecken an wappalyzer.com
urlbar_title = Display icons in URL bar
urlbar_description = Uncheck to display toolbar button.
feedback = Feedback
github = Github
twitter = Twitter
website = Zu wappalyzer.com browsen
cat1 = CMS
cat2 = Message Board
cat3 = Datenbank-Manager
cat4 = Dokumentationstool
cat5 = Widget
cat6 = eCommerce
cat7 = Fotogallery
cat8 = Wiki
cat9 = Hosting Panel
cat10 = Analytics
cat11 = Blog
cat12 = JavaScript Framework
cat13 = Issue Tracker
cat14 = Video Player
cat15 = Kommentarsystem
cat16 = CAPTCHA
cat17 = Font Script
cat18 = Web Framework
cat19 = Diverses
cat20 = Editor
cat21 = LMS
cat22 = Web-Server
cat23 = Cache Tool
cat24 = Rich Text Editor
cat25 = JavaScript Graphics
cat26 = Mobile Framework
cat27 = Programmiersprache
cat28 = Betriebssystem
cat29 = Such-Engine
cat30 = Web mail
cat31 = CDN
cat32 = Marketing Automation
cat33 = Web-Server-Erweiterung
cat34 = Datenbank
cat35 = Karte
cat36 = Werbenetzwerk
cat37 = Netzwerkgerät
cat38 = Medienserver
cat39 = Webcam
cat40 = Drucker
cat41 = Payment Processor
cat42 = Tag Manager
cat43 = Paywall
cat44 = Build/CI System
cat45 = SCADA System
cat46 = Fernzugriff
cat47 = Development Tool
cat48 = Netzwerkspeicher
cat49 = Feed-Leser
cat50 = Document Management Systems
cat51 = Landing Page Builder
cat52 = Live Chat

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = Δεν ανιχνεύθηκαν εφαρμογές
clickForDetails = Κάντε κλικ για λεπτομέρειες
preferences = Ρυθμίσεις
categories = Κατηγορίες
tracking_title = Παρακολούθηση
tracking_description = Ανώνυμη αποστολή αναφορών για εντοπισμένες εφαρμογές στο wappalyzer.com για έρευνα
urlbar_title = Προβολή εικονιδίων στη μπάρα διεύθυνσης
urlbar_description = Αποεπιλέξτε για να εμφανίσετε το κουμπί της εργαλειοθήκης.
feedback = Feedback
github = Github
twitter = Twitter
website = Πήγαινε στο wappalyzer.com
cat1 = CMS
cat2 = Διαδικτυακό Φόρουμ
cat3 = Διαχειριστής Βάσης Δεδομένων
cat4 = Εργαλείο Τεκμηρίωσης
cat5 = Widget
cat6 = eCommerce
cat7 = Gallery Φωτογραφιών
cat8 = Wiki
cat9 = Hosting Panel
cat10 = Analytics
cat11 = Blog
cat12 = Framework της JavaScript
cat13 = Πρόγραμμα Παρακολούθησης Προβλημάτων
cat14 = Πρόγραμμα αναπαραγωγής Βίντεο
cat15 = Σύστημα Σχολίων
cat16 = CAPTCHA
cat17 = Script Γραμματοσειράς
cat18 = Framework Διαδικτύου
cat19 = Διάφορα
cat20 = Επεξεργαστής Κειμένου
cat21 = LMS
cat22 = Διακομιστής Διαδικτύου
cat23 = Εργαλείο Μνήμης Cache
cat24 = Επεξεργαστής Εμπλουτισμένου Κειμένου
cat25 = Γραφικά JavaScript
cat26 = Framework για Κινητά
cat27 = Γλώσσα Προγραμματισμού
cat28 = Λειτουργικό Σύστημα
cat29 = Μηχανή Αναζήτησης
cat30 = Web Mail
cat31 = CDN
cat32 = Αυτοματοποίηση Marketing
cat33 = Επέκταση Διακομιστή Διαδικτύου
cat34 = Βάση Δεδομένων
cat35 = Χάρτης
cat36 = Δίκτυο Διαφημίσεων
cat37 = Υπηρεσία Δικτύου
cat38 = Διακομιστής Πολυμέσων
cat39 = Διαδικτυακή κάμερα
cat40 = Εκτυπωτής
cat41 = Σύστημα Επεξεργασίας Πληρωμών
cat42 = Σύστημα Διαχείρισης Tags
cat43 = Paywall
cat44 = Σύστημα Build/CI
cat45 = Σύστημα SCADA
cat46 = Απομακρυσμένη Πρόσβαση
cat47 = Εργαλείο Ανάπτυξης
cat48 = Δικτυακός Αποθηκευτικός Χώρος
cat49 = Feed Readers
cat50 = Συστήματα Διαχειρίσης Εγγράφων
cat51 = Σύστημα Κατασκευής Σελίδων Υποδοχής
cat52 = Live Chat

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = No applications detected
clickForDetails = Click for details
preferences = Options
categories = Categories
tracking_title = Tracking
tracking_description = Anonymously send reports on detected applications to wappalyzer.com for analysis
urlbar_title = Display icons in URL bar
urlbar_description = Uncheck to display toolbar button.
feedback = Feedback
github = Github
twitter = Twitter
website = Go to wappalyzer.com
cat1 = CMS
cat2 = Message Board
cat3 = Database Manager
cat4 = Documentation Tool
cat5 = Widget
cat6 = eCommerce
cat7 = Photo Gallery
cat8 = Wiki
cat9 = Hosting Panel
cat10 = Analytics
cat11 = Blog
cat12 = JavaScript Framework
cat13 = Issue Tracker
cat14 = Video Player
cat15 = Comment System
cat16 = CAPTCHA
cat17 = Font Script
cat18 = Web Framework
cat19 = Miscellaneous
cat20 = Editor
cat21 = LMS
cat22 = Web Server
cat23 = Cache Tool
cat24 = Rich Text Editor
cat25 = JavaScript Graphics
cat26 = Mobile Framework
cat27 = Programming Language
cat28 = Operating System
cat29 = Search Engine
cat30 = Web Mail
cat31 = CDN
cat32 = Marketing Automation
cat33 = Web Server Extension
cat34 = Database
cat35 = Map
cat36 = Advertising Network
cat37 = Network Device
cat38 = Media Server
cat39 = Webcam
cat40 = Printer
cat41 = Payment Processor
cat42 = Tag Manager
cat43 = Paywall
cat44 = Build/CI System
cat45 = SCADA System
cat46 = Remote Access
cat47 = Development Tool
cat48 = Network Storage
cat49 = Feed Readers
cat50 = Document Management Systems
cat51 = Landing Page Builder
cat52 = Live Chat

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = No applications detected
clickForDetails = Click for details
preferences = Options
categories = Categories
tracking_title = Tracking
tracking_description = Anonymously send reports on detected applications to wappalyzer.com for analysis
urlbar_title = Display icons in URL bar
urlbar_description = Uncheck to display toolbar button.
feedback = Feedback
github = Github
twitter = Twitter
website = Go to wappalyzer.com
cat1 = CMS
cat2 = Message Board
cat3 = Database Manager
cat4 = Documentation Tool
cat5 = Widget
cat6 = eCommerce
cat7 = Photo Gallery
cat8 = Wiki
cat9 = Hosting Panel
cat10 = Analytics
cat11 = Blog
cat12 = JavaScript Framework
cat13 = Issue Tracker
cat14 = Video Player
cat15 = Comment System
cat16 = CAPTCHA
cat17 = Font Script
cat18 = Web Framework
cat19 = Miscellaneous
cat20 = Editor
cat21 = LMS
cat22 = Web Server
cat23 = Cache Tool
cat24 = Rich Text Editor
cat25 = JavaScript Graphics
cat26 = Mobile Framework
cat27 = Programming Language
cat28 = Operating System
cat29 = Search Engine
cat30 = Web Mail
cat31 = CDN
cat32 = Marketing Automation
cat33 = Web Server Extension
cat34 = Database
cat35 = Map
cat36 = Advertising Network
cat37 = Network Device
cat38 = Media Server
cat39 = Webcam
cat40 = Printer
cat41 = Payment Processor
cat42 = Tag Manager
cat43 = Paywall
cat44 = Build/CI System
cat45 = SCADA System
cat46 = Remote Access
cat47 = Development Tool
cat48 = Network Storage
cat49 = Feed Readers
cat50 = Document Management Systems
cat51 = Landing Page Builder
cat52 = Live Chat

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = Aplicaciones no detectadas
clickForDetail = Clic para detalles
preferences = Opciones
categories = Categorías
tracking_title = Seguimiento
tracking_description = Enviar informes anónimos sobre las aplicaciones detectadas a wappalyzer.com para análisis
urlbar_title = Display icons in URL bar
urlbar_description = Uncheck to display toolbar button.
feedback = Opinión
github = Github
twitter = Twitter
website = Ir a wappalyzer.com
cat1 = Gestor de Contenido
cat2 = Foro
cat3 = estor de Bases de Datos
cat4 = Herramienta de Documentación
cat5 = Widget
cat6 = Tienda Web
cat7 = Galería fotográfica
cat8 = Wiki
cat9 = Panel de Hosting
cat10 = Analítica
cat11 = Blog
cat12 = Framework JavaScript
cat13 = Gestor de Incidencias
cat14 = Reproductor de Vídeo
cat15 = Sistema de Comentarios
cat16 = CAPTCHA
cat17 = Tipografía
cat18 = Framework Web
cat19 = Miscelánea
cat20 = Editor
cat21 = LMS
cat22 = Servidor Web
cat23 = Herramienta de Cache
cat24 = Editor de Texto Enriquecido
cat25 = Gráficos JavaScript
cat26 = Framework Móvil
cat27 = Lenguaje de programación
cat28 = Sistema Operativo
cat29 = Motor de Búsqueda
cat30 = Correo Web
cat31 = CDN
cat32 = Automatización de Marketing
cat33 = Extensión de Servidor Web
cat34 = Base de Datos
cat35 = Mapa
cat36 = Red de Publicidad
cat37 = Dispositivo de Red
cat38 = Servidores de Contenido
cat39 = Webcam
cat40 = Impresora
cat41 = Payment Processor
cat42 = Tag Manager
cat43 = Paywall
cat44 = Build/CI System
cat45 = SCADA System
cat46 = Remote Access
cat47 = Development Tool
cat48 = Network Storage
cat49 = Feed Readers
cat50 = Document Management Systems
cat51 = Landing Page Builder
cat52 = Live Chat

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = Pas d'applications détectées
clickForDetails = Cliquer pour plus de détails
preferences = Plus d'options...
categories = Gérer les catégories
tracking_title = Traçage
tracking_description = Envoyer anonymement des rapports sur les applications détectées à wappalyzer.com pour la recherche
urlbar_title = Afficher les icônes dans la barre d'adresse
urlbar_description = Décocher pour afficher le bouton dans la barre des modules
feedback = Donner votre avis
github = Github
twitter = Twitter
website = Aller sur wappalyzer.com
cat1 = CMS
cat2 = Forum
cat3 = Gestionnaire de base de données
cat4 = Outil de documentation
cat5 = Widget
cat6 = Boutique en ligne
cat7 = Galerie photo
cat8 = Wiki
cat9 = Gestionnaire de serveur
cat10 = Outil de statistiques
cat11 = Blog
cat12 = Framework JavaScript
cat13 = Outils de suivi de problèmes
cat14 = Lecteur de vidéos
cat15 = Système de commentaires
cat16 = CAPTCHA
cat17 = Script de police
cat18 = Framework web
cat19 = Divers
cat20 = Editeur
cat21 = LMS
cat22 = Serveur web
cat23 = Outil de cache
cat24 = Editeur WYSIWYG
cat25 = Graphismes JavaScript
cat26 = Framework pour mobiles
cat27 = Language de programmation
cat28 = Système d'exploitation
cat29 = Moteur de recherche
cat30 = Web Mail
cat31 = CDN
cat32 = Logiciel de marketing
cat33 = Extension de serveur web
cat34 = Base de données
cat35 = Carte
cat36 = Réseau publicitaire
cat37 = Périphérique réseau
cat38 = Serveur multimédia
cat39 = Webcam
cat40 = Imprimante
cat41 = Service de paiement
cat42 = Tag Manager
cat43 = Paywall
cat44 = Système CI
cat45 = Système SCADA
cat46 = Accès à distance
cat47 = Outil de développement
cat48 = Stockage réseau
cat49 = Lecteur RSS
cat50 = Système de gestion de documents
cat51 = Landing Page Builder
cat52 = Chat en direct

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = Nessuna applicazione rilevata
clickForDetails = Clicca per i dettagli
preferences = Opzioni
categories = Categorie
tracking_title = Tracking
tracking_description = Inviare anonimamente un report sulle applicazioni rilevate a wappalyzer.com per l'analisi
urlbar_title = Mostra le icone nella barra delle URL
urlbar_description = Deselezionare per visualizzare il pulsante nella barra degli strumenti.
feedback = Feedback
github = Github
twitter = Twitter
website = Vai su wappalyzer.com
cat1 = CMS
cat2 = Forum
cat3 = Gestore di database
cat4 = Strumento di documentazione
cat5 = Widget
cat6 = eCommerce
cat7 = Galleria fotografica
cat8 = Wiki
cat9 = Pannello Hosting
cat10 = Analytics
cat11 = Blog
cat12 = Framework JavaScript
cat13 = Issue Tracker
cat14 = Player Video
cat15 = Sistema di commenti
cat16 = CAPTCHA
cat17 = Font Script
cat18 = Framework Web
cat19 = Miscellanea
cat20 = Editor
cat21 = LMS
cat22 = Web Server
cat23 = Cache Tool
cat24 = Editor di Testo Ricco
cat25 = JavaScript Graphics
cat26 = Framework Mobile
cat27 = Linguaggio di Programmazione
cat28 = Sistema Operativo
cat29 = Motore di Ricerca
cat30 = Web Mail
cat31 = CDN
cat32 = Marketing Automation
cat33 = Estensione Web Server
cat34 = Database
cat35 = Mappa
cat36 = Network Pubblicitario
cat37 = Network Device
cat38 = Media Server
cat39 = Webcam
cat40 = Stampante
cat41 = Payment Processor
cat42 = Tag Manager
cat43 = Paywall
cat44 = Sistema Build/CI
cat45 = SCADA System
cat46 = Accesso Remoto
cat47 = Strumenti di Sviluppo
cat48 = Network Storage
cat49 = Lettore di Feed
cat50 = Sistema di Gestione Documenti
cat51 = Landing Page Builder
cat52 = Live Chat

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = Geen applicaties gedetecteerd
clickForDetails = Klik voor details
preferences = Meer opties…
categories = Beheer categoriën
tracking_title = Tracking
tracking_description = Verzend anonieme informatie over applicaties naar wappalyzer.com voor onderzoek
urlbar_title = Laat iconen in de adresbalk zien
urlbar_description = Uncheck to display toolbar button.
feedback = Feedback
github = Github
twitter = Twitter
website = Ga naar wappalyzer.com
cat1 = CMS
cat2 = Forum
cat3 = Database Manager
cat4 = Documentatie Tool
cat5 = Widget
cat6 = Webwinkel
cat7 = Fotogalerij
cat8 = Wiki
cat9 = Hosting Paneel
cat10 = Analytics
cat11 = Blog
cat12 = JavaScript Framework
cat13 = Issue Tracker
cat14 = Videospeler
cat15 = Reactiesysteem
cat16 = CAPTCHA
cat17 = Font Script
cat18 = Web Framework
cat19 = Overige
cat20 = Editor
cat21 = LMS
cat22 = Webserver
cat23 = Cache Tool
cat24 = Rich Text Editor
cat25 = JavaScript Graphics
cat26 = Mobiel Framework
cat27 = Programmeertaal
cat28 = Besturingssysteem
cat29 = Zoekmachine
cat30 = Webmail
cat31 = CDN
cat32 = Marketing Automatisering
cat33 = Web Server Extensie
cat34 = Database
cat35 = Landkaart
cat36 = Advertentienetwerk
cat37 = Netwerk Apparaat
cat38 = Media Server
cat39 = Webcam
cat40 = Printer
cat41 = Betalingsverwerker
cat42 = Tag Manager
cat43 = Paywall
cat44 = Build/CI System
cat45 = SCADA System
cat46 = Remote Access
cat47 = Development Tool
cat48 = Network Storage
cat49 = Feed Readers
cat50 = Document Management Systems
cat51 = Landing Page Builder
cat52 = Live Chat

@ -1,65 +0,0 @@
name = Wappalyzer
noAppsDetected = Nici o aplicație detectată
clickForDetails = Click pentru detalii
preferences = Opțiuni
categories = Categorii
tracking_title = Analiză
tracking_description = Trimite rapoarte anonime despre aplicațiile detectate către wappalyzer.com pentru cercetare
urlbar_title = Afișează iconițe în bara URL
urlbar_description = Debifează pentru a arăta butonul în toolbar.
feedback = Părere
github = Github
twitter = Twitter
website = Mergi la wappalyzer.com
cat1 = CMS
cat2 = Forum de discuții
cat3 = Manager baze de date
cat4 = Unealtă pentru documentare
cat5 = Widget
cat10 = Analiză trafic web
cat11 = Blog
cat12 = Framework JavaScript
cat13 = Tracker probleme
cat14 = Player Video
cat15 = Sistem de comentarii
cat16 = Verificare Captcha
cat17 = Script pentru fonturi
cat18 = Framework Web
cat19 = Divers
cat20 = Editor
cat21 = LMS
cat22 = Server Web
cat23 = Unealtă Cache
cat24 = Editor Texte Rich
cat25 = Grafică JavaScript
cat26 = Framework Mobile
cat27 = Limbaj de programare
cat28 = Sistem de operare
cat29 = Motor de căutare
cat30 = Poștă electronică
cat31 = CDN
cat32 = Automatizare marketing
cat33 = Extensie server web
cat34 = Bază de date
cat35 = Hartă
cat36 = Rețea de advertising
cat37 = Serviciu rețea
cat38 = Server Media
cat39 = Webcam
cat40 = Imprimantă
cat41 = Sistem de plată
cat42 = Manager cuvinte cheie
cat43 = Paywall
cat44 = Build/CI System
cat45 = SCADA System
cat46 = Remote Access
cat47 = Development Tool
cat48 = Network Storage
cat49 = Feed Readers
cat50 = Document Management Systems
cat51 = Landing Page Builder
cat52 = Live Chat

@ -1,68 +0,0 @@
name = Wappalyzer
noAppsDetected = Нет данных о сайте
clickForDetails = Щелкните, чтобы посмотреть детально
preferences = Настройки Wappalyzer
categories = Категории
tracking_title = Слежение
tracking_description = Анонимно отправлять статистику распознанных данных на сервер (для улучшения расширения)
urlbar_title = Отображать иконку в строке URL
urlbar_description = Снимите галочку, чтобы отображать кнопку на панели
feedback = Обратная связь
github = Форкнуть на GitHub!
twitter = Следите за новостями в Твиттере
website = Перейти на Wappalyzer.com
cat1 = CMS
cat2 = Форум
cat3 = Менеджер БД
cat4 = Документация
cat5 = Виджет
cat6 = Электронная коммерция
cat7 = Фотогалерея
cat8 = Wiki
cat9 = Панель хостинга
cat10 = Аналитика
cat11 = Блог
cat12 = JS фреймворк
cat13 = Баг трекер
cat14 = Видео плеер
cat15 = Система комментариев
cat16 = Капча
cat17 = Шрифт
cat18 = Веб фреймворк
cat19 = Прочее
cat20 = HTML редактор
cat21 = LMS
cat22 = Веб сервер
cat23 = Кеширование
cat24 = WYSIWYG редактор
cat25 = JS графика
cat26 = Мобильный фреймворк
cat27 = Язык программирования
cat28 = Операционная система
cat29 = Поисковый движок
cat30 = Веб почта
cat31 = CDN
cat32 = Управление маркетингом
cat33 = Расширение Веб сервера
cat34 = База данных
cat35 = Карта
cat36 = Рекламная сеть
cat37 = Сетевая служба
cat38 = Медиа сервер
cat39 = Вебкамера
cat40 = Принтер
cat41 = Провайдер платежей
cat42 = Менеджер тэгов
cat43 = Paywall
cat44 = Система непрерывной интеграции
cat45 = Система SCADA
cat46 = Удаленное управление
cat47 = Утилита для разработчиков
cat48 = Сетевое хранилище
cat49 = Граббер контента
cat50 = Управление документами
cat51 = Генератор лендингов
cat52 = Live Chat

@ -1,29 +0,0 @@
{
"name": "wappalyzer",
"title": "Wappalyzer",
"homepage": "https://wappalyzer.com",
"icon": "images/icon48.png",
"icon64": "images/icon64.png",
"id": "wappalyzer@crunchlabz.com",
"description": "Identifies software on the web",
"author": "Elbert Alias",
"license": "GPLv3",
"version": "3.2.11",
"main": "driver.js",
"preferences": [{
"name": "tracking",
"title": "Tracking",
"description": "Anonymously send reports on detected applications to wappalyzer.com for analysis",
"type": "bool",
"value": true
}, {
"name": "urlbar",
"title": "Display icons in URL bar",
"description": "Uncheck to display toolbar button.",
"type": "bool",
"value": true
}],
"permissions": {
"private-browsing": true
}
}

@ -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,30 +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,
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);
},
/**
@ -114,7 +123,7 @@
init: function() {
var
page, hostname,
headers = {};
headers = {},
a = document.createElement('a'),
json = JSON.parse(require('fs').read('apps.json'));
@ -166,7 +175,7 @@
};
page.open(url, function(status) {
var html, environmentVars;
var html, environmentVars = '';
if ( status === 'success' ) {
html = page.content;
@ -177,7 +186,7 @@
// Collect environment variables
environmentVars = page.evaluate(function() {
var i, environmentVars;
var i, environmentVars = '';
for ( i in window ) {
environmentVars += i + ' ';

@ -6,7 +6,7 @@ const
phantomjs = require('phantomjs-prebuilt');
exports.run = function(args, callback) {
args.unshift.apply(args, ['driver.js', '--web-security=false', '--load-images=false', '--ignore-ssl-errors=yes', '--ssl-protocol=any']);
args.unshift.apply(args, [path.join(__dirname, 'driver.js'), '--web-security=false', '--load-images=false', '--ignore-ssl-errors=yes', '--ssl-protocol=any']);
var driver = phantomjs.exec.apply(this, args);

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

@ -3,3 +3,5 @@ images/icons/converted/*.png
images/icons/*.png
images/icons/*.svg
js/wappalyzer.js
js/iframe.js
js/network.js

@ -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": "Δεν ανιχνεύθηκαν εφαρμογές." },
@ -56,5 +57,6 @@
"categoryName49": { "message": "Feed Readers" },
"categoryName50": { "message": "Συστήματα Διαχειρίσης Εγγράφων" },
"categoryName51": { "message": "Σύστημα Κατασκευής Σελίδων Υποδοχής" },
"categoryName52": { "message": "Live Chat" }
"categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }
}

@ -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" },
@ -56,5 +61,6 @@
"categoryName49": { "message": "Feed Readers" },
"categoryName50": { "message": "Document Management Systems" },
"categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Live Chat" }
"categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }
}

@ -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." },
@ -60,5 +61,6 @@
"categoryName49": { "message": "Feed Readers" },
"categoryName50": { "message": "Document Management Systems" },
"categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Live Chat" }
"categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }
}

@ -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é" },
@ -60,5 +61,6 @@
"categoryName49": { "message": "Lecteur RSS" },
"categoryName50": { "message": "Système de gestion de documents" },
"categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Chat en direct" }
"categoryName52": { "message": "Chat en direct" },
"categoryName53": { "message": "CRM" }
}

@ -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": "Δεν ανιχνεύθηκαν εφαρμογές." },
@ -56,5 +57,6 @@
"categoryName49": { "message": "Feed Readers" },
"categoryName50": { "message": "Συστήματα Διαχειρίσης Εγγράφων" },
"categoryName51": { "message": "Σύστημα Κατασκευής Σελίδων Υποδοχής" },
"categoryName52": { "message": "Live Chat" }
"categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }
}

@ -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." },
@ -60,6 +61,7 @@
"categoryName49": { "message": "Lettore di Feed" },
"categoryName50": { "message": "Sistema di Gestione Documenti" },
"categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Live Chat" }
"categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }
}

@ -0,0 +1,62 @@
{
"github": { "message": "Fork Wappalyzer on GitHub!" },
"twitter": { "message": "Obserwuj Wappalyzer na Twitterze" },
"website": { "message": "Przejdź do wappalyzer.com" },
"options": { "message": "Opcje" },
"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." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Forum" },
"categoryName3": { "message": "Menedżer baz danych" },
"categoryName4": { "message": "Narzędzia dokumentacji" },
"categoryName5": { "message": "Widżet" },
"categoryName10": { "message": "Statystyki" },
"categoryName11": { "message": "Blog" },
"categoryName12": { "message": "Framework JavaScript" },
"categoryName13": { "message": "Lista problemów" },
"categoryName14": { "message": "Odtwarzacz wideo" },
"categoryName15": { "message": "System komentarzy" },
"categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Skrypt czcionek" },
"categoryName18": { "message": "Framework webowy" },
"categoryName19": { "message": "Różne" },
"categoryName20": { "message": "Edytor" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Serwer internetowy" },
"categoryName23": { "message": "Narzędzia cache" },
"categoryName24": { "message": "Rich Text Editor" },
"categoryName25": { "message": "Grafika JavaScript" },
"categoryName26": { "message": "Framework mobilny" },
"categoryName27": { "message": "Język programowania" },
"categoryName28": { "message": "System operacyjny" },
"categoryName29": { "message": "Silnik wyszukiwarki" },
"categoryName30": { "message": "Poczta internetowa" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Automatyzacja marketingu" },
"categoryName33": { "message": "Rozszerzenie serwera WWW" },
"categoryName34": { "message": "Baza danych" },
"categoryName35": { "message": "Mapy" },
"categoryName36": { "message": "Sieć reklamowa" },
"categoryName37": { "message": "Usługa sieciowa" },
"categoryName38": { "message": "Serwer mediów" },
"categoryName39": { "message": "Kamera internetowa" },
"categoryName40": { "message": "Drukarka" },
"categoryName41": { "message": "Procesor płatności" },
"categoryName42": { "message": "Menedżer tagów" },
"categoryName43": { "message": "Menedżer płatności" },
"categoryName44": { "message": "System Build/CI" },
"categoryName45": { "message": "System SCADA" },
"categoryName46": { "message": "Dostęp zdalny" },
"categoryName47": { "message": "Narzędzia deweloperskie" },
"categoryName48": { "message": "Magazyn sieciowy" },
"categoryName49": { "message": "Czytnik" },
"categoryName50": { "message": "Systemy zarządzania dokumentami" },
"categoryName51": { "message": "Konstruktory stron" },
"categoryName52": { "message": "Czat na żywo" },
"categoryName53": { "message": "CRM" }
}

@ -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ă." },
@ -56,5 +57,6 @@
"categoryName49": { "message": "Feed Readers" },
"categoryName50": { "message": "Document Management Systems" },
"categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Live Chat" }
"categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }
}

@ -47,6 +47,7 @@
"categoryName50" : { "message" : "Управление документами" },
"categoryName51" : { "message": "Генератор лендингов" },
"categoryName52" : { "message": "Live Chat" },
"categoryName53" : { "message": "CRM" },
"github" : { "message" : "Форкнуть на GitHub!" },
"noAppsDetected" : { "message" : "Нет данных о сайте" },
"nothingToDo" : { "message" : "Тут нечего искать" },

@ -6,7 +6,6 @@
<script src="js/browser-polyfill.js"></script>
<script src="js/wappalyzer.js"></script>
<script src="js/defaults.js"></script>
<script src="js/driver.js"></script>
<script src="js/network.js"></script>
</head>

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 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
*/
@ -46,29 +71,35 @@
w.driver.categoryOrder = Object.keys(w.categories).sort(function(a, b) {
return w.categories[a].priority - w.categories[b].priority;
});
console.log(w.driver.categoryOrder);
};
xhr.send(null);
// Version check
try {
var version = browser.app.getDetails().version;
if ( localStorage['version'] == null ) {
firstRun = true;
var version = browser.runtime.getManifest().version;
// 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);
@ -76,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');
@ -111,7 +148,9 @@
}
for ( var header in responseHeaders ) {
headersCache[uri][header] = responseHeaders[header];
if ( responseHeaders.hasOwnProperty(header) ) {
headersCache[uri][header] = responseHeaders[header];
}
}
}
@ -135,6 +174,7 @@
onMessage: function(message, sender, sendResponse) {
var
hostname,
response,
a = document.createElement('a');
if ( typeof message.id != 'undefined' ) {
@ -164,21 +204,29 @@
break;
case 'get_apps':
sendResponse({
response = {
tabCache: tabCache[message.tab.id],
apps: w.apps,
categories: w.categories
});
};
break;
default:
}
sendResponse(response);
}
},
/**
* 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
});
},
/**
@ -200,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);
}
};
},
@ -234,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 = [];
}
});
},
/**
@ -257,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

@ -1,6 +1,6 @@
(function() {
try {
var i, environmentVars, e = document.createEvent('Events');
var i, environmentVars = '', e = document.createEvent('Events');
e.initEvent('wappalyzerEvent', true, false);
@ -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,584 +0,0 @@
'use strict';
(function() {
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',
'innovid.com',
'serving-sys.com',
'btrll.com',
'teads.tv',
'tubemogul.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 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);
this.collectors[tabId] = new PageNetworkTrafficCollector(tabId);
},
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'};
browser.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;
browser.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;
browser.webNavigation.getFrame(getFrameDetails).then(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;
browser.webNavigation.getFrame(getFrameDetails).then(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 ( 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];
browser.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;
}
};
browser.webRequest.onBeforeRequest.addListener(function(details) {
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRequest);
}, {urls: ['http://*/*', 'https://*/*']}, []);
browser.webRequest.onSendHeaders.addListener(function(details) {
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onSendHeaders);
}, {urls: ['http://*/*', 'https://*/*']}, ['requestHeaders']);
browser.webRequest.onHeadersReceived.addListener(function(details) {
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onHeadersReceived);
}, {urls: ['http://*/*', 'https://*/*']}, ['responseHeaders']);
browser.webRequest.onBeforeRedirect.addListener(function(details) {
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRedirect);
}, {urls: ['http://*/*', 'https://*/*']}, []);
browser.webRequest.onResponseStarted.addListener(function(details) {
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onResponseStarted);
}, {urls: ['http://*/*', 'https://*/*']}, ['responseHeaders']);
browser.webNavigation.onBeforeNavigate.addListener(function(details) {
if ( details.frameId === 0 ) {
globalPageContainer.onNewNavigation(details);
}
}, {});
browser.webNavigation.onCommitted.addListener(function(details) {
if ( details.frameId === 0 ) {
globalPageContainer.onNavigationCommitted(details);
}
});
browser.webNavigation.onCompleted.addListener(function(details) {
if ( details.frameId === 0 ) {
globalPageContainer.onNavigationCompleted(details);
}
});
browser.tabs.onRemoved.addListener(function(tabId, closeInfo) {
globalPageContainer.onTabClose(tabId, closeInfo);
});
browser.runtime.onMessage.addListener(function(message, sender, sendResponse) {
if ( message.event === 'new-ad' && message.data.event === 'ad' ) {
var tabId = sender.tab.id;
if ( tabId ) {
globalPageContainer.onDisplayAdFound(tabId);
}
}
});
})();

@ -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 }).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 }).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": "3",
"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": "3",
"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><!--

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

@ -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.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save