diff --git a/chrome/content/apps.js b/chrome/content/apps.js index 7d5aaefa3..fb4334f52 100644 --- a/chrome/content/apps.js +++ b/chrome/content/apps.js @@ -34,6 +34,7 @@ if ( typeof wappalyzer != 'undefined' ) { 'Advanced Web Stats': { cats: { 1: 10 }, html: /aws.src = [^<]+caphyon\-analytics/i }, 'Amiro.CMS': { cats: { 1: 1 }, html: /<meta name=("|')generator("|') [^>]+Amiro/i }, 'Apache': { cats: { 1: 22 }, headers: { 'Server': /Apache/i } }, + 'Apache Tomcat': { cats: { 1: 22 }, headers: { 'Server': /Apache-Coyote/i } }, 'AWStats': { cats: { 1: 10 }, html: /<meta name=("|')generator("|') [^>]+AWStats/i }, 'BIGACE': { cats: { 1: 1 }, html: /(<meta name=("|')generator("|') [^>]+BIGACE|Powered by <a href=("|')[^>]+BIGACE|<!--\s+Site is running BIGACE)/i }, 'BigDump': { cats: { 1: 3 }, html: /<!-- <h1>BigDump: Staggered MySQL Dump Importer/ }, @@ -43,6 +44,7 @@ if ( typeof wappalyzer != 'undefined' ) { 'Burning Board': { cats: { 1: 2 }, html: /<a href=('|")[^>]+woltlab\.com.+Burning Board/i }, 'chartbeat': { cats: { 1: 10 }, html: /function loadChartbeat\(\) {/i }, 'Chamilo': { cats: { 1: 21 }, html: /<meta name=("|')generator("|') [^>]+Chamilo/i, headers: { 'X-Powered-By': /Chamilo/ } }, + 'Cherokee': { cats: { 1: 22 }, headers: { 'Server': /Cherokee/i } }, 'ClickTale': { cats: { 1: 10 }, html: /if\(typeof ClickTale(Tag)*==("|')function("|')\)/ }, 'Clicky': { cats: { 1: 10 }, html: /<script src=("|')http:\/\/static\.getclicky\.com/i }, 'CMS Made Simple': { cats: { 1: 1 }, html: /<meta name=("|')generator("|') [^>]+CMS Made Simple/i }, @@ -60,14 +62,15 @@ if ( typeof wappalyzer != 'undefined' ) { 'cufon': { cats: { 1: 17 }, html: /(<script[^>]* src=("|')[^>]*cufon\-yui\.js|<script[^>]*>[^<]+Cufon\.now\(\))/i }, 'Danneo CMS': { cats: { 1: 1 }, html: /<meta name=("|')generator("|') [^>]+Danneo/i }, 'DataLife Engine': { cats: { 1: 1 }, html: /<meta name=("|')generator("|') [^>]+DataLife Engine/i }, + 'DHTMLX': { cats: { 1: 12 }, html: /<script [^>]+dhtmlxcommon\.js/i }, 'DirectAdmin': { cats: { 1: 9 }, html: /<a[^>]+>DirectAdmin<\/a> Web Control Panel/i }, 'Disqus': { cats: { 1: 15 }, html: /(<div[^>]+id=("|')disqus_thread("|')|<script[^>]+disqus_url)/ }, - 'dojo': { cats: { 1: 12 }, html: /<script[^>]* src=("|')[^>]*dojo(\.xd)?\.js/i, env: /dojo/ }, + 'dojo': { cats: { 1: 12 }, html: /<script[^>]* src=("|')[^>]*dojo(\.xd)?\.js/i, env: /^dojo$/ }, 'Dokeos': { cats: { 1: 21 }, html: /(<meta name=("|')generator("|') [^>]+Dokeos|Portal <a[^>]+>Dokeos|@import "[^"]+dokeos_blue)/i, headers: { 'X-Powered-By': /Dokeos/ } }, 'DokuWiki': { cats: { 1: 8 }, html: /<meta name=("|')generator("|') [^>]+DokuWiki/i }, 'DotNetNuke': { cats: { 1: 1 }, html: /(<meta name=("|')generator("|') [^>]+DotNetNuke|<!\-\- by DotNetNuke Corporation)/i }, 'DreamWeaver': { cats: { 1: 20 }, html: /(<!\-\-[^>]*(InstanceBeginEditable|Dreamweaver[^>]+target|DWLayoutDefaultTable)|function MM_preloadImages\(\) {)/ }, - 'Drupal': { cats: { 1: 1 }, html: /(<script [^>]+drupal\.js|jQuery\.extend\(Drupal\.settings, \{|Drupal\.extend\(\{ settings: \{|<link[^>]+sites\/(default|all)\/themes\/|<style[^>]+sites\/(default|all)\/(themes|modules)\/)/i, headers: { 'X-Drupal-Cache': /.*/, 'Expires': /19 Nov 1978/ } }, + 'Drupal': { cats: { 1: 1 }, html: /(<script [^>]+drupal\.js|jQuery\.extend\(Drupal\.settings, \{|Drupal\.extend\(\{ settings: \{|<link[^>]+sites\/(default|all)\/themes\/|<style[^>]+sites\/(default|all)\/(themes|modules)\/)/i, headers: { 'X-Drupal-Cache': /.*/, 'Expires': /19 Nov 1978/ }, env: /^Drupal$/ }, 'Dynamicweb': { cats: { 1: 1 }, html: /<meta name=("|')generator("|') [^>]+Dynamicweb/i }, 'e107': { cats: { 1: 1 }, html: /<script [^>]+e107\.js/i }, 'ExtJS': { cats: { 1: 12 }, html: /<script[^>]* src=("|')[^>]*ext\-base\.js("|')/i, env: /^Ext$/ }, @@ -77,7 +80,7 @@ if ( typeof wappalyzer != 'undefined' ) { 'Flyspray': { cats: { 1: 13 }, html: /(<a[^>]+>Powered by Flyspray|<map id=("|')projectsearchform)/ }, 'FrontPage': { cats: { 1: 20 }, html: /(<meta name=("|')GENERATOR("|') [^>]+Microsoft FrontPage|<html[^>]+urn:schemas\-microsoft\-com:office:office)/i }, 'Get Satisfaction': { cats: { 1: 13 }, html: /var feedback_widget = new GSFN\.feedback_widget\(feedback_widget_options\)/ }, - 'Google Analytics': { cats: { 1: 10 }, html: /(\.google\-analytics\.com\/ga\.js|<script src=("|')[^"]+google-analytics\.com\/urchin\.js("|'))/i }, + 'Google Analytics': { cats: { 1: 10 }, html: /(\.google\-analytics\.com\/ga\.js|<script src=("|')[^"]+google-analytics\.com\/urchin\.js("|'))/i, env: /^gaGlobal$/ }, 'Google Font API': { cats: { 1: 17 }, html: /<link[^>]* href=("|')http:\/\/fonts\.googleapis\.com/ }, 'Google Friend Connect': { cats: { 1: 5 }, html: /<script[^>]* src=("|')[^>]*google.com\/friendconnect/i }, 'Google Maps': { cats: { 1: 5 }, html: /(<script[^>]* src=("|')[^>]*maps\.google\.com\/maps\?file=api|maps\.google\.com\/maps\/api\/staticmap)/i }, @@ -112,6 +115,7 @@ if ( typeof wappalyzer != 'undefined' ) { 'Microsoft SharePoint': { cats: { 1: 1 }, html: /<meta name=("|')generator("|') [^>]+Microsoft SharePoint/i, headers: { 'MicrosoftSharePointTeamServices': /.*/, 'X-SharePointHealthScore': /.*/, 'SPRequestGuid': /.*/ } }, 'MiniBB': { cats: { 1: 2 }, html: /<a href=("|')[^>]+minibb.+\s+<!--End of copyright link/i }, 'Mint': { cats: { 1: 10 }, html: /<script[^>]* src=("|')[^>]*mint\/\?js/i }, + 'Mixpanel': { cats: { 1: 10 }, html: /<script[^>]* src=("|')[^>]*api\.mixpanel\.com\/track/i }, 'MochiKit': { cats: { 1: 12 }, html: /<script[^>]* src=("|')[^>]*MochiKit\.js/i, env: /^MochiKit$/ }, 'Modernizr': { cats: { 1: 12 }, html: /<script[^>]* src=("|')[^>]*modernizr[^>]*\.js/i }, 'MODx': { cats: { 1: 1 }, html: /(<a[^>]+>Powered by MODx<\/a>|var el= \$\('modxhost'\);|<script type=("|')text\/javascript("|')>var MODX_MEDIA_PATH = "media";)/i }, @@ -122,6 +126,7 @@ if ( typeof wappalyzer != 'undefined' ) { 'Movable Type': { cats: { 1: 1 }, html: /<meta name=("|')generator("|') [^>]+Movable Type/i }, 'MyBB': { cats: { 1: 2 }, html: /(<script [^>]+\s+<!--\s+lang\.no_new_posts|<a[^>]* title=("|')Powered By MyBB)/i }, 'MyBlogLog': { cats: { 1: 5 }, html: /<script[^>]* src=("|')[^>]*pub\.mybloglog\.com/i }, + 'Mynetcap': { cats: { 1: 1 }, html: /<meta name=("|')generator("|') [^>]+Mynetcap/i }, 'Nedstat': { cats: { 1: 10 }, html: /sitestat\(("|')http:\/\/nl\.sitestat\.com/ }, 'Nginx': { cats: { 1: 22 }, headers: { 'Server': /nginx/i } }, 'nopCommerce': { cats: { 1: 6 }, html: /(<!\-\-Powered by nopCommerce|Powered by: <a[^>]+nopcommerce)/i }, @@ -146,7 +151,7 @@ if ( typeof wappalyzer != 'undefined' ) { 'Prestashop': { cats: { 1: 6 }, html: /(<meta name=("|')generator("|') [^>]+PrestaShop|Powered by <a href=("|')[^>]+PrestaShop)/i }, 'Prototype': { cats: { 1: 12 }, html: /<script[^>]* src=("|')[^>]*(prototype|protoaculous)\.js("|')/i, env: /^Prototype$/ }, 'punBB': { cats: { 1: 2 }, html: /Powered by <a href=("|')[^>]+punbb/i }, - 'Quantcast': { cats: { 1: 10 }, html: /<script[^>]* src=("|')http:\/\/edge\.quantserve\.com\/quant\.js("|')>/i }, + 'Quantcast': { cats: { 1: 10 }, html: /<script[^>]* src=("|')http:\/\/edge\.quantserve\.com\/quant\.js("|')>/i, env: /^quantserve$/ }, 'Quick.Cart': { cats: { 1: 6 }, html: /<a href="[^>]+opensolution\.org\/">Powered by/i }, 'reCAPTCHA': { cats: { 1: 16 }, html: /(<div[^>]+id=("|')recaptcha_image|<script[^>]+ src=("|')(api\-secure\.recaptcha\.net|recaptcha_ajax\.js))/ }, 'Reddit': { cats: { 1: 2 }, html: /(<script[^>]+>var reddit = {|<a[^>]+Powered by Reddit|powered by <a[^>]+>reddit<)/i, url: /^(www.)?reddit\.com/ }, diff --git a/chrome/content/content.js b/chrome/content/content.js index 459a0a5e1..4058c4b42 100644 --- a/chrome/content/content.js +++ b/chrome/content/content.js @@ -1,5 +1,6 @@ (function() { self = { + element: false, prevUrl: '', init: function() { @@ -65,10 +66,31 @@ try { var element = content.document.createElement('wappalyzerData'); - element.setAttribute('id', 'wappalyzerData'); + element.setAttribute('id', 'wappalyzerData'); + element.setAttribute('style', 'display: none'); + + content.document.documentElement.appendChild(element); + + content.location.href = 'javascript:' + + '(function() {' + + 'try {' + + 'var event = document.createEvent("Events");' + + + 'event.initEvent("wappalyzerEvent", true, false);' + + + 'var environmentVars = "";' + + + 'for ( var i in window ) environmentVars += i + " ";' + + + 'document.getElementById("wappalyzerData").appendChild(document.createComment(environmentVars));' + + + 'document.getElementById("wappalyzerData").dispatchEvent(event);' + + '}' + + 'catch(e) { }' + + '})();'; element.addEventListener('wappalyzerEvent', (function(event) { - environmentVars = event.target.innerHTML.split(' '); + environmentVars = event.target.childNodes[0].nodeValue; self.log('getEnvironmentVars: ' + environmentVars); @@ -78,25 +100,9 @@ href: content.document.location.href, html: content.document.documentElement.innerHTML, headers: [], - environmentVars: environmentVars + environmentVars: environmentVars.split(' ') }); }), true); - - content.document.documentElement.appendChild(element); - - content.location.href = 'javascript:' + - '(function() {' + - 'try {' + - 'for ( i in window ) {' + - 'window.document.getElementById("wappalyzerData").innerHTML += i + " ";' + - '}' + - - 'var event = document.createEvent("Events");' + 'event.initEvent("wappalyzerEvent", true, false);' + - - 'document.getElementById("wappalyzerData").dispatchEvent(event);' + - '}' + - 'catch(e) { }' + - '})();'; } catch(e) { } @@ -105,4 +111,6 @@ } self.init(); + + return app; })(); diff --git a/chrome/content/options.xul b/chrome/content/options.xul index cc37f8bd5..dba4fa01d 100755 --- a/chrome/content/options.xul +++ b/chrome/content/options.xul @@ -16,9 +16,9 @@ <prefpane label="&wappalyzer.options;"> <preferences> <preference id="wappalyzer-location" name="wappalyzer.location" type="int" /> - <preference id="wappalyzer-auto-detect" name="wappalyzer.autoDetect" type="bool" /> <preference id="wappalyzer-enable-tracking" name="wappalyzer.enableTracking" type="bool" /> <preference id="wappalyzer-show-apps" name="wappalyzer.showApps" type="int" /> + <preference id="wappalyzer-popup" name="wappalyzer.popupOnHover" type="bool" /> <preference id="wappalyzer-custom-apps" name="wappalyzer.customApps" type="string"/> <preference id="wappalyzer-cat1" name="wappalyzer.cat1" type="bool" /> <preference id="wappalyzer-cat2" name="wappalyzer.cat2" type="bool" /> @@ -87,6 +87,19 @@ </menulist> </hbox> </row> + <row> + <hbox align="center"> + <label control="wappalyzer-popup" value="&wappalyzer.popupOnHover;:"/> + </hbox> + <hbox align="center"> + <menulist preference="wappalyzer-popup" id="wappalyzer-popup"> + <menupopup> + <menuitem label="&wappalyzer.onHover;" value="true" /> + <menuitem label="&wappalyzer.onClick;" value="false"/> + </menupopup> + </menulist> + </hbox> + </row> </rows> </grid> diff --git a/chrome/content/wappalyzer.js b/chrome/content/wappalyzer.js index c4424d38b..d0b27022d 100644 --- a/chrome/content/wappalyzer.js +++ b/chrome/content/wappalyzer.js @@ -4,7 +4,6 @@ var wappalyzer = (function() { self = { apps: {}, appsDetected: 0, - autoDetect: true, browser: false, cats: {}, checkUnique: {}, @@ -17,6 +16,7 @@ var wappalyzer = (function() { homeUrl: 'http://wappalyzer.com/', hoverTimeout: false, newInstall: false, + popupOnHover: true, prevUrl: '', prefs: {}, regexBlacklist: /(dev\.|\/admin|\.local)/, @@ -26,6 +26,7 @@ var wappalyzer = (function() { showApps: 1, showCats: [], strings: {}, + twitterUrl: 'https://twitter.com/Wappalyzer', version: '', init: function() { @@ -42,10 +43,10 @@ var wappalyzer = (function() { self.prefs.addObserver('', wappalyzer, false); self.showApps = self.prefs.getIntPref( 'showApps'); - self.autoDetect = self.prefs.getBoolPref('autoDetect'); self.customApps = self.prefs.getCharPref('customApps'); self.debug = self.prefs.getBoolPref('debug'); self.enableTracking = self.prefs.getBoolPref('enableTracking'); + self.popupOnHover = self.prefs.getBoolPref('popupOnHover'); self.newInstall = self.prefs.getBoolPref('newInstall'); self.version = self.prefs.getCharPref('version'); @@ -57,28 +58,28 @@ var wappalyzer = (function() { self.moveLocation(locationPref); - // Open page after upgrade - try { - var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); + // Open page after installation + if ( self.newInstall ) { + self.prefs.setBoolPref('newInstall', false); - var enabledItems = prefs.getCharPref('extensions.enabledAddons'); - var version = enabledItems.replace(/(^.*wappalyzer[^:]+:)([^,]+),.*$/, '$2'); + gBrowser.addEventListener('DOMContentLoaded', self.installSuccess, false); + } else { + // Open page after upgrade + try { + var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); - if ( version && self.version != version ) { - self.browser.addEventListener('load', self.upgradeSuccess, false); + var enabledItems = prefs.getCharPref('extensions.enabledAddons'); + var version = enabledItems.replace(/(^.*wappalyzer[^:]+:)([^,]+),.*$/, '$2'); - self.version = version; + if ( version && self.version != version ) { + gBrowser.addEventListener('DOMContentLoaded', self.upgradeSuccess, false); - self.prefs.setCharPref('version', self.version); - } - } - catch(e) { } + self.version = version; - // Open page after installation - if ( self.newInstall ) { - self.prefs.setBoolPref('newInstall', false); - - self.browser.addEventListener('load', self.installSuccess, false); + self.prefs.setCharPref('version', self.version); + } + } + catch(e) { } } // Listen messages sent from the content process @@ -113,10 +114,6 @@ var wappalyzer = (function() { } switch(data) { - case 'autoDetect': - self.autoDetect = self.prefs.getBoolPref('autoDetect'); - - break; case 'customApps': self.customApps = self.prefs.getCharPref('customApps'); @@ -128,6 +125,12 @@ var wappalyzer = (function() { case 'enableTracking': self.enableTracking = self.prefs.getBoolPref('enableTracking'); + break; + case 'popupOnHover': + self.popupOnHover = self.prefs.getBoolPref('popupOnHover'); + + self.moveLocation(); + break; case 'showApps': self.showApps = self.prefs.getIntPref('showApps'); @@ -192,6 +195,16 @@ var wappalyzer = (function() { var e = document.getElementById(containerId); var container = document.getElementById('wappalyzer-container'); + if ( self.popupOnHover ) { + container.addEventListener('mouseover', function() { + self.hoverTimeout = setTimeout(function() { + document.getElementById('wappalyzer-apps').openPopup(document.getElementById('wappalyzer-container'), 'after_end'); + }, 200); + }, false); + + container.addEventListener('mouseout', function() { clearTimeout(self.hoverTimeout); }, false); + } + e.appendChild(container); }, @@ -210,8 +223,7 @@ var wappalyzer = (function() { target.documentElement.innerHTML, [], [], - true, - false + true ); }, @@ -224,8 +236,7 @@ var wappalyzer = (function() { message.json.html, message.json.headers, message.json.environmentVars, - true, - false + true ); }, @@ -246,7 +257,6 @@ var wappalyzer = (function() { doc.documentElement ? doc.documentElement.innerHTML : '', [], [], - false, false ); }, @@ -284,7 +294,7 @@ var wappalyzer = (function() { onSecurityChange: function(a, b, c) {} }, - analyzePage: function(doc, href, html, headers, environmentVars, doCount, manualDetect) { + analyzePage: function(doc, href, html, headers, environmentVars, doCount) { self.log('analyzePage'); self.currentTab = false; @@ -303,83 +313,81 @@ var wappalyzer = (function() { html = ''; } - if ( self.autoDetect || ( !self.autoDetect && manualDetect ) ) { - // Prevent large documents from slowing things down - if ( html.length > 50000 ) { - html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length); - } + // Prevent large documents from slowing things down + if ( html.length > 50000 ) { + html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length); + } - // Scan URL, domain and response headers for patterns - if ( html ) { - // Check cached application names - if ( doc && typeof doc.detectedApps != 'undefined' ) { - for ( i in doc.detectedApps ) { - var appName = doc.detectedApps[i]; + // Scan URL, domain and response headers for patterns + if ( html || self.request ) { + // Check cached application names + if ( doc && typeof doc.detectedApps != 'undefined' ) { + for ( i in doc.detectedApps ) { + var appName = doc.detectedApps[i]; - if ( typeof self.checkUnique[appName] == 'undefined' ) { - self.log('CACHE'); // + if ( typeof self.checkUnique[appName] == 'undefined' ) { + self.log('CACHE'); // - self.showApp(appName, doc, href, doCount); + self.showApp(appName, doc, href, doCount); - self.checkUnique[appName] = true; - } + self.checkUnique[appName] = true; } } + } - for ( var appName in self.apps ) { - // Don't scan for apps that have already been detected - if ( typeof self.checkUnique[appName] == 'undefined' ) { - // Scan HTML - if ( typeof self.apps[appName].html != 'undefined' ) { - var regex = self.apps[appName].html; + for ( var appName in self.apps ) { + // Don't scan for apps that have already been detected + if ( typeof self.checkUnique[appName] == 'undefined' ) { + // Scan HTML + if ( html && typeof self.apps[appName].html != 'undefined' ) { + var regex = self.apps[appName].html; - if ( regex.test(html) ) { - self.showApp(appName, doc, href, doCount); - } + if ( regex.test(html) ) { + self.showApp(appName, doc, href, doCount); } + } - // Scan URL - if ( href && typeof self.apps[appName].url != 'undefined' ) { - var regex = self.apps[appName].url; + // Scan URL + if ( href && typeof self.apps[appName].url != 'undefined' ) { + var regex = self.apps[appName].url; - if ( regex.test(href) ) { - self.showApp(appName, doc, href, doCount); - } + if ( regex.test(href) ) { + self.showApp(appName, doc, href, doCount); } + } - // Scan response headers - if ( typeof self.apps[appName].headers != 'undefined' && self.request ) { - for ( var header in self.apps[appName].headers ) { - var regex = self.apps[appName].headers[header]; + // Scan response headers + if ( typeof self.apps[appName].headers != 'undefined' && self.request ) { + for ( var header in self.apps[appName].headers ) { + var regex = self.apps[appName].headers[header]; - try { - if ( regex.test(self.request.nsIHttpChannel.getResponseHeader(header)) ) { - self.showApp(appName, doc, href, doCount); - } + try { + if ( regex.test(self.request.nsIHttpChannel.getResponseHeader(header)) ) { + self.showApp(appName, doc, href, doCount); } - catch(e) { } } + catch(e) { } } + } - // Scan environment variables - if ( environmentVars && typeof self.apps[appName].env != 'undefined' ) { - var regex = self.apps[appName].env; + // Scan environment variables + if ( environmentVars && typeof self.apps[appName].env != 'undefined' ) { + var regex = self.apps[appName].env; - for ( var i in environmentVars ) { - try { - if ( regex.test(environmentVars[i]) ) { - self.showApp(appName, doc, href, doCount); - } + for ( var i in environmentVars ) { + try { + if ( regex.test(environmentVars[i]) ) { + self.showApp(appName, doc, href, doCount); } - catch(e) { } } + catch(e) { } } } } } - - html = ''; // Free memory } + + html = ''; // Free memory }, showApp: function(detectedApp, doc, href, doCount) { @@ -410,38 +418,36 @@ var wappalyzer = (function() { if ( show && self.currentTab ) { var e = document.getElementById('wappalyzer-detected-apps'); - if ( self.autoDetect ) { - if ( self.showApps == 2 ) { - document.getElementById('wappalyzer-icon').setAttribute('src', 'chrome://wappalyzer/skin/icon16x16_hot.ico'); - - document.getElementById('wappalyzer-detected-apps').style.display = 'none'; - } - else { - // Hide Wappalyzer icon - document.getElementById('wappalyzer-icon').style.display = 'none'; + if ( self.showApps == 2 ) { + document.getElementById('wappalyzer-icon').setAttribute('src', 'chrome://wappalyzer/skin/icon16x16_hot.ico'); - document.getElementById('wappalyzer-detected-apps').style.display = ''; - } + document.getElementById('wappalyzer-detected-apps').style.display = 'none'; + } + else { + // Hide Wappalyzer icon + document.getElementById('wappalyzer-icon').style.display = 'none'; - // Show app icon and label - var child = document.createElement('image'); + document.getElementById('wappalyzer-detected-apps').style.display = ''; + } - if ( typeof self.apps[detectedApp].icon == 'string' ) { - child.setAttribute('src', self.apps[detectedApp].icon); - } - else { - child.setAttribute('src', 'chrome://wappalyzer/skin/icons/' + detectedApp + '.ico'); - } + // Show app icon and label + var child = document.createElement('image'); - child.setAttribute('class', 'wappalyzer-icon'); + if ( typeof self.apps[detectedApp].icon == 'string' ) { + child.setAttribute('src', self.apps[detectedApp].icon); + } + else { + child.setAttribute('src', 'chrome://wappalyzer/skin/icons/' + detectedApp + '.ico'); + } - if ( self.appsDetected ) { - child.setAttribute('style', 'margin-left: .5em'); - } + child.setAttribute('class', 'wappalyzer-icon'); - e.appendChild(child); + if ( self.appsDetected ) { + child.setAttribute('style', 'margin-left: .5em'); } + e.appendChild(child); + if ( self.showApps == 0 ) { var child = document.createElement('label'); @@ -622,7 +628,7 @@ var wappalyzer = (function() { installSuccess: function() { self.log('installSuccess'); - self.browser.removeEventListener('load', self.installSuccess, false); + gBrowser.removeEventListener('DOMContentLoaded', self.installSuccess, false); self.openTab(self.homeUrl + 'install/success/'); }, @@ -630,7 +636,7 @@ var wappalyzer = (function() { upgradeSuccess: function() { self.log('upgradeSuccess'); - self.browser.removeEventListener('load', self.upgradeSuccess, false); + gBrowser.removeEventListener('DOMContentLoaded', self.upgradeSuccess, false); self.openTab(self.homeUrl + 'install/upgraded/'); } diff --git a/chrome/content/wappalyzer.xul b/chrome/content/wappalyzer.xul index 5d2b7d6f3..44ba8f8df 100755 --- a/chrome/content/wappalyzer.xul +++ b/chrome/content/wappalyzer.xul @@ -18,8 +18,6 @@ id="wappalyzer-container" context="wappalyzer-menu" popup="wappalyzer-apps" - onmouseover="wappalyzer.hoverTimeout = setTimeout(function() { document.getElementById('wappalyzer-apps').openPopup(document.getElementById('wappalyzer-container'), 'after_end'); }, 200);" - onmouseout="clearTimeout(wappalyzer.hoverTimeout);" > <image id="wappalyzer-icon" @@ -38,6 +36,7 @@ <menuseparator/> <menuitem label="&wappalyzer.donate;" oncommand="wappalyzer.openTab(wappalyzer.homeUrl + 'donate/');"/> <menuitem label="&wappalyzer.feedback;" oncommand="wappalyzer.openTab(wappalyzer.homeUrl + '?redirect=feedback');"/> + <menuitem label="&wappalyzer.twitter;" oncommand="wappalyzer.openTab(wappalyzer.twitterUrl);"/> <menuitem label="&wappalyzer.home;" oncommand="wappalyzer.openTab(wappalyzer.homeUrl);"/> </menupopup> </hbox> diff --git a/chrome/locale/en-US/wappalyzer.dtd b/chrome/locale/en-US/wappalyzer.dtd index c63be672d..2ed67d872 100755 --- a/chrome/locale/en-US/wappalyzer.dtd +++ b/chrome/locale/en-US/wappalyzer.dtd @@ -11,7 +11,11 @@ <!ENTITY wappalyzer.labels "Icons, text and popup"> <!ENTITY wappalyzer.icons "Icons and popup"> <!ENTITY wappalyzer.popup "Popup only"> +<!ENTITY wappalyzer.popupOnHover "Show popup"> +<!ENTITY wappalyzer.onHover "On hover and click"> +<!ENTITY wappalyzer.onClick "On click only"> <!ENTITY wappalyzer.categories "Categories"> +<!ENTITY wappalyzer.twitter "Twitter"> <!ENTITY wappalyzer.home "Go to Wappalyzer"> <!ENTITY wappalyzer.privacy "Privacy"> <!ENTITY wappalyzer.donate "Donate"> diff --git a/chrome/skin/icons/Apache Tomcat.ico b/chrome/skin/icons/Apache Tomcat.ico new file mode 100644 index 000000000..4a498f745 Binary files /dev/null and b/chrome/skin/icons/Apache Tomcat.ico differ diff --git a/chrome/skin/icons/Cherokee.ico b/chrome/skin/icons/Cherokee.ico new file mode 100644 index 000000000..402bfff9f Binary files /dev/null and b/chrome/skin/icons/Cherokee.ico differ diff --git a/chrome/skin/icons/DHTMLX.ico b/chrome/skin/icons/DHTMLX.ico new file mode 100644 index 000000000..d24acaa1b Binary files /dev/null and b/chrome/skin/icons/DHTMLX.ico differ diff --git a/chrome/skin/icons/Mixpanel.ico b/chrome/skin/icons/Mixpanel.ico new file mode 100644 index 000000000..4a25cfeed Binary files /dev/null and b/chrome/skin/icons/Mixpanel.ico differ diff --git a/chrome/skin/icons/Mynetcap.ico b/chrome/skin/icons/Mynetcap.ico new file mode 100644 index 000000000..c153eff66 Binary files /dev/null and b/chrome/skin/icons/Mynetcap.ico differ diff --git a/defaults/preferences/defaults.js b/defaults/preferences/defaults.js index bc5588c57..97a91f546 100644 --- a/defaults/preferences/defaults.js +++ b/defaults/preferences/defaults.js @@ -6,6 +6,7 @@ pref('wappalyzer.newInstall', true); pref('wappalyzer.showApps', 1); pref('wappalyzer.customApps', ''); pref('wappalyzer.version', ''); +pref('wappalyzer.popupOnHover', true); pref('wappalyzer.cat1', true); pref('wappalyzer.cat2', true); diff --git a/install.rdf b/install.rdf index 019bc6dd3..2a0eb4572 100644 --- a/install.rdf +++ b/install.rdf @@ -1,11 +1,9 @@ <?xml version="1.0"?> -<!--DOCTYPE overlay SYSTEM "chrome://wappalyzer/locale/overlay.dtd"--> - <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#"> <Description about="urn:mozilla:install-manifest"> <em:id>wappalyzer@crunchlabz.com</em:id> - <em:version>1.15.2</em:version> + <em:version>1.16.0</em:version> <em:type>2</em:type> <em:unpack>true</em:unpack> diff --git a/wappalyzer.xpi b/wappalyzer.xpi index 9bc0a63d2..b882fc1db 100644 Binary files a/wappalyzer.xpi and b/wappalyzer.xpi differ