From 092e9575aaa457d6069e3c6d7863c4e93e89e109 Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sat, 1 Apr 2017 13:13:55 +1100 Subject: [PATCH] Removed Firefox & Chrome drivers in favour of the WebExtension driver --- bin/wappalyzer-build | 18 +- bin/wappalyzer-links | 17 +- src/apps.json | 2 +- src/drivers/chrome/.gitignore | 7 - src/drivers/chrome/_locales/el/messages.json | 60 -- src/drivers/chrome/_locales/en/messages.json | 60 -- src/drivers/chrome/_locales/es/messages.json | 64 --- src/drivers/chrome/_locales/fr/messages.json | 64 --- src/drivers/chrome/_locales/gr/messages.json | 60 -- src/drivers/chrome/_locales/it/messages.json | 65 --- src/drivers/chrome/_locales/ro/messages.json | 60 -- src/drivers/chrome/_locales/ru/messages.json | 60 -- src/drivers/chrome/background.html | 15 - src/drivers/chrome/css/options.css | 65 --- src/drivers/chrome/css/popup.css | 93 ---- src/drivers/chrome/css/widgets.css | 298 ---------- src/drivers/chrome/images/github.png | Bin 281 -> 0 bytes src/drivers/chrome/images/icon_128.png | Bin 5720 -> 0 bytes src/drivers/chrome/images/icon_19.png | Bin 643 -> 0 bytes src/drivers/chrome/images/icon_32.png | Bin 1046 -> 0 bytes src/drivers/chrome/images/icon_38.png | Bin 1218 -> 0 bytes src/drivers/chrome/images/icon_hot.png | Bin 555 -> 0 bytes src/drivers/chrome/images/icons/.gitkeep | 0 .../chrome/images/icons/converted/.gitkeep | 0 src/drivers/chrome/images/twitter.png | Bin 373 -> 0 bytes src/drivers/chrome/js/content.js | 63 --- src/drivers/chrome/js/defaults.js | 5 - src/drivers/chrome/js/driver.js | 301 ---------- src/drivers/chrome/js/i18n.js | 12 - src/drivers/chrome/js/inject.js | 15 - src/drivers/chrome/js/options.js | 55 -- src/drivers/chrome/js/popup.js | 67 --- src/drivers/chrome/manifest.json | 34 -- src/drivers/chrome/options.html | 40 -- src/drivers/chrome/popup.html | 21 - src/drivers/firefox | 524 ++++++++++++++++++ src/drivers/firefox/.gitignore | 5 - src/drivers/firefox/data/css/panel.css | 69 --- src/drivers/firefox/data/images/icon32.png | Bin 1046 -> 0 bytes .../firefox/data/images/icons/.gitkeep | 0 src/drivers/firefox/data/js/panel.js | 96 ---- src/drivers/firefox/data/js/tab.js | 31 -- src/drivers/firefox/data/panel.html | 16 - src/drivers/firefox/driver.js | 520 ----------------- src/drivers/firefox/images/icon48.png | Bin 1753 -> 0 bytes src/drivers/firefox/images/icon64.png | Bin 2649 -> 0 bytes src/drivers/firefox/locale/de-DE.properties | 68 --- src/drivers/firefox/locale/el-GR.properties | 68 --- src/drivers/firefox/locale/en-GB.properties | 68 --- src/drivers/firefox/locale/en-US.properties | 68 --- src/drivers/firefox/locale/es-ES.properties | 68 --- src/drivers/firefox/locale/fr-FR.properties | 68 --- src/drivers/firefox/locale/it-IT.properties | 68 --- src/drivers/firefox/locale/nl-NL.properties | 68 --- src/drivers/firefox/locale/ro-RO.properties | 65 --- src/drivers/firefox/locale/ru-RU.properties | 68 --- src/drivers/firefox/package.json | 29 - src/drivers/webextension/.gitignore | 2 + src/drivers/webextension/images/icon_64.png | Bin 0 -> 2406 bytes src/drivers/webextension/js/driver.js | 2 +- src/drivers/webextension/js/iframe.js | 95 +++- src/drivers/webextension/js/network.js | 264 +++++++-- src/drivers/webextension/js/popup.js | 4 +- src/utils/iframe.js | 91 ++- src/utils/network.js | 240 +++++++- 65 files changed, 1115 insertions(+), 3171 deletions(-) delete mode 100644 src/drivers/chrome/.gitignore delete mode 100644 src/drivers/chrome/_locales/el/messages.json delete mode 100644 src/drivers/chrome/_locales/en/messages.json delete mode 100644 src/drivers/chrome/_locales/es/messages.json delete mode 100644 src/drivers/chrome/_locales/fr/messages.json delete mode 100644 src/drivers/chrome/_locales/gr/messages.json delete mode 100644 src/drivers/chrome/_locales/it/messages.json delete mode 100644 src/drivers/chrome/_locales/ro/messages.json delete mode 100644 src/drivers/chrome/_locales/ru/messages.json delete mode 100644 src/drivers/chrome/background.html delete mode 100644 src/drivers/chrome/css/options.css delete mode 100644 src/drivers/chrome/css/popup.css delete mode 100644 src/drivers/chrome/css/widgets.css delete mode 100644 src/drivers/chrome/images/github.png delete mode 100644 src/drivers/chrome/images/icon_128.png delete mode 100644 src/drivers/chrome/images/icon_19.png delete mode 100644 src/drivers/chrome/images/icon_32.png delete mode 100644 src/drivers/chrome/images/icon_38.png delete mode 100644 src/drivers/chrome/images/icon_hot.png delete mode 100644 src/drivers/chrome/images/icons/.gitkeep delete mode 100644 src/drivers/chrome/images/icons/converted/.gitkeep delete mode 100644 src/drivers/chrome/images/twitter.png delete mode 100644 src/drivers/chrome/js/content.js delete mode 100644 src/drivers/chrome/js/defaults.js delete mode 100644 src/drivers/chrome/js/driver.js delete mode 100644 src/drivers/chrome/js/i18n.js delete mode 100644 src/drivers/chrome/js/inject.js delete mode 100644 src/drivers/chrome/js/options.js delete mode 100644 src/drivers/chrome/js/popup.js delete mode 100644 src/drivers/chrome/manifest.json delete mode 100644 src/drivers/chrome/options.html delete mode 100644 src/drivers/chrome/popup.html create mode 100644 src/drivers/firefox delete mode 100644 src/drivers/firefox/.gitignore delete mode 100644 src/drivers/firefox/data/css/panel.css delete mode 100644 src/drivers/firefox/data/images/icon32.png delete mode 100644 src/drivers/firefox/data/images/icons/.gitkeep delete mode 100644 src/drivers/firefox/data/js/panel.js delete mode 100644 src/drivers/firefox/data/js/tab.js delete mode 100644 src/drivers/firefox/data/panel.html delete mode 100644 src/drivers/firefox/driver.js delete mode 100644 src/drivers/firefox/images/icon48.png delete mode 100644 src/drivers/firefox/images/icon64.png delete mode 100755 src/drivers/firefox/locale/de-DE.properties delete mode 100644 src/drivers/firefox/locale/el-GR.properties delete mode 100755 src/drivers/firefox/locale/en-GB.properties delete mode 100755 src/drivers/firefox/locale/en-US.properties delete mode 100755 src/drivers/firefox/locale/es-ES.properties delete mode 100644 src/drivers/firefox/locale/fr-FR.properties delete mode 100755 src/drivers/firefox/locale/it-IT.properties delete mode 100755 src/drivers/firefox/locale/nl-NL.properties delete mode 100644 src/drivers/firefox/locale/ro-RO.properties delete mode 100644 src/drivers/firefox/locale/ru-RU.properties delete mode 100644 src/drivers/firefox/package.json create mode 100644 src/drivers/webextension/images/icon_64.png diff --git a/bin/wappalyzer-build b/bin/wappalyzer-build index 9c4989728..b526af24b 100755 --- a/bin/wappalyzer-build +++ b/bin/wappalyzer-build @@ -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,22 +52,6 @@ node $WAPPALYZER_NODE_PATH/node_modules/imagemin-cli/cli.js $WAPPALYZER_ROOT/src wappalyzer links -# Mozilla Firefox -echo "Building Firefox driver..." - -pushd $WAPPALYZER_ROOT/src/drivers/firefox > /dev/null - -node $WAPPALYZER_NODE_PATH/node_modules/jpm/bin/jpm xpi && mv *.xpi $WAPPALYZER_ROOT/build/wappalyzer_firefox.xpi - -popd > /dev/null - -# Google Chrome -echo "Building Chrome driver..." - -pushd $WAPPALYZER_ROOT/src/drivers/chrome > /dev/null - -zip -qr $WAPPALYZER_ROOT/build/wappalyzer_chrome.zip . - # WebExtension echo "Building WebExtension driver..." diff --git a/bin/wappalyzer-links b/bin/wappalyzer-links index 251cebbf2..ae75f4432 100755 --- a/bin/wappalyzer-links +++ b/bin/wappalyzer-links @@ -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 diff --git a/src/apps.json b/src/apps.json index e63cd6347..7577301b1 100755 --- a/src/apps.json +++ b/src/apps.json @@ -10161,4 +10161,4 @@ "priority": "9" } } -} +} \ No newline at end of file diff --git a/src/drivers/chrome/.gitignore b/src/drivers/chrome/.gitignore deleted file mode 100644 index 602df1590..000000000 --- a/src/drivers/chrome/.gitignore +++ /dev/null @@ -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 diff --git a/src/drivers/chrome/_locales/el/messages.json b/src/drivers/chrome/_locales/el/messages.json deleted file mode 100644 index 8b63568f5..000000000 --- a/src/drivers/chrome/_locales/el/messages.json +++ /dev/null @@ -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" } -} diff --git a/src/drivers/chrome/_locales/en/messages.json b/src/drivers/chrome/_locales/en/messages.json deleted file mode 100644 index f95251750..000000000 --- a/src/drivers/chrome/_locales/en/messages.json +++ /dev/null @@ -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" } -} diff --git a/src/drivers/chrome/_locales/es/messages.json b/src/drivers/chrome/_locales/es/messages.json deleted file mode 100644 index 2676f4671..000000000 --- a/src/drivers/chrome/_locales/es/messages.json +++ /dev/null @@ -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" } -} diff --git a/src/drivers/chrome/_locales/fr/messages.json b/src/drivers/chrome/_locales/fr/messages.json deleted file mode 100644 index 122d43020..000000000 --- a/src/drivers/chrome/_locales/fr/messages.json +++ /dev/null @@ -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" } -} diff --git a/src/drivers/chrome/_locales/gr/messages.json b/src/drivers/chrome/_locales/gr/messages.json deleted file mode 100644 index 8b63568f5..000000000 --- a/src/drivers/chrome/_locales/gr/messages.json +++ /dev/null @@ -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" } -} diff --git a/src/drivers/chrome/_locales/it/messages.json b/src/drivers/chrome/_locales/it/messages.json deleted file mode 100644 index 7be8c396b..000000000 --- a/src/drivers/chrome/_locales/it/messages.json +++ /dev/null @@ -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" } -} - diff --git a/src/drivers/chrome/_locales/ro/messages.json b/src/drivers/chrome/_locales/ro/messages.json deleted file mode 100644 index 851974d2b..000000000 --- a/src/drivers/chrome/_locales/ro/messages.json +++ /dev/null @@ -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" } -} diff --git a/src/drivers/chrome/_locales/ru/messages.json b/src/drivers/chrome/_locales/ru/messages.json deleted file mode 100644 index 6338d320e..000000000 --- a/src/drivers/chrome/_locales/ru/messages.json +++ /dev/null @@ -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" } -} diff --git a/src/drivers/chrome/background.html b/src/drivers/chrome/background.html deleted file mode 100644 index 3aaa6249f..000000000 --- a/src/drivers/chrome/background.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - Background - - - - - - - - - - diff --git a/src/drivers/chrome/css/options.css b/src/drivers/chrome/css/options.css deleted file mode 100644 index 9fb9bf253..000000000 --- a/src/drivers/chrome/css/options.css +++ /dev/null @@ -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; } -} \ No newline at end of file diff --git a/src/drivers/chrome/css/popup.css b/src/drivers/chrome/css/popup.css deleted file mode 100644 index 0c2fbf65c..000000000 --- a/src/drivers/chrome/css/popup.css +++ /dev/null @@ -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; -} diff --git a/src/drivers/chrome/css/widgets.css b/src/drivers/chrome/css/widgets.css deleted file mode 100644 index 9322e4635..000000000 --- a/src/drivers/chrome/css/widgets.css +++ /dev/null @@ -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: - * - *
- * - *
- */ - -.checkbox, -.radio { - margin: 0.65em 0; -} - -.checkbox label, -.radio label { - /* Don't expand horizontally: . */ - 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; -} - diff --git a/src/drivers/chrome/images/github.png b/src/drivers/chrome/images/github.png deleted file mode 100644 index 037d0c33617bc314c9a772e9434801b70f870891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmV+!0p|XRP) zLS?J56<&?(J5gDJsE`B3^2!YB0Cq*O`WD}>M>RVn+YF14O*gs}6ZRrF5{x#oYw fMt=FD7vB8~u+DAIWnGkt00000NkvXXu0mjfdTM>M diff --git a/src/drivers/chrome/images/icon_128.png b/src/drivers/chrome/images/icon_128.png deleted file mode 100644 index 05ad20d8f1de19fe4fa8a1d34bf0f7858c6e9b34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5720 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 CuPw6x diff --git a/src/drivers/chrome/images/icon_19.png b/src/drivers/chrome/images/icon_19.png deleted file mode 100644 index 9668bc65a08262e25517e70160720cd792f8c6f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 643 zcmV-}0(||6P)XFU~e6%*Mp#xuk730;hj zRyjP%rDwU;Y@jtTV|?8xt@)WXxL7iUGLUdpj}CKrvS837bVRL4k3hv=`kzAO8vYO`x_@Xw||y-d%XYv002ovPDHLkV1i$u9k~Di diff --git a/src/drivers/chrome/images/icon_32.png b/src/drivers/chrome/images/icon_32.png deleted file mode 100644 index cc9d30b15574ea8423c0f1a9ba3016e55a7ed1c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1046 zcmV+x1nK*UP)>Vlu$Kl)EJ{kF3&u}y0#ZBx^70UHa#y1?Dtd*}EdMcN{}>_YoJ z&YU^lH)qbAIU{6=D)t8b@Wc*LS?SqpYL%gw1_+YbQhb(=PjV3u;W@h{TNtF zZa5~s)ODt64$n4e&7NrO58~ONh5AN9lDsx8QPTtGAI<)LX;N|}lmlKpP zCFnoZ8GCf(5&;#V&u;>IH?WGuML+O(ms|Vow1BC*{Weg@<$({pvefk(r83;HOI5dU zWzcP@66Z=miCbN6%}ZkBVPN<&QYS>@`PGRdwbMyh6>g9EN-MBtak-_>Sf;Lf;*no2 zr~~^ZYn|2Zk^5D(0Z1(dwSm^8>)myp9KfDw&_jnKa5^d2TExu@+^51m5u*~#-=!M3lV!+PUNnM<9K}})jdx+jIz<8Y2S1N zmb10Oh}8*l-+u|J#LO@$5-hQbka-tIWyBxC@%r%bW=<3!tdCe_;h09hk*KxxHB_FP z>tV{50-|{<2}wal)Sjjo^iB{rf2A|sZ-E5TJPqM*P9F zn#4&Rn~~*nqTSN`YKNW2=j@0|*#3ZsX#t8Cs0K}<@`6Lt8yUA`*YV6X0SSBrQk^6D zucFpt{p>uNO;;>YwrxiAbs#wJLLmA9h6ab`$(-8qVjAwS#A*XpWJrF_s6IJJ^H=E% z?M%G=P47^IRUcx>Rlq%IHr|6$F+lTAi}E!q;n{T}ybl!3a<^Y~=x>BC{7n62^*Jr2 zq0|$5H)z?^&>2f*!x@^so3AfB8v&#AjxMLNC1EAPA`Ar7RG+5#cs9QN0YTDlwlpRX QV*mgE07*qoM6N<$f>LAVi2wiq diff --git a/src/drivers/chrome/images/icon_38.png b/src/drivers/chrome/images/icon_38.png deleted file mode 100644 index 95f220ff36a7fd4f3a6ef38fc95b3049a012abd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1218 zcmV;z1U>tSP)Mfq}ddwlO!tV!lI%{NJ1Z^WyN+kXU^p|=iS}j_dNZPSkC3%>)nUXpXWU1 zd4K1;&(}G^5XjxU9k?zu;aQMe$99)|++Ea~tW8PQ!0cdcj)U$};m!*~e~QYI1M$L7 zM-41LR9mX(8^G9pQ;O)OaLlZ&p{RGnz!vafdQZrE6ZFw5=_!2cs8#$)yx_#JgXN{| zxkrrb1g831p`9YK;y`R+^)P{{v!)V0=;CpkR5awTr~)7KBVjMhv2x&&1BG zIl{8O%fNEkotmC%y^P9AMn?`CSX|$;@VAR#`DuIa!mv{zhtU+F17vw!tZiYY7TKlm%8_ysHG!*RLV2L#}xD%fHdMw?LG4fbpXQI$+ zio8qG#hldLlPz_2fX*CYs751FQXeb)YQU0IA1i9??HTtF@FL)iND@=CKM)Mw@n0wa zr@!LoJm_Zkto~uF9X^-sOba`bGCYxo;gtIa?OyA2;wA$8^}m^a3Qvc7t=XT6_w_OI7McEunb=Esg zt9t@7kf(@NVOSQWGA0qqQnBO(l(kptB7%}eBru(zq+Mk}^f>AMN{81rnCf?;_9BT$ z`99zge-*>xdgms_+gS-g#Y`7b_ZWQ|_q(LU4wIXTkPig>xa>J|mN@4bBbiuY4Wg~I zxlvl&U+{2!$AyY)6@VLg>Q-B17s%~?SEopjEGLIFD`UX!UQSgBtIOt#uaVlPuu_z;|hKB!G=WJh4-1 zG-?*N@aot7Ck9MRU3}BoN#y+u!iq4{&t=455^-=qYb_1Vk5X~`s_vB$*33f84j_Ao z5`PSpXQI6FTGAKZELKkt(QN_?l7#vZ)#50X-w)~AMK}u4cT8hORksxg0Iik= gA8w-JSh9Bi2Ipg#T)U;h&j0`b07*qoM6N<$f+qh`6#xJL diff --git a/src/drivers/chrome/images/icon_hot.png b/src/drivers/chrome/images/icon_hot.png deleted file mode 100644 index 31e9b7c864d80adbd96c9aa8f817c54baab81c89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 555 zcmV+`0@VG9P)`dfWg20k}y- zK~y-)m6Od&lu;PPf6sky<2y<-ZcIg6sDUJeE2U)%>0?>M5LiY*&?ZP}=f;XzC?dKk zYSXR>(>5WIgtV}Kp^X$|j!_O_R`a3nd!II=`7w^;S)O~&S)6+wVIQ2~nIDNB9acxP zsdBg8t|fk!(n%@uLS(Wd^vnxXP8F#|C(`>acWM5>fOGzfe1jYcZ>$xirH0(qGW<4GT|b+S*9><6|taZQ@9%bAm@J5WZUsg z4FDUOCmk%1b!$5^6#@ZhroS7J6wvzrtAu*ng2D1V_(Vv!-Mpe|ZloEV*&5Ob?!KP)s@kGHYL0?0{qm%q#>WXQZbUm9^n<-RAM!}WK( zy^YUyphXfm4FF2=pL_c=D&XknL)bLG|M}M*XCeZHx 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(); -}()); diff --git a/src/drivers/chrome/js/defaults.js b/src/drivers/chrome/js/defaults.js deleted file mode 100644 index 3ec2d3e09..000000000 --- a/src/drivers/chrome/js/defaults.js +++ /dev/null @@ -1,5 +0,0 @@ -var defaults = { - autoAnalyzeHeaders: 0, - upgradeMessage: 1, - tracking: 1 -}; diff --git a/src/drivers/chrome/js/driver.js b/src/drivers/chrome/js/driver.js deleted file mode 100644 index d2ec6ae29..000000000 --- a/src/drivers/chrome/js/driver.js +++ /dev/null @@ -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(); -}()); diff --git a/src/drivers/chrome/js/i18n.js b/src/drivers/chrome/js/i18n.js deleted file mode 100644 index 2f11efbc5..000000000 --- a/src/drivers/chrome/js/i18n.js +++ /dev/null @@ -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); - } - } -}); diff --git a/src/drivers/chrome/js/inject.js b/src/drivers/chrome/js/inject.js deleted file mode 100644 index 2a8856596..000000000 --- a/src/drivers/chrome/js/inject.js +++ /dev/null @@ -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) { } -}()); diff --git a/src/drivers/chrome/js/options.js b/src/drivers/chrome/js/options.js deleted file mode 100644 index 92d1fe3f7..000000000 --- a/src/drivers/chrome/js/options.js +++ /dev/null @@ -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(); -}); diff --git a/src/drivers/chrome/js/popup.js b/src/drivers/chrome/js/popup.js deleted file mode 100644 index e3afa610a..000000000 --- a/src/drivers/chrome/js/popup.js +++ /dev/null @@ -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 = '
' + chrome.i18n.getMessage('noAppsDetected') + '
'; - } else { - detectedApps.innerHTML = '
' + chrome.i18n.getMessage('nothingToDo') + '
'; - } - }); - - 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 = - ''; - - detectedApps.innerHTML = detectedApps.innerHTML + html; - } - } - }); - }); - } - }; - - popup.init(); -}); diff --git a/src/drivers/chrome/manifest.json b/src/drivers/chrome/manifest.json deleted file mode 100644 index 2542cc790..000000000 --- a/src/drivers/chrome/manifest.json +++ /dev/null @@ -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'" -} diff --git a/src/drivers/chrome/options.html b/src/drivers/chrome/options.html deleted file mode 100644 index 1df81d498..000000000 --- a/src/drivers/chrome/options.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Wappalyzer Options - - - - - - - - - - - - - -

- -

- -

- -

- -

- -

- -

- -
-

- - - -

- - diff --git a/src/drivers/chrome/popup.html b/src/drivers/chrome/popup.html deleted file mode 100644 index 2412d04ac..000000000 --- a/src/drivers/chrome/popup.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Popup - - - - - - - - - -
- - - - diff --git a/src/drivers/firefox b/src/drivers/firefox new file mode 100644 index 000000000..8eb4f289f --- /dev/null +++ b/src/drivers/firefox @@ -0,0 +1,524 @@ +/** + * Wappalyzer v2 + * + * Created by Elbert Alias + * + * License: GPLv3 http://www.gnu.org/licenses/gpl-3.0.txt + */ + +var wappalyzer = (function() { + //'use strict'; + + /** + * Application class + */ + var Application = function(app, detected) { + this.app = app; + this.confidence = {}; + this.confidenceTotal = 0; + this.detected = Boolean(detected); + this.excludes = []; + this.version = ''; + this.versions = []; + }; + + Application.prototype = { + /** + * Calculate confidence total + */ + getConfidence: function() { + var total = 0, id; + + for ( id in this.confidence ) { + total += this.confidence[id]; + } + + return this.confidenceTotal = Math.min(total, 100); + }, + + /** + * Resolve version number (find the longest version number that contains all shorter detected version numbers) + */ + getVersion: function() { + var i, resolved; + + if ( !this.versions.length ) { + return; + } + + this.versions.sort(function(a, b) { + return a.length - b.length; + }); + + resolved = this.versions[0]; + + for ( i = 1; i < this.versions.length; i++ ) { + if ( this.versions[i].indexOf(resolved) === -1 ) { + break; + } + + resolved = this.versions[i]; + } + + return this.version = resolved; + }, + + setDetected: function(pattern, type, value, key) { + this.detected = true; + + // Set confidence level + this.confidence[type + ' ' + ( key ? key + ' ' : '' ) + pattern.regex] = pattern.confidence ? pattern.confidence : 100; + + // Detect version number + if ( pattern.version ) { + var + version = pattern.version, + matches = pattern.regex.exec(value); + + if ( matches ) { + matches.forEach(function(match, i) { + // Parse ternary operator + var ternary = new RegExp('\\\\' + i + '\\?([^:]+):(.*)$').exec(version); + + if ( ternary && ternary.length === 3 ) { + w.log({ match: match, i: i, ternary: ternary }); + + version = version.replace(ternary[0], match ? ternary[1] : ternary[2]); + + w.log({ version: version }); + } + + // Replace back references + version = version.replace(new RegExp('\\\\' + i, 'g'), match ? match : ''); + }); + + if ( version && this.versions.indexOf(version) < 0 ) { + this.versions.push(version); + } + + this.getVersion(); + } + } + } + }; + + var Profiler = function() { + this.regexCount = 0; + this.startTime = new Date().getTime(); + this.lastTime = new Date().getTime(); + this.slowest = { duration: null, app: '', type: '', pattern: '' }; + this.timedOut = false; + }; + + Profiler.prototype = { + checkPoint: function(app, type, regex) { + var duration = new Date().getTime() - this.lastTime; + + if ( !this.slowest.duration || duration > this.slowest.duration ) { + this.slowest.duration = duration; + this.slowest.app = app; + this.slowest.type = type; + this.slowest.regex = regex; + } + + this.regexCount++; + + this.lastTime = new Date().getTime(); + + this.timedOut = this.lastTime - this.startTime > w.driver.timeout; + } + }; + + /** + * Call driver functions + */ + var driver = function(func, args) { + if ( typeof w.driver[func] !== 'function' ) { + w.log('not implemented: w.driver.' + func, 'warn'); + + return; + } + + if ( func !== 'log' ) { + w.log('w.driver.' + func); + } + + return w.driver[func](args); + }; + + /** + * Parse apps.json patterns + */ + var parse = function(patterns) { + var + attrs, + parsed = []; + + // Convert single patterns to an array + if ( typeof patterns === 'string' ) { + patterns = [ patterns ]; + } + + patterns.forEach(function(pattern) { + attrs = {}; + + pattern.split('\\;').forEach(function(attr, i) { + if ( i ) { + // Key value pairs + attr = attr.split(':'); + + if ( attr.length > 1 ) { + attrs[attr.shift()] = attr.join(':'); + } + } else { + attrs.string = attr; + + try { + attrs.regex = new RegExp(attr.replace('/', '\/'), 'i'); // Escape slashes in regular expression + } catch (e) { + attrs.regex = new RegExp(); + + w.log(e + ': ' + attr, 'error'); + } + } + }); + + parsed.push(attrs); + }); + + return parsed; + }; + + /** + * Main script + */ + var w = { + apps: {}, + cats: null, + ping: { hostnames: {} }, + adCache: [], + detected: {}, + + config: { + websiteURL: 'https://wappalyzer.com/', + twitterURL: 'https://twitter.com/Wappalyzer', + githubURL: 'https://github.com/AliasIO/Wappalyzer', + }, + + /** + * Log messages to console + */ + log: function(message, type) { + if ( type === undefined ) { + type = 'debug'; + } + + if ( typeof message === 'object' ) { + message = JSON.stringify(message); + } + + driver('log', { message: message, type: type }); + }, + + /** + * Initialize + */ + init: function() { + w.log('w.init'); + + // Checks + if ( w.driver === undefined ) { + w.log('no driver, exiting'); + + return; + } + + // Initialize driver + driver('init'); + }, + + /** + * Analyze the request + */ + analyze: function(hostname, url, data) { + var + i, app, confidence, type, regexMeta, regexScript, match, content, meta, header, version, id, + profiler = new Profiler(), + apps = {}, + excludes = [], + checkImplies = true; + + w.log('w.analyze'); + + // Remove hash from URL + data.url = url = url.split('#')[0]; + + if ( w.apps === undefined || w.categories === undefined ) { + w.log('apps.json not loaded, check for syntax errors'); + + return; + } + + if ( w.detected[url] === undefined ) { + w.detected[url] = {}; + } + + for ( app in w.apps ) { + // Exit loop after one second to prevent CPU hogging + // Remaining patterns will not be evaluated + if ( profiler.timedOut ) { + w.log('Timeout, exiting loop'); + + break; + } + + apps[app] = w.detected[url] && w.detected[url][app] ? w.detected[url][app] : new Application(app); + + for ( type in w.apps[app] ) { + switch ( type ) { + case 'url': + parse(w.apps[app][type]).forEach(function(pattern) { + if ( pattern.regex.test(url) ) { + apps[app].setDetected(pattern, type, url); + } + + profiler.checkPoint(app, type, pattern.regex); + }); + + break; + case 'html': + if ( typeof data[type] !== 'string' || !data.html ) { + break; + } + + parse(w.apps[app][type]).forEach(function(pattern) { + if ( pattern.regex.test(data[type]) ) { + apps[app].setDetected(pattern, type, data[type]); + } + + profiler.checkPoint(app, type, pattern.regex); + }); + + break; + case 'script': + if ( typeof data.html !== 'string' || !data.html ) { + break; + } + + regexScript = new RegExp(']+src=("|\')([^"\']+)', 'ig'); + + parse(w.apps[app][type]).forEach(function(pattern) { + while ( match = regexScript.exec(data.html) ) { + if ( pattern.regex.test(match[2]) ) { + apps[app].setDetected(pattern, type, match[2]); + } + } + + profiler.checkPoint(app, type, pattern.regex); + }); + + break; + case 'meta': + if ( typeof data.html !== 'string' || !data.html ) { + break; + } + + regexMeta = /]+>/ig; + + while ( match = regexMeta.exec(data.html) ) { + for ( meta in w.apps[app][type] ) { + profiler.checkPoint(app, type, regexMeta); + + if ( new RegExp('(name|property)=["\']' + meta + '["\']', 'i').test(match) ) { + content = match.toString().match(/content=("|')([^"']+)("|')/i); + + parse(w.apps[app].meta[meta]).forEach(function(pattern) { + if ( content && content.length === 4 && pattern.regex.test(content[2]) ) { + apps[app].setDetected(pattern, type, content[2], meta); + } + + profiler.checkPoint(app, type, pattern.regex); + }); + } + } + } + + break; + case 'headers': + if ( typeof data[type] !== 'object' || !data[type] ) { + break; + } + + for ( header in w.apps[app].headers ) { + parse(w.apps[app][type][header]).forEach(function(pattern) { + if ( data[type][header.toLowerCase()] instanceof Array ) { + data[type][header.toLowerCase()].forEach(function(el) { + if ( typeof el === 'string' && pattern.regex.test(el) ) { + apps[app].setDetected(pattern, type, data[type][header.toLowerCase()], header); + } + }); + } else { + if ( typeof data[type][header.toLowerCase()] === 'string' && pattern.regex.test(data[type][header.toLowerCase()]) ) { + apps[app].setDetected(pattern, type, data[type][header.toLowerCase()], header); + } + } + + profiler.checkPoint(app, type, pattern.regex); + }); + } + + break; + case 'env': + if ( typeof data[type] !== 'object' || !data[type] ) { + break; + } + + parse(w.apps[app][type]).forEach(function(pattern) { + for ( i in data[type] ) { + + if ( pattern.regex.test(data[type][i]) ) { + apps[app].setDetected(pattern, type, data[type][i]); + } + } + + profiler.checkPoint(app, type, pattern.regex); + }); + + break; + } + } + } + + w.log('[ profiler ] Tested ' + profiler.regexCount + ' regular expressions in ' + ( (new Date().getTime() - profiler.startTime) / 1000 ) + 's'); + w.log('[ profiler ] Slowest pattern took ' + ( profiler.slowest.duration / 1000 ) + 's: ' + profiler.slowest.app + ' | ' + profiler.slowest.type + ' | ' + profiler.slowest.regex); + + for ( app in apps ) { + if ( !apps[app].detected ) { + delete apps[app]; + } + } + + // Exclude app in detected apps only + for ( app in apps ) { + if (w.apps[app].excludes ) { + if ( typeof w.apps[app].excludes === 'string' ) { + w.apps[app].excludes = [ w.apps[app].excludes ]; + } + + w.apps[app].excludes.forEach(function(excluded) { + excludes.push(excluded); + }); + } + } + + // Remove excluded applications + for ( app in apps ) { + if ( excludes.indexOf(app) !== -1 ) { + delete apps[app]; + } + } + + // Implied applications + // Run several passes as implied apps may imply other apps + while ( checkImplies ) { + checkImplies = false; + + for ( app in apps ) { + confidence = apps[app].confidence; + + if ( w.apps[app] && w.apps[app].implies ) { + // Cast strings to an array + if ( typeof w.apps[app].implies === 'string' ) { + w.apps[app].implies = [ w.apps[app].implies ]; + } + + w.apps[app].implies.forEach(function(implied) { + implied = parse(implied)[0]; + + if ( !w.apps[implied.string] ) { + w.log('Implied application ' + implied.string + ' does not exist', 'warn'); + + return; + } + + if ( !apps.hasOwnProperty(implied.string) ) { + apps[implied.string] = w.detected[url] && w.detected[url][implied.string] ? w.detected[url][implied.string] : new Application(implied.string, true); + + checkImplies = true; + } + + // Apply app confidence to implied app + for ( id in confidence ) { + apps[implied.string].confidence[id + ' implied by ' + app] = confidence[id] * ( implied.confidence ? implied.confidence / 100 : 1 ); + } + }); + } + } + } + + w.log(Object.keys(apps).length + ' apps detected: ' + Object.keys(apps).join(', ') + ' on ' + url); + + // Keep history of detected apps + for ( app in apps ) { + confidence = apps[app].confidence; + version = apps[app].version; + + // Per URL + w.detected[url][app] = apps[app]; + + for ( id in confidence ) { + w.detected[url][app].confidence[id] = confidence[id]; + } + + if ( w.detected[url][app].getConfidence() >= 100 ) { + // Per hostname + if ( /(www.)?((.+?)\.(([a-z]{2,3}\.)?[a-z]{2,6}))$/.test(hostname) && !/((local|dev(elopment)?|stag(e|ing)?|test(ing)?|demo(shop)?|admin|google|cache)\.|\/admin|\.local)/.test(url) ) { + if ( !w.ping.hostnames.hasOwnProperty(hostname) ) { + w.ping.hostnames[hostname] = { applications: {}, meta: {} }; + } + + if ( !w.ping.hostnames[hostname].applications.hasOwnProperty(app) ) { + w.ping.hostnames[hostname].applications[app] = { hits: 0 }; + } + + w.ping.hostnames[hostname].applications[app].hits ++; + + if ( version ) { + w.ping.hostnames[hostname].applications[app].version = version; + } + } else { + w.log('Ignoring hostname "' + hostname + '"'); + } + } + } + + // Additional information + if ( w.ping.hostnames.hasOwnProperty(hostname) ) { + if ( typeof data.html === 'string' && data.html ) { + match = data.html.match(/]*[: ]lang="([a-z]{2}((-|_)[A-Z]{2})?)"/i); + + if ( match && match.length ) { + w.ping.hostnames[hostname].meta['language'] = match[1]; + } + } + } + + if ( Object.keys(w.ping.hostnames).length >= 50 || w.adCache.length >= 50 ) { + driver('ping'); + } + + apps = null; + data = null; + + driver('displayApps'); + } + }; + + return w; +})(); + +// CommonJS package +// See http://wiki.commonjs.org/wiki/CommonJS +if ( typeof exports === 'object' ) { + exports.wappalyzer = wappalyzer; +} diff --git a/src/drivers/firefox/.gitignore b/src/drivers/firefox/.gitignore deleted file mode 100644 index 8484335b2..000000000 --- a/src/drivers/firefox/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -data/apps.json -data/images/icons/*.png -data/images/icons/*.svg -data/js/iframe.js -wappalyzer.js diff --git a/src/drivers/firefox/data/css/panel.css b/src/drivers/firefox/data/css/panel.css deleted file mode 100644 index a4f6661c3..000000000 --- a/src/drivers/firefox/data/css/panel.css +++ /dev/null @@ -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; -} diff --git a/src/drivers/firefox/data/images/icon32.png b/src/drivers/firefox/data/images/icon32.png deleted file mode 100644 index cc9d30b15574ea8423c0f1a9ba3016e55a7ed1c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1046 zcmV+x1nK*UP)>Vlu$Kl)EJ{kF3&u}y0#ZBx^70UHa#y1?Dtd*}EdMcN{}>_YoJ z&YU^lH)qbAIU{6=D)t8b@Wc*LS?SqpYL%gw1_+YbQhb(=PjV3u;W@h{TNtF zZa5~s)ODt64$n4e&7NrO58~ONh5AN9lDsx8QPTtGAI<)LX;N|}lmlKpP zCFnoZ8GCf(5&;#V&u;>IH?WGuML+O(ms|Vow1BC*{Weg@<$({pvefk(r83;HOI5dU zWzcP@66Z=miCbN6%}ZkBVPN<&QYS>@`PGRdwbMyh6>g9EN-MBtak-_>Sf;Lf;*no2 zr~~^ZYn|2Zk^5D(0Z1(dwSm^8>)myp9KfDw&_jnKa5^d2TExu@+^51m5u*~#-=!M3lV!+PUNnM<9K}})jdx+jIz<8Y2S1N zmb10Oh}8*l-+u|J#LO@$5-hQbka-tIWyBxC@%r%bW=<3!tdCe_;h09hk*KxxHB_FP z>tV{50-|{<2}wal)Sjjo^iB{rf2A|sZ-E5TJPqM*P9F zn#4&Rn~~*nqTSN`YKNW2=j@0|*#3ZsX#t8Cs0K}<@`6Lt8yUA`*YV6X0SSBrQk^6D zucFpt{p>uNO;;>YwrxiAbs#wJLLmA9h6ab`$(-8qVjAwS#A*XpWJrF_s6IJJ^H=E% z?M%G=P47^IRUcx>Rlq%IHr|6$F+lTAi}E!q;n{T}ybl!3a<^Y~=x>BC{7n62^*Jr2 zq0|$5H)z?^&>2f*!x@^so3AfB8v&#AjxMLNC1EAPA`Ar7RG+5#cs9QN0YTDlwlpRX QV*mgE07*qoM6N<$f>LAVi2wiq diff --git a/src/drivers/firefox/data/images/icons/.gitkeep b/src/drivers/firefox/data/images/icons/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/drivers/firefox/data/js/panel.js b/src/drivers/firefox/data/js/panel.js deleted file mode 100644 index 8fbfc9d3d..000000000 --- a/src/drivers/firefox/data/js/panel.js +++ /dev/null @@ -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); - }); -}()); diff --git a/src/drivers/firefox/data/js/tab.js b/src/drivers/firefox/data/js/tab.js deleted file mode 100644 index 72719ec2b..000000000 --- a/src/drivers/firefox/data/js/tab.js +++ /dev/null @@ -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) { } -}()); diff --git a/src/drivers/firefox/data/panel.html b/src/drivers/firefox/data/panel.html deleted file mode 100644 index 83f1abe54..000000000 --- a/src/drivers/firefox/data/panel.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - Panel - - - - -
- -
- - diff --git a/src/drivers/firefox/driver.js b/src/drivers/firefox/driver.js deleted file mode 100644 index 4eb7565c0..000000000 --- a/src/drivers/firefox/driver.js +++ /dev/null @@ -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 - ] - }; -}()); diff --git a/src/drivers/firefox/images/icon48.png b/src/drivers/firefox/images/icon48.png deleted file mode 100644 index 82259f2274684d31e9713f0931ed2025b20f65c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1753 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 Hu0mjfvNZxh diff --git a/src/drivers/firefox/locale/de-DE.properties b/src/drivers/firefox/locale/de-DE.properties deleted file mode 100755 index 1de0e86e6..000000000 --- a/src/drivers/firefox/locale/de-DE.properties +++ /dev/null @@ -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 diff --git a/src/drivers/firefox/locale/el-GR.properties b/src/drivers/firefox/locale/el-GR.properties deleted file mode 100644 index 626098c94..000000000 --- a/src/drivers/firefox/locale/el-GR.properties +++ /dev/null @@ -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 diff --git a/src/drivers/firefox/locale/en-GB.properties b/src/drivers/firefox/locale/en-GB.properties deleted file mode 100755 index 0c2ec9d3d..000000000 --- a/src/drivers/firefox/locale/en-GB.properties +++ /dev/null @@ -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 diff --git a/src/drivers/firefox/locale/en-US.properties b/src/drivers/firefox/locale/en-US.properties deleted file mode 100755 index 0c2ec9d3d..000000000 --- a/src/drivers/firefox/locale/en-US.properties +++ /dev/null @@ -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 diff --git a/src/drivers/firefox/locale/es-ES.properties b/src/drivers/firefox/locale/es-ES.properties deleted file mode 100755 index 503d472e8..000000000 --- a/src/drivers/firefox/locale/es-ES.properties +++ /dev/null @@ -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 diff --git a/src/drivers/firefox/locale/fr-FR.properties b/src/drivers/firefox/locale/fr-FR.properties deleted file mode 100644 index f65c5da0c..000000000 --- a/src/drivers/firefox/locale/fr-FR.properties +++ /dev/null @@ -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 diff --git a/src/drivers/firefox/locale/it-IT.properties b/src/drivers/firefox/locale/it-IT.properties deleted file mode 100755 index aaaf8f5ef..000000000 --- a/src/drivers/firefox/locale/it-IT.properties +++ /dev/null @@ -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 diff --git a/src/drivers/firefox/locale/nl-NL.properties b/src/drivers/firefox/locale/nl-NL.properties deleted file mode 100755 index 9d2833f50..000000000 --- a/src/drivers/firefox/locale/nl-NL.properties +++ /dev/null @@ -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 diff --git a/src/drivers/firefox/locale/ro-RO.properties b/src/drivers/firefox/locale/ro-RO.properties deleted file mode 100644 index 61bf776f5..000000000 --- a/src/drivers/firefox/locale/ro-RO.properties +++ /dev/null @@ -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 diff --git a/src/drivers/firefox/locale/ru-RU.properties b/src/drivers/firefox/locale/ru-RU.properties deleted file mode 100644 index 5c820a05f..000000000 --- a/src/drivers/firefox/locale/ru-RU.properties +++ /dev/null @@ -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 diff --git a/src/drivers/firefox/package.json b/src/drivers/firefox/package.json deleted file mode 100644 index c6a05fcf8..000000000 --- a/src/drivers/firefox/package.json +++ /dev/null @@ -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 - } -} diff --git a/src/drivers/webextension/.gitignore b/src/drivers/webextension/.gitignore index d0671fb4f..602df1590 100644 --- a/src/drivers/webextension/.gitignore +++ b/src/drivers/webextension/.gitignore @@ -3,3 +3,5 @@ images/icons/converted/*.png images/icons/*.png images/icons/*.svg js/wappalyzer.js +js/iframe.js +js/network.js diff --git a/src/drivers/webextension/images/icon_64.png b/src/drivers/webextension/images/icon_64.png new file mode 100644 index 0000000000000000000000000000000000000000..160dfde79054a97afc6ab388c45c1309ec8b3fdf GIT binary patch literal 2406 zcmV-s37PhZP)^bN6JHOZWcMl9=5Q7-RAO;@Uu9vUMaTkA(<6J-URGvcydc&!_YdBnu4*r+EkmG(O9c8Tru882WyLF}I zy&1Tn?6eMo+3w;SP}bfE3lA{C5^GP6YkmG{X#rDt&gF0?JdBbB(GFS))^_@>yS8!D zk<&r}xsG)gD4my3a^V1GuL?~h|E=~}CE+flhjAB@-eJr$W~j^=WJ=au4X_KknMW;DnVNVq@G6HsvaeC zHwR{IjG6*wQ{-rN8h=1kK{QHehf71#1;5Yge|%J|&;#!K-sGAN@E`1xK z?u~}<>0{zqvF%FkeCWb3y@7iyS9|Gn$1A;FsK+3f>smiYp*Hrjob3_Q^3r*5-6V#l z$8uiQS$w{`k(zQ}I7)tRy4A~4!iDu-oIu-j$8_CWeiKZRB zi@3xX5>uS)e7!ajDPo*$S$XFgHb%)sARz@sy!mb22Z9h%0=HL}1Q2#x43t^B4dAiq-Z>U0{a0IL%T#AB8#|fP`cR zg->PigCD2T8L%jMy_PqgDQEAy^@zY9-@2TOrVQ(v-*C{+ysRx8X^JQb>_)2OTM{FR zXMp5rnft1eX=GlK)NOoUX(Jn-Ea%f*->_o)6~rewx_;ZV_5jQ0l}4IOG>N9>Z)(4> z2taaN#ZLnBqg|NVjperc&quWXnfmcT@5>LGSh-^wBQoN; zO#kl5@6uT3=SM&BGJC-o&bc`8gu39NIlK9EXJe#fH-ROS{U1HJn8kM2DRX0svy?3_ zf*RZ3l}BIb;r9E_XTppT#5hl0WF9Q@QTA~YmtW`Y8vATl1BKb!F*}d?!}!aGaP9n~ zh3BKc+>5UzVws>!M9bUMe#7o=X)uk#iJHi2Z%k%qf|fEqoL%BPF-)8}g6#ZJeE-T} zNG~YYtB-%ls)7%r7KHtF>*p1npT(lgd6g{NbesZa>uIDHBK)3X9bAu|5=hlEl_t6? z+>M8(yP0}ZIy3GVb%O7o3`>9hAKrf9>j-B(6{t18w7#(p#dZw|k0sikdp}`uhwhcD zw~H|M_^L3V+Kd*v-f)Y@j1fmz?60lG=sJ?B5ATnh2ob(3@^jf}uhh2pSTMVsA%*BC>LI3ser z&JLShZ`85tjXDyN9k}9k>c4J}Oo&$-Evp_6K4 z;?Yw$UD0YcP-B*1sgPNtUMc2QvwUM08*F7qMLd(&Xd>qWV}tdZTI>co2@t0xAp`ee zxmUfgI{;RD8Jix@DDNZ%xSFOZpNob-EnBcZDsj45`L>#A|0oU3j0}OtrZmQ+0%z)`F6|s#x|yznh}R z!^^MJM9dz#MMAPZg5gF+R08C;DY?g6huxy|yh@h#>Qj1O+*i^lSb(UIj~?7wJYHiA z4sl0J_zo4I#@tVv-4fC>5LOPij}(^jRIk}npW{~=3nw5F^4W`^G29qMvL61|vliXx%SPyv7(}HBTQ%%n_>0eRL>)sA=se z`ArqeR)p6X3KJRJlVOVfBB)8BNL7lSPKuF+gxs=sBnJ2drEaa_k+2_ChMl~d*xA%V z?rIMKg)k+UQrlEBKGj6LmV_=wcav8gRGIr}v<~(}VxG2@@5X9YRY#^b7(w)xRQc?t zW4XQeBqmabX!+L4j*3_=TdRxlz21(JJG6MXChp$=8FD znA2SW$4J$}3v7{>fd0IEs8GtzujbDs(L7^R8B8-f>yycSt|w9zoWwj<9&K(hU`)0* zq^d6@=8RJSKq`yUH6hqL;y#g>Gg1LTNL9Z`%o&eV7ESibqJO2a@CpVoh(Qcu5T^$J Y1?0Db>(wr4LI3~&07*qoM6N<$g1Q!+g8%>k literal 0 HcmV?d00001 diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index 9e0ace31a..3c5c7bd26 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -54,7 +54,7 @@ // Version check try { - var version = browser.app.getDetails().version; + var version = browser.runtime.getManifest().version; if ( localStorage['version'] == null ) { firstRun = true; diff --git a/src/drivers/webextension/js/iframe.js b/src/drivers/webextension/js/iframe.js index fcf40539f..d37f91ef1 100644 --- a/src/drivers/webextension/js/iframe.js +++ b/src/drivers/webextension/js/iframe.js @@ -69,6 +69,7 @@ var exports = {}; realArray: function(a) { return Array.prototype.slice.apply(a); }, + onDocLoaded: function(doc, callback) { if ( doc.readyState === 'loading' ) { doc.addEventListener('DOMContentLoaded', callback); @@ -112,10 +113,42 @@ var exports = {}; try { dict[key] = window.decodeURIComponent(val); } catch (e) { + + continue; } } return dict; }, + sendToBackground: function(message, event, responseMessage, onResponse) { + if ( typeof browser !== 'undefined' ) { + var response = browser.runtime.sendMessage(message); + response.then(onResponse); + } else if ( typeof chrome !== 'undefined' ) { + chrome.runtime.sendMessage(message, onResponse); + } else if ( window.self.port ) { + window.self.port.on(responseMessage, onResponse); + window.self.port.emit(event, message); + } + }, + + ifTrackingEnabled: function(callback, elseCallback) { + + this.sendToBackground( + 'is_tracking_enabled', + '', + 'tracking_enabled_response', + function(message) { + if ( message.tracking_enabled ) { + + callback(); + } else { + + elseCallback(); + } + } + ); + + } }; utils.SCRIPT_IN_FRIENDLY_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && utils.isFriendlyWindow(window.parent); @@ -135,7 +168,7 @@ var exports = {}; LogGenerator.prototype = { log: function(event, opt_assets, opt_pageTags) { var opt_video_assets; - if ( event === 'video' ) { + if ( event === 'video' || event === 'invalid-video' ) { opt_video_assets = opt_assets || []; opt_assets = []; } else { @@ -148,7 +181,7 @@ var exports = {}; video_assets: opt_video_assets, assets: opt_assets, version: '3', - mrev: '5dacb94-c', + mrev: '9c4d5b3-c', msgNum: this.msgNum, timestamp: new Date().getTime(), pageVis: document.visibilityState, @@ -305,7 +338,6 @@ var exports = {}; return div; } } - return null; }; TopSearcher.prototype._jumpedOut = function(el) { @@ -858,7 +890,7 @@ var exports = {}; var _pageTags; var INIT_MS_BW_SEARCHES = 2000; var PAGE_TAG_RE = new RegExp('gpt|oascentral'); - var POST_MSG_ID = '1484952787-11883-24071-12354-1549'; + var POST_MSG_ID = '1490888598-28717-31700-14775-21098'; var AD_SERVER_RE = new RegExp('^(google_ads_iframe|oas_frame|atwAdFrame)'); function getPageTags(doc) { @@ -924,9 +956,9 @@ var exports = {}; if ( exports.utils.SCRIPT_IN_WINDOW_TOP || document.readyState === 'complete' ) { extractAds(); } - setTimeout(function() { - extractAdsWrapper(); - }, INIT_MS_BW_SEARCHES); + setTimeout( + function() { extractAdsWrapper(); }, INIT_MS_BW_SEARCHES + ); } function extractAds() { @@ -987,7 +1019,6 @@ var exports = {}; } } } - return null; } function onPostMessage(event) { @@ -1009,6 +1040,8 @@ var exports = {}; delete adData.postMessageId; + event.stopImmediatePropagation(); + if ( isChildWin(myWin, ifrWin) ) { if ( exports.utils.isFriendlyWindow(ifrWin) ) { ifrTag = ifrWin.frameElement; @@ -1053,12 +1086,24 @@ var exports = {}; callback(msg); } }); + } else if ( typeof chrome !== 'undefined' ) { + chrome.runtime.onMessage.addListener(function(msg) { + if ( msg.event === event ) { + callback(msg); + } + }); } else if ( window.self.port ) { window.self.port.on(event, callback); } } exports.coordinator = { + addPostMessageListener: function() { + if ( !exports.utils.SCRIPT_IN_FRIENDLY_IFRAME ) { + window.addEventListener('message', onPostMessage, false); + } + }, + init: function(onAdFound) { if ( exports.utils.SCRIPT_IN_FRIENDLY_IFRAME ) { @@ -1066,8 +1111,6 @@ var exports = {}; } _onAdFound = onAdFound; - window.addEventListener('message', onPostMessage, false); - if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { var log = _logGen.log('page'); onAdFound(log); @@ -1092,26 +1135,32 @@ var exports = {}; if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { window.adparser = { init: exports.coordinator.init, + addPostMessageListener: exports.coordinator.addPostMessageListener, + ifTrackingEnabled: exports.utils.ifTrackingEnabled, + sendToBackground: exports.utils.sendToBackground }; } else { - exports.coordinator.init(function() {}); + exports.coordinator.addPostMessageListener(); + exports.utils.ifTrackingEnabled( + function() { + exports.coordinator.init(function() {}); + }, + function() {} + ); } - })(window); (function(adparser) { - function sendToBackground(event, message) { - if ( window.self.port ) { - window.self.port.emit(event, message); - } else if ( typeof browser !== 'undefined' ) { - browser.runtime.sendMessage(message); - } - } - function onAdFound(log) { - sendToBackground('ad_log', { id: 'ad_log', subject: log }); + adparser.sendToBackground({ id: 'ad_log', subject: log }, 'ad_log', '', function(){}); } - if ( window === window.top ) { - adparser.init(onAdFound); + if ( window === window.top ) { + adparser.addPostMessageListener(); + adparser.ifTrackingEnabled( + function() { + adparser.init(onAdFound); + }, + function() {} + ) } })(window.adparser); diff --git a/src/drivers/webextension/js/network.js b/src/drivers/webextension/js/network.js index 9dc38f5a2..b2f2ea018 100644 --- a/src/drivers/webextension/js/network.js +++ b/src/drivers/webextension/js/network.js @@ -1,6 +1,27 @@ 'use strict'; (function() { + function isChrome() { + return (typeof chrome !== 'undefined' && + window.navigator.userAgent.match(/Chrom(?:e|ium)\/([0-9\.]+)/)); + } + + var browserProxy; + if ( isChrome() ) { + browserProxy = chrome; + } else { + browserProxy = browser; + } + + var MIN_FF_MAJOR_VERSION = 51; + + var requiredBrowserApis = [ + browserProxy.webNavigation, + browserProxy.tabs, + browserProxy.webRequest, + browserProxy.runtime + ]; + var areListenersRegistered = false; var secBefore = 2000; var secAfter = 5000; var secBetweenDupAssets = 10e3; @@ -22,11 +43,27 @@ var topVideoAssetDomains = [ '2mdn.net', + 'adap.tv', + 'adnxs.com', + 'adsrvr.org', + 'btrll.com', + 'celtra.com', + 'flashtalking.com', + 'flite.com', 'innovid.com', + 'jivox.com', + 'mixpo.com', + 'nytimes.com', + 'playwire.com', + 'selectmedia.asia', 'serving-sys.com', - 'btrll.com', + 'solvemedia.com', + 'spotible.com', 'teads.tv', - 'tubemogul.com' + 'tribalfusion.com', + 'tubemogul.com', + 'videologygroup.com', + 'washingtonpost.com' ]; if ( !String.prototype.endsWith ) { @@ -42,6 +79,47 @@ }; } + function getFrame(getFrameDetails, callback) { + if ( typeof chrome !== 'undefined' ) { + chrome.webNavigation.getFrame(getFrameDetails, callback); + } else if ( typeof browser !== 'undefined' ) { + var gettingFrame = browser.webNavigation.getFrame(getFrameDetails); + gettingFrame.then(callback); + } + } + + function ifBrowserValid(callback, elseCallback) { + if ( isChrome() ) { + + callback(); + } else if ( typeof browser !== 'undefined' ) { + try { + var gettingInfo = browser.runtime.getBrowserInfo(); + gettingInfo.then(function(browserInfo) { + var browserVersion = parseInt(browserInfo.version.split('.')[0]); + + if ( browserInfo.name === 'Firefox' && + browserVersion >= MIN_FF_MAJOR_VERSION) { + callback(); + } else { + elseCallback(); + } + }); + } catch (err) { + + elseCallback(); + } + } else { + elseCallback(); + } + } + + function isTrackingEnabled() { + + return parseInt(localStorage.tracking, 10); + + } + function isPixelRequest(request) { return (request.type === 'image' || request.responseStatus === 204) && request.size <= 1000; @@ -57,7 +135,7 @@ } function stripQueryParams(url) { - return url.split('?',1)[0]; + return url.split('?', 1)[0]; } function parseHostnameFromUrl(url) { @@ -117,7 +195,18 @@ var tabId = details.tabId; this.cleanupCollector(tabId); - this.collectors[tabId] = new PageNetworkTrafficCollector(tabId); + if ( isTrackingEnabled() ) { + if ( !areListenersRegistered ) { + + registerListeners(); + } + this.collectors[tabId] = new PageNetworkTrafficCollector(tabId); + } else { + if ( areListenersRegistered ) { + + unregisterListeners(); + } + } }, onNavigationCommitted: function(details) { @@ -160,7 +249,7 @@ PageNetworkTrafficCollector.prototype.sendLogMessageToTabConsole = function() { var logMessage = Array.from(arguments).join(' '); var message = {message: logMessage, event: 'console-log-message'}; - browser.tabs.sendMessage(this.tabId, message); + browserProxy.tabs.sendMessage(this.tabId, message); }; PageNetworkTrafficCollector.prototype.sendToTab = function(assetReq, reqs, curPageUrl, isValidAd) { @@ -179,7 +268,9 @@ return parseHostnameFromUrl(request.url); }); msg.assets = [{ + url: parseHostnameFromUrl(assetReq.url), + contentType: assetReq.contentType, size: assetReq.size }]; @@ -188,7 +279,7 @@ msg.origUrl = curPageUrl; msg.displayAdFound = this.displayAdFound; - browser.tabs.sendMessage(this.tabId, msg); + browserProxy.tabs.sendMessage(this.tabId, msg); }; PageNetworkTrafficCollector.prototype.getRedirKey = function(url, frameId) { @@ -236,7 +327,7 @@ frameId: details.frameId }; var pageNetworkTrafficController = this; - browser.webNavigation.getFrame(getFrameDetails).then(function(frameDetails) { + getFrame(getFrameDetails, function(frameDetails) { if ( frameDetails && frameDetails.url ) { pageNetworkTrafficController._onHeadersReceived(details, frameDetails); } @@ -356,7 +447,7 @@ frameId: responseDetails.frameId }; var pageNetworkTrafficController = this; - browser.webNavigation.getFrame(getFrameDetails).then(function(frameDetails) { + getFrame(getFrameDetails, function(frameDetails) { if ( frameDetails && frameDetails.url ) { pageNetworkTrafficController.processResponse(responseDetails, frameDetails); } @@ -484,6 +575,10 @@ var hasVpaidOrVastRequest = tagRequests.some(function(tagRequest) { return isVpaidOrVastRequest(tagRequest); }); + + if ( assetRequest.isYoutubeAd ) { + return true; + } if ( hasVpaidOrVastRequest ) { return true; } @@ -498,7 +593,7 @@ var _this = this, origPageUrl, msgAssetReq; msgAssetReq = this.msgsBeingSent[msgKey]; - browser.tabs.get(this.tabId, function(tab) {origPageUrl = tab.url;}); + browserProxy.tabs.get(this.tabId, function(tab) {origPageUrl = tab.url;}); setTimeout(function() { var rawRequests = []; @@ -531,54 +626,159 @@ } }; - browser.webRequest.onBeforeRequest.addListener(function(details) { + function onBeforeRequestListener(details) { globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRequest); - }, {urls: ['http://*/*', 'https://*/*']}, []); + } - browser.webRequest.onSendHeaders.addListener(function(details) { + function onSendHeadersListener(details) { globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onSendHeaders); - }, {urls: ['http://*/*', 'https://*/*']}, ['requestHeaders']); + } - browser.webRequest.onHeadersReceived.addListener(function(details) { + function onHeadersReceivedListener(details) { globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onHeadersReceived); - }, {urls: ['http://*/*', 'https://*/*']}, ['responseHeaders']); + } - browser.webRequest.onBeforeRedirect.addListener(function(details) { + function onBeforeRedirectListener(details) { globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRedirect); - }, {urls: ['http://*/*', 'https://*/*']}, []); + } - browser.webRequest.onResponseStarted.addListener(function(details) { + function onResponseStartedListener(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) { + function onCommittedListener(details) { if ( details.frameId === 0 ) { globalPageContainer.onNavigationCommitted(details); } - }); + } - browser.webNavigation.onCompleted.addListener(function(details) { + function onCompletedListener(details) { if ( details.frameId === 0 ) { globalPageContainer.onNavigationCompleted(details); } - }); + } - browser.tabs.onRemoved.addListener(function(tabId, closeInfo) { + function onRemovedListener(tabId, closeInfo) { globalPageContainer.onTabClose(tabId, closeInfo); - }); + } - browser.runtime.onMessage.addListener(function(message, sender, sendResponse) { + function onMessageListener(message, sender, sendResponse) { if ( message.event === 'new-ad' && message.data.event === 'ad' ) { var tabId = sender.tab.id; if ( tabId ) { globalPageContainer.onDisplayAdFound(tabId); } } + } + + function registerListeners() { + + browserProxy.webRequest.onBeforeRequest.addListener( + onBeforeRequestListener, + {urls: ['http://*/*', 'https://*/*']}, + [] + ); + + browserProxy.webRequest.onSendHeaders.addListener( + onSendHeadersListener, + {urls: ['http://*/*', 'https://*/*']}, + ['requestHeaders'] + ); + + browserProxy.webRequest.onHeadersReceived.addListener( + onHeadersReceivedListener, + {urls: ['http://*/*', 'https://*/*']}, + ['responseHeaders'] + ); + + browserProxy.webRequest.onBeforeRedirect.addListener( + onBeforeRedirectListener, + {urls: ['http://*/*', 'https://*/*']}, + [] + ); + + browserProxy.webRequest.onResponseStarted.addListener( + onResponseStartedListener, + {urls: ['http://*/*', 'https://*/*']}, + ['responseHeaders'] + ); + + browserProxy.webNavigation.onCommitted.addListener(onCommittedListener); + browserProxy.webNavigation.onCompleted.addListener(onCompletedListener); + browserProxy.tabs.onRemoved.addListener(onRemovedListener); + browserProxy.runtime.onMessage.addListener(onMessageListener); + + areListenersRegistered = true; + } + + function unregisterListeners() { + + browserProxy.webRequest.onBeforeRequest.removeListener( + onBeforeRequestListener + ); + + browserProxy.webRequest.onSendHeaders.removeListener( + onSendHeadersListener + ); + + browserProxy.webRequest.onHeadersReceived.removeListener( + onHeadersReceivedListener + ); + + browserProxy.webRequest.onBeforeRedirect.removeListener( + onBeforeRedirectListener + ); + + browserProxy.webRequest.onResponseStarted.removeListener( + onResponseStartedListener + ); + + browserProxy.webNavigation.onCommitted.removeListener(onCommittedListener); + browserProxy.webNavigation.onCompleted.removeListener(onCompletedListener); + browserProxy.tabs.onRemoved.removeListener(onRemovedListener); + browserProxy.runtime.onMessage.removeListener(onMessageListener); + + areListenersRegistered = false; + } + + function areRequiredBrowserApisAvailable() { + return requiredBrowserApis.every(function(api) { + return typeof api !== 'undefined'; + }); + } + + if ( areRequiredBrowserApisAvailable() ) { + ifBrowserValid( + function() { + browserProxy.webNavigation.onBeforeNavigate.addListener( + function(details) { + if ( details.frameId === 0 ) { + globalPageContainer.onNewNavigation(details); + } + }, + { + url: [{urlMatches: 'http://*/*'}, {urlMatches: 'https://*/*'}] + } + ); + }, function() { + + } + ); + } + + browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) { + if ( request === 'is_browser_valid' ) { + ifBrowserValid( + sendResponse({'browser_valid': true}), + sendResponse({'browser_valid': false}) + ); + } }); + + browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) { + if ( request === 'is_tracking_enabled' ) { + sendResponse({'tracking_enabled': isTrackingEnabled()}); + } + }); + })(); diff --git a/src/drivers/webextension/js/popup.js b/src/drivers/webextension/js/popup.js index 6e81a7939..99b415211 100644 --- a/src/drivers/webextension/js/popup.js +++ b/src/drivers/webextension/js/popup.js @@ -10,7 +10,7 @@ document.addEventListener('DOMContentLoaded', function() { popup = { init: function() { - browser.tabs.query({ active: true }).then(function(tabs) { + browser.tabs.query({ active: true, windowId: browser.windows.WINDOW_ID_CURRENT }).then(function(tabs) { if ( tabs[0].url.match(/https?:\/\//) ) { detectedApps.innerHTML = '
' + browser.i18n.getMessage('noAppsDetected') + '
'; } else { @@ -24,7 +24,7 @@ document.addEventListener('DOMContentLoaded', function() { displayApps: function() { var appName, confidence, version; - browser.tabs.query({ active: true }).then(function(tabs) { + browser.tabs.query({ active: true, windowId: browser.windows.WINDOW_ID_CURRENT }).then(function(tabs) { function sendGetApps(response) { if ( response.tabCache && response.tabCache.count > 0 ) { detectedApps.innerHTML = ''; diff --git a/src/utils/iframe.js b/src/utils/iframe.js index 64e2c20e4..d37f91ef1 100644 --- a/src/utils/iframe.js +++ b/src/utils/iframe.js @@ -69,6 +69,7 @@ var exports = {}; realArray: function(a) { return Array.prototype.slice.apply(a); }, + onDocLoaded: function(doc, callback) { if ( doc.readyState === 'loading' ) { doc.addEventListener('DOMContentLoaded', callback); @@ -118,6 +119,36 @@ var exports = {}; } return dict; }, + sendToBackground: function(message, event, responseMessage, onResponse) { + if ( typeof browser !== 'undefined' ) { + var response = browser.runtime.sendMessage(message); + response.then(onResponse); + } else if ( typeof chrome !== 'undefined' ) { + chrome.runtime.sendMessage(message, onResponse); + } else if ( window.self.port ) { + window.self.port.on(responseMessage, onResponse); + window.self.port.emit(event, message); + } + }, + + ifTrackingEnabled: function(callback, elseCallback) { + + this.sendToBackground( + 'is_tracking_enabled', + '', + 'tracking_enabled_response', + function(message) { + if ( message.tracking_enabled ) { + + callback(); + } else { + + elseCallback(); + } + } + ); + + } }; utils.SCRIPT_IN_FRIENDLY_IFRAME = !utils.SCRIPT_IN_WINDOW_TOP && utils.isFriendlyWindow(window.parent); @@ -137,7 +168,7 @@ var exports = {}; LogGenerator.prototype = { log: function(event, opt_assets, opt_pageTags) { var opt_video_assets; - if ( event === 'video' ) { + if ( event === 'video' || event === 'invalid-video' ) { opt_video_assets = opt_assets || []; opt_assets = []; } else { @@ -150,7 +181,7 @@ var exports = {}; video_assets: opt_video_assets, assets: opt_assets, version: '3', - mrev: '9efbfba-c', + mrev: '9c4d5b3-c', msgNum: this.msgNum, timestamp: new Date().getTime(), pageVis: document.visibilityState, @@ -859,7 +890,7 @@ var exports = {}; var _pageTags; var INIT_MS_BW_SEARCHES = 2000; var PAGE_TAG_RE = new RegExp('gpt|oascentral'); - var POST_MSG_ID = '1488911709-15415-26289-19282-15751'; + var POST_MSG_ID = '1490888598-28717-31700-14775-21098'; var AD_SERVER_RE = new RegExp('^(google_ads_iframe|oas_frame|atwAdFrame)'); function getPageTags(doc) { @@ -925,9 +956,9 @@ var exports = {}; if ( exports.utils.SCRIPT_IN_WINDOW_TOP || document.readyState === 'complete' ) { extractAds(); } - setTimeout(function() { - extractAdsWrapper(); - }, INIT_MS_BW_SEARCHES); + setTimeout( + function() { extractAdsWrapper(); }, INIT_MS_BW_SEARCHES + ); } function extractAds() { @@ -1049,7 +1080,13 @@ var exports = {}; } function addBackgroundListener(event, callback) { - if ( typeof chrome !== 'undefined' ) { + if ( typeof browser !== 'undefined' ) { + browser.runtime.onMessage.addListener(function(msg) { + if ( msg.event === event ) { + callback(msg); + } + }); + } else if ( typeof chrome !== 'undefined' ) { chrome.runtime.onMessage.addListener(function(msg) { if ( msg.event === event ) { callback(msg); @@ -1061,6 +1098,12 @@ var exports = {}; } exports.coordinator = { + addPostMessageListener: function() { + if ( !exports.utils.SCRIPT_IN_FRIENDLY_IFRAME ) { + window.addEventListener('message', onPostMessage, false); + } + }, + init: function(onAdFound) { if ( exports.utils.SCRIPT_IN_FRIENDLY_IFRAME ) { @@ -1068,8 +1111,6 @@ var exports = {}; } _onAdFound = onAdFound; - window.addEventListener('message', onPostMessage, false); - if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { var log = _logGen.log('page'); onAdFound(log); @@ -1094,26 +1135,32 @@ var exports = {}; if ( exports.utils.SCRIPT_IN_WINDOW_TOP ) { window.adparser = { init: exports.coordinator.init, + addPostMessageListener: exports.coordinator.addPostMessageListener, + ifTrackingEnabled: exports.utils.ifTrackingEnabled, + sendToBackground: exports.utils.sendToBackground }; } else { - exports.coordinator.init(function() {}); + exports.coordinator.addPostMessageListener(); + exports.utils.ifTrackingEnabled( + function() { + exports.coordinator.init(function() {}); + }, + function() {} + ); } - })(window); (function(adparser) { - function sendToBackground(event, message) { - if ( window.self.port ) { - window.self.port.emit(event, message); - } else if ( typeof chrome !== 'undefined' ) { - chrome.extension.sendRequest(message); - } - } - function onAdFound(log) { - sendToBackground('ad_log', { id: 'ad_log', subject: log }); + adparser.sendToBackground({ id: 'ad_log', subject: log }, 'ad_log', '', function(){}); } - if ( window === window.top ) { - adparser.init(onAdFound); + if ( window === window.top ) { + adparser.addPostMessageListener(); + adparser.ifTrackingEnabled( + function() { + adparser.init(onAdFound); + }, + function() {} + ) } })(window.adparser); diff --git a/src/utils/network.js b/src/utils/network.js index 944db09c2..b2f2ea018 100644 --- a/src/utils/network.js +++ b/src/utils/network.js @@ -1,6 +1,27 @@ 'use strict'; (function() { + function isChrome() { + return (typeof chrome !== 'undefined' && + window.navigator.userAgent.match(/Chrom(?:e|ium)\/([0-9\.]+)/)); + } + + var browserProxy; + if ( isChrome() ) { + browserProxy = chrome; + } else { + browserProxy = browser; + } + + var MIN_FF_MAJOR_VERSION = 51; + + var requiredBrowserApis = [ + browserProxy.webNavigation, + browserProxy.tabs, + browserProxy.webRequest, + browserProxy.runtime + ]; + var areListenersRegistered = false; var secBefore = 2000; var secAfter = 5000; var secBetweenDupAssets = 10e3; @@ -58,6 +79,47 @@ }; } + function getFrame(getFrameDetails, callback) { + if ( typeof chrome !== 'undefined' ) { + chrome.webNavigation.getFrame(getFrameDetails, callback); + } else if ( typeof browser !== 'undefined' ) { + var gettingFrame = browser.webNavigation.getFrame(getFrameDetails); + gettingFrame.then(callback); + } + } + + function ifBrowserValid(callback, elseCallback) { + if ( isChrome() ) { + + callback(); + } else if ( typeof browser !== 'undefined' ) { + try { + var gettingInfo = browser.runtime.getBrowserInfo(); + gettingInfo.then(function(browserInfo) { + var browserVersion = parseInt(browserInfo.version.split('.')[0]); + + if ( browserInfo.name === 'Firefox' && + browserVersion >= MIN_FF_MAJOR_VERSION) { + callback(); + } else { + elseCallback(); + } + }); + } catch (err) { + + elseCallback(); + } + } else { + elseCallback(); + } + } + + function isTrackingEnabled() { + + return parseInt(localStorage.tracking, 10); + + } + function isPixelRequest(request) { return (request.type === 'image' || request.responseStatus === 204) && request.size <= 1000; @@ -73,7 +135,7 @@ } function stripQueryParams(url) { - return url.split('?',1)[0]; + return url.split('?', 1)[0]; } function parseHostnameFromUrl(url) { @@ -133,7 +195,18 @@ var tabId = details.tabId; this.cleanupCollector(tabId); - this.collectors[tabId] = new PageNetworkTrafficCollector(tabId); + if ( isTrackingEnabled() ) { + if ( !areListenersRegistered ) { + + registerListeners(); + } + this.collectors[tabId] = new PageNetworkTrafficCollector(tabId); + } else { + if ( areListenersRegistered ) { + + unregisterListeners(); + } + } }, onNavigationCommitted: function(details) { @@ -176,7 +249,7 @@ PageNetworkTrafficCollector.prototype.sendLogMessageToTabConsole = function() { var logMessage = Array.from(arguments).join(' '); var message = {message: logMessage, event: 'console-log-message'}; - chrome.tabs.sendMessage(this.tabId, message); + browserProxy.tabs.sendMessage(this.tabId, message); }; PageNetworkTrafficCollector.prototype.sendToTab = function(assetReq, reqs, curPageUrl, isValidAd) { @@ -195,7 +268,9 @@ return parseHostnameFromUrl(request.url); }); msg.assets = [{ + url: parseHostnameFromUrl(assetReq.url), + contentType: assetReq.contentType, size: assetReq.size }]; @@ -204,7 +279,7 @@ msg.origUrl = curPageUrl; msg.displayAdFound = this.displayAdFound; - chrome.tabs.sendMessage(this.tabId, msg); + browserProxy.tabs.sendMessage(this.tabId, msg); }; PageNetworkTrafficCollector.prototype.getRedirKey = function(url, frameId) { @@ -252,7 +327,7 @@ frameId: details.frameId }; var pageNetworkTrafficController = this; - chrome.webNavigation.getFrame(getFrameDetails, function(frameDetails) { + getFrame(getFrameDetails, function(frameDetails) { if ( frameDetails && frameDetails.url ) { pageNetworkTrafficController._onHeadersReceived(details, frameDetails); } @@ -372,7 +447,7 @@ frameId: responseDetails.frameId }; var pageNetworkTrafficController = this; - chrome.webNavigation.getFrame(getFrameDetails, function(frameDetails) { + getFrame(getFrameDetails, function(frameDetails) { if ( frameDetails && frameDetails.url ) { pageNetworkTrafficController.processResponse(responseDetails, frameDetails); } @@ -518,7 +593,7 @@ var _this = this, origPageUrl, msgAssetReq; msgAssetReq = this.msgsBeingSent[msgKey]; - chrome.tabs.get(this.tabId, function(tab) {origPageUrl = tab.url;}); + browserProxy.tabs.get(this.tabId, function(tab) {origPageUrl = tab.url;}); setTimeout(function() { var rawRequests = []; @@ -551,54 +626,159 @@ } }; - chrome.webRequest.onBeforeRequest.addListener(function(details) { + function onBeforeRequestListener(details) { globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRequest); - }, {urls: ['http://*/*', 'https://*/*']}, []); + } - chrome.webRequest.onSendHeaders.addListener(function(details) { + function onSendHeadersListener(details) { globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onSendHeaders); - }, {urls: ['http://*/*', 'https://*/*']}, ['requestHeaders']); + } - chrome.webRequest.onHeadersReceived.addListener(function(details) { + function onHeadersReceivedListener(details) { globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onHeadersReceived); - }, {urls: ['http://*/*', 'https://*/*']}, ['responseHeaders']); + } - chrome.webRequest.onBeforeRedirect.addListener(function(details) { + function onBeforeRedirectListener(details) { globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRedirect); - }, {urls: ['http://*/*', 'https://*/*']}, []); + } - chrome.webRequest.onResponseStarted.addListener(function(details) { + function onResponseStartedListener(details) { globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onResponseStarted); - }, {urls: ['http://*/*', 'https://*/*']}, ['responseHeaders']); - - chrome.webNavigation.onBeforeNavigate.addListener(function(details) { - if ( details.frameId === 0 ) { - globalPageContainer.onNewNavigation(details); - } - }, {}); + } - chrome.webNavigation.onCommitted.addListener(function(details) { + function onCommittedListener(details) { if ( details.frameId === 0 ) { globalPageContainer.onNavigationCommitted(details); } - }); + } - chrome.webNavigation.onCompleted.addListener(function(details) { + function onCompletedListener(details) { if ( details.frameId === 0 ) { globalPageContainer.onNavigationCompleted(details); } - }); + } - chrome.tabs.onRemoved.addListener(function(tabId, closeInfo) { + function onRemovedListener(tabId, closeInfo) { globalPageContainer.onTabClose(tabId, closeInfo); - }); + } - chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { + function onMessageListener(message, sender, sendResponse) { if ( message.event === 'new-ad' && message.data.event === 'ad' ) { var tabId = sender.tab.id; if ( tabId ) { globalPageContainer.onDisplayAdFound(tabId); } } + } + + function registerListeners() { + + browserProxy.webRequest.onBeforeRequest.addListener( + onBeforeRequestListener, + {urls: ['http://*/*', 'https://*/*']}, + [] + ); + + browserProxy.webRequest.onSendHeaders.addListener( + onSendHeadersListener, + {urls: ['http://*/*', 'https://*/*']}, + ['requestHeaders'] + ); + + browserProxy.webRequest.onHeadersReceived.addListener( + onHeadersReceivedListener, + {urls: ['http://*/*', 'https://*/*']}, + ['responseHeaders'] + ); + + browserProxy.webRequest.onBeforeRedirect.addListener( + onBeforeRedirectListener, + {urls: ['http://*/*', 'https://*/*']}, + [] + ); + + browserProxy.webRequest.onResponseStarted.addListener( + onResponseStartedListener, + {urls: ['http://*/*', 'https://*/*']}, + ['responseHeaders'] + ); + + browserProxy.webNavigation.onCommitted.addListener(onCommittedListener); + browserProxy.webNavigation.onCompleted.addListener(onCompletedListener); + browserProxy.tabs.onRemoved.addListener(onRemovedListener); + browserProxy.runtime.onMessage.addListener(onMessageListener); + + areListenersRegistered = true; + } + + function unregisterListeners() { + + browserProxy.webRequest.onBeforeRequest.removeListener( + onBeforeRequestListener + ); + + browserProxy.webRequest.onSendHeaders.removeListener( + onSendHeadersListener + ); + + browserProxy.webRequest.onHeadersReceived.removeListener( + onHeadersReceivedListener + ); + + browserProxy.webRequest.onBeforeRedirect.removeListener( + onBeforeRedirectListener + ); + + browserProxy.webRequest.onResponseStarted.removeListener( + onResponseStartedListener + ); + + browserProxy.webNavigation.onCommitted.removeListener(onCommittedListener); + browserProxy.webNavigation.onCompleted.removeListener(onCompletedListener); + browserProxy.tabs.onRemoved.removeListener(onRemovedListener); + browserProxy.runtime.onMessage.removeListener(onMessageListener); + + areListenersRegistered = false; + } + + function areRequiredBrowserApisAvailable() { + return requiredBrowserApis.every(function(api) { + return typeof api !== 'undefined'; + }); + } + + if ( areRequiredBrowserApisAvailable() ) { + ifBrowserValid( + function() { + browserProxy.webNavigation.onBeforeNavigate.addListener( + function(details) { + if ( details.frameId === 0 ) { + globalPageContainer.onNewNavigation(details); + } + }, + { + url: [{urlMatches: 'http://*/*'}, {urlMatches: 'https://*/*'}] + } + ); + }, function() { + + } + ); + } + + browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) { + if ( request === 'is_browser_valid' ) { + ifBrowserValid( + sendResponse({'browser_valid': true}), + sendResponse({'browser_valid': false}) + ); + } }); + + browserProxy.runtime.onMessage.addListener(function(request, sender, sendResponse) { + if ( request === 'is_tracking_enabled' ) { + sendResponse({'tracking_enabled': isTrackingEnabled()}); + } + }); + })();