mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-08 04:27:37 +00:00
766d404cfe
r=neil sr=dveditz
246 lines
7.4 KiB
JavaScript
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);
|