RetroZilla/xpfe/components/related/resources/related-panel.js
2015-10-20 23:03:22 -04:00

246 lines
7.4 KiB
JavaScript

/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is from Alexa Internet (www.alexa.com).
*
* The Initial Developer of the Original Code is
* Alexa Internet.
* Portions created by the Initial Developer are Copyright (C) 2000
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/*
Code for the Related Links Sidebar Panel
*/
var kUnknownReasonUrl = 'about:blank';
var kMAMIUrl = 'http://xslt.alexa.com/data?cli=17&dat=nsa';
var kNoHTTPReasonUrl = kMAMIUrl + 'req_type=secure_intranet';
var kSkipDomainReasonUrl = kMAMIUrl + 'req_type=blocked_list';
var kDataPrefixUrl = kMAMIUrl;
var oNavObserver = null;
// Our observer of Navigation Messages
function NavObserver(oDisplayFrame,oContentWindow)
{
this.m_oDisplayFrame = oDisplayFrame;
this.m_oContentWindow = oContentWindow;
this.m_sWindowID = ''+parseInt(Math.random()*32767);
this.m_sLastDataUrl = 'about:blank'; // The last url that we drove our display to.
}
NavObserver.prototype.observe =
function (oSubject, sMessage, sContextUrl)
{
try {
if (oSubject != this.m_oContentWindow) {
// only pay attention to our client window.
return;
}
var bReferrer = (this.m_oContentWindow.document.referrer)?true:false;
if ((sMessage == 'EndDocumentLoad')
&& (sContextUrl != this.m_oContentWindow.location)) {
// we were redirected...
sContextUrl = '' + this.m_oContentWindow.location;
bReferrer = true;
}
this.TrackContext(sContextUrl, bReferrer);
} catch(ex) {
}
}
NavObserver.prototype.GetCDT =
function (bReferrer)
{
var sCDT = '';
sCDT += 't=' +(bReferrer?'1':'0');
sCDT += '&pane=nswr6';
sCDT += '&wid='+this.m_sWindowID;
return encodeURIComponent(sCDT);
}
NavObserver.prototype.TrackContext =
function (sContextUrl, bReferrer)
{
if (sContextUrl != this.m_sLastContextUrl && this.m_oDisplayFrame) {
var sDataUrl = this.TranslateContext(sContextUrl,bReferrer);
this.m_oDisplayFrame.setAttribute('src', sDataUrl);
this.m_sLastContextUrl = sContextUrl;
}
}
NavObserver.prototype.TranslateContext =
function (sUrl, bReferrer)
{
if (!sUrl || ('string' != typeof(sUrl))
|| ('' == sUrl) || sUrl == 'about:blank') {
return kUnknownReasonUrl;
}
// Strip off any query strings (Don't want to be too nosy).
var nQueryPart = sUrl.indexOf('?');
if (nQueryPart != 1) {
sUrl = sUrl.slice(0, nQueryPart);
}
// We can only get related links data on HTTP URLs
if (0 != sUrl.indexOf("http://")) {
return kNoHTTPReasonUrl;
}
// ...and non-intranet sites(those that have a '.' in the domain)
var sUrlSuffix = sUrl.substr(7); // strip off "http://" prefix
var nFirstSlash = sUrlSuffix.indexOf('/');
var nFirstDot = sUrlSuffix.indexOf('.');
if (-1 == nFirstDot)
return kNoHTTPReasonUrl;
if ((nFirstSlash < nFirstDot) && (-1 != nFirstSlash))
return kNoHTTPReasonUrl;
// url is http, non-intranet url: see if the domain is in their blocked list.
var nPortOffset = sUrlSuffix.indexOf(":");
var nDomainEnd = (((nPortOffset >=0) && (nPortOffset <= nFirstSlash))
? nPortOffset : nFirstSlash);
var sDomain = sUrlSuffix;
if (-1 != nDomainEnd) {
sDomain = sUrlSuffix.substr(0,nDomainEnd);
}
if (DomainInSkipList(sDomain)) {
return kSkipDomainReasonUrl;
} else {
// ok! it is a good url!
var sFinalUrl = kDataPrefixUrl;
sFinalUrl += 'cdt='+this.GetCDT(bReferrer);
sFinalUrl += '&url='+sUrl;
return sFinalUrl;
}
}
function DomainInSkipList(sDomain)
{
var bSkipDomainFlag = false;
if ('/' == sDomain[sDomain.length - 1]) {
sDomain = sDomain.substring(0, sDomain.length - 1);
}
try {
var pref = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
var sDomainList = pref.getCharPref("browser.related.disabledForDomains");
if ((sDomainList) && (sDomainList != "")) {
var aDomains = sDomainList.split(",");
// split on commas
for (var x=0; x < aDomains.length; x++) {
var sDomainCopy = sDomain;
var sTestDomain = aDomains[x];
if ('*' == sTestDomain[0]) { // wildcard match
// strip off the asterisk
sTestDomain = sTestDomain.substring(1);
if (sDomainCopy.length > sTestDomain.length) {
var sDomainIndex = sDomain.length - sTestDomain.length;
sDomainCopy = sDomainCopy.substring(sDomainIndex);
}
}
if (0 == sDomainCopy.lastIndexOf(sTestDomain)) {
bSkipDomainFlag = true;
break;
}
}
}
} catch(ex) {
}
return(bSkipDomainFlag);
}
function Init()
{
// Initialize the Related Links panel
// Install our navigation observer so we can track the main client window.
oContentWindow = window.content;
oFrame = document.getElementById('daFrame');
if (oContentWindow && oFrame) {
var oObserverService = Components.classes["@mozilla.org/observer-service;1"].getService();
oObserverService = oObserverService.QueryInterface(Components.interfaces.nsIObserverService);
oNavObserver = new NavObserver(oFrame,oContentWindow);
oNavObserver.TrackContext(''+oContentWindow.location);
if (oObserverService && oNavObserver) {
oObserverService.addObserver(oNavObserver, "StartDocumentLoad", false);
oObserverService.addObserver(oNavObserver, "EndDocumentLoad", false);
oObserverService.addObserver(oNavObserver, "FailDocumentLoad", false);
} else {
oNavObserver = null;
dump("FAILURE to get observer service\n");
}
}
}
function Destruct()
{
// remove our navigation observer.
var oObserverService = Components.classes["@mozilla.org/observer-service;1"].getService();
oObserverService = oObserverService.QueryInterface(Components.interfaces.nsIObserverService);
if (oObserverService && oNavObserver) {
oObserverService.removeObserver(oNavObserver, "StartDocumentLoad");
oObserverService.removeObserver(oNavObserver, "EndDocumentLoad");
oObserverService.removeObserver(oNavObserver, "FailDocumentLoad");
oNavObserver = null;
} else {
dump("FAILURE to get observer service\n");
}
}
addEventListener("load", Init, false);
addEventListener("unload", Destruct, false);