@ -1,7 +0,0 @@
|
|||||||
apps.json
|
|
||||||
images/icons/converted/*.png
|
|
||||||
images/icons/*.png
|
|
||||||
images/icons/*.svg
|
|
||||||
js/wappalyzer.js
|
|
||||||
js/iframe.js
|
|
||||||
js/network.js
|
|
@ -1,60 +0,0 @@
|
|||||||
{
|
|
||||||
"github": { "message": "Fork Wappalyzer on GitHub!" },
|
|
||||||
"twitter": { "message": "Follow Wappalyzer on Twitter" },
|
|
||||||
"website": { "message": "Go to wappalyzer.com" },
|
|
||||||
"options": { "message": "Wappalyzer Options" },
|
|
||||||
"optionsSave": { "message": "Save options" },
|
|
||||||
"optionsSaved": { "message": "Saved" },
|
|
||||||
"optionUpgradeMessage": { "message": "Tell me about upgrades" },
|
|
||||||
"optionTracking": { "message": "Anonymously send reports on detected applications to wappalyzer.com for research" },
|
|
||||||
"nothingToDo": { "message": "Nothing to do here." },
|
|
||||||
"noAppsDetected": { "message": "No applications detected." },
|
|
||||||
"categoryName1": { "message": "CMS" },
|
|
||||||
"categoryName2": { "message": "Message Board" },
|
|
||||||
"categoryName3": { "message": "Database Manager" },
|
|
||||||
"categoryName4": { "message": "Documentation Tool" },
|
|
||||||
"categoryName5": { "message": "Widget" },
|
|
||||||
"categoryName10": { "message": "Analytics" },
|
|
||||||
"categoryName11": { "message": "Blog" },
|
|
||||||
"categoryName12": { "message": "JavaScript Framework" },
|
|
||||||
"categoryName13": { "message": "Issue Tracker" },
|
|
||||||
"categoryName14": { "message": "Video Player" },
|
|
||||||
"categoryName15": { "message": "Comment System" },
|
|
||||||
"categoryName16": { "message": "Captcha" },
|
|
||||||
"categoryName17": { "message": "Font Script" },
|
|
||||||
"categoryName18": { "message": "Web Framework" },
|
|
||||||
"categoryName19": { "message": "Miscellaneous" },
|
|
||||||
"categoryName20": { "message": "Editor" },
|
|
||||||
"categoryName21": { "message": "LMS" },
|
|
||||||
"categoryName22": { "message": "Web Server" },
|
|
||||||
"categoryName23": { "message": "Cache Tool" },
|
|
||||||
"categoryName24": { "message": "Rich Text Editor" },
|
|
||||||
"categoryName25": { "message": "JavaScript Graphics" },
|
|
||||||
"categoryName26": { "message": "Mobile Framework" },
|
|
||||||
"categoryName27": { "message": "Programming Language" },
|
|
||||||
"categoryName28": { "message": "Operating System" },
|
|
||||||
"categoryName29": { "message": "Search Engine" },
|
|
||||||
"categoryName30": { "message": "Web Mail" },
|
|
||||||
"categoryName31": { "message": "CDN" },
|
|
||||||
"categoryName32": { "message": "Marketing Automation" },
|
|
||||||
"categoryName33": { "message": "Web Server Extension" },
|
|
||||||
"categoryName34": { "message": "Database" },
|
|
||||||
"categoryName35": { "message": "Map" },
|
|
||||||
"categoryName36": { "message": "Advertising Network" },
|
|
||||||
"categoryName37": { "message": "Network Service" },
|
|
||||||
"categoryName38": { "message": "Media Server" },
|
|
||||||
"categoryName39": { "message": "Webcam" },
|
|
||||||
"categoryName40": { "message": "Printer" },
|
|
||||||
"categoryName41": { "message": "Payment Processor" },
|
|
||||||
"categoryName42": { "message": "Tag Manager" },
|
|
||||||
"categoryName43": { "message": "Paywall" },
|
|
||||||
"categoryName44": { "message": "Build/CI System" },
|
|
||||||
"categoryName45": { "message": "SCADA System" },
|
|
||||||
"categoryName46": { "message": "Remote Access" },
|
|
||||||
"categoryName47": { "message": "Development Tool" },
|
|
||||||
"categoryName48": { "message": "Network Storage" },
|
|
||||||
"categoryName49": { "message": "Feed Readers" },
|
|
||||||
"categoryName50": { "message": "Document Management Systems" },
|
|
||||||
"categoryName51": { "message": "Landing Page Builder" },
|
|
||||||
"categoryName52": { "message": "Live Chat" }
|
|
||||||
}
|
|
@ -1,64 +0,0 @@
|
|||||||
{
|
|
||||||
"github": { "message": "¡Forkea Wappalyzer en GitHub!" },
|
|
||||||
"twitter": { "message": "Sigue Wappalyzer en Twitter" },
|
|
||||||
"website": { "message": "Ir a wappalyzer.com" },
|
|
||||||
"options": { "message": "Opciones de Wappalyzer" },
|
|
||||||
"optionsSave": { "message": "Guardar opciones" },
|
|
||||||
"optionsSaved": { "message": "Guardado" },
|
|
||||||
"optionUpgradeMessage": { "message": "Indicarme actualizaciones" },
|
|
||||||
"optionTracking": { "message": "Enviar informes anónimos sobre las aplicaciones detectadas a wappalyzer.com para análisis" },
|
|
||||||
"nothingToDo": { "message": "Nada que hacer aquí." },
|
|
||||||
"noAppsDetected": { "message": "Aplicaciones no detectadas." },
|
|
||||||
"categoryName1": { "message": "Gestor de Contenido" },
|
|
||||||
"categoryName2": { "message": "Foro" },
|
|
||||||
"categoryName3": { "message": "Gestor de Bases de Datos" },
|
|
||||||
"categoryName4": { "message": "Herramienta de Documentación" },
|
|
||||||
"categoryName5": { "message": "Widget" },
|
|
||||||
"categoryName6": { "message": "Tienda Web" },
|
|
||||||
"categoryName7": { "message": "Galería fotográfica" },
|
|
||||||
"categoryName8": { "message": "Wiki" },
|
|
||||||
"categoryName9": { "message": "Panel de Hosting" },
|
|
||||||
"categoryName10": { "message": "Analítica" },
|
|
||||||
"categoryName11": { "message": "Blog" },
|
|
||||||
"categoryName12": { "message": "Framework JavaScript" },
|
|
||||||
"categoryName13": { "message": "Gestor de Incidencias" },
|
|
||||||
"categoryName14": { "message": "Reproductor de Vídeo" },
|
|
||||||
"categoryName15": { "message": "Sistema de Comentarios" },
|
|
||||||
"categoryName16": { "message": "Captcha" },
|
|
||||||
"categoryName17": { "message": "Tipografía" },
|
|
||||||
"categoryName18": { "message": "Framework Web" },
|
|
||||||
"categoryName19": { "message": "Miscelánea" },
|
|
||||||
"categoryName20": { "message": "Editor" },
|
|
||||||
"categoryName21": { "message": "LMS" },
|
|
||||||
"categoryName22": { "message": "Servidor Web" },
|
|
||||||
"categoryName23": { "message": "Herramienta de Cache" },
|
|
||||||
"categoryName24": { "message": "Editor de Texto Enriquecido" },
|
|
||||||
"categoryName25": { "message": "Gráficos JavaScript" },
|
|
||||||
"categoryName26": { "message": "Framework Móvil" },
|
|
||||||
"categoryName27": { "message": "Lenguaje de programación" },
|
|
||||||
"categoryName28": { "message": "Sistema Operativo" },
|
|
||||||
"categoryName29": { "message": "Motor de Búsqueda" },
|
|
||||||
"categoryName30": { "message": "Correo Web" },
|
|
||||||
"categoryName31": { "message": "CDN" },
|
|
||||||
"categoryName32": { "message": "Automatización de Marketing" },
|
|
||||||
"categoryName33": { "message": "Extensión de Servidor Web" },
|
|
||||||
"categoryName34": { "message": "Base de Datos" },
|
|
||||||
"categoryName35": { "message": "Mapa" },
|
|
||||||
"categoryName36": { "message": "Red de Publicidad" },
|
|
||||||
"categoryName37": { "message": "Network Sevice" },
|
|
||||||
"categoryName38": { "message": "Media Server" },
|
|
||||||
"categoryName39": { "message": "Webcam" },
|
|
||||||
"categoryName40": { "message": "Printer" },
|
|
||||||
"categoryName41": { "message": "Payment Processor" },
|
|
||||||
"categoryName42": { "message": "Tag Manager" },
|
|
||||||
"categoryName43": { "message": "Paywall" },
|
|
||||||
"categoryName44": { "message": "Build/CI System" },
|
|
||||||
"categoryName45": { "message": "SCADA System" },
|
|
||||||
"categoryName46": { "message": "Remote Access" },
|
|
||||||
"categoryName47": { "message": "Development Tool" },
|
|
||||||
"categoryName48": { "message": "Network Storage" },
|
|
||||||
"categoryName49": { "message": "Feed Readers" },
|
|
||||||
"categoryName50": { "message": "Document Management Systems" },
|
|
||||||
"categoryName51": { "message": "Landing Page Builder" },
|
|
||||||
"categoryName52": { "message": "Live Chat" }
|
|
||||||
}
|
|
@ -1,65 +0,0 @@
|
|||||||
{
|
|
||||||
"github": { "message": "Fork Wappalyzer su GitHub!" },
|
|
||||||
"twitter": { "message": "Follow Wappalyzer su Twitter" },
|
|
||||||
"website": { "message": "Vai su wappalyzer.com" },
|
|
||||||
"options": { "message": "Opzioni Wappalyzer" },
|
|
||||||
"optionsSave": { "message": "Salva opzioni" },
|
|
||||||
"optionsSaved": { "message": "Salvato" },
|
|
||||||
"optionUpgradeMessage": { "message": "Parlami dell'upgrade" },
|
|
||||||
"optionTracking": { "message": "Inviare anonimamente un report sulle applicazioni rilevate a wappalyzer.com per l'analisi" },
|
|
||||||
"nothingToDo": { "message": "Niente da fare qui." },
|
|
||||||
"noAppsDetected": { "message": "Nessuna applicazione rilevata." },
|
|
||||||
"categoryName1": { "message": "CMS" },
|
|
||||||
"categoryName2": { "message": "Forum" },
|
|
||||||
"categoryName3": { "message": "Gestore di Database" },
|
|
||||||
"categoryName4": { "message": "Strumento di documentazione" },
|
|
||||||
"categoryName5": { "message": "Widget" },
|
|
||||||
"categoryName6": { "message": "eCommerce" },
|
|
||||||
"categoryName7": { "message": "Galleria fotografica" },
|
|
||||||
"categoryName8": { "message": "Wiki" },
|
|
||||||
"categoryName9": { "message": "Pannello Hosting" },
|
|
||||||
"categoryName10": { "message": "Analytics" },
|
|
||||||
"categoryName11": { "message": "Blog" },
|
|
||||||
"categoryName12": { "message": "Framework JavaScript" },
|
|
||||||
"categoryName13": { "message": "Issue Tracker" },
|
|
||||||
"categoryName14": { "message": "Player Video" },
|
|
||||||
"categoryName15": { "message": "Sistema di commenti" },
|
|
||||||
"categoryName16": { "message": "Captcha" },
|
|
||||||
"categoryName17": { "message": "Font Script" },
|
|
||||||
"categoryName18": { "message": "Framework Web" },
|
|
||||||
"categoryName19": { "message": "Miscellanea" },
|
|
||||||
"categoryName20": { "message": "Editor" },
|
|
||||||
"categoryName21": { "message": "LMS" },
|
|
||||||
"categoryName22": { "message": "Web Server" },
|
|
||||||
"categoryName23": { "message": "Cache Tool" },
|
|
||||||
"categoryName24": { "message": "Editor di Testo Ricco" },
|
|
||||||
"categoryName25": { "message": "JavaScript Graphics" },
|
|
||||||
"categoryName26": { "message": "Framework Mobile" },
|
|
||||||
"categoryName27": { "message": "Linguaggio di programmazione" },
|
|
||||||
"categoryName28": { "message": "Sistema Operativo" },
|
|
||||||
"categoryName29": { "message": "Motore di Ricerca" },
|
|
||||||
"categoryName30": { "message": "Web Mail" },
|
|
||||||
"categoryName31": { "message": "CDN" },
|
|
||||||
"categoryName32": { "message": "Marketing Automation" },
|
|
||||||
"categoryName33": { "message": "Estensione Web Server" },
|
|
||||||
"categoryName34": { "message": "Database" },
|
|
||||||
"categoryName35": { "message": "Mappa" },
|
|
||||||
"categoryName36": { "message": "Network Pubblicitario" },
|
|
||||||
"categoryName37": { "message": "Network Service" },
|
|
||||||
"categoryName38": { "message": "Media Server" },
|
|
||||||
"categoryName39": { "message": "Webcam" },
|
|
||||||
"categoryName40": { "message": "Stampante" },
|
|
||||||
"categoryName41": { "message": "Payment Processor" },
|
|
||||||
"categoryName42": { "message": "Tag Manager" },
|
|
||||||
"categoryName43": { "message": "Paywall" },
|
|
||||||
"categoryName44": { "message": "Sistema Build/CI" },
|
|
||||||
"categoryName45": { "message": "SCADA System" },
|
|
||||||
"categoryName46": { "message": "Accesso" },
|
|
||||||
"categoryName47": { "message": "Strumenti di Sviluppo" },
|
|
||||||
"categoryName48": { "message": "Network Storage" },
|
|
||||||
"categoryName49": { "message": "Lettore di Feed" },
|
|
||||||
"categoryName50": { "message": "Sistema di Gestione Documenti" },
|
|
||||||
"categoryName51": { "message": "Landing Page Builder" },
|
|
||||||
"categoryName52": { "message": "Live Chat" }
|
|
||||||
}
|
|
||||||
|
|
@ -1,60 +0,0 @@
|
|||||||
{
|
|
||||||
"github": { "message": "Fork-uiește Wappalyzer pe GitHub!" },
|
|
||||||
"twitter": { "message": "Urmărește Wappalyzer pe Twitter" },
|
|
||||||
"website": { "message": "Mergi la wappalyzer.com" },
|
|
||||||
"options": { "message": "Opțiuni Wappalyzer" },
|
|
||||||
"optionsSave": { "message": "Salvează opțiuni" },
|
|
||||||
"optionsSaved": { "message": "Salvat" },
|
|
||||||
"optionUpgradeMessage": { "message": "Anunță-mă dacă sunt actualizări" },
|
|
||||||
"optionTracking": { "message": "Trimite rapoarte anonime despre aplicațiile detectate către wappalyzer.com pentru cercetare" },
|
|
||||||
"nothingToDo": { "message": "Nimic de făcut pe pagina curentă." },
|
|
||||||
"noAppsDetected": { "message": "Nici o aplicație detectată." },
|
|
||||||
"categoryName1": { "message": "CMS" },
|
|
||||||
"categoryName2": { "message": "Forum de discuții" },
|
|
||||||
"categoryName3": { "message": "Manager baze de date" },
|
|
||||||
"categoryName4": { "message": "Unealtă pentru documentare" },
|
|
||||||
"categoryName5": { "message": "Widget" },
|
|
||||||
"categoryName10": { "message": "Analiză trafic web" },
|
|
||||||
"categoryName11": { "message": "Blog" },
|
|
||||||
"categoryName12": { "message": "Framework JavaScript" },
|
|
||||||
"categoryName13": { "message": "Tracker probleme" },
|
|
||||||
"categoryName14": { "message": "Player Video" },
|
|
||||||
"categoryName15": { "message": "Sistem de comentarii" },
|
|
||||||
"categoryName16": { "message": "Verificare Captcha" },
|
|
||||||
"categoryName17": { "message": "Script pentru fonturi" },
|
|
||||||
"categoryName18": { "message": "Framework Web" },
|
|
||||||
"categoryName19": { "message": "Divers" },
|
|
||||||
"categoryName20": { "message": "Editor" },
|
|
||||||
"categoryName21": { "message": "LMS" },
|
|
||||||
"categoryName22": { "message": "Server Web" },
|
|
||||||
"categoryName23": { "message": "Unealtă Cache" },
|
|
||||||
"categoryName24": { "message": "Editor Texte Rich" },
|
|
||||||
"categoryName25": { "message": "Grafică JavaScript" },
|
|
||||||
"categoryName26": { "message": "Framework Mobile" },
|
|
||||||
"categoryName27": { "message": "Limbaj de programare" },
|
|
||||||
"categoryName28": { "message": "Sistem de operare" },
|
|
||||||
"categoryName29": { "message": "Motor de căutare" },
|
|
||||||
"categoryName30": { "message": "Poștă electronică" },
|
|
||||||
"categoryName31": { "message": "CDN" },
|
|
||||||
"categoryName32": { "message": "Automatizare marketing" },
|
|
||||||
"categoryName33": { "message": "Extensie server web" },
|
|
||||||
"categoryName34": { "message": "Bază de date" },
|
|
||||||
"categoryName35": { "message": "Hartă" },
|
|
||||||
"categoryName36": { "message": "Rețea de advertising" },
|
|
||||||
"categoryName37": { "message": "Serviciu rețea" },
|
|
||||||
"categoryName38": { "message": "Server Media" },
|
|
||||||
"categoryName39": { "message": "Webcam" },
|
|
||||||
"categoryName40": { "message": "Imprimantă" },
|
|
||||||
"categoryName41": { "message": "Sistem de plată" },
|
|
||||||
"categoryName42": { "message": "Manager cuvinte cheie" },
|
|
||||||
"categoryName43": { "message": "Paywall" },
|
|
||||||
"categoryName44": { "message": "Build/CI System" },
|
|
||||||
"categoryName45": { "message": "SCADA System" },
|
|
||||||
"categoryName46": { "message": "Remote Access" },
|
|
||||||
"categoryName47": { "message": "Development Tool" },
|
|
||||||
"categoryName48": { "message": "Network Storage" },
|
|
||||||
"categoryName49": { "message": "Feed Readers" },
|
|
||||||
"categoryName50": { "message": "Document Management Systems" },
|
|
||||||
"categoryName51": { "message": "Landing Page Builder" },
|
|
||||||
"categoryName52": { "message": "Live Chat" }
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Background</title>
|
|
||||||
|
|
||||||
<script src="js/ga.js"></script>
|
|
||||||
<script src="js/wappalyzer.js"></script>
|
|
||||||
<script src="js/defaults.js"></script>
|
|
||||||
<script src="js/driver.js"></script>
|
|
||||||
<script src="js/network.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,65 +0,0 @@
|
|||||||
body {
|
|
||||||
color: #303942;
|
|
||||||
cursor: default;
|
|
||||||
font-family: 'DejaVu Sans', Arial, sans-serif; font-size: 75%;
|
|
||||||
margin: 0 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
line-height: 1.8em;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1, h2, h3 {
|
|
||||||
font-weight: normal;
|
|
||||||
line-height: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
border-bottom: 1px solid #eee;
|
|
||||||
font-size: 1.5em;
|
|
||||||
margin: 0;
|
|
||||||
padding: 21px 0 13px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
font-size: 1.3em;
|
|
||||||
margin-bottom: 0.4em;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
color: black;
|
|
||||||
font-size: 1.2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: rgb(17, 85, 204);
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:active {
|
|
||||||
color: rgb(5, 37, 119);
|
|
||||||
}
|
|
||||||
|
|
||||||
#options-saved {
|
|
||||||
display: none;
|
|
||||||
-webkit-animation: fadeout 2s;
|
|
||||||
}
|
|
||||||
|
|
||||||
#about {
|
|
||||||
border-top: 1px solid #eee;
|
|
||||||
margin-top: 21px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#about img {
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
#about button {
|
|
||||||
line-height: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
@-webkit-keyframes fadeout {
|
|
||||||
from { opacity: 1; }
|
|
||||||
to { opacity: 0; }
|
|
||||||
}
|
|
@ -1,93 +0,0 @@
|
|||||||
body {
|
|
||||||
background: #fff;
|
|
||||||
color: #000;
|
|
||||||
font-family: Helvetica, Arial, sans-serif;
|
|
||||||
font-size: 13px;
|
|
||||||
line-height: 16px;
|
|
||||||
margin: 0;
|
|
||||||
min-width: 200px;
|
|
||||||
padding: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:focus {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
display: inline-block;
|
|
||||||
height: 16px;
|
|
||||||
margin-right: 8px;
|
|
||||||
vertical-align: top;
|
|
||||||
width: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detected-app {
|
|
||||||
padding: 7px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detected-app:first-child {
|
|
||||||
padding-top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detected-app:last-child {
|
|
||||||
border: none;
|
|
||||||
padding-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detected-app a {
|
|
||||||
color: #000;
|
|
||||||
display: block;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detected-app a .label .name {
|
|
||||||
border-bottom: 1px dotted #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detected-app a:hover .label .name {
|
|
||||||
border-bottom: 1px solid #333;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detected-app a .category .name {
|
|
||||||
border-bottom: 1px solid transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detected-app a:hover .category .name {
|
|
||||||
border-bottom: 1px solid #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.label {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.category {
|
|
||||||
color: #999;
|
|
||||||
display: block;
|
|
||||||
margin: 5px 0 0 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty {
|
|
||||||
color: #999;
|
|
||||||
font-style: italic;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#footer {
|
|
||||||
border-top: 1px solid #ccc;
|
|
||||||
margin-top: 17px;
|
|
||||||
overflow: hidden;
|
|
||||||
padding-top: 11px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#footer a {
|
|
||||||
color: #999;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#footer a:hover {
|
|
||||||
color: #333;
|
|
||||||
}
|
|
||||||
|
|
||||||
#options {
|
|
||||||
float: right;
|
|
||||||
}
|
|
@ -1,298 +0,0 @@
|
|||||||
/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
||||||
* Use of this source code is governed by a BSD-style license that can be
|
|
||||||
* found in the LICENSE file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* This file defines styles for form controls. The order of rule blocks is
|
|
||||||
* important as there are some rules with equal specificity that rely on order
|
|
||||||
* as a tiebreaker. These are marked with OVERRIDE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Default state **************************************************************/
|
|
||||||
|
|
||||||
button:not(.custom-appearance):not(.link-button),
|
|
||||||
input[type='button']:not(.custom-appearance):not(.link-button),
|
|
||||||
input[type='submit']:not(.custom-appearance):not(.link-button),
|
|
||||||
select,
|
|
||||||
input[type='checkbox'],
|
|
||||||
input[type='radio'] {
|
|
||||||
-webkit-appearance: none;
|
|
||||||
-webkit-user-select: none;
|
|
||||||
background-image: -webkit-linear-gradient(#ededed, #ededed 38%, #dedede);
|
|
||||||
border: 1px solid rgba(0, 0, 0, 0.25);
|
|
||||||
border-radius: 2px;
|
|
||||||
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08),
|
|
||||||
inset 0 1px 2px rgba(255, 255, 255, 0.75);
|
|
||||||
color: #444;
|
|
||||||
font: inherit;
|
|
||||||
margin: 0 1px 0 0;
|
|
||||||
text-shadow: 0 1px 0 rgb(240, 240, 240);
|
|
||||||
}
|
|
||||||
|
|
||||||
button:not(.custom-appearance):not(.link-button),
|
|
||||||
input[type='button']:not(.custom-appearance):not(.link-button),
|
|
||||||
input[type='submit']:not(.custom-appearance):not(.link-button),
|
|
||||||
select {
|
|
||||||
min-height: 2em;
|
|
||||||
min-width: 4em;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
button:not(.custom-appearance):not(.link-button),
|
|
||||||
input[type='button']:not(.custom-appearance):not(.link-button),
|
|
||||||
input[type='submit']:not(.custom-appearance):not(.link-button) {
|
|
||||||
-webkit-padding-end: 10px;
|
|
||||||
-webkit-padding-start: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
select {
|
|
||||||
-webkit-appearance: none;
|
|
||||||
-webkit-padding-end: 20px;
|
|
||||||
-webkit-padding-start: 6px;
|
|
||||||
/* OVERRIDE */
|
|
||||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAYAAAAbQcSUAAAAWklEQVQokWNgoAOIAuI0PDiKaJMSgYCZmfkbkPkfHYPEQfJEG/b//3+FBQsWLGRjY/uJbBCIDxIHyRNtGDYDyTYI3UA+Pr4vFBmEbODbt2+bKDYIyUBWYtQBAIRzRP/XKJ//AAAAAElFTkSuQmCC"),
|
|
||||||
-webkit-linear-gradient(#ededed, #ededed 38%, #dedede);
|
|
||||||
background-position: right center;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
html[dir='rtl'] select {
|
|
||||||
background-position: center left;
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type='checkbox'] {
|
|
||||||
bottom: 2px;
|
|
||||||
height: 13px;
|
|
||||||
position: relative;
|
|
||||||
vertical-align: middle;
|
|
||||||
width: 13px;
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type='radio'] {
|
|
||||||
/* OVERRIDE */
|
|
||||||
border-radius: 100%;
|
|
||||||
bottom: 3px;
|
|
||||||
height: 15px;
|
|
||||||
position: relative;
|
|
||||||
vertical-align: middle;
|
|
||||||
width: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO(estade): add more types here? */
|
|
||||||
input[type='password'],
|
|
||||||
input[type='search'],
|
|
||||||
input[type='text'],
|
|
||||||
input[type='url'],
|
|
||||||
input:not([type]) {
|
|
||||||
border: 1px solid #bfbfbf;
|
|
||||||
border-radius: 2px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
color: #444;
|
|
||||||
font: inherit;
|
|
||||||
margin: 0;
|
|
||||||
/* Use min-height to accommodate addditional padding for touch as needed. */
|
|
||||||
min-height: 2em;
|
|
||||||
padding: 3px;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type='search'] {
|
|
||||||
-webkit-appearance: textfield;
|
|
||||||
/* NOTE: Keep a relatively high min-width for this so we don't obscure the end
|
|
||||||
* of the default text in relatively spacious languages (i.e. German). */
|
|
||||||
min-width: 160px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Checked ********************************************************************/
|
|
||||||
|
|
||||||
input[type='checkbox']:checked::before {
|
|
||||||
-webkit-user-select: none;
|
|
||||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wDBhYcG79aGIsAAACbSURBVBjTjdFBCkFhFAXgj4fp24PBy0SZ2ICRXRgYGb2xlKzBSEo2YgsiKWVoZgFKMjD5X/2Ux6lb99bpnNO5lKMR5i8MsEQHkhJiEzlS9HCqfiFWMUIt3AfsC3KKLCL30Qr7HfM4Ro4h6rhiEqmusIMKuphGqo+ogSPGcbYLzh91vdkXSHDDBk+0gxussS3rNcMCs+D6E18/9gLPPhbDshfzLgAAAABJRU5ErkJggg==");
|
|
||||||
background-size: 100% 100%;
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
html[dir='rtl'] input[type='checkbox']:checked::before {
|
|
||||||
-webkit-transform: scaleX(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type='radio']:checked::before {
|
|
||||||
background-color: #666;
|
|
||||||
border-radius: 100%;
|
|
||||||
bottom: 25%;
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
left: 25%;
|
|
||||||
position: absolute;
|
|
||||||
right: 25%;
|
|
||||||
top: 25%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hover **********************************************************************/
|
|
||||||
|
|
||||||
button:not(.custom-appearance):not(.link-button):enabled:hover,
|
|
||||||
input[type='button']:not(.custom-appearance):not(.link-button):enabled:hover,
|
|
||||||
input[type='submit']:not(.custom-appearance):not(.link-button):enabled:hover,
|
|
||||||
select:enabled:hover,
|
|
||||||
input[type='checkbox']:enabled:hover,
|
|
||||||
input[type='radio']:enabled:hover {
|
|
||||||
background-image: -webkit-linear-gradient(#f0f0f0, #f0f0f0 38%, #e0e0e0);
|
|
||||||
border-color: rgba(0, 0, 0, 0.3);
|
|
||||||
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.12),
|
|
||||||
inset 0 1px 2px rgba(255, 255, 255, 0.95);
|
|
||||||
color: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
select:enabled:hover {
|
|
||||||
/* OVERRIDE */
|
|
||||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAYAAAAbQcSUAAAAWklEQVQokWNgoAOIAuI0PDiKaJMSgYCZmfkbkPkfHYPEQfJEG/b//3+FBQsWLGRjY/uJbBCIDxIHyRNtGDYDyTYI3UA+Pr4vFBmEbODbt2+bKDYIyUBWYtQBAIRzRP/XKJ//AAAAAElFTkSuQmCC"),
|
|
||||||
-webkit-linear-gradient(#f0f0f0, #f0f0f0 38%, #e0e0e0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Active *********************************************************************/
|
|
||||||
|
|
||||||
button:not(.custom-appearance):not(.link-button):enabled:active,
|
|
||||||
input[type='button']:not(.custom-appearance):not(.link-button):enabled:active,
|
|
||||||
input[type='submit']:not(.custom-appearance):not(.link-button):enabled:active,
|
|
||||||
select:enabled:active,
|
|
||||||
input[type='checkbox']:enabled:active,
|
|
||||||
input[type='radio']:enabled:active {
|
|
||||||
background-image: -webkit-linear-gradient(#e7e7e7, #e7e7e7 38%, #d7d7d7);
|
|
||||||
box-shadow: none;
|
|
||||||
text-shadow: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
select:enabled:active {
|
|
||||||
/* OVERRIDE */
|
|
||||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAYAAAAbQcSUAAAAWklEQVQokWNgoAOIAuI0PDiKaJMSgYCZmfkbkPkfHYPEQfJEG/b//3+FBQsWLGRjY/uJbBCIDxIHyRNtGDYDyTYI3UA+Pr4vFBmEbODbt2+bKDYIyUBWYtQBAIRzRP/XKJ//AAAAAElFTkSuQmCC"),
|
|
||||||
-webkit-linear-gradient(#e7e7e7, #e7e7e7 38%, #d7d7d7);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Disabled *******************************************************************/
|
|
||||||
|
|
||||||
button:not(.custom-appearance):not(.link-button):disabled,
|
|
||||||
input[type='button']:not(.custom-appearance):not(.link-button):disabled,
|
|
||||||
input[type='submit']:not(.custom-appearance):not(.link-button):disabled,
|
|
||||||
select:disabled {
|
|
||||||
background-image: -webkit-linear-gradient(#f1f1f1, #f1f1f1 38%, #e6e6e6);
|
|
||||||
border-color: rgba(80, 80, 80, 0.2);
|
|
||||||
box-shadow: 0 1px 0 rgba(80, 80, 80, 0.08),
|
|
||||||
inset 0 1px 2px rgba(255, 255, 255, 0.75);
|
|
||||||
color: #aaa;
|
|
||||||
}
|
|
||||||
|
|
||||||
select:disabled {
|
|
||||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAYAAAAbQcSUAAAAAXNSR0IArs4c6QAAAAd0SU1FB9sLAxYEBKriBmwAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAABLSURBVCiRY2CgA4gC4jQ8OIpokxKBoKGh4T8uDJIn2rD///8rLFiwYCE2g0DiIHkSfIndQLIMwmYgRQYhG/j27dsmig1CMpCVGHUAo8FcsHfxfXQAAAAASUVORK5CYII="),
|
|
||||||
-webkit-linear-gradient(#f1f1f1, #f1f1f1 38%, #e6e6e6);
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type='checkbox']:disabled,
|
|
||||||
input[type='radio']:disabled {
|
|
||||||
opacity: .75;
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type='password']:disabled,
|
|
||||||
input[type='search']:disabled,
|
|
||||||
input[type='text']:disabled,
|
|
||||||
input[type='url']:disabled,
|
|
||||||
input:not([type]):disabled {
|
|
||||||
color: #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Focus **********************************************************************/
|
|
||||||
|
|
||||||
button:not(.custom-appearance):not(.link-button):enabled:focus,
|
|
||||||
input[type='button']:not(.custom-appearance):enabled:focus,
|
|
||||||
input[type='checkbox']:enabled:focus,
|
|
||||||
input[type='password']:enabled:focus,
|
|
||||||
input[type='radio']:enabled:focus,
|
|
||||||
input[type='search']:enabled:focus,
|
|
||||||
input[type='submit']:not(.custom-appearance):enabled:focus,
|
|
||||||
input[type='text']:enabled:focus,
|
|
||||||
input[type='url']:enabled:focus,
|
|
||||||
input:not([type]):enabled:focus,
|
|
||||||
select:enabled:focus {
|
|
||||||
/* OVERRIDE */
|
|
||||||
-webkit-transition: border-color 200ms;
|
|
||||||
/* We use border color because it follows the border radius (unlike outline).
|
|
||||||
* This is particularly noticeable on mac. */
|
|
||||||
border-color: rgb(77, 144, 254);
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Link buttons ***************************************************************/
|
|
||||||
|
|
||||||
.link-button {
|
|
||||||
-webkit-box-shadow: none;
|
|
||||||
background: transparent none;
|
|
||||||
border: none;
|
|
||||||
color: rgb(17, 85, 204);
|
|
||||||
cursor: pointer;
|
|
||||||
/* Input elements have -webkit-small-control which can override the body font.
|
|
||||||
* Resolve this by using 'inherit'. */
|
|
||||||
font: inherit;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.link-button:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.link-button:active {
|
|
||||||
color: rgb(5, 37, 119);
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.link-button[disabled] {
|
|
||||||
color: #999;
|
|
||||||
cursor: default;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Checkbox/radio helpers ******************************************************
|
|
||||||
*
|
|
||||||
* .checkbox and .radio classes wrap labels. Checkboxes and radios should use
|
|
||||||
* these classes with the markup structure:
|
|
||||||
*
|
|
||||||
* <div class="checkbox">
|
|
||||||
* <label>
|
|
||||||
* <input type="checkbox"></input>
|
|
||||||
* <span>
|
|
||||||
* </label>
|
|
||||||
* </div>
|
|
||||||
*/
|
|
||||||
|
|
||||||
.checkbox,
|
|
||||||
.radio {
|
|
||||||
margin: 0.65em 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.checkbox label,
|
|
||||||
.radio label {
|
|
||||||
/* Don't expand horizontally: <http://crbug.com/112091>. */
|
|
||||||
display: -webkit-inline-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
.checkbox label input ~ span,
|
|
||||||
.radio label input ~ span {
|
|
||||||
-webkit-margin-start: 0.6em;
|
|
||||||
/* Make sure long spans wrap at the same horizontal position they start. */
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.checkbox label:hover,
|
|
||||||
.radio label:hover {
|
|
||||||
color: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
label > input[type=checkbox]:disabled ~ span,
|
|
||||||
label > input[type=radio]:disabled ~ span {
|
|
||||||
color: #999;
|
|
||||||
}
|
|
||||||
|
|
Before Width: | Height: | Size: 281 B |
Before Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 643 B |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 555 B |
Before Width: | Height: | Size: 373 B |
@ -1,63 +0,0 @@
|
|||||||
(function() {
|
|
||||||
var c = {
|
|
||||||
init: function() {
|
|
||||||
var html = document.documentElement.outerHTML;
|
|
||||||
|
|
||||||
c.log('init');
|
|
||||||
|
|
||||||
if ( html.length > 50000 ) {
|
|
||||||
html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
chrome.extension.sendRequest({ id: 'analyze', subject: { html: html } });
|
|
||||||
|
|
||||||
c.getEnvironmentVars();
|
|
||||||
},
|
|
||||||
|
|
||||||
log: function(message) {
|
|
||||||
chrome.extension.sendRequest({ id: 'log', message: '[ content.js ] ' + message });
|
|
||||||
},
|
|
||||||
|
|
||||||
getEnvironmentVars: function() {
|
|
||||||
var container, script;
|
|
||||||
|
|
||||||
c.log('getEnvironmentVars');
|
|
||||||
|
|
||||||
if ( typeof document.documentElement.innerHTML === 'undefined' ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
container = document.createElement('wappalyzerData');
|
|
||||||
|
|
||||||
container.setAttribute('id', 'wappalyzerData');
|
|
||||||
container.setAttribute('style', 'display: none');
|
|
||||||
|
|
||||||
script = document.createElement('script');
|
|
||||||
|
|
||||||
script.setAttribute('id', 'wappalyzerEnvDetection');
|
|
||||||
script.setAttribute('src', chrome.extension.getURL('js/inject.js'));
|
|
||||||
|
|
||||||
container.addEventListener('wappalyzerEvent', (function(event) {
|
|
||||||
var environmentVars = event.target.childNodes[0].nodeValue;
|
|
||||||
|
|
||||||
document.documentElement.removeChild(container);
|
|
||||||
document.documentElement.removeChild(script);
|
|
||||||
|
|
||||||
//c.log('getEnvironmentVars: ' + environmentVars);
|
|
||||||
|
|
||||||
environmentVars = environmentVars.split(' ').slice(0, 500);
|
|
||||||
|
|
||||||
chrome.extension.sendRequest({ id: 'analyze', subject: { env: environmentVars } });
|
|
||||||
}), true);
|
|
||||||
|
|
||||||
document.documentElement.appendChild(container);
|
|
||||||
document.documentElement.appendChild(script);
|
|
||||||
} catch(e) {
|
|
||||||
c.log('Error: ' + e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
c.init();
|
|
||||||
}());
|
|
@ -1,5 +0,0 @@
|
|||||||
var defaults = {
|
|
||||||
autoAnalyzeHeaders: 0,
|
|
||||||
upgradeMessage: 1,
|
|
||||||
tracking: 1
|
|
||||||
};
|
|
@ -1,301 +0,0 @@
|
|||||||
/**
|
|
||||||
* Chrome driver
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
if ( wappalyzer == null ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var w = wappalyzer,
|
|
||||||
firstRun = false,
|
|
||||||
upgraded = false,
|
|
||||||
tab,
|
|
||||||
tabCache = {},
|
|
||||||
headersCache = {};
|
|
||||||
|
|
||||||
w.driver = {
|
|
||||||
timeout: 1000,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Log messages to console
|
|
||||||
*/
|
|
||||||
log: function(args) {
|
|
||||||
console.log('[wappalyzer ' + args.type + '] ' + args.message);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize
|
|
||||||
*/
|
|
||||||
init: function() {
|
|
||||||
w.log('init');
|
|
||||||
|
|
||||||
// Load apps.json
|
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
|
|
||||||
xhr.open('GET', 'apps.json', true);
|
|
||||||
|
|
||||||
xhr.overrideMimeType('application/json');
|
|
||||||
|
|
||||||
xhr.onload = function() {
|
|
||||||
var json = JSON.parse(xhr.responseText);
|
|
||||||
|
|
||||||
w.categories = json.categories;
|
|
||||||
w.apps = json.apps;
|
|
||||||
};
|
|
||||||
|
|
||||||
xhr.send(null);
|
|
||||||
|
|
||||||
// Version check
|
|
||||||
try {
|
|
||||||
var version = chrome.app.getDetails().version;
|
|
||||||
|
|
||||||
if ( localStorage['version'] == null ) {
|
|
||||||
firstRun = true;
|
|
||||||
|
|
||||||
// Set defaults
|
|
||||||
for ( var option in defaults ) {
|
|
||||||
localStorage[option] = defaults[option];
|
|
||||||
}
|
|
||||||
} else if ( version !== localStorage['version'] && parseInt(localStorage['upgradeMessage'], 10) ) {
|
|
||||||
upgraded = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
localStorage['version'] = version;
|
|
||||||
} catch(e) { }
|
|
||||||
|
|
||||||
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
|
|
||||||
var
|
|
||||||
hostname,
|
|
||||||
a = document.createElement('a');
|
|
||||||
|
|
||||||
if ( typeof request.id != 'undefined' ) {
|
|
||||||
w.log('request: ' + request.id);
|
|
||||||
|
|
||||||
switch ( request.id ) {
|
|
||||||
case 'log':
|
|
||||||
w.log(request.message);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'analyze':
|
|
||||||
tab = sender.tab;
|
|
||||||
|
|
||||||
a.href = tab.url.replace(/#.*$/, '');
|
|
||||||
|
|
||||||
hostname = a.hostname;
|
|
||||||
|
|
||||||
if ( headersCache[a.href] !== undefined ) {
|
|
||||||
request.subject.headers = headersCache[a.href];
|
|
||||||
}
|
|
||||||
|
|
||||||
w.analyze(hostname, a.href, request.subject);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'ad_log':
|
|
||||||
w.adCache.push(request.subject);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'get_apps':
|
|
||||||
sendResponse({
|
|
||||||
tabCache: tabCache[request.tab.id],
|
|
||||||
apps: w.apps,
|
|
||||||
categories: w.categories
|
|
||||||
});
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
chrome.tabs.query({}, function(tabs) {
|
|
||||||
tabs.forEach(function(tab) {
|
|
||||||
if ( tab.url.match(/^https?:\/\//) ) {
|
|
||||||
chrome.tabs.executeScript(tab.id, { file: 'js/content.js' });
|
|
||||||
}
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
chrome.tabs.onRemoved.addListener(function(tabId) {
|
|
||||||
w.log('remove tab');
|
|
||||||
|
|
||||||
tabCache[tabId] = null;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Live intercept headers using webRequest API
|
|
||||||
chrome.webRequest.onCompleted.addListener(function(details) {
|
|
||||||
var responseHeaders = {};
|
|
||||||
|
|
||||||
if ( details.responseHeaders ) {
|
|
||||||
var uri = details.url.replace(/#.*$/, ''); // Remove hash
|
|
||||||
|
|
||||||
details.responseHeaders.forEach(function(header) {
|
|
||||||
responseHeaders[header.name.toLowerCase()] = header.value || '' + header.binaryValue;
|
|
||||||
});
|
|
||||||
|
|
||||||
if ( headersCache.length > 50 ) {
|
|
||||||
headersCache = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( /text\/html/.test(responseHeaders['content-type']) ) {
|
|
||||||
if ( headersCache[uri] === undefined ) {
|
|
||||||
headersCache[uri] = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( var header in responseHeaders ) {
|
|
||||||
headersCache[uri][header] = responseHeaders[header];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
w.log(JSON.stringify({ uri: uri, headers: responseHeaders }));
|
|
||||||
}
|
|
||||||
}, { urls: [ 'http://*/*', 'https://*/*' ], types: [ 'main_frame' ] }, [ 'responseHeaders' ]);
|
|
||||||
|
|
||||||
if ( firstRun ) {
|
|
||||||
w.driver.goToURL({ url: w.config.websiteURL + 'installed', medium: 'install' });
|
|
||||||
|
|
||||||
firstRun = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( upgraded ) {
|
|
||||||
w.driver.goToURL({ url: w.config.websiteURL + 'upgraded', medium: 'upgrade', background: true });
|
|
||||||
|
|
||||||
upgraded = false;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
goToURL: function(args) {
|
|
||||||
var url = args.url + ( typeof args.medium === 'undefined' ? '' : '?pk_campaign=chrome&pk_kwd=' + args.medium);
|
|
||||||
|
|
||||||
chrome.tabs.create({ url: url, active: args.background === undefined || !args.background });
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Display apps
|
|
||||||
*/
|
|
||||||
displayApps: function() {
|
|
||||||
var
|
|
||||||
url = tab.url.replace(/#.*$/, ''),
|
|
||||||
count = w.detected[url] ? Object.keys(w.detected[url]).length.toString() : '0';
|
|
||||||
|
|
||||||
if ( tabCache[tab.id] == null ) {
|
|
||||||
tabCache[tab.id] = {
|
|
||||||
count: 0,
|
|
||||||
appsDetected: []
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
tabCache[tab.id].count = count;
|
|
||||||
tabCache[tab.id].appsDetected = w.detected[url];
|
|
||||||
|
|
||||||
if ( count > 0 ) {
|
|
||||||
// Find the main application to display
|
|
||||||
var appName, found = false;
|
|
||||||
|
|
||||||
w.driver.categoryOrder.forEach(function(match) {
|
|
||||||
for ( appName in w.detected[url] ) {
|
|
||||||
w.apps[appName].cats.forEach(function(cat) {
|
|
||||||
var icon = w.apps[appName].icon;
|
|
||||||
|
|
||||||
if ( cat == match && !found ) {
|
|
||||||
if ( /\.svg$/i.test(icon) ) {
|
|
||||||
icon = 'converted/' + icon + '.png';
|
|
||||||
}
|
|
||||||
|
|
||||||
chrome.pageAction.setIcon({ tabId: tab.id, path: 'images/icons/' + icon });
|
|
||||||
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
chrome.pageAction.show(tab.id);
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Anonymously track detected applications for research purposes
|
|
||||||
*/
|
|
||||||
ping: function() {
|
|
||||||
if ( Object.keys(w.ping.hostnames).length && parseInt(localStorage['tracking'], 10) ) {
|
|
||||||
w.driver.post('http://ping.wappalyzer.com/v2/', w.ping);
|
|
||||||
|
|
||||||
w.log('w.driver.ping: ' + JSON.stringify(w.ping));
|
|
||||||
|
|
||||||
w.ping = { hostnames: {} };
|
|
||||||
|
|
||||||
w.driver.post('https://ad.wappalyzer.com/log/wp/', w.adCache);
|
|
||||||
|
|
||||||
w.adCache = [];
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Make POST request
|
|
||||||
*/
|
|
||||||
post: function(url, data) {
|
|
||||||
var xhr = new XMLHttpRequest();
|
|
||||||
|
|
||||||
xhr.open('POST', url, true);
|
|
||||||
|
|
||||||
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
|
|
||||||
|
|
||||||
xhr.onreadystatechange = function(e) {
|
|
||||||
if ( xhr.readyState == 4 ) {
|
|
||||||
w.log('w.driver.post: status ' + xhr.status + ' (' + url + ')');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
xhr.send('json=' + encodeURIComponent(JSON.stringify(data)));
|
|
||||||
},
|
|
||||||
|
|
||||||
categoryOrder: [ // Used to pick the main application
|
|
||||||
1, // CMS
|
|
||||||
11, // Blog
|
|
||||||
6, // Web Shop
|
|
||||||
2, // Message Board
|
|
||||||
51, // Landing Page Builder
|
|
||||||
8, // Wiki
|
|
||||||
13, // Issue Tracker
|
|
||||||
30, // Web Mail
|
|
||||||
18, // Web Framework
|
|
||||||
21, // LMS
|
|
||||||
7, // Photo Gallery
|
|
||||||
38, // Media Server
|
|
||||||
3, // Database Manager
|
|
||||||
34, // Database
|
|
||||||
4, // Documentation Tool
|
|
||||||
9, // Hosting Panel
|
|
||||||
29, // Search Engine
|
|
||||||
12, // JavaScript Framework
|
|
||||||
26, // Mobile Framework
|
|
||||||
25, // JavaScript Graphics
|
|
||||||
22, // Web Server
|
|
||||||
27, // Programming Language
|
|
||||||
28, // Operating System
|
|
||||||
15, // Comment System
|
|
||||||
20, // Editor
|
|
||||||
41, // Payment Processor
|
|
||||||
10, // Analytics
|
|
||||||
32, // Marketing Automation
|
|
||||||
31, // CDN
|
|
||||||
23, // Cache Tool
|
|
||||||
17, // Font Script
|
|
||||||
24, // Rich Text Editor
|
|
||||||
35, // Map
|
|
||||||
5, // Widget
|
|
||||||
14, // Video Player
|
|
||||||
16, // Captcha
|
|
||||||
33, // Web Server Extension
|
|
||||||
37, // Network Device
|
|
||||||
39, // Webcam
|
|
||||||
40, // Printer
|
|
||||||
36, // Advertising Network
|
|
||||||
42, // Tag Managers
|
|
||||||
43, // Paywalls
|
|
||||||
19 // Miscellaneous
|
|
||||||
]
|
|
||||||
};
|
|
||||||
|
|
||||||
w.init();
|
|
||||||
}());
|
|
@ -1,12 +0,0 @@
|
|||||||
document.addEventListener('DOMContentLoaded', function() {
|
|
||||||
var
|
|
||||||
i, value,
|
|
||||||
d = document,
|
|
||||||
nodes = d.getElementsByTagName('*');
|
|
||||||
|
|
||||||
for ( i = 0; i < nodes.length; i ++ ) {
|
|
||||||
if ( attr = nodes[i].dataset.i18n ) {
|
|
||||||
nodes[i].innerHTML = chrome.i18n.getMessage(attr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,15 +0,0 @@
|
|||||||
(function() {
|
|
||||||
try {
|
|
||||||
var i, environmentVars,
|
|
||||||
e = document.createEvent('Events');
|
|
||||||
|
|
||||||
e.initEvent('wappalyzerEvent', true, false);
|
|
||||||
|
|
||||||
for ( i in window ) {
|
|
||||||
environmentVars += i + ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
document.getElementById('wappalyzerData').appendChild(document.createComment(environmentVars));
|
|
||||||
document.getElementById('wappalyzerData').dispatchEvent(e);
|
|
||||||
} catch(e) { }
|
|
||||||
}());
|
|
@ -1,55 +0,0 @@
|
|||||||
document.addEventListener('DOMContentLoaded', function() {
|
|
||||||
var d = document;
|
|
||||||
|
|
||||||
var options = {
|
|
||||||
opts: defaults,
|
|
||||||
|
|
||||||
init: function() {
|
|
||||||
options.load();
|
|
||||||
|
|
||||||
d.getElementById('github' ).addEventListener('click', function() { window.open(wappalyzer.config.githubURL); });
|
|
||||||
d.getElementById('twitter' ).addEventListener('click', function() { window.open(wappalyzer.config.twitterURL); });
|
|
||||||
d.getElementById('wappalyzer').addEventListener('click', function() { window.open(wappalyzer.config.websiteURL + '?pk_campaign=chrome&pk_kwd=options'); });
|
|
||||||
|
|
||||||
d.getElementById('options-save').addEventListener('click', options.save);
|
|
||||||
},
|
|
||||||
|
|
||||||
load: function() {
|
|
||||||
for ( var option in options.opts ) {
|
|
||||||
if ( localStorage[option] ) {
|
|
||||||
options.opts[option] = localStorage[option];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( options.opts.autoAnalyzeHeaders === "0" || options.opts.autoAnalyzeHeaders === "1" ) {
|
|
||||||
//Remove old stored option from localStorage because it's no longer needed. This can be entirely removed in future versions
|
|
||||||
delete localStorage['autoAnalyzeHeaders'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( parseInt(options.opts.upgradeMessage) ) {
|
|
||||||
d.getElementById('option-upgrade-message').setAttribute('checked', 'checked');
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( parseInt(options.opts.tracking) ) {
|
|
||||||
d.getElementById('option-tracking').setAttribute('checked', 'checked');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
save: function() {
|
|
||||||
options.opts.upgradeMessage = d.getElementById('option-upgrade-message' ).checked ? 1 : 0;
|
|
||||||
options.opts.tracking = d.getElementById('option-tracking' ).checked ? 1 : 0;
|
|
||||||
|
|
||||||
for ( option in options.opts ) {
|
|
||||||
localStorage[option] = options.opts[option];
|
|
||||||
}
|
|
||||||
|
|
||||||
d.getElementById('options-saved').style.display = 'inline';
|
|
||||||
|
|
||||||
setTimeout(function(){
|
|
||||||
d.getElementById('options-saved').style.display = 'none';
|
|
||||||
}, 2000);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
options.init();
|
|
||||||
});
|
|
@ -1,67 +0,0 @@
|
|||||||
document.addEventListener('DOMContentLoaded', function() {
|
|
||||||
var
|
|
||||||
slugify, popup,
|
|
||||||
d = document,
|
|
||||||
detectedApps = d.getElementById('detected-apps');
|
|
||||||
|
|
||||||
slugify = function(string) {
|
|
||||||
return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, '');
|
|
||||||
};
|
|
||||||
|
|
||||||
popup = {
|
|
||||||
init: function() {
|
|
||||||
d.getElementById('options').addEventListener('click', function() {
|
|
||||||
window.open(chrome.extension.getURL('options.html'));
|
|
||||||
});
|
|
||||||
|
|
||||||
chrome.tabs.getSelected(null, function(tab) {
|
|
||||||
if ( tab.url.match(/https?:\/\//) ) {
|
|
||||||
detectedApps.innerHTML = '<div class="empty">' + chrome.i18n.getMessage('noAppsDetected') + '</div>';
|
|
||||||
} else {
|
|
||||||
detectedApps.innerHTML = '<div class="empty">' + chrome.i18n.getMessage('nothingToDo') + '</div>';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
popup.displayApps();
|
|
||||||
},
|
|
||||||
|
|
||||||
displayApps: function() {
|
|
||||||
var appName, confidence, version;
|
|
||||||
|
|
||||||
chrome.tabs.getSelected(null, function(tab) {
|
|
||||||
chrome.extension.sendRequest({ id: 'get_apps', tab: tab }, function(response) {
|
|
||||||
if ( response.tabCache && response.tabCache.count > 0 ) {
|
|
||||||
detectedApps.innerHTML = '';
|
|
||||||
|
|
||||||
for ( appName in response.tabCache.appsDetected ) {
|
|
||||||
confidence = response.tabCache.appsDetected[appName].confidenceTotal;
|
|
||||||
version = response.tabCache.appsDetected[appName].version;
|
|
||||||
|
|
||||||
var html =
|
|
||||||
'<div class="detected-app">' +
|
|
||||||
'<a target="_blank" href="https://wappalyzer.com/applications/' + slugify(appName) + '?pk_campaign=chrome&pk_kwd=popup">' +
|
|
||||||
'<img src="images/icons/' + response.apps[appName].icon + '"/>' +
|
|
||||||
'<span class="label"><span class="name">' + appName + '</span>' + ( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '' ) + '</span>' +
|
|
||||||
'</a>';
|
|
||||||
|
|
||||||
response.apps[appName].cats.forEach(function(cat) {
|
|
||||||
html +=
|
|
||||||
'<a target="_blank" href="https://wappalyzer.com/categories/' + slugify(response.categories[cat]) + '?pk_campaign=chrome&pk_kwd=popup">' +
|
|
||||||
'<span class="category"><span class="name">' + chrome.i18n.getMessage('categoryName' + cat) + '</span></span>' +
|
|
||||||
'</a>';
|
|
||||||
});
|
|
||||||
|
|
||||||
html +=
|
|
||||||
'</a>' +
|
|
||||||
'</div>';
|
|
||||||
|
|
||||||
detectedApps.innerHTML = detectedApps.innerHTML + html;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
popup.init();
|
|
||||||
});
|
|
@ -1,34 +0,0 @@
|
|||||||
{ "name": "Wappalyzer",
|
|
||||||
"homepage_url": "https://wappalyzer.com?pk_campaign=chrome&pk_kwd=context",
|
|
||||||
"description": "Identifies software on the web",
|
|
||||||
"version": "2.52",
|
|
||||||
"default_locale": "en",
|
|
||||||
"manifest_version": 2,
|
|
||||||
"icons": {
|
|
||||||
"16": "images/icon_hot.png",
|
|
||||||
"32": "images/icon_32.png",
|
|
||||||
"128": "images/icon_128.png"
|
|
||||||
},
|
|
||||||
"page_action": {
|
|
||||||
"default_icon": "images/icon_32.png",
|
|
||||||
"default_title": "Wappalyzer - click for details",
|
|
||||||
"default_popup": "popup.html"
|
|
||||||
},
|
|
||||||
"background": { "page": "background.html" },
|
|
||||||
"content_scripts": [{
|
|
||||||
"matches": [ "http://*/*", "https://*/*" ],
|
|
||||||
"js": [ "js/content.js" ],
|
|
||||||
"run_at": "document_idle"
|
|
||||||
}, {
|
|
||||||
"matches": [ "http://*/*", "https://*/*" ],
|
|
||||||
"js": [ "js/iframe.js" ],
|
|
||||||
"run_at": "document_start",
|
|
||||||
"all_frames": true
|
|
||||||
}],
|
|
||||||
"web_accessible_resources": [
|
|
||||||
"js/inject.js"
|
|
||||||
],
|
|
||||||
"options_page": "options.html",
|
|
||||||
"permissions": [ "tabs", "webRequest", "webNavigation", "http://*/*", "https://*/*" ],
|
|
||||||
"content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'"
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title data-i18n="options">Wappalyzer Options</title>
|
|
||||||
|
|
||||||
<link rel="icon" href="images/icon_hot.png">
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="css/widgets.css">
|
|
||||||
<link rel="stylesheet" href="css/options.css">
|
|
||||||
|
|
||||||
<script src="js/ga.js"></script>
|
|
||||||
<script src="js/wappalyzer.js"></script>
|
|
||||||
<script src="js/defaults.js"></script>
|
|
||||||
<script src="js/options.js"></script>
|
|
||||||
<script src="js/i18n.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1 data-i18n="options"></h1>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<label for="option-upgrade-message"><input id="option-upgrade-message" type="checkbox"> <span data-i18n="optionUpgradeMessage"></span></label>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<label for="option-tracking"><input id="option-tracking" type="checkbox"> <span data-i18n="optionTracking"></span></label>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<button id="options-save" data-i18n="optionsSave"></button> <span id="options-saved" data-i18n="optionsSaved"></span>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div id="about">
|
|
||||||
<p>
|
|
||||||
<button id="github" ><img src="images/github.png" width="16" height="16" alt=""/> <span data-i18n="github" ></span></button>
|
|
||||||
<button id="twitter" ><img src="images/twitter.png" width="16" height="16" alt=""/> <span data-i18n="twitter"></span></button>
|
|
||||||
<button id="wappalyzer"><img src="images/icon_hot.png" width="16" height="16" alt=""/> <span data-i18n="website"></span></button>
|
|
||||||
</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,21 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Popup</title>
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="css/widgets.css">
|
|
||||||
<link rel="stylesheet" href="css/popup.css">
|
|
||||||
|
|
||||||
<script src="js/ga.js"></script>
|
|
||||||
<script src="js/popup.js"></script>
|
|
||||||
<script src="js/i18n.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="detected-apps"></div>
|
|
||||||
|
|
||||||
<div id="footer">
|
|
||||||
<a href="javascript: void(0);" data-i18n="options" id="options">Options</a>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,5 +0,0 @@
|
|||||||
data/apps.json
|
|
||||||
data/images/icons/*.png
|
|
||||||
data/images/icons/*.svg
|
|
||||||
data/js/iframe.js
|
|
||||||
wappalyzer.js
|
|
@ -1,69 +0,0 @@
|
|||||||
body {
|
|
||||||
background: #fff;
|
|
||||||
color: #000;
|
|
||||||
font-family: Helvetica, Arial, sans-serif;
|
|
||||||
font-size: 13px;
|
|
||||||
line-height: 16px;
|
|
||||||
margin: 0;
|
|
||||||
min-width: 200px;
|
|
||||||
padding: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
display: inline-block;
|
|
||||||
height: 16px;
|
|
||||||
margin-right: 8px;
|
|
||||||
vertical-align: top;
|
|
||||||
width: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detected-app {
|
|
||||||
padding: 7px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detected-app:first-child {
|
|
||||||
padding-top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detected-app:last-child {
|
|
||||||
border: none;
|
|
||||||
padding-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detected-app a {
|
|
||||||
color: #000;
|
|
||||||
display: block;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detected-app a .label .name {
|
|
||||||
border-bottom: 1px dotted #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detected-app a:hover .label .name {
|
|
||||||
border-bottom: 1px solid #333;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detected-app a .category .name {
|
|
||||||
border-bottom: 1px solid transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detected-app a:hover .category .name {
|
|
||||||
border-bottom: 1px solid #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.label {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.category {
|
|
||||||
color: #999;
|
|
||||||
display: block;
|
|
||||||
margin: 5px 0 0 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#empty {
|
|
||||||
color: #999;
|
|
||||||
font-style: italic;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
Before Width: | Height: | Size: 1.0 KiB |
@ -1,96 +0,0 @@
|
|||||||
(function() {
|
|
||||||
self.port.on('displayApps', function(message) {
|
|
||||||
var
|
|
||||||
div, a, img, label, name, slugify, confidence, version,
|
|
||||||
d = document,
|
|
||||||
detectedApps = d.getElementById('detected-apps'),
|
|
||||||
empty = d.getElementById('empty');
|
|
||||||
|
|
||||||
slugify = function(string) {
|
|
||||||
return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/g, '');
|
|
||||||
};
|
|
||||||
|
|
||||||
while ( detectedApps.firstChild ) {
|
|
||||||
detectedApps.removeChild(detectedApps.firstChild);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( message.tabs.count > 0 ) {
|
|
||||||
empty.style.display = 'none';
|
|
||||||
|
|
||||||
for ( appName in message.tabs.appsDetected ) {
|
|
||||||
div = d.createElement('div');
|
|
||||||
a = d.createElement('a');
|
|
||||||
img = d.createElement('img');
|
|
||||||
label = d.createElement('span');
|
|
||||||
name = d.createElement('span');
|
|
||||||
|
|
||||||
confidence = message.tabs.appsDetected[appName].confidenceTotal;
|
|
||||||
version = message.tabs.appsDetected[appName].version;
|
|
||||||
|
|
||||||
div.setAttribute('class', 'detected-app');
|
|
||||||
|
|
||||||
a.setAttribute('href', '#');
|
|
||||||
|
|
||||||
(function(appName) {
|
|
||||||
a.addEventListener('click', function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
self.port.emit('goToUrl', 'applications/' + slugify(appName));
|
|
||||||
});
|
|
||||||
}(appName));
|
|
||||||
|
|
||||||
img.setAttribute('src', 'images/icons/' + message.apps[appName].icon);
|
|
||||||
img.setAttribute('height', '16');
|
|
||||||
img.setAttribute('width', '16');
|
|
||||||
|
|
||||||
label.setAttribute('class', 'label');
|
|
||||||
|
|
||||||
name.setAttribute('class', 'name');
|
|
||||||
|
|
||||||
name.appendChild(d.createTextNode(appName));
|
|
||||||
|
|
||||||
label.appendChild(name);
|
|
||||||
label.appendChild(d.createTextNode(( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '')));
|
|
||||||
|
|
||||||
a.appendChild(img);
|
|
||||||
a.appendChild(label);
|
|
||||||
|
|
||||||
div.appendChild(a);
|
|
||||||
|
|
||||||
message.apps[appName].cats.forEach(function(cat) {
|
|
||||||
a = d.createElement('a');
|
|
||||||
label = d.createElement('span');
|
|
||||||
name = d.createElement('span');
|
|
||||||
|
|
||||||
a.setAttribute('href', '#');
|
|
||||||
|
|
||||||
(function(appName) {
|
|
||||||
a.addEventListener('click', function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
self.port.emit('goToUrl', 'categories/' + slugify(message.categories[cat]));
|
|
||||||
});
|
|
||||||
}(appName));
|
|
||||||
|
|
||||||
label.setAttribute('class', 'category');
|
|
||||||
|
|
||||||
name.setAttribute('class', 'name');
|
|
||||||
|
|
||||||
name.appendChild(d.createTextNode(message.categoryNames[cat]));
|
|
||||||
|
|
||||||
label.appendChild(name);
|
|
||||||
|
|
||||||
a.appendChild(label);
|
|
||||||
|
|
||||||
div.appendChild(a);
|
|
||||||
});
|
|
||||||
|
|
||||||
detectedApps.appendChild(div);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
empty.style.display = 'inherit';
|
|
||||||
}
|
|
||||||
|
|
||||||
self.port.emit('resize', document.body.offsetHeight);
|
|
||||||
});
|
|
||||||
}());
|
|
@ -1,31 +0,0 @@
|
|||||||
(function() {
|
|
||||||
try {
|
|
||||||
if ( document && document.contentType === 'text/html' ) {
|
|
||||||
var html = new XMLSerializer().serializeToString(document),
|
|
||||||
|
|
||||||
self.port.emit('log', html);
|
|
||||||
|
|
||||||
self.port.emit('log', 'init');
|
|
||||||
|
|
||||||
if ( html.length > 50000 ) {
|
|
||||||
html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
self.port.emit('analyze', {
|
|
||||||
hostname: location.hostname,
|
|
||||||
url: location.href,
|
|
||||||
analyze: { html: html }
|
|
||||||
});
|
|
||||||
|
|
||||||
setTimeout(function() {
|
|
||||||
var env = Object.keys(unsafeWindow).slice(0, 500);
|
|
||||||
|
|
||||||
self.port.emit('analyze', {
|
|
||||||
hostname: location.hostname,
|
|
||||||
url: location.href,
|
|
||||||
analyze: { env: env }
|
|
||||||
});
|
|
||||||
}, 1000);
|
|
||||||
}
|
|
||||||
} catch (e) { }
|
|
||||||
}());
|
|
@ -1,16 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
|
|
||||||
<title>Panel</title>
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="css/panel.css">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="empty" data-l10n-id="noAppsDetected"></div>
|
|
||||||
|
|
||||||
<div id="detected-apps"></div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,520 +0,0 @@
|
|||||||
(function() {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var
|
|
||||||
w = require('wappalyzer').wappalyzer,
|
|
||||||
{Cc, Ci} = require('chrome'),
|
|
||||||
headersCache = {},
|
|
||||||
categoryNames = {},
|
|
||||||
windows = [],
|
|
||||||
Window,
|
|
||||||
Tab,
|
|
||||||
Panel,
|
|
||||||
Button,
|
|
||||||
button,
|
|
||||||
pageMod,
|
|
||||||
UrlBar;
|
|
||||||
|
|
||||||
exports.main = function(options, callbacks) {
|
|
||||||
w.log('main: ' + options.loadReason);
|
|
||||||
|
|
||||||
w.init();
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.onUnload = function(reason) {
|
|
||||||
var win;
|
|
||||||
|
|
||||||
w.log('unload: ' + reason);
|
|
||||||
|
|
||||||
for each ( win in windows ) {
|
|
||||||
win.destroy();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Window = function(win) {
|
|
||||||
var
|
|
||||||
self = this,
|
|
||||||
tab;
|
|
||||||
|
|
||||||
w.log('new Window');
|
|
||||||
|
|
||||||
this.window = win;
|
|
||||||
this.tabs = {};
|
|
||||||
this.urlBar = null;
|
|
||||||
|
|
||||||
if ( button ) {
|
|
||||||
button.destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( require('sdk/simple-prefs').prefs.urlbar ) {
|
|
||||||
this.urlBar = new UrlBar(this.window);
|
|
||||||
} else {
|
|
||||||
button = new Button();
|
|
||||||
}
|
|
||||||
|
|
||||||
require('sdk/simple-prefs').on('urlbar', function() {
|
|
||||||
self.destroy();
|
|
||||||
|
|
||||||
if ( button ) {
|
|
||||||
button.destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( require('sdk/simple-prefs').prefs.urlbar ) {
|
|
||||||
self.urlBar = new UrlBar(this.window);
|
|
||||||
} else {
|
|
||||||
button = new Button();
|
|
||||||
}
|
|
||||||
|
|
||||||
self.displayApps();
|
|
||||||
});
|
|
||||||
|
|
||||||
for each ( tab in this.window.tabs ) {
|
|
||||||
this.tabs[tab.id] = new Tab(tab);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.window.tabs
|
|
||||||
.on('open', function(tab) {
|
|
||||||
self.tabs[tab.id] = new Tab(tab);
|
|
||||||
})
|
|
||||||
.on('close', function(tab) {
|
|
||||||
self.tabs[tab.id] = null;
|
|
||||||
})
|
|
||||||
.on('activate', function(tab) {
|
|
||||||
self.displayApps();
|
|
||||||
});
|
|
||||||
|
|
||||||
self.displayApps();
|
|
||||||
};
|
|
||||||
|
|
||||||
Window.prototype.displayApps = function() {
|
|
||||||
var
|
|
||||||
self = this,
|
|
||||||
tab = this.window.tabs.activeTab,
|
|
||||||
url,
|
|
||||||
count = 0,
|
|
||||||
message = {};
|
|
||||||
|
|
||||||
w.log('Window.displayApps');
|
|
||||||
|
|
||||||
if ( !tab || require('sdk/tabs').activeTab !== tab ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
url = tab.url.replace(/#.*$/, '');
|
|
||||||
count = w.detected[url] ? Object.keys(w.detected[url]).length : 0;
|
|
||||||
|
|
||||||
this.tabs[tab.id].count = count;
|
|
||||||
this.tabs[tab.id].appsDetected = w.detected[url];
|
|
||||||
|
|
||||||
message = {
|
|
||||||
tabs: this.tabs[tab.id],
|
|
||||||
apps: w.apps,
|
|
||||||
categories: w.categories,
|
|
||||||
categoryNames: categoryNames
|
|
||||||
};
|
|
||||||
|
|
||||||
if ( this.urlBar ) {
|
|
||||||
this.urlBar.clear();
|
|
||||||
|
|
||||||
// Add icons
|
|
||||||
if ( count ) {
|
|
||||||
for ( appName in this.tabs[tab.id].appsDetected ) {
|
|
||||||
this.urlBar.addIcon(appName);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.urlBar.addIcon();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.urlBar.panel.get().port.emit('displayApps', message);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( button ) {
|
|
||||||
button.setIcon();
|
|
||||||
|
|
||||||
if ( count ) {
|
|
||||||
var
|
|
||||||
appName,
|
|
||||||
found = false;
|
|
||||||
|
|
||||||
// Find the main application to display
|
|
||||||
w.driver.categoryOrder.forEach(function(match) {
|
|
||||||
for ( appName in w.detected[url] ) {
|
|
||||||
w.apps[appName].cats.forEach(function(cat) {
|
|
||||||
if ( cat == match && !found ) {
|
|
||||||
button.setIcon(appName);
|
|
||||||
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
button.panel.get().port.emit('displayApps', message);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Window.prototype.destroy = function() {
|
|
||||||
if ( this.urlBar ) {
|
|
||||||
this.urlBar.destroy();
|
|
||||||
|
|
||||||
this.urlBar = null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
pageMod = require('sdk/page-mod');
|
|
||||||
pageMod.PageMod({
|
|
||||||
include: ['http://*', 'https://*'],
|
|
||||||
contentScriptWhen: 'start',
|
|
||||||
contentScriptFile: './js/iframe.js',
|
|
||||||
onAttach: function(worker) {
|
|
||||||
worker.port.on('ad_log', function(message) {
|
|
||||||
w.adCache.push(message.subject);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Tab = function(tab) {
|
|
||||||
tab.on('ready', function(tab) {
|
|
||||||
var worker = tab.attach({
|
|
||||||
contentScriptFile: require('sdk/self').data.url('js/tab.js')
|
|
||||||
});
|
|
||||||
|
|
||||||
worker.port.on('analyze', function(message) {
|
|
||||||
var url = message.url.replace(/#.*$/, '');
|
|
||||||
|
|
||||||
if ( typeof headersCache[url] !== 'undefined' ) {
|
|
||||||
message.analyze.headers = headersCache[url];
|
|
||||||
}
|
|
||||||
|
|
||||||
w.analyze(message.hostname, url, message.analyze);
|
|
||||||
});
|
|
||||||
|
|
||||||
worker.port.on('log', function(message) {
|
|
||||||
w.log('[ tab.js ] ' + message);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
Panel = function() {
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
this.panel = require('sdk/panel').Panel({
|
|
||||||
width: 250,
|
|
||||||
height: 50,
|
|
||||||
contentURL: require('sdk/self').data.url('panel.html'),
|
|
||||||
contentScriptFile: require('sdk/self').data.url('js/panel.js'),
|
|
||||||
position: { right: 30, top: 30 },
|
|
||||||
onHide: function() {
|
|
||||||
if ( button ) {
|
|
||||||
button.get().state('window', { checked: false });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.panel.port.on('resize', function(height) {
|
|
||||||
self.panel.height = height;
|
|
||||||
});
|
|
||||||
|
|
||||||
this.panel.port.on('goToUrl', function(url) {
|
|
||||||
self.panel.hide();
|
|
||||||
|
|
||||||
w.driver.goToURL({ url: w.config.websiteURL + url, medium: 'panel' });
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
Panel.prototype.get = function() {
|
|
||||||
return this.panel;
|
|
||||||
};
|
|
||||||
|
|
||||||
Panel.prototype.destroy = function() {
|
|
||||||
this.panel.destroy();
|
|
||||||
};
|
|
||||||
|
|
||||||
Button = function() {
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
this.panel = new Panel();
|
|
||||||
|
|
||||||
this.button = require('sdk/ui/button/toggle').ToggleButton({
|
|
||||||
id: 'wappalyzer',
|
|
||||||
label: 'Wappalyzer',
|
|
||||||
icon: './images/icon32.png',
|
|
||||||
onChange: function(state) {
|
|
||||||
if ( state.checked ) {
|
|
||||||
self.panel.get().show({ position: self.button });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
Button.prototype.setIcon = function(appName) {
|
|
||||||
var url = typeof appName === 'undefined' ? './images/icon32.png' : './images/icons/' + w.apps[appName].icon;
|
|
||||||
|
|
||||||
this.button.icon = url;
|
|
||||||
};
|
|
||||||
|
|
||||||
Button.prototype.get = function() {
|
|
||||||
return this.button;
|
|
||||||
};
|
|
||||||
|
|
||||||
Button.prototype.destroy = function() {
|
|
||||||
this.panel.destroy();
|
|
||||||
|
|
||||||
this.button.destroy();
|
|
||||||
};
|
|
||||||
|
|
||||||
UrlBar = function(window) {
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
this.panel = new Panel();
|
|
||||||
|
|
||||||
this.onClick = function() {
|
|
||||||
self.panel.get().show();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Can't get document from sdk/windows. Use active window instead.
|
|
||||||
// This breaks switching between URL bar and button with multiple windows open
|
|
||||||
this.document = Cc['@mozilla.org/appshell/window-mediator;1'].getService(Ci.nsIWindowMediator)
|
|
||||||
.getMostRecentWindow('navigator:browser').document;
|
|
||||||
|
|
||||||
if ( this.document.getElementById('wappalyzer-urlbar') ) {
|
|
||||||
this.urlBar = this.document.getElementById('wappalyzer-urlbar');
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
|
|
||||||
this.urlBar = this.document.createElement('hbox');
|
|
||||||
|
|
||||||
this.urlBar.setAttribute('id', 'wappalyzer-urlbar');
|
|
||||||
this.urlBar.setAttribute('style', 'cursor: pointer; margin: 0 2px;');
|
|
||||||
this.urlBar.setAttribute('tooltiptext', require('sdk/l10n').get('name'));
|
|
||||||
|
|
||||||
this.urlBar.addEventListener('click', this.onClick);
|
|
||||||
|
|
||||||
this.document.getElementById('urlbar-icons').appendChild(this.urlBar);
|
|
||||||
};
|
|
||||||
|
|
||||||
UrlBar.prototype.get = function() {
|
|
||||||
return this.urlBar;
|
|
||||||
};
|
|
||||||
|
|
||||||
UrlBar.prototype.addIcon = function(appName) {
|
|
||||||
var
|
|
||||||
icon = this.document.createElement('image'),
|
|
||||||
url = typeof appName === 'undefined' ? 'images/icon32.png' : 'images/icons/' + w.apps[appName].icon,
|
|
||||||
tooltipText = ( typeof appName !== 'undefined' ? appName + ' - ' + require('sdk/l10n').get('clickForDetails') + ' - ' : '' ) + require('sdk/l10n').get('name');
|
|
||||||
|
|
||||||
icon.setAttribute('src', require('sdk/self').data.url(url));
|
|
||||||
icon.setAttribute('class', 'wappalyzer-icon');
|
|
||||||
icon.setAttribute('width', '16');
|
|
||||||
icon.setAttribute('height', '16');
|
|
||||||
icon.setAttribute('style', 'margin: 0 1px;');
|
|
||||||
icon.setAttribute('tooltiptext', tooltipText);
|
|
||||||
|
|
||||||
this.get().appendChild(icon);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
UrlBar.prototype.clear = function() {
|
|
||||||
var icons;
|
|
||||||
|
|
||||||
do {
|
|
||||||
icons = this.get().getElementsByClassName('wappalyzer-icon');
|
|
||||||
|
|
||||||
if ( icons.length ) {
|
|
||||||
this.get().removeChild(icons[0]);
|
|
||||||
}
|
|
||||||
} while ( icons.length );
|
|
||||||
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
UrlBar.prototype.destroy = function() {
|
|
||||||
this.panel.destroy();
|
|
||||||
|
|
||||||
this.urlBar.removeEventListener('click', this.onClick);
|
|
||||||
|
|
||||||
this.urlBar.remove();
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
w.driver = {
|
|
||||||
timeout: 1000,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Log messages to console
|
|
||||||
*/
|
|
||||||
log: function(args) {
|
|
||||||
console.log('[wappalyzer ' + args.type + '] ' + args.message);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize
|
|
||||||
*/
|
|
||||||
init: function(callback) {
|
|
||||||
var
|
|
||||||
id,
|
|
||||||
version,
|
|
||||||
win,
|
|
||||||
httpRequestObserver,
|
|
||||||
json = JSON.parse(require('sdk/self').data.load('apps.json'));
|
|
||||||
|
|
||||||
w.log('driver.init');
|
|
||||||
|
|
||||||
try {
|
|
||||||
version = require('sdk/self').version;
|
|
||||||
|
|
||||||
if ( !require('sdk/simple-storage').storage.version ) {
|
|
||||||
w.driver.goToURL({ url: w.config.websiteURL + 'installed', medium: 'install' });
|
|
||||||
} else if ( version !== require('sdk/simple-storage').storage.version ) {
|
|
||||||
w.driver.goToURL({ url: w.config.websiteURL + 'upgraded', medium: 'upgrade', background: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
require('sdk/simple-storage').storage.version = version;
|
|
||||||
} catch(e) { }
|
|
||||||
|
|
||||||
w.apps = json.apps;
|
|
||||||
w.categories = json.categories;
|
|
||||||
|
|
||||||
for ( id in w.categories ) {
|
|
||||||
categoryNames[id] = require('sdk/l10n').get('cat' + id);
|
|
||||||
}
|
|
||||||
|
|
||||||
require('sdk/windows').browserWindows
|
|
||||||
.on('open', function(win) {
|
|
||||||
windows.push(new Window(win));
|
|
||||||
});
|
|
||||||
|
|
||||||
for each ( win in require('sdk/windows').browserWindows ) {
|
|
||||||
windows.push(new Window(win));
|
|
||||||
}
|
|
||||||
|
|
||||||
httpRequestObserver = {
|
|
||||||
init: function() {
|
|
||||||
var observerService = Cc['@mozilla.org/observer-service;1'].getService(Ci.nsIObserverService);
|
|
||||||
|
|
||||||
observerService.addObserver(this, 'http-on-examine-response', false);
|
|
||||||
},
|
|
||||||
|
|
||||||
observe: function(subject, topic, data) {
|
|
||||||
if ( topic == 'http-on-examine-response' ) {
|
|
||||||
subject.QueryInterface(Ci.nsIHttpChannel);
|
|
||||||
|
|
||||||
this.onExamineResponse(subject);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
onExamineResponse: function (subject) {
|
|
||||||
var uri = subject.URI.spec.replace(/#.*$/, ''); // Remove hash
|
|
||||||
|
|
||||||
if ( headersCache.length > 50 ) {
|
|
||||||
headersCache = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( subject.contentType === 'text/html' ) {
|
|
||||||
if ( typeof headersCache[uri] === 'undefined' ) {
|
|
||||||
headersCache[uri] = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
subject.visitResponseHeaders(function(header, value) {
|
|
||||||
headersCache[uri][header.toLowerCase()] = value;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
httpRequestObserver.init();
|
|
||||||
},
|
|
||||||
|
|
||||||
goToURL: function(args) {
|
|
||||||
var url = args.url + ( typeof args.medium === 'undefined' ? '' : '?pk_campaign=firefox&pk_kwd=' + args.medium);
|
|
||||||
|
|
||||||
require('sdk/tabs').open({ url: url, inBackground: typeof args.background !== 'undefined' && args.background });
|
|
||||||
},
|
|
||||||
|
|
||||||
ping: function() {
|
|
||||||
var Request = require('sdk/request').Request, post;
|
|
||||||
|
|
||||||
if ( Object.keys(w.ping.hostnames).length && require('sdk/simple-prefs').prefs.tracking ) {
|
|
||||||
post = function(url, data) {
|
|
||||||
Request({
|
|
||||||
url: url,
|
|
||||||
content: { json: JSON.stringify(data) },
|
|
||||||
onComplete: function (response) {
|
|
||||||
w.log('w.driver.ping: status ' + response.status);
|
|
||||||
}
|
|
||||||
}).post();
|
|
||||||
};
|
|
||||||
|
|
||||||
post('http://ping.wappalyzer.com/v2/', w.ping);
|
|
||||||
|
|
||||||
w.log('w.driver.ping: ' + JSON.stringify(w.ping));
|
|
||||||
|
|
||||||
w.ping = { hostnames: {} };
|
|
||||||
|
|
||||||
post('https://ad.wappalyzer.com/log/wp/', w.adCache);
|
|
||||||
|
|
||||||
w.adCache = [];
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
displayApps: function() {
|
|
||||||
var win;
|
|
||||||
|
|
||||||
for each ( win in windows ) {
|
|
||||||
win.displayApps();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
categoryOrder: [ // Used to pick the main application
|
|
||||||
1, // CMS
|
|
||||||
11, // Blog
|
|
||||||
6, // Web Shop
|
|
||||||
2, // Message Board
|
|
||||||
51, // Landing Page Builder
|
|
||||||
8, // Wiki
|
|
||||||
13, // Issue Tracker
|
|
||||||
30, // Web Mail
|
|
||||||
18, // Web Framework
|
|
||||||
21, // LMS
|
|
||||||
7, // Photo Gallery
|
|
||||||
38, // Media Server
|
|
||||||
3, // Database Manager
|
|
||||||
34, // Database
|
|
||||||
4, // Documentation Tool
|
|
||||||
9, // Hosting Panel
|
|
||||||
29, // Search Engine
|
|
||||||
12, // JavaScript Framework
|
|
||||||
26, // Mobile Framework
|
|
||||||
25, // JavaScript Graphics
|
|
||||||
22, // Web Server
|
|
||||||
27, // Programming Language
|
|
||||||
28, // Operating System
|
|
||||||
15, // Comment System
|
|
||||||
20, // Editor
|
|
||||||
41, // Payment Processor
|
|
||||||
10, // Analytics
|
|
||||||
32, // Marketing Automation
|
|
||||||
31, // CDN
|
|
||||||
23, // Cache Tool
|
|
||||||
17, // Font Script
|
|
||||||
24, // Rich Text Editor
|
|
||||||
35, // Map
|
|
||||||
5, // Widget
|
|
||||||
14, // Video Player
|
|
||||||
16, // Captcha
|
|
||||||
33, // Web Server Extension
|
|
||||||
37, // Network Device
|
|
||||||
39, // Webcam
|
|
||||||
40, // Printer
|
|
||||||
36, // Advertising Network
|
|
||||||
42, // Tag Managers
|
|
||||||
43, // Paywalls
|
|
||||||
19 // Miscellaneous
|
|
||||||
]
|
|
||||||
};
|
|
||||||
}());
|
|
Before Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 2.6 KiB |
@ -1,68 +0,0 @@
|
|||||||
name = Wappalyzer
|
|
||||||
noAppsDetected = Keine Applikationen erkannt
|
|
||||||
clickForDetails = Klicken für Details
|
|
||||||
|
|
||||||
preferences = Weitere Optionen ...
|
|
||||||
categories = Kategorienverwaltung
|
|
||||||
tracking_title = Tracken
|
|
||||||
tracking_description = Sende anonyme Reports über gefundene Applikationen zu Forschungszwecken an wappalyzer.com
|
|
||||||
urlbar_title = Display icons in URL bar
|
|
||||||
urlbar_description = Uncheck to display toolbar button.
|
|
||||||
|
|
||||||
feedback = Feedback
|
|
||||||
github = Github
|
|
||||||
twitter = Twitter
|
|
||||||
website = Zu wappalyzer.com browsen
|
|
||||||
|
|
||||||
cat1 = CMS
|
|
||||||
cat2 = Message Board
|
|
||||||
cat3 = Datenbank-Manager
|
|
||||||
cat4 = Dokumentationstool
|
|
||||||
cat5 = Widget
|
|
||||||
cat6 = eCommerce
|
|
||||||
cat7 = Fotogallery
|
|
||||||
cat8 = Wiki
|
|
||||||
cat9 = Hosting Panel
|
|
||||||
cat10 = Analytics
|
|
||||||
cat11 = Blog
|
|
||||||
cat12 = JavaScript Framework
|
|
||||||
cat13 = Issue Tracker
|
|
||||||
cat14 = Video Player
|
|
||||||
cat15 = Kommentarsystem
|
|
||||||
cat16 = CAPTCHA
|
|
||||||
cat17 = Font Script
|
|
||||||
cat18 = Web Framework
|
|
||||||
cat19 = Diverses
|
|
||||||
cat20 = Editor
|
|
||||||
cat21 = LMS
|
|
||||||
cat22 = Web-Server
|
|
||||||
cat23 = Cache Tool
|
|
||||||
cat24 = Rich Text Editor
|
|
||||||
cat25 = JavaScript Graphics
|
|
||||||
cat26 = Mobile Framework
|
|
||||||
cat27 = Programmiersprache
|
|
||||||
cat28 = Betriebssystem
|
|
||||||
cat29 = Such-Engine
|
|
||||||
cat30 = Web mail
|
|
||||||
cat31 = CDN
|
|
||||||
cat32 = Marketing Automation
|
|
||||||
cat33 = Web-Server-Erweiterung
|
|
||||||
cat34 = Datenbank
|
|
||||||
cat35 = Karte
|
|
||||||
cat36 = Werbenetzwerk
|
|
||||||
cat37 = Netzwerkgerät
|
|
||||||
cat38 = Medienserver
|
|
||||||
cat39 = Webcam
|
|
||||||
cat40 = Drucker
|
|
||||||
cat41 = Payment Processor
|
|
||||||
cat42 = Tag Manager
|
|
||||||
cat43 = Paywall
|
|
||||||
cat44 = Build/CI System
|
|
||||||
cat45 = SCADA System
|
|
||||||
cat46 = Fernzugriff
|
|
||||||
cat47 = Development Tool
|
|
||||||
cat48 = Netzwerkspeicher
|
|
||||||
cat49 = Feed-Leser
|
|
||||||
cat50 = Document Management Systems
|
|
||||||
cat51 = Landing Page Builder
|
|
||||||
cat52 = Live Chat
|
|
@ -1,68 +0,0 @@
|
|||||||
name = Wappalyzer
|
|
||||||
noAppsDetected = No applications detected
|
|
||||||
clickForDetails = Click for details
|
|
||||||
|
|
||||||
preferences = Options
|
|
||||||
categories = Categories
|
|
||||||
tracking_title = Tracking
|
|
||||||
tracking_description = Anonymously send reports on detected applications to wappalyzer.com for analysis
|
|
||||||
urlbar_title = Display icons in URL bar
|
|
||||||
urlbar_description = Uncheck to display toolbar button.
|
|
||||||
|
|
||||||
feedback = Feedback
|
|
||||||
github = Github
|
|
||||||
twitter = Twitter
|
|
||||||
website = Go to wappalyzer.com
|
|
||||||
|
|
||||||
cat1 = CMS
|
|
||||||
cat2 = Message Board
|
|
||||||
cat3 = Database Manager
|
|
||||||
cat4 = Documentation Tool
|
|
||||||
cat5 = Widget
|
|
||||||
cat6 = eCommerce
|
|
||||||
cat7 = Photo Gallery
|
|
||||||
cat8 = Wiki
|
|
||||||
cat9 = Hosting Panel
|
|
||||||
cat10 = Analytics
|
|
||||||
cat11 = Blog
|
|
||||||
cat12 = JavaScript Framework
|
|
||||||
cat13 = Issue Tracker
|
|
||||||
cat14 = Video Player
|
|
||||||
cat15 = Comment System
|
|
||||||
cat16 = CAPTCHA
|
|
||||||
cat17 = Font Script
|
|
||||||
cat18 = Web Framework
|
|
||||||
cat19 = Miscellaneous
|
|
||||||
cat20 = Editor
|
|
||||||
cat21 = LMS
|
|
||||||
cat22 = Web Server
|
|
||||||
cat23 = Cache Tool
|
|
||||||
cat24 = Rich Text Editor
|
|
||||||
cat25 = JavaScript Graphics
|
|
||||||
cat26 = Mobile Framework
|
|
||||||
cat27 = Programming Language
|
|
||||||
cat28 = Operating System
|
|
||||||
cat29 = Search Engine
|
|
||||||
cat30 = Web Mail
|
|
||||||
cat31 = CDN
|
|
||||||
cat32 = Marketing Automation
|
|
||||||
cat33 = Web Server Extension
|
|
||||||
cat34 = Database
|
|
||||||
cat35 = Map
|
|
||||||
cat36 = Advertising Network
|
|
||||||
cat37 = Network Device
|
|
||||||
cat38 = Media Server
|
|
||||||
cat39 = Webcam
|
|
||||||
cat40 = Printer
|
|
||||||
cat41 = Payment Processor
|
|
||||||
cat42 = Tag Manager
|
|
||||||
cat43 = Paywall
|
|
||||||
cat44 = Build/CI System
|
|
||||||
cat45 = SCADA System
|
|
||||||
cat46 = Remote Access
|
|
||||||
cat47 = Development Tool
|
|
||||||
cat48 = Network Storage
|
|
||||||
cat49 = Feed Readers
|
|
||||||
cat50 = Document Management Systems
|
|
||||||
cat51 = Landing Page Builder
|
|
||||||
cat52 = Live Chat
|
|
@ -1,68 +0,0 @@
|
|||||||
name = Wappalyzer
|
|
||||||
noAppsDetected = No applications detected
|
|
||||||
clickForDetails = Click for details
|
|
||||||
|
|
||||||
preferences = Options
|
|
||||||
categories = Categories
|
|
||||||
tracking_title = Tracking
|
|
||||||
tracking_description = Anonymously send reports on detected applications to wappalyzer.com for analysis
|
|
||||||
urlbar_title = Display icons in URL bar
|
|
||||||
urlbar_description = Uncheck to display toolbar button.
|
|
||||||
|
|
||||||
feedback = Feedback
|
|
||||||
github = Github
|
|
||||||
twitter = Twitter
|
|
||||||
website = Go to wappalyzer.com
|
|
||||||
|
|
||||||
cat1 = CMS
|
|
||||||
cat2 = Message Board
|
|
||||||
cat3 = Database Manager
|
|
||||||
cat4 = Documentation Tool
|
|
||||||
cat5 = Widget
|
|
||||||
cat6 = eCommerce
|
|
||||||
cat7 = Photo Gallery
|
|
||||||
cat8 = Wiki
|
|
||||||
cat9 = Hosting Panel
|
|
||||||
cat10 = Analytics
|
|
||||||
cat11 = Blog
|
|
||||||
cat12 = JavaScript Framework
|
|
||||||
cat13 = Issue Tracker
|
|
||||||
cat14 = Video Player
|
|
||||||
cat15 = Comment System
|
|
||||||
cat16 = CAPTCHA
|
|
||||||
cat17 = Font Script
|
|
||||||
cat18 = Web Framework
|
|
||||||
cat19 = Miscellaneous
|
|
||||||
cat20 = Editor
|
|
||||||
cat21 = LMS
|
|
||||||
cat22 = Web Server
|
|
||||||
cat23 = Cache Tool
|
|
||||||
cat24 = Rich Text Editor
|
|
||||||
cat25 = JavaScript Graphics
|
|
||||||
cat26 = Mobile Framework
|
|
||||||
cat27 = Programming Language
|
|
||||||
cat28 = Operating System
|
|
||||||
cat29 = Search Engine
|
|
||||||
cat30 = Web Mail
|
|
||||||
cat31 = CDN
|
|
||||||
cat32 = Marketing Automation
|
|
||||||
cat33 = Web Server Extension
|
|
||||||
cat34 = Database
|
|
||||||
cat35 = Map
|
|
||||||
cat36 = Advertising Network
|
|
||||||
cat37 = Network Device
|
|
||||||
cat38 = Media Server
|
|
||||||
cat39 = Webcam
|
|
||||||
cat40 = Printer
|
|
||||||
cat41 = Payment Processor
|
|
||||||
cat42 = Tag Manager
|
|
||||||
cat43 = Paywall
|
|
||||||
cat44 = Build/CI System
|
|
||||||
cat45 = SCADA System
|
|
||||||
cat46 = Remote Access
|
|
||||||
cat47 = Development Tool
|
|
||||||
cat48 = Network Storage
|
|
||||||
cat49 = Feed Readers
|
|
||||||
cat50 = Document Management Systems
|
|
||||||
cat51 = Landing Page Builder
|
|
||||||
cat52 = Live Chat
|
|
@ -1,68 +0,0 @@
|
|||||||
name = Wappalyzer
|
|
||||||
noAppsDetected = Aplicaciones no detectadas
|
|
||||||
clickForDetail = Clic para detalles
|
|
||||||
|
|
||||||
preferences = Opciones
|
|
||||||
categories = Categorías
|
|
||||||
tracking_title = Seguimiento
|
|
||||||
tracking_description = Enviar informes anónimos sobre las aplicaciones detectadas a wappalyzer.com para análisis
|
|
||||||
urlbar_title = Display icons in URL bar
|
|
||||||
urlbar_description = Uncheck to display toolbar button.
|
|
||||||
|
|
||||||
feedback = Opinión
|
|
||||||
github = Github
|
|
||||||
twitter = Twitter
|
|
||||||
website = Ir a wappalyzer.com
|
|
||||||
|
|
||||||
cat1 = Gestor de Contenido
|
|
||||||
cat2 = Foro
|
|
||||||
cat3 = estor de Bases de Datos
|
|
||||||
cat4 = Herramienta de Documentación
|
|
||||||
cat5 = Widget
|
|
||||||
cat6 = Tienda Web
|
|
||||||
cat7 = Galería fotográfica
|
|
||||||
cat8 = Wiki
|
|
||||||
cat9 = Panel de Hosting
|
|
||||||
cat10 = Analítica
|
|
||||||
cat11 = Blog
|
|
||||||
cat12 = Framework JavaScript
|
|
||||||
cat13 = Gestor de Incidencias
|
|
||||||
cat14 = Reproductor de Vídeo
|
|
||||||
cat15 = Sistema de Comentarios
|
|
||||||
cat16 = CAPTCHA
|
|
||||||
cat17 = Tipografía
|
|
||||||
cat18 = Framework Web
|
|
||||||
cat19 = Miscelánea
|
|
||||||
cat20 = Editor
|
|
||||||
cat21 = LMS
|
|
||||||
cat22 = Servidor Web
|
|
||||||
cat23 = Herramienta de Cache
|
|
||||||
cat24 = Editor de Texto Enriquecido
|
|
||||||
cat25 = Gráficos JavaScript
|
|
||||||
cat26 = Framework Móvil
|
|
||||||
cat27 = Lenguaje de programación
|
|
||||||
cat28 = Sistema Operativo
|
|
||||||
cat29 = Motor de Búsqueda
|
|
||||||
cat30 = Correo Web
|
|
||||||
cat31 = CDN
|
|
||||||
cat32 = Automatización de Marketing
|
|
||||||
cat33 = Extensión de Servidor Web
|
|
||||||
cat34 = Base de Datos
|
|
||||||
cat35 = Mapa
|
|
||||||
cat36 = Red de Publicidad
|
|
||||||
cat37 = Dispositivo de Red
|
|
||||||
cat38 = Servidores de Contenido
|
|
||||||
cat39 = Webcam
|
|
||||||
cat40 = Impresora
|
|
||||||
cat41 = Payment Processor
|
|
||||||
cat42 = Tag Manager
|
|
||||||
cat43 = Paywall
|
|
||||||
cat44 = Build/CI System
|
|
||||||
cat45 = SCADA System
|
|
||||||
cat46 = Remote Access
|
|
||||||
cat47 = Development Tool
|
|
||||||
cat48 = Network Storage
|
|
||||||
cat49 = Feed Readers
|
|
||||||
cat50 = Document Management Systems
|
|
||||||
cat51 = Landing Page Builder
|
|
||||||
cat52 = Live Chat
|
|
@ -1,68 +0,0 @@
|
|||||||
name = Wappalyzer
|
|
||||||
noAppsDetected = Pas d'applications détectées
|
|
||||||
clickForDetails = Cliquer pour plus de détails
|
|
||||||
|
|
||||||
preferences = Plus d'options...
|
|
||||||
categories = Gérer les catégories
|
|
||||||
tracking_title = Traçage
|
|
||||||
tracking_description = Envoyer anonymement des rapports sur les applications détectées à wappalyzer.com pour la recherche
|
|
||||||
urlbar_title = Afficher les icônes dans la barre d'adresse
|
|
||||||
urlbar_description = Décocher pour afficher le bouton dans la barre des modules
|
|
||||||
|
|
||||||
feedback = Donner votre avis
|
|
||||||
github = Github
|
|
||||||
twitter = Twitter
|
|
||||||
website = Aller sur wappalyzer.com
|
|
||||||
|
|
||||||
cat1 = CMS
|
|
||||||
cat2 = Forum
|
|
||||||
cat3 = Gestionnaire de base de données
|
|
||||||
cat4 = Outil de documentation
|
|
||||||
cat5 = Widget
|
|
||||||
cat6 = Boutique en ligne
|
|
||||||
cat7 = Galerie photo
|
|
||||||
cat8 = Wiki
|
|
||||||
cat9 = Gestionnaire de serveur
|
|
||||||
cat10 = Outil de statistiques
|
|
||||||
cat11 = Blog
|
|
||||||
cat12 = Framework JavaScript
|
|
||||||
cat13 = Outils de suivi de problèmes
|
|
||||||
cat14 = Lecteur de vidéos
|
|
||||||
cat15 = Système de commentaires
|
|
||||||
cat16 = CAPTCHA
|
|
||||||
cat17 = Script de police
|
|
||||||
cat18 = Framework web
|
|
||||||
cat19 = Divers
|
|
||||||
cat20 = Editeur
|
|
||||||
cat21 = LMS
|
|
||||||
cat22 = Serveur web
|
|
||||||
cat23 = Outil de cache
|
|
||||||
cat24 = Editeur WYSIWYG
|
|
||||||
cat25 = Graphismes JavaScript
|
|
||||||
cat26 = Framework pour mobiles
|
|
||||||
cat27 = Language de programmation
|
|
||||||
cat28 = Système d'exploitation
|
|
||||||
cat29 = Moteur de recherche
|
|
||||||
cat30 = Web Mail
|
|
||||||
cat31 = CDN
|
|
||||||
cat32 = Logiciel de marketing
|
|
||||||
cat33 = Extension de serveur web
|
|
||||||
cat34 = Base de données
|
|
||||||
cat35 = Carte
|
|
||||||
cat36 = Réseau publicitaire
|
|
||||||
cat37 = Périphérique réseau
|
|
||||||
cat38 = Serveur multimédia
|
|
||||||
cat39 = Webcam
|
|
||||||
cat40 = Imprimante
|
|
||||||
cat41 = Service de paiement
|
|
||||||
cat42 = Tag Manager
|
|
||||||
cat43 = Paywall
|
|
||||||
cat44 = Système CI
|
|
||||||
cat45 = Système SCADA
|
|
||||||
cat46 = Accès à distance
|
|
||||||
cat47 = Outil de développement
|
|
||||||
cat48 = Stockage réseau
|
|
||||||
cat49 = Lecteur RSS
|
|
||||||
cat50 = Système de gestion de documents
|
|
||||||
cat51 = Landing Page Builder
|
|
||||||
cat52 = Chat en direct
|
|
@ -1,68 +0,0 @@
|
|||||||
name = Wappalyzer
|
|
||||||
noAppsDetected = Nessuna applicazione rilevata
|
|
||||||
clickForDetails = Clicca per i dettagli
|
|
||||||
|
|
||||||
preferences = Opzioni
|
|
||||||
categories = Categorie
|
|
||||||
tracking_title = Tracking
|
|
||||||
tracking_description = Inviare anonimamente un report sulle applicazioni rilevate a wappalyzer.com per l'analisi
|
|
||||||
urlbar_title = Mostra le icone nella barra delle URL
|
|
||||||
urlbar_description = Deselezionare per visualizzare il pulsante nella barra degli strumenti.
|
|
||||||
|
|
||||||
feedback = Feedback
|
|
||||||
github = Github
|
|
||||||
twitter = Twitter
|
|
||||||
website = Vai su wappalyzer.com
|
|
||||||
|
|
||||||
cat1 = CMS
|
|
||||||
cat2 = Forum
|
|
||||||
cat3 = Gestore di database
|
|
||||||
cat4 = Strumento di documentazione
|
|
||||||
cat5 = Widget
|
|
||||||
cat6 = eCommerce
|
|
||||||
cat7 = Galleria fotografica
|
|
||||||
cat8 = Wiki
|
|
||||||
cat9 = Pannello Hosting
|
|
||||||
cat10 = Analytics
|
|
||||||
cat11 = Blog
|
|
||||||
cat12 = Framework JavaScript
|
|
||||||
cat13 = Issue Tracker
|
|
||||||
cat14 = Player Video
|
|
||||||
cat15 = Sistema di commenti
|
|
||||||
cat16 = CAPTCHA
|
|
||||||
cat17 = Font Script
|
|
||||||
cat18 = Framework Web
|
|
||||||
cat19 = Miscellanea
|
|
||||||
cat20 = Editor
|
|
||||||
cat21 = LMS
|
|
||||||
cat22 = Web Server
|
|
||||||
cat23 = Cache Tool
|
|
||||||
cat24 = Editor di Testo Ricco
|
|
||||||
cat25 = JavaScript Graphics
|
|
||||||
cat26 = Framework Mobile
|
|
||||||
cat27 = Linguaggio di Programmazione
|
|
||||||
cat28 = Sistema Operativo
|
|
||||||
cat29 = Motore di Ricerca
|
|
||||||
cat30 = Web Mail
|
|
||||||
cat31 = CDN
|
|
||||||
cat32 = Marketing Automation
|
|
||||||
cat33 = Estensione Web Server
|
|
||||||
cat34 = Database
|
|
||||||
cat35 = Mappa
|
|
||||||
cat36 = Network Pubblicitario
|
|
||||||
cat37 = Network Device
|
|
||||||
cat38 = Media Server
|
|
||||||
cat39 = Webcam
|
|
||||||
cat40 = Stampante
|
|
||||||
cat41 = Payment Processor
|
|
||||||
cat42 = Tag Manager
|
|
||||||
cat43 = Paywall
|
|
||||||
cat44 = Sistema Build/CI
|
|
||||||
cat45 = SCADA System
|
|
||||||
cat46 = Accesso Remoto
|
|
||||||
cat47 = Strumenti di Sviluppo
|
|
||||||
cat48 = Network Storage
|
|
||||||
cat49 = Lettore di Feed
|
|
||||||
cat50 = Sistema di Gestione Documenti
|
|
||||||
cat51 = Landing Page Builder
|
|
||||||
cat52 = Live Chat
|
|
@ -1,68 +0,0 @@
|
|||||||
name = Wappalyzer
|
|
||||||
noAppsDetected = Geen applicaties gedetecteerd
|
|
||||||
clickForDetails = Klik voor details
|
|
||||||
|
|
||||||
preferences = Meer opties…
|
|
||||||
categories = Beheer categoriën
|
|
||||||
tracking_title = Tracking
|
|
||||||
tracking_description = Verzend anonieme informatie over applicaties naar wappalyzer.com voor onderzoek
|
|
||||||
urlbar_title = Laat iconen in de adresbalk zien
|
|
||||||
urlbar_description = Uncheck to display toolbar button.
|
|
||||||
|
|
||||||
feedback = Feedback
|
|
||||||
github = Github
|
|
||||||
twitter = Twitter
|
|
||||||
website = Ga naar wappalyzer.com
|
|
||||||
|
|
||||||
cat1 = CMS
|
|
||||||
cat2 = Forum
|
|
||||||
cat3 = Database Manager
|
|
||||||
cat4 = Documentatie Tool
|
|
||||||
cat5 = Widget
|
|
||||||
cat6 = Webwinkel
|
|
||||||
cat7 = Fotogalerij
|
|
||||||
cat8 = Wiki
|
|
||||||
cat9 = Hosting Paneel
|
|
||||||
cat10 = Analytics
|
|
||||||
cat11 = Blog
|
|
||||||
cat12 = JavaScript Framework
|
|
||||||
cat13 = Issue Tracker
|
|
||||||
cat14 = Videospeler
|
|
||||||
cat15 = Reactiesysteem
|
|
||||||
cat16 = CAPTCHA
|
|
||||||
cat17 = Font Script
|
|
||||||
cat18 = Web Framework
|
|
||||||
cat19 = Overige
|
|
||||||
cat20 = Editor
|
|
||||||
cat21 = LMS
|
|
||||||
cat22 = Webserver
|
|
||||||
cat23 = Cache Tool
|
|
||||||
cat24 = Rich Text Editor
|
|
||||||
cat25 = JavaScript Graphics
|
|
||||||
cat26 = Mobiel Framework
|
|
||||||
cat27 = Programmeertaal
|
|
||||||
cat28 = Besturingssysteem
|
|
||||||
cat29 = Zoekmachine
|
|
||||||
cat30 = Webmail
|
|
||||||
cat31 = CDN
|
|
||||||
cat32 = Marketing Automatisering
|
|
||||||
cat33 = Web Server Extensie
|
|
||||||
cat34 = Database
|
|
||||||
cat35 = Landkaart
|
|
||||||
cat36 = Advertentienetwerk
|
|
||||||
cat37 = Netwerk Apparaat
|
|
||||||
cat38 = Media Server
|
|
||||||
cat39 = Webcam
|
|
||||||
cat40 = Printer
|
|
||||||
cat41 = Betalingsverwerker
|
|
||||||
cat42 = Tag Manager
|
|
||||||
cat43 = Paywall
|
|
||||||
cat44 = Build/CI System
|
|
||||||
cat45 = SCADA System
|
|
||||||
cat46 = Remote Access
|
|
||||||
cat47 = Development Tool
|
|
||||||
cat48 = Network Storage
|
|
||||||
cat49 = Feed Readers
|
|
||||||
cat50 = Document Management Systems
|
|
||||||
cat51 = Landing Page Builder
|
|
||||||
cat52 = Live Chat
|
|
@ -1,65 +0,0 @@
|
|||||||
name = Wappalyzer
|
|
||||||
noAppsDetected = Nici o aplicație detectată
|
|
||||||
clickForDetails = Click pentru detalii
|
|
||||||
|
|
||||||
preferences = Opțiuni
|
|
||||||
categories = Categorii
|
|
||||||
tracking_title = Analiză
|
|
||||||
tracking_description = Trimite rapoarte anonime despre aplicațiile detectate către wappalyzer.com pentru cercetare
|
|
||||||
urlbar_title = Afișează iconițe în bara URL
|
|
||||||
urlbar_description = Debifează pentru a arăta butonul în toolbar.
|
|
||||||
|
|
||||||
feedback = Părere
|
|
||||||
github = Github
|
|
||||||
twitter = Twitter
|
|
||||||
website = Mergi la wappalyzer.com
|
|
||||||
|
|
||||||
|
|
||||||
cat1 = CMS
|
|
||||||
cat2 = Forum de discuții
|
|
||||||
cat3 = Manager baze de date
|
|
||||||
cat4 = Unealtă pentru documentare
|
|
||||||
cat5 = Widget
|
|
||||||
cat10 = Analiză trafic web
|
|
||||||
cat11 = Blog
|
|
||||||
cat12 = Framework JavaScript
|
|
||||||
cat13 = Tracker probleme
|
|
||||||
cat14 = Player Video
|
|
||||||
cat15 = Sistem de comentarii
|
|
||||||
cat16 = Verificare Captcha
|
|
||||||
cat17 = Script pentru fonturi
|
|
||||||
cat18 = Framework Web
|
|
||||||
cat19 = Divers
|
|
||||||
cat20 = Editor
|
|
||||||
cat21 = LMS
|
|
||||||
cat22 = Server Web
|
|
||||||
cat23 = Unealtă Cache
|
|
||||||
cat24 = Editor Texte Rich
|
|
||||||
cat25 = Grafică JavaScript
|
|
||||||
cat26 = Framework Mobile
|
|
||||||
cat27 = Limbaj de programare
|
|
||||||
cat28 = Sistem de operare
|
|
||||||
cat29 = Motor de căutare
|
|
||||||
cat30 = Poștă electronică
|
|
||||||
cat31 = CDN
|
|
||||||
cat32 = Automatizare marketing
|
|
||||||
cat33 = Extensie server web
|
|
||||||
cat34 = Bază de date
|
|
||||||
cat35 = Hartă
|
|
||||||
cat36 = Rețea de advertising
|
|
||||||
cat37 = Serviciu rețea
|
|
||||||
cat38 = Server Media
|
|
||||||
cat39 = Webcam
|
|
||||||
cat40 = Imprimantă
|
|
||||||
cat41 = Sistem de plată
|
|
||||||
cat42 = Manager cuvinte cheie
|
|
||||||
cat43 = Paywall
|
|
||||||
cat44 = Build/CI System
|
|
||||||
cat45 = SCADA System
|
|
||||||
cat46 = Remote Access
|
|
||||||
cat47 = Development Tool
|
|
||||||
cat48 = Network Storage
|
|
||||||
cat49 = Feed Readers
|
|
||||||
cat50 = Document Management Systems
|
|
||||||
cat51 = Landing Page Builder
|
|
||||||
cat52 = Live Chat
|
|
@ -1,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
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,62 @@
|
|||||||
|
{
|
||||||
|
"github": { "message": "Fork Wappalyzer on GitHub!" },
|
||||||
|
"twitter": { "message": "Obserwuj Wappalyzer na Twitterze" },
|
||||||
|
"website": { "message": "Przejdź do wappalyzer.com" },
|
||||||
|
"options": { "message": "Opcje" },
|
||||||
|
"optionsSave": { "message": "Zapisz opcje" },
|
||||||
|
"optionsSaved": { "message": "Zapisano" },
|
||||||
|
"optionUpgradeMessage": { "message": "Powiadamiaj mnie o aktualizacjach" },
|
||||||
|
"optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" },
|
||||||
|
"optionTracking": { "message": "Przesyłaj anonimowe statystyki aplikacji wykrytych przez Wappalyzer do twórców" },
|
||||||
|
"nothingToDo": { "message": "Nic tu nie ma." },
|
||||||
|
"noAppsDetected": { "message": "Nie wykryto żadnych aplikacji." },
|
||||||
|
"categoryName1": { "message": "CMS" },
|
||||||
|
"categoryName2": { "message": "Forum" },
|
||||||
|
"categoryName3": { "message": "Menedżer baz danych" },
|
||||||
|
"categoryName4": { "message": "Narzędzia dokumentacji" },
|
||||||
|
"categoryName5": { "message": "Widżet" },
|
||||||
|
"categoryName10": { "message": "Statystyki" },
|
||||||
|
"categoryName11": { "message": "Blog" },
|
||||||
|
"categoryName12": { "message": "Framework JavaScript" },
|
||||||
|
"categoryName13": { "message": "Lista problemów" },
|
||||||
|
"categoryName14": { "message": "Odtwarzacz wideo" },
|
||||||
|
"categoryName15": { "message": "System komentarzy" },
|
||||||
|
"categoryName16": { "message": "Captcha" },
|
||||||
|
"categoryName17": { "message": "Skrypt czcionek" },
|
||||||
|
"categoryName18": { "message": "Framework webowy" },
|
||||||
|
"categoryName19": { "message": "Różne" },
|
||||||
|
"categoryName20": { "message": "Edytor" },
|
||||||
|
"categoryName21": { "message": "LMS" },
|
||||||
|
"categoryName22": { "message": "Serwer internetowy" },
|
||||||
|
"categoryName23": { "message": "Narzędzia cache" },
|
||||||
|
"categoryName24": { "message": "Rich Text Editor" },
|
||||||
|
"categoryName25": { "message": "Grafika JavaScript" },
|
||||||
|
"categoryName26": { "message": "Framework mobilny" },
|
||||||
|
"categoryName27": { "message": "Język programowania" },
|
||||||
|
"categoryName28": { "message": "System operacyjny" },
|
||||||
|
"categoryName29": { "message": "Silnik wyszukiwarki" },
|
||||||
|
"categoryName30": { "message": "Poczta internetowa" },
|
||||||
|
"categoryName31": { "message": "CDN" },
|
||||||
|
"categoryName32": { "message": "Automatyzacja marketingu" },
|
||||||
|
"categoryName33": { "message": "Rozszerzenie serwera WWW" },
|
||||||
|
"categoryName34": { "message": "Baza danych" },
|
||||||
|
"categoryName35": { "message": "Mapy" },
|
||||||
|
"categoryName36": { "message": "Sieć reklamowa" },
|
||||||
|
"categoryName37": { "message": "Usługa sieciowa" },
|
||||||
|
"categoryName38": { "message": "Serwer mediów" },
|
||||||
|
"categoryName39": { "message": "Kamera internetowa" },
|
||||||
|
"categoryName40": { "message": "Drukarka" },
|
||||||
|
"categoryName41": { "message": "Procesor płatności" },
|
||||||
|
"categoryName42": { "message": "Menedżer tagów" },
|
||||||
|
"categoryName43": { "message": "Menedżer płatności" },
|
||||||
|
"categoryName44": { "message": "System Build/CI" },
|
||||||
|
"categoryName45": { "message": "System SCADA" },
|
||||||
|
"categoryName46": { "message": "Dostęp zdalny" },
|
||||||
|
"categoryName47": { "message": "Narzędzia deweloperskie" },
|
||||||
|
"categoryName48": { "message": "Magazyn sieciowy" },
|
||||||
|
"categoryName49": { "message": "Czytnik" },
|
||||||
|
"categoryName50": { "message": "Systemy zarządzania dokumentami" },
|
||||||
|
"categoryName51": { "message": "Konstruktory stron" },
|
||||||
|
"categoryName52": { "message": "Czat na żywo" },
|
||||||
|
"categoryName53": { "message": "CRM" }
|
||||||
|
}
|
After Width: | Height: | Size: 5.6 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 2.3 KiB |
@ -1,5 +0,0 @@
|
|||||||
var defaults = {
|
|
||||||
autoAnalyzeHeaders: 0,
|
|
||||||
upgradeMessage: 1,
|
|
||||||
tracking: 1
|
|
||||||
};
|
|
@ -1,11 +1,13 @@
|
|||||||
|
/** global: browser */
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
var
|
var
|
||||||
i, value,
|
i, value,
|
||||||
nodes = document.getElementsByTagName('*');
|
nodes = document.querySelector('*');
|
||||||
|
|
||||||
for ( i = 0; i < nodes.length; i ++ ) {
|
for ( i = 0; i < nodes.length; i ++ ) {
|
||||||
if ( attr = nodes[i].dataset.i18n ) {
|
if ( value = nodes[i].dataset.i18n ) {
|
||||||
nodes[i].innerHTML = browser.i18n.getMessage(attr);
|
nodes[i].innerHTML = browser.i18n.getMessage(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -0,0 +1,846 @@
|
|||||||
|
if (!Range.prototype["intersectsNode"]) {
|
||||||
|
Range.prototype["intersectsNode"] = function (node) {
|
||||||
|
let range = document.createRange();
|
||||||
|
range.selectNode(node);
|
||||||
|
return 0 > this.compareBoundaryPoints(Range.END_TO_START, range)
|
||||||
|
&& 0 < this.compareBoundaryPoints(Range.START_TO_END, range);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
var getExtensionProtocol = function () {
|
||||||
|
if (typeof browser == "undefined") {
|
||||||
|
if (typeof chrome !== "undefined")
|
||||||
|
return "chrome-extension://";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return "ms-browser-extension://";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
class FakeEvent {
|
||||||
|
addListener(callback) { }
|
||||||
|
addRules(rules, callback) { }
|
||||||
|
getRules(ruleIdentifiers, callback) { }
|
||||||
|
hasListener(callback) { return false; }
|
||||||
|
hasListeners() { return false; }
|
||||||
|
removeRules(ruleIdentifiers, callback) { }
|
||||||
|
removeListener(callback) { }
|
||||||
|
}
|
||||||
|
class EdgeBridgeHelper {
|
||||||
|
constructor() {
|
||||||
|
this.fakeEvent = new FakeEvent();
|
||||||
|
}
|
||||||
|
toAbsolutePath(relativePath) {
|
||||||
|
if (relativePath.indexOf("ms-browser-extension://") == 0) {
|
||||||
|
return relativePath.replace(myBrowser.runtime.getURL(""), "");
|
||||||
|
}
|
||||||
|
else if (relativePath.indexOf("/") != 0) {
|
||||||
|
var absolutePath = "";
|
||||||
|
var documentPath = document.location.pathname;
|
||||||
|
absolutePath = documentPath.substring(0, documentPath.lastIndexOf("/") + 1);
|
||||||
|
absolutePath += relativePath;
|
||||||
|
return absolutePath;
|
||||||
|
}
|
||||||
|
return relativePath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var bridgeHelper = new EdgeBridgeHelper();
|
||||||
|
class EdgeBridgeDebugLog {
|
||||||
|
constructor() {
|
||||||
|
this.CatchOnException = true;
|
||||||
|
this.VerboseLogging = true;
|
||||||
|
this.FailedCalls = {};
|
||||||
|
this.SuccededCalls = {};
|
||||||
|
this.DeprecatedCalls = {};
|
||||||
|
this.BridgedCalls = {};
|
||||||
|
this.UnavailableApis = {};
|
||||||
|
this.EdgeIssues = {};
|
||||||
|
}
|
||||||
|
log(message) {
|
||||||
|
try {
|
||||||
|
if (this.VerboseLogging) {
|
||||||
|
console.log(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
info(message) {
|
||||||
|
try {
|
||||||
|
if (this.VerboseLogging) {
|
||||||
|
console.info(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
warn(message) {
|
||||||
|
try {
|
||||||
|
if (this.VerboseLogging) {
|
||||||
|
console.warn(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
error(message) {
|
||||||
|
try {
|
||||||
|
if (this.VerboseLogging) {
|
||||||
|
console.error(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DoActionAndLog(action, name, deprecatedTo, bridgedTo) {
|
||||||
|
var result;
|
||||||
|
try {
|
||||||
|
result = action();
|
||||||
|
this.AddToCalledDictionary(this.SuccededCalls, name);
|
||||||
|
if (typeof deprecatedTo !== "undefined" && typeof deprecatedTo !== "null") {
|
||||||
|
this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!");
|
||||||
|
this.AddToCalledDictionary(this.DeprecatedCalls, name);
|
||||||
|
}
|
||||||
|
if (typeof bridgedTo !== "undefined" && typeof bridgedTo !== "null") {
|
||||||
|
this.info("API Call '" + name + "' has been bridged to another Edge API: " + bridgedTo);
|
||||||
|
this.AddToCalledDictionary(this.BridgedCalls, name);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
catch (ex) {
|
||||||
|
this.AddToCalledDictionary(this.FailedCalls, name);
|
||||||
|
if (this.CatchOnException)
|
||||||
|
this.error("API Call Failed: " + name + " - " + ex);
|
||||||
|
else
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LogEdgeIssue(name, message) {
|
||||||
|
this.warn(message);
|
||||||
|
this.AddToCalledDictionary(this.EdgeIssues, name);
|
||||||
|
}
|
||||||
|
LogUnavailbleApi(name, deprecatedTo) {
|
||||||
|
this.warn("API Call '" + name + "' is not supported in Edge");
|
||||||
|
this.AddToCalledDictionary(this.UnavailableApis, name);
|
||||||
|
if (typeof deprecatedTo !== "undefined" && typeof deprecatedTo !== "null") {
|
||||||
|
this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!");
|
||||||
|
this.AddToCalledDictionary(this.DeprecatedCalls, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AddToCalledDictionary(dictionary, name) {
|
||||||
|
if (typeof dictionary[name] !== "undefined") {
|
||||||
|
dictionary[name]++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dictionary[name] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var bridgeLog = new EdgeBridgeDebugLog();
|
||||||
|
class EdgeChromeAppBridge {
|
||||||
|
getDetails() {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return EdgeChromeRuntimeBridge.prototype.getManifest();
|
||||||
|
}, "app.getManifest", undefined, "runtime.getManifest");
|
||||||
|
}
|
||||||
|
get isInstalled() { return bridgeLog.DoActionAndLog(() => { throw "app.isInstalled is not available in Edge"; }, "app.isInstalled"); }
|
||||||
|
getIsInstalled() { return bridgeLog.DoActionAndLog(() => { throw "app.getIsInstalled is not available in the Edge"; }, "app.getIsInstalled"); }
|
||||||
|
installState() { return bridgeLog.DoActionAndLog(() => { throw "app.installState is not available in Edge"; }, "app.installState"); }
|
||||||
|
runningState() { return bridgeLog.DoActionAndLog(() => { throw "app.runningState is not available in Edge"; }, "app.runningState"); }
|
||||||
|
}
|
||||||
|
class EdgeBrowserActionBridge {
|
||||||
|
get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.browserAction.onClicked; }, "browserAction.onClicked"); }
|
||||||
|
disable(tabId) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.browserAction.disable(tabId);
|
||||||
|
}, "browserAction.disable");
|
||||||
|
}
|
||||||
|
enable(tabId) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof tabId !== "undefined" && typeof tabId !== "null") {
|
||||||
|
myBrowser.browserAction.enable(tabId);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.browserAction.enable();
|
||||||
|
}
|
||||||
|
}, "browserAction.Enable");
|
||||||
|
}
|
||||||
|
getBadgeBackgroundColor(details, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.browserAction.getBadgeBackgroundColor(details, callback);
|
||||||
|
}, "browserAction.getBadgeBackgroundColor");
|
||||||
|
}
|
||||||
|
getBadgeText(details, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.browserAction.getBadgeText(details, callback);
|
||||||
|
}, "browserAction.getBadgeText");
|
||||||
|
}
|
||||||
|
setBadgeBackgroundColor(details) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.browserAction.setBadgeBackgroundColor(details);
|
||||||
|
}, "browserAction.setBadgeBackgroundColor");
|
||||||
|
}
|
||||||
|
setBadgeText(details) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.browserAction.setBadgeText(details);
|
||||||
|
}, "browserAction.setBadgeText");
|
||||||
|
}
|
||||||
|
setIcon(details, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof details.path !== "undefined") {
|
||||||
|
if (typeof details.path === "object") {
|
||||||
|
for (var key in details.path) {
|
||||||
|
if (details.path.hasOwnProperty(key)) {
|
||||||
|
details.path[key] = bridgeHelper.toAbsolutePath(details.path[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
details.path = bridgeHelper.toAbsolutePath(details.path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.browserAction.setIcon(details, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.browserAction.setIcon(details);
|
||||||
|
}
|
||||||
|
}, "browserAction.setIcon", undefined, "browserAction.setIcon with absolute path");
|
||||||
|
}
|
||||||
|
setPopup(details) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.browserAction.setPopup(details);
|
||||||
|
}, "browserAction.setPopup");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeChromeBrowserActionBridge extends EdgeBrowserActionBridge {
|
||||||
|
getPopup(details, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("browserAction.getPopup");
|
||||||
|
}
|
||||||
|
getTitle(details, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("browserAction.getTitle");
|
||||||
|
}
|
||||||
|
setTitle(details) {
|
||||||
|
bridgeLog.LogUnavailbleApi("browserAction.setTitle");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeContextMenusBridge {
|
||||||
|
get ACTION_MENU_TOP_LEVEL_LIMIT() { return bridgeLog.DoActionAndLog(() => { return myBrowser.contextMenus.ACTION_MENU_TOP_LEVEL_LIMIT; }, "contextMenus.ACTION_MENU_TOP_LEVEL_LIMIT"); }
|
||||||
|
get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.contextMenus.onClicked; }, "contextMenus.onClicked"); }
|
||||||
|
create(createProperties, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.contextMenus.create(createProperties, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.contextMenus.create(createProperties);
|
||||||
|
}
|
||||||
|
}, "contextMenus.create");
|
||||||
|
}
|
||||||
|
remove(menuItemId, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.contextMenus.remove(menuItemId, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.contextMenus.remove(menuItemId);
|
||||||
|
}
|
||||||
|
}, "contextMenus.remove");
|
||||||
|
}
|
||||||
|
removeAll(callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.contextMenus.removeAll(callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.contextMenus.removeAll();
|
||||||
|
}
|
||||||
|
}, "contextMenus.removeAll");
|
||||||
|
}
|
||||||
|
update(id, updateProperties, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.contextMenus.update(id, updateProperties, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.contextMenus.update(id, updateProperties);
|
||||||
|
}
|
||||||
|
}, "contextMenus.update");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeCookiesBridge {
|
||||||
|
get(details, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.cookies.get(details, callback);
|
||||||
|
}, "cookies.get");
|
||||||
|
}
|
||||||
|
getAll(details, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.cookies.getAll(details, callback);
|
||||||
|
}, "cookies.getAll");
|
||||||
|
}
|
||||||
|
remove(details, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.cookies.remove(details, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.cookies.remove(details);
|
||||||
|
}
|
||||||
|
}, "cookies.remove");
|
||||||
|
}
|
||||||
|
set(details, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.cookies.set(details, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.cookies.set(details);
|
||||||
|
}
|
||||||
|
}, "cookies.set");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeChromeCookiesBridge extends EdgeCookiesBridge {
|
||||||
|
get onChanged() { bridgeLog.LogUnavailbleApi("cookies.onChanged"); return bridgeHelper.fakeEvent; }
|
||||||
|
}
|
||||||
|
class EdgeExtensionBridge {
|
||||||
|
getBackgroundPage() {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return myBrowser.extension.getBackgroundPage();
|
||||||
|
}, "extension.getBackgroundPage");
|
||||||
|
}
|
||||||
|
getURL(path) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return myBrowser.extension.getURL(path);
|
||||||
|
}, "extension.getURL");
|
||||||
|
}
|
||||||
|
getViews(fetchProperties) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return myBrowser.extension.getViews(fetchProperties);
|
||||||
|
}, "extension.getViews");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeChromeExtensionBridge extends EdgeExtensionBridge {
|
||||||
|
get onConnect() { return bridgeLog.DoActionAndLog(() => { return EdgeRuntimeBridge.prototype.onConnect; }, "extension.onConnect", "runtime.onConnect", "runtime.onConnect"); }
|
||||||
|
get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onMessage", "runtime.onMessage", "runtime.onMessage"); }
|
||||||
|
get onRequest() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onRequest", "runtime.onMessage", "runtime.onMessage"); }
|
||||||
|
get onRequestExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "extension.onRequestExternal", "runtime.onMessageExternal", "runtime.onMessageExternal"); }
|
||||||
|
get inIncognitoContext() { return bridgeLog.DoActionAndLog(() => { return myBrowser.extension["inPrivateContext"]; }, "extension.inIncognitoContext", undefined, "extension.inPrivateContext"); }
|
||||||
|
get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "extension.lastError", undefined, "runtime.lastError"); }
|
||||||
|
connect(extensionId, connectInfo) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return EdgeRuntimeBridge.prototype.connect(extensionId, connectInfo);
|
||||||
|
}, "extension.connect", "runtime.connect", "runtime.connect");
|
||||||
|
}
|
||||||
|
sendMessage(message, responseCallback) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return EdgeRuntimeBridge.prototype.sendMessage(message, responseCallback, undefined, undefined);
|
||||||
|
}, "extension.sendMessage", "runtime.sendMessage", "runtime.sendMessage");
|
||||||
|
}
|
||||||
|
sendRequest(extensionId, message, options, responseCallback) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return EdgeRuntimeBridge.prototype.sendMessage(extensionId, message, options, responseCallback);
|
||||||
|
}, "extension.sendRequest", "runtime.sendMessage", "runtime.sendMessage");
|
||||||
|
}
|
||||||
|
isAllowedFileSchemeAccess(callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("extension.isAllowedFileSchemeAccess");
|
||||||
|
}
|
||||||
|
isAllowedIncognitoAccess(callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("extension.isAllowedIncognitoAccess");
|
||||||
|
}
|
||||||
|
setUpdateUrlData(data) {
|
||||||
|
bridgeLog.LogUnavailbleApi("extension.setUpdateUrlData");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeHistoryBridge {
|
||||||
|
get onVisited() { bridgeLog.LogUnavailbleApi("history.onVisited"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onVisitRemoved() { bridgeLog.LogUnavailbleApi("history.onVisitRemoved"); return bridgeHelper.fakeEvent; }
|
||||||
|
addUrl(details, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("history.addUrl");
|
||||||
|
}
|
||||||
|
deleteAll(callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("history.deleteAll");
|
||||||
|
}
|
||||||
|
deleteRange(range, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("history.deleteRange");
|
||||||
|
}
|
||||||
|
deleteUrl(details, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("history.deleteUrl");
|
||||||
|
}
|
||||||
|
getVisits(details, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("history.getVisits");
|
||||||
|
}
|
||||||
|
search(query, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("history.search");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeI18nBridge {
|
||||||
|
getAcceptLanguages(callback) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return myBrowser.i18n.getAcceptLanguages(callback);
|
||||||
|
}, "i18n.getAcceptLanguages");
|
||||||
|
}
|
||||||
|
getMessage(messageName, substitutions) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (messageName.indexOf("@@extension_id") > -1) {
|
||||||
|
return myBrowser.runtime.id;
|
||||||
|
}
|
||||||
|
if (typeof substitutions !== "undefined" && typeof substitutions !== "null") {
|
||||||
|
return myBrowser.i18n.getMessage(messageName, substitutions);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return myBrowser.i18n.getMessage(messageName);
|
||||||
|
}
|
||||||
|
}, "i18n.getMessage");
|
||||||
|
}
|
||||||
|
getUILanguage() {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return myBrowser.i18n.getUILanguage();
|
||||||
|
}, "i18n.getUILanguage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeNotificationBridge {
|
||||||
|
get onButtonClicked() { bridgeLog.LogUnavailbleApi("notifications.onButtonClicked"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onClicked() { bridgeLog.LogUnavailbleApi("notifications.onClicked"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onClosed() { bridgeLog.LogUnavailbleApi("notifications.onClosed"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onPermissionLevelChanged() { bridgeLog.LogUnavailbleApi("notifications.onPermissionLevelChanged"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onShowSettings() { bridgeLog.LogUnavailbleApi("notifications.onShowSettings"); return bridgeHelper.fakeEvent; }
|
||||||
|
clear(notificationId, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("notifications.clear");
|
||||||
|
}
|
||||||
|
create(notificationId, options, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("notifications.create");
|
||||||
|
}
|
||||||
|
getAll(callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("notifications.getAll");
|
||||||
|
}
|
||||||
|
getPermissionLevel(callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("notifications.getPermissionLevel");
|
||||||
|
}
|
||||||
|
update(notificationId, options, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("notifications.update");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgePageActionBridge {
|
||||||
|
get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.pageAction.onClicked; }, "pageAction.onClicked"); }
|
||||||
|
getPopup(details, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.pageAction.getPopup(details, callback);
|
||||||
|
}, "pageAction.getPopup");
|
||||||
|
}
|
||||||
|
getTitle(details, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.pageAction.getTitle(details, callback);
|
||||||
|
}, "pageAction.getTitle");
|
||||||
|
}
|
||||||
|
hide(tabId) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.pageAction.hide(tabId);
|
||||||
|
}, "pageAction.hide");
|
||||||
|
}
|
||||||
|
setTitle(details) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.pageAction.setTitle(details);
|
||||||
|
}, "pageAction.setTitle");
|
||||||
|
}
|
||||||
|
setIcon(details, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.pageAction.setIcon(details, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.pageAction.setIcon(details, callback);
|
||||||
|
}
|
||||||
|
}, "pageAction.setIcon");
|
||||||
|
}
|
||||||
|
setPopup(details) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.pageAction.setPopup(details);
|
||||||
|
}, "pageAction.setPopup");
|
||||||
|
}
|
||||||
|
show(tabId) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.pageAction.show(tabId);
|
||||||
|
}, "pageAction.show");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgePermissionsBridge {
|
||||||
|
get onAdded() { bridgeLog.LogUnavailbleApi("permissions.onAdded"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onRemoved() { bridgeLog.LogUnavailbleApi("permissions.onRemoved"); return bridgeHelper.fakeEvent; }
|
||||||
|
contains(permissions, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("permissions.contains");
|
||||||
|
}
|
||||||
|
getAll(callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("permissions.getAll");
|
||||||
|
}
|
||||||
|
remove(permissions, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("permissions.remove");
|
||||||
|
}
|
||||||
|
request(permissions, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("permissions.request");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeRuntimeBridge {
|
||||||
|
get id() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.id; }, "runtime.id"); }
|
||||||
|
get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "runtime.lastError"); }
|
||||||
|
get onConnect() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onConnect; }, "runtime.onConnect"); }
|
||||||
|
get onInstalled() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onInstalled; }, "runtime.onInstalled"); }
|
||||||
|
get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "runtime.onMessage"); }
|
||||||
|
get onMessageExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "runtime.onMessageExternal"); }
|
||||||
|
connect(extensionId, connectInfo) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof connectInfo !== "undefined" && typeof connectInfo !== "null") {
|
||||||
|
return myBrowser.runtime.connect(extensionId, connectInfo);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return myBrowser.runtime.connect(extensionId);
|
||||||
|
}
|
||||||
|
}, "runtime.connect");
|
||||||
|
}
|
||||||
|
getBackgroundPage(callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.runtime.getBackgroundPage(callback);
|
||||||
|
}, "runtime.getBackgroundPage");
|
||||||
|
}
|
||||||
|
getManifest() {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return myBrowser.runtime.getManifest();
|
||||||
|
}, "runtime.getManifest");
|
||||||
|
}
|
||||||
|
getURL(path) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return myBrowser.runtime.getURL(path);
|
||||||
|
}, "runtime.getURL");
|
||||||
|
}
|
||||||
|
sendMessage(extensionId, message, options, responseCallback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof responseCallback !== "undefined" && typeof responseCallback !== "null") {
|
||||||
|
myBrowser.runtime.sendMessage(extensionId, message, options, responseCallback);
|
||||||
|
}
|
||||||
|
else if (typeof options !== "undefined" && typeof options !== "null") {
|
||||||
|
myBrowser.runtime.sendMessage(extensionId, message, options);
|
||||||
|
}
|
||||||
|
else if (typeof message !== "undefined" && typeof message !== "null") {
|
||||||
|
myBrowser.runtime.sendMessage(extensionId, message);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.runtime.sendMessage(undefined, extensionId);
|
||||||
|
}
|
||||||
|
}, "runtime.sendMessage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeChromeRuntimeBridge extends EdgeRuntimeBridge {
|
||||||
|
get onConnectExternal() { bridgeLog.LogUnavailbleApi("runtime.onConnectExternal"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onRestartRequired() { bridgeLog.LogUnavailbleApi("runtime.onRestartRequired"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onStartup() { bridgeLog.LogUnavailbleApi("runtime.onStartup"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onSuspend() { bridgeLog.LogUnavailbleApi("runtime.onSuspend"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onSuspendCanceled() { bridgeLog.LogUnavailbleApi("runtime.onSuspendCanceled"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onUpdateAvailable() { bridgeLog.LogUnavailbleApi("runtime.onUpdateAvailable"); return bridgeHelper.fakeEvent; }
|
||||||
|
openOptionsPage(callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
var optionsPage = myBrowser.runtime.getManifest()["options_page"];
|
||||||
|
var optionsPageUrl = myBrowser.runtime.getURL(optionsPage);
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.tabs.create({ url: optionsPageUrl }, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.tabs.create({ url: optionsPageUrl });
|
||||||
|
}
|
||||||
|
}, "runtime.openOptionsPage", undefined, "tabs.create({ url: optionsPageUrl })");
|
||||||
|
}
|
||||||
|
connectNative(application) {
|
||||||
|
bridgeLog.LogUnavailbleApi("runtime.connectNative");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
getPackageDirectoryEntry(callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("runtime.getPackageDirectoryEntry");
|
||||||
|
}
|
||||||
|
getPlatformInfo(callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("runtime.getPlatformInfo");
|
||||||
|
}
|
||||||
|
reload() {
|
||||||
|
bridgeLog.LogUnavailbleApi("runtime.reload");
|
||||||
|
}
|
||||||
|
requestUpdateCheck(callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("runtime.requestUpdateCheck");
|
||||||
|
}
|
||||||
|
restart() {
|
||||||
|
bridgeLog.LogUnavailbleApi("runtime.restart");
|
||||||
|
}
|
||||||
|
setUninstallURL(url, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("runtime.setUninstallURL");
|
||||||
|
}
|
||||||
|
sendNativeMessage(application, message, responseCallback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("runtime.sendNativeMessage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeStorageBridge {
|
||||||
|
get local() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.local"); }
|
||||||
|
get onChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.onChanged; }, "storage.onChanged"); }
|
||||||
|
}
|
||||||
|
class EdgeChromeStorageBridge extends EdgeStorageBridge {
|
||||||
|
get managed() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.managed", undefined, "storage.local"); }
|
||||||
|
get sync() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.sync", undefined, "storage.local"); }
|
||||||
|
}
|
||||||
|
class EdgeTabsBridge {
|
||||||
|
get onActivated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onActivated; }, "tabs.onActivated"); }
|
||||||
|
get onCreated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onCreated; }, "tabs.onCreated"); }
|
||||||
|
get onRemoved() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onRemoved; }, "tabs.onRemoved"); }
|
||||||
|
get onReplaced() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onReplaced; }, "tabs.onReplaced"); }
|
||||||
|
get onUpdated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onUpdated; }, "tabs.onUpdated"); }
|
||||||
|
create(createProperties, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.tabs.create(createProperties, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.tabs.create(createProperties);
|
||||||
|
}
|
||||||
|
}, "tabs.create");
|
||||||
|
}
|
||||||
|
detectLanguage(tabId, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.tabs.detectLanguage(tabId, callback);
|
||||||
|
}, "tabs.detectLanguage");
|
||||||
|
}
|
||||||
|
executeScript(tabId, details, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.tabs.executeScript(tabId, details, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.tabs.executeScript(tabId, details);
|
||||||
|
}
|
||||||
|
}, "tabs.executeScript");
|
||||||
|
}
|
||||||
|
get(tabId, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.tabs.get(tabId, callback);
|
||||||
|
}, "tabs.get");
|
||||||
|
}
|
||||||
|
getCurrent(callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.tabs.getCurrent(callback);
|
||||||
|
}, "tabs.getCurrent");
|
||||||
|
}
|
||||||
|
insertCSS(tabId, details, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.tabs.insertCSS(tabId, details, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.tabs.insertCSS(tabId, details);
|
||||||
|
}
|
||||||
|
}, "tabs.insertCSS");
|
||||||
|
}
|
||||||
|
query(queryInfo, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.tabs.query(queryInfo, callback);
|
||||||
|
}, "tabs.query");
|
||||||
|
}
|
||||||
|
remove(tabId, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.tabs.remove(tabId, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.tabs.remove(tabId);
|
||||||
|
}
|
||||||
|
}, "tabs.remove");
|
||||||
|
}
|
||||||
|
sendMessage(tabId, message, responseCallback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof responseCallback !== "undefined" && typeof responseCallback !== "null") {
|
||||||
|
myBrowser.tabs.sendMessage(tabId, message, responseCallback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.tabs.sendMessage(tabId, message);
|
||||||
|
}
|
||||||
|
}, "tabs.sendMessage");
|
||||||
|
}
|
||||||
|
update(tabId, updateProperties, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.tabs.update(tabId, updateProperties, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.tabs.update(tabId, updateProperties);
|
||||||
|
}
|
||||||
|
}, "tabs.update");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeChromeTabsBridge extends EdgeTabsBridge {
|
||||||
|
get onAttached() { bridgeLog.LogUnavailbleApi("tabs.onAttached"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onDetached() { bridgeLog.LogUnavailbleApi("tabs.onDetached"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onHighlighted() { bridgeLog.LogUnavailbleApi("tabs.onHighlighted"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onMoved() { bridgeLog.LogUnavailbleApi("tabs.onMoved"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onSelectionChanged() {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
var fakeEvent = bridgeHelper.fakeEvent;
|
||||||
|
fakeEvent.addListener = (callback) => {
|
||||||
|
myBrowser.tabs.onActivated.addListener((activeInfo) => {
|
||||||
|
callback(activeInfo.tabId, { windowId: activeInfo.windowId });
|
||||||
|
});
|
||||||
|
};
|
||||||
|
return fakeEvent;
|
||||||
|
}, "tabs.onSelectionChanged", "tabs.onActivated", "tabs.onActivated");
|
||||||
|
}
|
||||||
|
duplicate(tabId, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
this.get(tabId, function (tab) {
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.tabs.create({ url: tab.url }, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.tabs.create({ url: tab.url });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, "tabs.duplicate", undefined, "tabs.create");
|
||||||
|
}
|
||||||
|
getAllInWindow(windowId, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
this.query({ windowId: windowId }, callback);
|
||||||
|
}, "tabs.getAllInWindow", "tabs.query", "tabs.query");
|
||||||
|
}
|
||||||
|
getSelected(windowId, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
this.query({ active: true }, (tabs) => callback(tabs[0]));
|
||||||
|
}, "tabs.getSelected", "tabs.query", "tabs.query");
|
||||||
|
}
|
||||||
|
sendRequest(tabId, request, responseCallback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
this.sendMessage(tabId, request, responseCallback);
|
||||||
|
}, "tabs.sendRequest", "tabs.sendMessage", "tabs.sendMessage");
|
||||||
|
}
|
||||||
|
captureVisibleTab(windowId, options, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("tabs.captureVisibleTab");
|
||||||
|
}
|
||||||
|
connect(tabId, connectInfo) {
|
||||||
|
bridgeLog.LogUnavailbleApi("tabs.connect");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
highlight(highlightInfo, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("tabs.highlight");
|
||||||
|
}
|
||||||
|
move(tabId, moveProperties, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("tabs.move");
|
||||||
|
}
|
||||||
|
reload(tabId, reloadProperties, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("tabs.reload");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeWebNavigationBridge {
|
||||||
|
get onBeforeNavigate() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onBeforeNavigate; }, "webNavigation.onBeforeNavigate"); }
|
||||||
|
get onCommitted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onCommitted; }, "webNavigation.onCommitted"); }
|
||||||
|
get onCompleted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onCompleted; }, "webNavigation.onCompleted"); }
|
||||||
|
get onCreatedNavigationTarget() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onCreatedNavigationTarget; }, "webNavigation.onCreatedNavigationTarget"); }
|
||||||
|
get onDOMContentLoaded() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onDOMContentLoaded; }, "webNavigation.onDOMContentLoaded"); }
|
||||||
|
get onErrorOccurred() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onErrorOccurred; }, "webNavigation.onErrorOccurred"); }
|
||||||
|
get onHistoryStateUpdated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onHistoryStateUpdated; }, "webNavigation.onHistoryStateUpdated"); }
|
||||||
|
get onReferenceFragmentUpdated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onReferenceFragmentUpdated; }, "webNavigation.onReferenceFragmentUpdated"); }
|
||||||
|
get onTabReplaced() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onTabReplaced; }, "webNavigation.onTabReplaced"); }
|
||||||
|
getAllFrames(details, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.webNavigation.getAllFrames(details, callback);
|
||||||
|
}, "webNavigation.getAllFrames");
|
||||||
|
}
|
||||||
|
getFrame(details, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.webNavigation.getFrame(details, callback);
|
||||||
|
}, "webNavigation.getFrame");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeWebRequestBridge {
|
||||||
|
get MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES; }, "webNavigation.MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES"); }
|
||||||
|
get onAuthRequired() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onAuthRequired; }, "webNavigation.onAuthRequired"); }
|
||||||
|
get onBeforeRedirect() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onBeforeRedirect; }, "webNavigation.onBeforeRedirect"); }
|
||||||
|
get onBeforeRequest() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onBeforeRequest; }, "webNavigation.onBeforeRequest"); }
|
||||||
|
get onBeforeSendHeaders() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onBeforeSendHeaders; }, "webNavigation.onBeforeSendHeaders"); }
|
||||||
|
get onCompleted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onCompleted; }, "webNavigation.onCompleted"); }
|
||||||
|
get onErrorOccurred() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onErrorOccurred; }, "webNavigation.onErrorOccurred"); }
|
||||||
|
get onHeadersReceived() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onHeadersReceived; }, "webNavigation.onHeadersReceived"); }
|
||||||
|
get onResponseStarted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onResponseStarted; }, "webNavigation.onResponseStarted"); }
|
||||||
|
get onSendHeaders() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onSendHeaders; }, "webNavigation.onSendHeaders"); }
|
||||||
|
handlerBehaviorChanged(callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.webRequest.handlerBehaviorChanged(callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.webRequest.handlerBehaviorChanged();
|
||||||
|
}
|
||||||
|
}, "webRequest.handlerBehaviorChanged");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeWindowsBridge {
|
||||||
|
get WINDOW_ID_CURRENT() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.WINDOW_ID_CURRENT; }, "windows.WINDOW_ID_CURRENT"); }
|
||||||
|
get WINDOW_ID_NONE() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.WINDOW_ID_NONE; }, "windows.WINDOW_ID_NONE"); }
|
||||||
|
get onCreated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onCreated; }, "windows.onCreated"); }
|
||||||
|
get onFocusChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onFocusChanged; }, "windows.onFocusChanged"); }
|
||||||
|
get onRemoved() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onRemoved; }, "windows.onRemoved"); }
|
||||||
|
create(createData, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.windows.create(createData, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.windows.create(createData);
|
||||||
|
}
|
||||||
|
}, "windows.create");
|
||||||
|
}
|
||||||
|
get(windowId, getInfo, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.windows.get(windowId, getInfo, callback);
|
||||||
|
}, "windows.get");
|
||||||
|
}
|
||||||
|
getAll(getInfo, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.windows.getAll(getInfo, callback);
|
||||||
|
}, "windows.getAll");
|
||||||
|
}
|
||||||
|
getCurrent(getInfo, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.windows.getCurrent(getInfo, callback);
|
||||||
|
}, "windows.getCurrent");
|
||||||
|
}
|
||||||
|
getLastFocused(getInfo, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.windows.getLastFocused(getInfo, callback);
|
||||||
|
}, "windows.getLastFocused");
|
||||||
|
}
|
||||||
|
update(windowId, updateInfo, callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.windows.update(windowId, updateInfo, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.windows.update(windowId, updateInfo);
|
||||||
|
}
|
||||||
|
}, "windows.update");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeChromeWindowsBridge extends EdgeWindowsBridge {
|
||||||
|
remove(windowId, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("windows.remove");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeBackgroundBridge {
|
||||||
|
constructor() {
|
||||||
|
this.app = new EdgeChromeAppBridge();
|
||||||
|
this.browserAction = typeof browser.browserAction !== "undefined" ? new EdgeChromeBrowserActionBridge() : undefined;
|
||||||
|
this.contextMenus = typeof browser.contextMenus !== "undefined" ? new EdgeContextMenusBridge() : undefined;
|
||||||
|
this.cookies = typeof browser.cookies !== "undefined" ? new EdgeChromeCookiesBridge() : undefined;
|
||||||
|
this.extension = typeof browser.extension !== "undefined" ? new EdgeChromeExtensionBridge() : undefined;
|
||||||
|
this.history = typeof browser.history !== "undefined" ? new EdgeHistoryBridge() : undefined;
|
||||||
|
this.i18n = typeof browser.i18n !== "undefined" ? new EdgeI18nBridge() : undefined;
|
||||||
|
this.notifications = typeof browser.notifications !== "undefined" ? new EdgeNotificationBridge() : undefined;
|
||||||
|
this.pageAction = typeof browser.pageAction !== "undefined" ? new EdgePageActionBridge() : undefined;
|
||||||
|
this.permissions = typeof browser.permissions !== "undefined" ? new EdgePermissionsBridge() : undefined;
|
||||||
|
this.runtime = typeof browser.runtime !== "undefined" ? new EdgeChromeRuntimeBridge() : undefined;
|
||||||
|
this.storage = typeof browser.storage !== "undefined" ? new EdgeChromeStorageBridge() : undefined;
|
||||||
|
this.tabs = typeof browser.tabs !== "undefined" ? new EdgeChromeTabsBridge() : undefined;
|
||||||
|
this.webNavigation = typeof browser.webNavigation !== "undefined" ? new EdgeWebNavigationBridge() : undefined;
|
||||||
|
this.webRequest = typeof browser.webRequest !== "undefined" ? new EdgeWebRequestBridge() : undefined;
|
||||||
|
this.windows = typeof browser.windows !== "undefined" ? new EdgeChromeWindowsBridge() : undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var myBrowser = browser;
|
||||||
|
var chrome = new EdgeBackgroundBridge();
|
@ -0,0 +1,323 @@
|
|||||||
|
if (!Range.prototype["intersectsNode"]) {
|
||||||
|
Range.prototype["intersectsNode"] = function (node) {
|
||||||
|
let range = document.createRange();
|
||||||
|
range.selectNode(node);
|
||||||
|
return 0 > this.compareBoundaryPoints(Range.END_TO_START, range)
|
||||||
|
&& 0 < this.compareBoundaryPoints(Range.START_TO_END, range);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
var getExtensionProtocol = function () {
|
||||||
|
if (typeof browser == "undefined") {
|
||||||
|
if (typeof chrome !== "undefined")
|
||||||
|
return "chrome-extension://";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return "ms-browser-extension://";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
class FakeEvent {
|
||||||
|
addListener(callback) { }
|
||||||
|
addRules(rules, callback) { }
|
||||||
|
getRules(ruleIdentifiers, callback) { }
|
||||||
|
hasListener(callback) { return false; }
|
||||||
|
hasListeners() { return false; }
|
||||||
|
removeRules(ruleIdentifiers, callback) { }
|
||||||
|
removeListener(callback) { }
|
||||||
|
}
|
||||||
|
class EdgeBridgeHelper {
|
||||||
|
constructor() {
|
||||||
|
this.fakeEvent = new FakeEvent();
|
||||||
|
}
|
||||||
|
toAbsolutePath(relativePath) {
|
||||||
|
if (relativePath.indexOf("ms-browser-extension://") == 0) {
|
||||||
|
return relativePath.replace(myBrowser.runtime.getURL(""), "");
|
||||||
|
}
|
||||||
|
else if (relativePath.indexOf("/") != 0) {
|
||||||
|
var absolutePath = "";
|
||||||
|
var documentPath = document.location.pathname;
|
||||||
|
absolutePath = documentPath.substring(0, documentPath.lastIndexOf("/") + 1);
|
||||||
|
absolutePath += relativePath;
|
||||||
|
return absolutePath;
|
||||||
|
}
|
||||||
|
return relativePath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var bridgeHelper = new EdgeBridgeHelper();
|
||||||
|
class EdgeBridgeDebugLog {
|
||||||
|
constructor() {
|
||||||
|
this.CatchOnException = true;
|
||||||
|
this.VerboseLogging = true;
|
||||||
|
this.FailedCalls = {};
|
||||||
|
this.SuccededCalls = {};
|
||||||
|
this.DeprecatedCalls = {};
|
||||||
|
this.BridgedCalls = {};
|
||||||
|
this.UnavailableApis = {};
|
||||||
|
this.EdgeIssues = {};
|
||||||
|
}
|
||||||
|
log(message) {
|
||||||
|
try {
|
||||||
|
if (this.VerboseLogging) {
|
||||||
|
console.log(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
info(message) {
|
||||||
|
try {
|
||||||
|
if (this.VerboseLogging) {
|
||||||
|
console.info(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
warn(message) {
|
||||||
|
try {
|
||||||
|
if (this.VerboseLogging) {
|
||||||
|
console.warn(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
error(message) {
|
||||||
|
try {
|
||||||
|
if (this.VerboseLogging) {
|
||||||
|
console.error(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DoActionAndLog(action, name, deprecatedTo, bridgedTo) {
|
||||||
|
var result;
|
||||||
|
try {
|
||||||
|
result = action();
|
||||||
|
this.AddToCalledDictionary(this.SuccededCalls, name);
|
||||||
|
if (typeof deprecatedTo !== "undefined" && typeof deprecatedTo !== "null") {
|
||||||
|
this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!");
|
||||||
|
this.AddToCalledDictionary(this.DeprecatedCalls, name);
|
||||||
|
}
|
||||||
|
if (typeof bridgedTo !== "undefined" && typeof bridgedTo !== "null") {
|
||||||
|
this.info("API Call '" + name + "' has been bridged to another Edge API: " + bridgedTo);
|
||||||
|
this.AddToCalledDictionary(this.BridgedCalls, name);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
catch (ex) {
|
||||||
|
this.AddToCalledDictionary(this.FailedCalls, name);
|
||||||
|
if (this.CatchOnException)
|
||||||
|
this.error("API Call Failed: " + name + " - " + ex);
|
||||||
|
else
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LogEdgeIssue(name, message) {
|
||||||
|
this.warn(message);
|
||||||
|
this.AddToCalledDictionary(this.EdgeIssues, name);
|
||||||
|
}
|
||||||
|
LogUnavailbleApi(name, deprecatedTo) {
|
||||||
|
this.warn("API Call '" + name + "' is not supported in Edge");
|
||||||
|
this.AddToCalledDictionary(this.UnavailableApis, name);
|
||||||
|
if (typeof deprecatedTo !== "undefined" && typeof deprecatedTo !== "null") {
|
||||||
|
this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!");
|
||||||
|
this.AddToCalledDictionary(this.DeprecatedCalls, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AddToCalledDictionary(dictionary, name) {
|
||||||
|
if (typeof dictionary[name] !== "undefined") {
|
||||||
|
dictionary[name]++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dictionary[name] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var bridgeLog = new EdgeBridgeDebugLog();
|
||||||
|
class EdgeExtensionBridge {
|
||||||
|
getBackgroundPage() {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return myBrowser.extension.getBackgroundPage();
|
||||||
|
}, "extension.getBackgroundPage");
|
||||||
|
}
|
||||||
|
getURL(path) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return myBrowser.extension.getURL(path);
|
||||||
|
}, "extension.getURL");
|
||||||
|
}
|
||||||
|
getViews(fetchProperties) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return myBrowser.extension.getViews(fetchProperties);
|
||||||
|
}, "extension.getViews");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeChromeExtensionBridge extends EdgeExtensionBridge {
|
||||||
|
get onConnect() { return bridgeLog.DoActionAndLog(() => { return EdgeRuntimeBridge.prototype.onConnect; }, "extension.onConnect", "runtime.onConnect", "runtime.onConnect"); }
|
||||||
|
get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onMessage", "runtime.onMessage", "runtime.onMessage"); }
|
||||||
|
get onRequest() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onRequest", "runtime.onMessage", "runtime.onMessage"); }
|
||||||
|
get onRequestExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "extension.onRequestExternal", "runtime.onMessageExternal", "runtime.onMessageExternal"); }
|
||||||
|
get inIncognitoContext() { return bridgeLog.DoActionAndLog(() => { return myBrowser.extension["inPrivateContext"]; }, "extension.inIncognitoContext", undefined, "extension.inPrivateContext"); }
|
||||||
|
get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "extension.lastError", undefined, "runtime.lastError"); }
|
||||||
|
connect(extensionId, connectInfo) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return EdgeRuntimeBridge.prototype.connect(extensionId, connectInfo);
|
||||||
|
}, "extension.connect", "runtime.connect", "runtime.connect");
|
||||||
|
}
|
||||||
|
sendMessage(message, responseCallback) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return EdgeRuntimeBridge.prototype.sendMessage(message, responseCallback, undefined, undefined);
|
||||||
|
}, "extension.sendMessage", "runtime.sendMessage", "runtime.sendMessage");
|
||||||
|
}
|
||||||
|
sendRequest(extensionId, message, options, responseCallback) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return EdgeRuntimeBridge.prototype.sendMessage(extensionId, message, options, responseCallback);
|
||||||
|
}, "extension.sendRequest", "runtime.sendMessage", "runtime.sendMessage");
|
||||||
|
}
|
||||||
|
isAllowedFileSchemeAccess(callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("extension.isAllowedFileSchemeAccess");
|
||||||
|
}
|
||||||
|
isAllowedIncognitoAccess(callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("extension.isAllowedIncognitoAccess");
|
||||||
|
}
|
||||||
|
setUpdateUrlData(data) {
|
||||||
|
bridgeLog.LogUnavailbleApi("extension.setUpdateUrlData");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeI18nBridge {
|
||||||
|
getAcceptLanguages(callback) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return myBrowser.i18n.getAcceptLanguages(callback);
|
||||||
|
}, "i18n.getAcceptLanguages");
|
||||||
|
}
|
||||||
|
getMessage(messageName, substitutions) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (messageName.indexOf("@@extension_id") > -1) {
|
||||||
|
return myBrowser.runtime.id;
|
||||||
|
}
|
||||||
|
if (typeof substitutions !== "undefined" && typeof substitutions !== "null") {
|
||||||
|
return myBrowser.i18n.getMessage(messageName, substitutions);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return myBrowser.i18n.getMessage(messageName);
|
||||||
|
}
|
||||||
|
}, "i18n.getMessage");
|
||||||
|
}
|
||||||
|
getUILanguage() {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return myBrowser.i18n.getUILanguage();
|
||||||
|
}, "i18n.getUILanguage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeRuntimeBridge {
|
||||||
|
get id() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.id; }, "runtime.id"); }
|
||||||
|
get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "runtime.lastError"); }
|
||||||
|
get onConnect() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onConnect; }, "runtime.onConnect"); }
|
||||||
|
get onInstalled() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onInstalled; }, "runtime.onInstalled"); }
|
||||||
|
get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "runtime.onMessage"); }
|
||||||
|
get onMessageExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "runtime.onMessageExternal"); }
|
||||||
|
connect(extensionId, connectInfo) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof connectInfo !== "undefined" && typeof connectInfo !== "null") {
|
||||||
|
return myBrowser.runtime.connect(extensionId, connectInfo);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return myBrowser.runtime.connect(extensionId);
|
||||||
|
}
|
||||||
|
}, "runtime.connect");
|
||||||
|
}
|
||||||
|
getBackgroundPage(callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
myBrowser.runtime.getBackgroundPage(callback);
|
||||||
|
}, "runtime.getBackgroundPage");
|
||||||
|
}
|
||||||
|
getManifest() {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return myBrowser.runtime.getManifest();
|
||||||
|
}, "runtime.getManifest");
|
||||||
|
}
|
||||||
|
getURL(path) {
|
||||||
|
return bridgeLog.DoActionAndLog(() => {
|
||||||
|
return myBrowser.runtime.getURL(path);
|
||||||
|
}, "runtime.getURL");
|
||||||
|
}
|
||||||
|
sendMessage(extensionId, message, options, responseCallback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
if (typeof responseCallback !== "undefined" && typeof responseCallback !== "null") {
|
||||||
|
myBrowser.runtime.sendMessage(extensionId, message, options, responseCallback);
|
||||||
|
}
|
||||||
|
else if (typeof options !== "undefined" && typeof options !== "null") {
|
||||||
|
myBrowser.runtime.sendMessage(extensionId, message, options);
|
||||||
|
}
|
||||||
|
else if (typeof message !== "undefined" && typeof message !== "null") {
|
||||||
|
myBrowser.runtime.sendMessage(extensionId, message);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.runtime.sendMessage(undefined, extensionId);
|
||||||
|
}
|
||||||
|
}, "runtime.sendMessage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeChromeRuntimeBridge extends EdgeRuntimeBridge {
|
||||||
|
get onConnectExternal() { bridgeLog.LogUnavailbleApi("runtime.onConnectExternal"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onRestartRequired() { bridgeLog.LogUnavailbleApi("runtime.onRestartRequired"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onStartup() { bridgeLog.LogUnavailbleApi("runtime.onStartup"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onSuspend() { bridgeLog.LogUnavailbleApi("runtime.onSuspend"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onSuspendCanceled() { bridgeLog.LogUnavailbleApi("runtime.onSuspendCanceled"); return bridgeHelper.fakeEvent; }
|
||||||
|
get onUpdateAvailable() { bridgeLog.LogUnavailbleApi("runtime.onUpdateAvailable"); return bridgeHelper.fakeEvent; }
|
||||||
|
openOptionsPage(callback) {
|
||||||
|
bridgeLog.DoActionAndLog(() => {
|
||||||
|
var optionsPage = myBrowser.runtime.getManifest()["options_page"];
|
||||||
|
var optionsPageUrl = myBrowser.runtime.getURL(optionsPage);
|
||||||
|
if (typeof callback !== "undefined" && typeof callback !== "null") {
|
||||||
|
myBrowser.tabs.create({ url: optionsPageUrl }, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myBrowser.tabs.create({ url: optionsPageUrl });
|
||||||
|
}
|
||||||
|
}, "runtime.openOptionsPage", undefined, "tabs.create({ url: optionsPageUrl })");
|
||||||
|
}
|
||||||
|
connectNative(application) {
|
||||||
|
bridgeLog.LogUnavailbleApi("runtime.connectNative");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
getPackageDirectoryEntry(callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("runtime.getPackageDirectoryEntry");
|
||||||
|
}
|
||||||
|
getPlatformInfo(callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("runtime.getPlatformInfo");
|
||||||
|
}
|
||||||
|
reload() {
|
||||||
|
bridgeLog.LogUnavailbleApi("runtime.reload");
|
||||||
|
}
|
||||||
|
requestUpdateCheck(callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("runtime.requestUpdateCheck");
|
||||||
|
}
|
||||||
|
restart() {
|
||||||
|
bridgeLog.LogUnavailbleApi("runtime.restart");
|
||||||
|
}
|
||||||
|
setUninstallURL(url, callback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("runtime.setUninstallURL");
|
||||||
|
}
|
||||||
|
sendNativeMessage(application, message, responseCallback) {
|
||||||
|
bridgeLog.LogUnavailbleApi("runtime.sendNativeMessage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class EdgeStorageBridge {
|
||||||
|
get local() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.local"); }
|
||||||
|
get onChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.onChanged; }, "storage.onChanged"); }
|
||||||
|
}
|
||||||
|
class EdgeChromeStorageBridge extends EdgeStorageBridge {
|
||||||
|
get managed() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.managed", undefined, "storage.local"); }
|
||||||
|
get sync() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.sync", undefined, "storage.local"); }
|
||||||
|
}
|
||||||
|
class EdgeContentBridge {
|
||||||
|
constructor() {
|
||||||
|
this.extension = typeof browser.extension !== "undefined" ? new EdgeChromeExtensionBridge() : undefined;
|
||||||
|
this.i18n = typeof browser.i18n !== "undefined" ? new EdgeI18nBridge() : undefined;
|
||||||
|
this.runtime = typeof browser.runtime !== "undefined" ? new EdgeChromeRuntimeBridge() : undefined;
|
||||||
|
this.storage = typeof browser.storage !== "undefined" ? new EdgeChromeStorageBridge() : undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var myBrowser = browser;
|
||||||
|
var chrome = new EdgeContentBridge();
|
@ -1,584 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
(function() {
|
|
||||||
|
|
||||||
var secBefore = 2000;
|
|
||||||
var secAfter = 5000;
|
|
||||||
var secBetweenDupAssets = 10e3;
|
|
||||||
var minVidSize = 500e3;
|
|
||||||
var maxVidSize = 25e6;
|
|
||||||
var maxContentRange = 25e6;
|
|
||||||
var videoExtensions = [
|
|
||||||
'af', '3gp', 'asf', 'avchd', 'avi', 'cam', 'dsh', 'flv', 'm1v', 'm2v',
|
|
||||||
'fla', 'flr', 'sol', 'm4v', 'mkv', 'wrap', 'mng', 'mov', 'mpeg', 'mpg',
|
|
||||||
'mpe', 'mp4', 'mxf', 'nsv', 'ogg', 'rm', 'svi', 'smi', 'wmv', 'webm'
|
|
||||||
];
|
|
||||||
var extensionsReg = new RegExp('\\.' + videoExtensions.join('$|\\.') + '$');
|
|
||||||
var videoContentTypesPrefixes = ['binary/octet-stream', 'video/', 'flv-application/', 'media'];
|
|
||||||
|
|
||||||
var bannedContentTypes = ['video/mp2t','video/f4m','video/f4f'];
|
|
||||||
var bannedFiletypes = ['ts'];
|
|
||||||
var bannedFiletypesReg = new RegExp('\\.' + bannedFiletypes.join('$|\\.') + '$');
|
|
||||||
var whitelistReqTypes = ['object', 'xmlhttprequest', 'other'];
|
|
||||||
|
|
||||||
var topVideoAssetDomains = [
|
|
||||||
'2mdn.net',
|
|
||||||
'innovid.com',
|
|
||||||
'serving-sys.com',
|
|
||||||
'btrll.com',
|
|
||||||
'teads.tv',
|
|
||||||
'tubemogul.com'
|
|
||||||
];
|
|
||||||
|
|
||||||
if ( !String.prototype.endsWith ) {
|
|
||||||
String.prototype.endsWith = function(searchString, position) {
|
|
||||||
var subjectString = this.toString();
|
|
||||||
if ( typeof position !== 'number' || !isFinite(position) ||
|
|
||||||
Math.floor(position) !== position || position > subjectString.length) {
|
|
||||||
position = subjectString.length;
|
|
||||||
}
|
|
||||||
position -= searchString.length;
|
|
||||||
var lastIndex = subjectString.indexOf(searchString, position);
|
|
||||||
return lastIndex !== -1 && lastIndex === position;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function isPixelRequest(request) {
|
|
||||||
return (request.type === 'image' || request.responseStatus === 204) &&
|
|
||||||
request.size <= 1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isVpaidOrVastRequest(request) {
|
|
||||||
var lowerCaseUrl = request.url.toLowerCase();
|
|
||||||
return lowerCaseUrl.indexOf('vpaid') !== -1 || lowerCaseUrl.indexOf('vast') !== -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
function hasValidRequestType(request) {
|
|
||||||
return whitelistReqTypes.indexOf(request.type) >= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function stripQueryParams(url) {
|
|
||||||
return url.split('?',1)[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
function parseHostnameFromUrl(url) {
|
|
||||||
var parser = document.createElement('a');
|
|
||||||
parser.href = url;
|
|
||||||
return parser.hostname;
|
|
||||||
}
|
|
||||||
|
|
||||||
function hasDomain(url, domain) {
|
|
||||||
return parseHostnameFromUrl(url).endsWith(domain);
|
|
||||||
}
|
|
||||||
|
|
||||||
function findHeader(headers, key) {
|
|
||||||
var header;
|
|
||||||
for ( var i = 0; i < headers.length; i += 1 ) {
|
|
||||||
header = headers[i];
|
|
||||||
if ( header.name.toLowerCase() === key ) {
|
|
||||||
return header;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function validVideoType(vtype) {
|
|
||||||
var goodType = videoContentTypesPrefixes.some(function(prefix) {
|
|
||||||
return vtype.indexOf(prefix) === 0;
|
|
||||||
});
|
|
||||||
return goodType;
|
|
||||||
}
|
|
||||||
|
|
||||||
function assetMsgKey(assetReq) {
|
|
||||||
var url = stripQueryParams(assetReq.url);
|
|
||||||
var key = assetReq.frameId + '-' + url;
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
var PageNetworkTrafficCollector = function(tabId) {
|
|
||||||
this.tabId = tabId;
|
|
||||||
this.displayAdFound = false;
|
|
||||||
this.requests = {};
|
|
||||||
this.msgsBeingSent = {};
|
|
||||||
this.assetsSeen = {};
|
|
||||||
this.allRedirects = {};
|
|
||||||
};
|
|
||||||
|
|
||||||
var globalPageContainer = {
|
|
||||||
collectors: {},
|
|
||||||
dyingCollectors: {},
|
|
||||||
|
|
||||||
cleanupCollector: function(tabId) {
|
|
||||||
if ( tabId in this.collectors ) {
|
|
||||||
delete globalPageContainer.collectors[tabId];
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
onNewNavigation: function(details) {
|
|
||||||
var tabId = details.tabId;
|
|
||||||
this.cleanupCollector(tabId);
|
|
||||||
|
|
||||||
this.collectors[tabId] = new PageNetworkTrafficCollector(tabId);
|
|
||||||
},
|
|
||||||
|
|
||||||
onNavigationCommitted: function(details) {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
onNavigationCompleted: function(details) {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
onTabClose: function(tabId, closeInfo) {
|
|
||||||
|
|
||||||
this.cleanupCollector(tabId);
|
|
||||||
delete this.collectors[tabId];
|
|
||||||
},
|
|
||||||
|
|
||||||
onDisplayAdFound: function(tabId) {
|
|
||||||
this.collectors[tabId].displayAdFound = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
getRandId: function() {
|
|
||||||
return String(Math.floor(Math.random() * 1e9));
|
|
||||||
},
|
|
||||||
|
|
||||||
getCollector: function(tabId) {
|
|
||||||
if ( this.collectors.hasOwnProperty(tabId) ) {
|
|
||||||
return this.collectors[tabId];
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
},
|
|
||||||
|
|
||||||
forwardCall: function(details, collectorMemberFunction) {
|
|
||||||
var collector = this.getCollector(details.tabId);
|
|
||||||
if ( collector !== null ) {
|
|
||||||
collectorMemberFunction.apply(collector, [details]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.sendLogMessageToTabConsole = function() {
|
|
||||||
var logMessage = Array.from(arguments).join(' ');
|
|
||||||
var message = {message: logMessage, event: 'console-log-message'};
|
|
||||||
browser.tabs.sendMessage(this.tabId, message);
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.sendToTab = function(assetReq, reqs, curPageUrl, isValidAd) {
|
|
||||||
var msg = {};
|
|
||||||
msg.assets = [];
|
|
||||||
msg.event_data = {};
|
|
||||||
if ( isValidAd ) {
|
|
||||||
msg.event = 'new-video-ad';
|
|
||||||
msg.requests = reqs;
|
|
||||||
msg.requests.sort(function(reqA, reqB) {return reqA.requestTimestamp - reqB.requestTimestamp;});
|
|
||||||
if ( assetReq ) {
|
|
||||||
msg.assets = [assetReq];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
msg.requests = reqs.map(function(request) {
|
|
||||||
return parseHostnameFromUrl(request.url);
|
|
||||||
});
|
|
||||||
msg.assets = [{
|
|
||||||
url: parseHostnameFromUrl(assetReq.url),
|
|
||||||
contentType: assetReq.contentType,
|
|
||||||
size: assetReq.size
|
|
||||||
}];
|
|
||||||
msg.event = 'new-invalid-video-ad';
|
|
||||||
}
|
|
||||||
msg.origUrl = curPageUrl;
|
|
||||||
msg.displayAdFound = this.displayAdFound;
|
|
||||||
|
|
||||||
browser.tabs.sendMessage(this.tabId, msg);
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.getRedirKey = function(url, frameId) {
|
|
||||||
return url + ':' + frameId;
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.seenBefore = function(request) {
|
|
||||||
var oldTime = this.assetsSeen[assetMsgKey(request)];
|
|
||||||
if ( oldTime && (request.requestTimestamp-oldTime < secBetweenDupAssets)){
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.recordSeenAsset = function(request) {
|
|
||||||
this.assetsSeen[assetMsgKey(request)] = request.requestTimestamp;
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.onBeforeRequest = function(details) {
|
|
||||||
var req = {
|
|
||||||
url: details.url,
|
|
||||||
type: details.type,
|
|
||||||
httpMethod: details.method,
|
|
||||||
frameId: details.frameId,
|
|
||||||
parentFrameId: details.parentFrameId,
|
|
||||||
requestTimestamp: details.timeStamp,
|
|
||||||
};
|
|
||||||
this.requests[details.requestId] = req;
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.onSendHeaders = function(details) {
|
|
||||||
var request, header;
|
|
||||||
request = this.requests[details.requestId];
|
|
||||||
header = request && findHeader(details.requestHeaders, 'x-requested-with');
|
|
||||||
if ( header && header.value.toLowerCase().indexOf('flash') > -1 ) {
|
|
||||||
request.from_flash = true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.onHeadersReceived = function(details) {
|
|
||||||
var getFrameDetails = {
|
|
||||||
tabId: details.tabId,
|
|
||||||
processId: null,
|
|
||||||
frameId: details.frameId
|
|
||||||
};
|
|
||||||
var pageNetworkTrafficController = this;
|
|
||||||
browser.webNavigation.getFrame(getFrameDetails).then(function(frameDetails) {
|
|
||||||
if ( frameDetails && frameDetails.url ) {
|
|
||||||
pageNetworkTrafficController._onHeadersReceived(details, frameDetails);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype._onHeadersReceived = function(details, frameDetails) {
|
|
||||||
var contentSize, contentRange;
|
|
||||||
|
|
||||||
var request = this.requests[details.requestId];
|
|
||||||
if ( request ) {
|
|
||||||
var redirParent = this.allRedirects[this.getRedirKey(details.url, details.frameId)];
|
|
||||||
var header = request && findHeader(details.responseHeaders, 'content-type');
|
|
||||||
var contentType = header && header.value.toLowerCase();
|
|
||||||
|
|
||||||
if ( contentType){
|
|
||||||
request.contentType = contentType;
|
|
||||||
}
|
|
||||||
header = request && findHeader(details.responseHeaders, 'content-length');
|
|
||||||
contentSize = header && header.value;
|
|
||||||
if ( contentSize ) {
|
|
||||||
request.size = request.size || 0;
|
|
||||||
request.size += parseInt(contentSize);
|
|
||||||
}
|
|
||||||
header = request && findHeader(details.responseHeaders, 'content-range');
|
|
||||||
contentRange = header && header.value;
|
|
||||||
if ( contentRange ) {
|
|
||||||
request.contentRange = parseInt(contentRange.split('/')[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
var frameUrl = null;
|
|
||||||
if ( frameDetails && frameDetails.url ) {
|
|
||||||
frameUrl = frameDetails.url;
|
|
||||||
}
|
|
||||||
if ( !this.bannedRequest(request) &&
|
|
||||||
(this.isVideoReq(frameUrl, request) || (redirParent && redirParent.isVideo))) {
|
|
||||||
request.isVideo = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.onBeforeRedirect = function(details) {
|
|
||||||
var request = this.requests[details.requestId];
|
|
||||||
if ( request ) {
|
|
||||||
if ( request.redirects ) {
|
|
||||||
request.redirects.push(details.redirectUrl);
|
|
||||||
} else {
|
|
||||||
request.redirects = [details.redirectUrl];
|
|
||||||
}
|
|
||||||
this.allRedirects[this.getRedirKey(details.redirectUrl, details.frameId)] = request;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.isYoutubeMastheadRequest = function(url) {
|
|
||||||
var re = /video_masthead/;
|
|
||||||
return this.hasYoutubeDomain(url) && re.test(url);
|
|
||||||
};
|
|
||||||
PageNetworkTrafficCollector.prototype.isYoutubeVideoRequest = function(srcUrl, destUrl) {
|
|
||||||
if ( !this.hasYoutubeDomain(srcUrl) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var re = /https?:\/\/r.*?\.googlevideo\.com\/videoplayback\?/;
|
|
||||||
return re.test(destUrl);
|
|
||||||
};
|
|
||||||
PageNetworkTrafficCollector.prototype.processResponse = function(requestDetails, frameDetails) {
|
|
||||||
var request;
|
|
||||||
if ( requestDetails ) {
|
|
||||||
request = this.requests[requestDetails.requestId];
|
|
||||||
if ( request ) {
|
|
||||||
request.responseStatus = requestDetails.statusCode;
|
|
||||||
request.responseTimestamp = requestDetails.timeStamp;
|
|
||||||
|
|
||||||
var frameUrl = null;
|
|
||||||
if ( frameDetails && frameDetails.url ) {
|
|
||||||
frameUrl = frameDetails.url;
|
|
||||||
}
|
|
||||||
|
|
||||||
var requestUrl = null;
|
|
||||||
if ( request.url ) {
|
|
||||||
requestUrl = request.url;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( this.isYoutubeAdReq(frameUrl, requestUrl) ) {
|
|
||||||
var videoId = this.parseYoutubeVideoIdFromUrl(requestUrl);
|
|
||||||
if ( videoId ) {
|
|
||||||
request.isYoutubeAd = true;
|
|
||||||
request.isVideo = true;
|
|
||||||
request.url = 'https://www.youtube.com/watch?v=' + this.parseYoutubeVideoIdFromUrl(requestUrl);
|
|
||||||
}
|
|
||||||
} else if ( !this.bannedRequest(request) &&
|
|
||||||
(this.isVideo || this.isVideoReq(frameUrl, request))) {
|
|
||||||
request.isVideo = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( request.isVideo ) {
|
|
||||||
|
|
||||||
var msgKey = assetMsgKey(request);
|
|
||||||
this.msgsBeingSent[msgKey] = request;
|
|
||||||
if ( !this.seenBefore(request) ) {
|
|
||||||
this.sendMsgWhenQuiet(msgKey);
|
|
||||||
}
|
|
||||||
this.recordSeenAsset(request);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.onResponseStarted = function(responseDetails) {
|
|
||||||
if ( responseDetails.frameId < 0 ) {
|
|
||||||
responseDetails.frameId = 99999;
|
|
||||||
|
|
||||||
}
|
|
||||||
var getFrameDetails = {
|
|
||||||
tabId: responseDetails.tabId,
|
|
||||||
processId: null,
|
|
||||||
frameId: responseDetails.frameId
|
|
||||||
};
|
|
||||||
var pageNetworkTrafficController = this;
|
|
||||||
browser.webNavigation.getFrame(getFrameDetails).then(function(frameDetails) {
|
|
||||||
if ( frameDetails && frameDetails.url ) {
|
|
||||||
pageNetworkTrafficController.processResponse(responseDetails, frameDetails);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.hasBannedFiletype = function(request) {
|
|
||||||
var url = stripQueryParams(request.url);
|
|
||||||
if ( bannedFiletypesReg.exec(url) ) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.checkContentHeaders = function(request) {
|
|
||||||
if ( request.contentType && validVideoType(request.contentType) ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.checkUrlExtension = function(request) {
|
|
||||||
var url = stripQueryParams(request.url);
|
|
||||||
if ( extensionsReg.exec(url) ) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.isVideoReq = function(srcUrl, request) {
|
|
||||||
if ( this.isYoutubeVideoRequest(srcUrl, request.url) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return this.checkUrlExtension(request) || this.checkContentHeaders(request);
|
|
||||||
};
|
|
||||||
PageNetworkTrafficCollector.prototype.hasYoutubeDomain = function(url) {
|
|
||||||
var hostname = parseHostnameFromUrl(url) ;
|
|
||||||
if ( hostname === 'www.youtube.com' ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
PageNetworkTrafficCollector.prototype.parseYoutubeVideoIdFromUrl = function(url) {
|
|
||||||
var re = /^https?:\/\/www\.youtube\.com\/get_video_info.*(?:\?|&)video_id=(.*?)(?:$|&)/;
|
|
||||||
var match = re.exec(url);
|
|
||||||
if ( match && match.length > 1 ) {
|
|
||||||
return match[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
re = /^https?:\/\/www\.youtube\.com\/embed\/(.*?)(?:$|\?)/;
|
|
||||||
match = re.exec(url);
|
|
||||||
if ( match && match.length > 1 ) {
|
|
||||||
return match[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
re = /^https?:\/\/www\.youtube\.com\/watch\?v=(.*$)/;
|
|
||||||
match = re.exec(url);
|
|
||||||
if ( match && match.length > 1 ) {
|
|
||||||
return match[1];
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.isYoutubeGetVideoInfoReq = function(url) {
|
|
||||||
var re = /^https?:\/\/www\.youtube\.com\/get_video_info\?/;
|
|
||||||
return re.test(url);
|
|
||||||
};
|
|
||||||
PageNetworkTrafficCollector.prototype.isYoutubeAdReq = function(srcUrl, destUrl) {
|
|
||||||
|
|
||||||
if ( !this.hasYoutubeDomain(srcUrl) ||
|
|
||||||
!this.isYoutubeGetVideoInfoReq(destUrl)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if ( this.parseYoutubeVideoIdFromUrl(srcUrl) ===
|
|
||||||
this.parseYoutubeVideoIdFromUrl(destUrl) &&
|
|
||||||
!this.isYoutubeMastheadRequest(destUrl)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.bannedRequest = function(request) {
|
|
||||||
return this.bannedVideoType(request) || this.hasBannedFiletype(request) || this.bannedVideoSize(request);
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.bannedVideoType = function(request) {
|
|
||||||
var badType = false;
|
|
||||||
if ( request.contentType ) {
|
|
||||||
badType = bannedContentTypes.some(function(prefix) {
|
|
||||||
return request.contentType.indexOf(prefix) >= 0;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return badType;
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.bannedVideoSize = function(request) {
|
|
||||||
if ( request.size !== null ) {
|
|
||||||
if ( request.size < minVidSize || request.size > maxVidSize || request.contentRange > maxContentRange ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.grabTagReqs = function(tabRequests, assetRequest) {
|
|
||||||
var minTimestamp, maxTimestamp;
|
|
||||||
minTimestamp = assetRequest.requestTimestamp - secBefore;
|
|
||||||
maxTimestamp = assetRequest.requestTimestamp + secAfter;
|
|
||||||
|
|
||||||
var filteredRequests = tabRequests.filter(function(request) {
|
|
||||||
return (request.requestTimestamp > minTimestamp &&
|
|
||||||
request.requestTimestamp < maxTimestamp &&
|
|
||||||
request.frameId === assetRequest.frameId &&
|
|
||||||
request.url !== assetRequest.url &&
|
|
||||||
(hasValidRequestType(request) ||
|
|
||||||
isPixelRequest(request)));
|
|
||||||
});
|
|
||||||
|
|
||||||
return filteredRequests;
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.isValidVideoAd = function(assetRequest, tagRequests) {
|
|
||||||
var hasVpaidOrVastRequest = tagRequests.some(function(tagRequest) {
|
|
||||||
return isVpaidOrVastRequest(tagRequest);
|
|
||||||
});
|
|
||||||
if ( hasVpaidOrVastRequest ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
var hasTopVideoAssetDomain = topVideoAssetDomains.some(function(assetDomain) {
|
|
||||||
return hasDomain(assetRequest.url, assetDomain);
|
|
||||||
});
|
|
||||||
|
|
||||||
return hasTopVideoAssetDomain;
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.sendMsgWhenQuiet = function(msgKey) {
|
|
||||||
var _this = this,
|
|
||||||
origPageUrl, msgAssetReq;
|
|
||||||
msgAssetReq = this.msgsBeingSent[msgKey];
|
|
||||||
browser.tabs.get(this.tabId, function(tab) {origPageUrl = tab.url;});
|
|
||||||
|
|
||||||
setTimeout(function() {
|
|
||||||
var rawRequests = [];
|
|
||||||
if ( globalPageContainer.collectors[_this.tabId] === _this ) {
|
|
||||||
for ( var reqId in _this.requests ) {
|
|
||||||
rawRequests.push(_this.requests[reqId]);
|
|
||||||
}
|
|
||||||
var tagReqs = _this.grabTagReqs(rawRequests, msgAssetReq);
|
|
||||||
|
|
||||||
if ( _this.isValidVideoAd(msgAssetReq, tagReqs) ) {
|
|
||||||
_this.sendToTab(msgAssetReq, tagReqs, origPageUrl, true);
|
|
||||||
} else {
|
|
||||||
|
|
||||||
_this.sendToTab(msgAssetReq, tagReqs, origPageUrl, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
}
|
|
||||||
delete _this.msgsBeingSent[msgKey];
|
|
||||||
}, secAfter+secBefore);
|
|
||||||
};
|
|
||||||
|
|
||||||
PageNetworkTrafficCollector.prototype.existingMessage = function(candidateRequest) {
|
|
||||||
var frameMsg = this.msgsBeingSent[candidateRequest.frameId];
|
|
||||||
if ( frameMsg ) {
|
|
||||||
return frameMsg;
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
browser.webRequest.onBeforeRequest.addListener(function(details) {
|
|
||||||
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRequest);
|
|
||||||
}, {urls: ['http://*/*', 'https://*/*']}, []);
|
|
||||||
|
|
||||||
browser.webRequest.onSendHeaders.addListener(function(details) {
|
|
||||||
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onSendHeaders);
|
|
||||||
}, {urls: ['http://*/*', 'https://*/*']}, ['requestHeaders']);
|
|
||||||
|
|
||||||
browser.webRequest.onHeadersReceived.addListener(function(details) {
|
|
||||||
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onHeadersReceived);
|
|
||||||
}, {urls: ['http://*/*', 'https://*/*']}, ['responseHeaders']);
|
|
||||||
|
|
||||||
browser.webRequest.onBeforeRedirect.addListener(function(details) {
|
|
||||||
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onBeforeRedirect);
|
|
||||||
}, {urls: ['http://*/*', 'https://*/*']}, []);
|
|
||||||
|
|
||||||
browser.webRequest.onResponseStarted.addListener(function(details) {
|
|
||||||
globalPageContainer.forwardCall(details, PageNetworkTrafficCollector.prototype.onResponseStarted);
|
|
||||||
}, {urls: ['http://*/*', 'https://*/*']}, ['responseHeaders']);
|
|
||||||
|
|
||||||
browser.webNavigation.onBeforeNavigate.addListener(function(details) {
|
|
||||||
if ( details.frameId === 0 ) {
|
|
||||||
globalPageContainer.onNewNavigation(details);
|
|
||||||
}
|
|
||||||
}, {});
|
|
||||||
|
|
||||||
browser.webNavigation.onCommitted.addListener(function(details) {
|
|
||||||
if ( details.frameId === 0 ) {
|
|
||||||
globalPageContainer.onNavigationCommitted(details);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
browser.webNavigation.onCompleted.addListener(function(details) {
|
|
||||||
if ( details.frameId === 0 ) {
|
|
||||||
globalPageContainer.onNavigationCompleted(details);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
browser.tabs.onRemoved.addListener(function(tabId, closeInfo) {
|
|
||||||
globalPageContainer.onTabClose(tabId, closeInfo);
|
|
||||||
});
|
|
||||||
|
|
||||||
browser.runtime.onMessage.addListener(function(message, sender, sendResponse) {
|
|
||||||
if ( message.event === 'new-ad' && message.data.event === 'ad' ) {
|
|
||||||
var tabId = sender.tab.id;
|
|
||||||
if ( tabId ) {
|
|
||||||
globalPageContainer.onDisplayAdFound(tabId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})();
|
|
After Width: | Height: | Size: 227 B |
After Width: | Height: | Size: 184 B |
After Width: | Height: | Size: 319 B |
After Width: | Height: | Size: 534 B |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.7 KiB |