home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 December / PCWorld_2005-12_cd.bin / komunikace / netscape / nsb-install-8-0.exe / chrome / browser.jar / content / browser / browser.js < prev    next >
Text File  |  2005-09-26  |  289KB  |  9,000 lines

  1.  
  2. const NS_ERROR_MODULE_NETWORK = 2152398848;
  3. const NS_NET_STATUS_READ_FROM = NS_ERROR_MODULE_NETWORK + 8;
  4. const NS_NET_STATUS_WROTE_TO  = NS_ERROR_MODULE_NETWORK + 9;
  5. const kXULNS = 
  6.     "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  7. const XHTML_NS = "http://www.w3.org/1999/xhtml";  
  8.  
  9. const nsCI               = Components.interfaces;
  10. const nsIWebNavigation   = nsCI.nsIWebNavigation;
  11. const nsIHTMLPluginDocument = Components.interfaces.nsIHTMLPluginDocument;
  12. const PRINT_PREVIEW_REQ_WHILE_TRIDENT_LOADING_ERROR = 0;
  13. const PRINT_REQ_WHILE_TRIDENT_LOADING_ERROR = 1;
  14.  
  15. const MAX_HISTORY_MENU_ITEMS = 15;
  16.  
  17. var gRDF = null;
  18. var gGlobalHistory = null;
  19. var gURIFixup = null;
  20. var gPageStyleButton = null;
  21. var gLivemarksButton = null;
  22. var gCharsetMenu = null;
  23. var gLastBrowserCharset = null;
  24. var gPrevCharset = null;
  25. var gURLBar = null;
  26. var gProxyButton = null;
  27. var gProxyFavIcon = null;
  28. var gProxyDeck = null;
  29. var gNavigatorBundle = null;
  30. var gIsLoadingBlank = false;
  31. var gLastValidURLStr = "";
  32. var gLastValidURL = null;
  33. var gHaveUpdatedToolbarState = false;
  34. var gClickSelectsAll = false;
  35. var gIgnoreFocus = false;
  36. var gIgnoreClick = false;
  37. var gMustLoadSidebar = false;
  38. var gProgressMeterPanel = null;
  39. var gProgressCollapseTimer = null;
  40. var gPrefService = null;
  41. var appCore = null;
  42. var gBrowser = null;
  43. var gSidebarCommand = "";
  44. var gReportButton = null;
  45.  
  46. // Global variable that holds the nsContextMenu instance.
  47. var gContextMenu = null;
  48.  
  49. var gChromeState = null; // chrome state before we went into print preview
  50.  
  51. var gFormFillPrefListener = null;
  52. var gFormHistory = null;
  53. var gFormFillEnabled = true;
  54.  
  55. var gURLBarAutoFillPrefListener = null;
  56.  
  57. var afDataMgr = null;
  58. var gOptout = null;
  59.  
  60. var isButtonToggle = true;
  61.  
  62.  
  63. function showStack() {
  64.     dump("\n STACK DUMP: \n");
  65.     try {
  66.         var borkbork = 1 / 0;
  67.         var foobar;
  68.         foobar.Cannibal;
  69.         throw "foobar";
  70.     } catch (e){
  71.         dump(e.stack);
  72.     }
  73. }
  74.  
  75.  
  76. /**
  77. * We can avoid adding multiple load event listeners and save some time by adding
  78. * one listener that calls all real handlers.
  79. */
  80.  
  81. function loadEventHandlers(event)
  82. {
  83.     // Filter out events that are not about the document load we are interested in
  84.     if (event.originalTarget == _content.document) {
  85.         try {
  86.             UpdateInternetSearchResults(event); // MERC JA migration ff5->vulpine
  87.         } catch (ex) { }
  88.         checkForDirectoryListing();
  89.         charsetLoadListener(event);
  90.         updatePageLivemarks();
  91.     }
  92.  
  93.     // some event handlers want to be told what the original browser/listener is
  94.     var targetBrowser = null;
  95.     var targetListener = null;
  96.     if (gBrowser.mTabbedMode) {
  97.         var targetBrowserIndex = gBrowser.getBrowserIndexForDocument(event.originalTarget);
  98.         if (targetBrowserIndex == -1)
  99.             return;
  100.  
  101.         targetBrowser = gBrowser.getBrowserAtIndex(targetBrowserIndex);
  102.         targetListener = gBrowser.mTabListeners[targetBrowserIndex];
  103.     } else {
  104.         targetBrowser = gBrowser.mCurrentBrowser;
  105.         targetListener = null;      // no listener for non-tabbed-mode
  106.     }
  107.  
  108.     updatePageFavIcon(targetBrowser, targetListener);
  109.  
  110.     // update the last visited date
  111.     if (targetBrowser.currentURI.spec)
  112.         BMSVC.updateLastVisitedDate(targetBrowser.currentURI.spec,
  113.                                     targetBrowser.contentDocument.characterSet);
  114. }
  115.  
  116. /**
  117. * Determine whether or not the content area is displaying a page with frames,
  118. * and if so, toggle the display of the 'save frame as' menu item.
  119. **/
  120. function getContentAreaFrameCount()
  121. {
  122.     var iDF = false;
  123.     try
  124.     {
  125.         iDF = isDocumentFrame(document.commandDispatcher.focusedWindow);
  126.     }
  127.     catch(e) { dump ("Caught Exception: " + e + "\n");}
  128.  
  129.     var saveFrameItem = document.getElementById("menu_saveFrame");
  130.     if (!content || !_content.frames.length || !iDF)
  131.     saveFrameItem.setAttribute("hidden", "true");
  132. else
  133.     saveFrameItem.removeAttribute("hidden");
  134. }
  135.  
  136. //////////////////////////////// BOOKMARKS ////////////////////////////////////
  137.  
  138. function UpdateBookmarksLastVisitedDate(event)
  139. {
  140.     var url = getWebNavigation().currentURI.spec;
  141.     if (url) {
  142.         // if the URL is bookmarked, update its "Last Visited" date
  143.         BMSVC.updateLastVisitedDate(url, _content.document.characterSet);
  144.     }
  145. }
  146.  
  147. function HandleBookmarkIcon(iconURL, addFlag)
  148. {
  149.     var url = getWebNavigation().currentURI.spec
  150.     if (url) {
  151.         // update URL with new icon reference
  152.         if (addFlag) {
  153.             // MERC: TODO: ccampbell: This function call should not use nulls.
  154.             // Unfortunately the function spec changed between foxforce5 and vulpine
  155.             // so we will need to do more here in order for this to work properly...
  156.             // See bookmarks.js for example usage.
  157.             if (BMSVC) BMSVC.updateBookmarkIcon(url, null, null, 0);
  158.         } else {
  159.             if (BMSVC) BMSVC.removeBookmarkIcon(url);
  160.         }
  161.     }
  162. }
  163.  
  164. function UpdateBackForwardButtons()
  165. {
  166.     var backBroadcaster = document.getElementById("Browser:Back");
  167.     var forwardBroadcaster = document.getElementById("Browser:Forward");
  168.  
  169.     var webNavigation = gBrowser.webNavigation;
  170.  
  171.     // Avoid setting attributes on broadcasters if the value hasn't changed!
  172.     // Remember, guys, setting attributes on elements is expensive!  They
  173.     // get inherited into anonymous content, broadcast to other widgets, etc.!
  174.     // Don't do it if the value hasn't changed! - dwh
  175.  
  176.     var backDisabled = backBroadcaster.hasAttribute("disabled");
  177.     var forwardDisabled = forwardBroadcaster.hasAttribute("disabled");
  178.     if (backDisabled == webNavigation.canGoBack) {
  179.         if (backDisabled)
  180.         backBroadcaster.removeAttribute("disabled");
  181.     else
  182.         backBroadcaster.setAttribute("disabled", true);
  183.     }
  184.  
  185.     if (forwardDisabled == webNavigation.canGoForward) {
  186.         if (forwardDisabled)
  187.         forwardBroadcaster.removeAttribute("disabled");
  188.     else
  189.         forwardBroadcaster.setAttribute("disabled", true);
  190.     }
  191. }
  192.  
  193. // MERC - JCH : changed pageReport to removePRIcon to check for icon display
  194. function UpdatePageReport(event)
  195. {
  196.     if (!gReportButton)
  197.         gReportButton = document.getElementById("page-report-button");
  198.  
  199.  
  200.     if (gBrowser.selectedBrowser.showPageReportIcon) {
  201.  
  202.         gReportButton.setAttribute("blocked", "true");
  203.  
  204.         if (gPrefService && gPrefService.getBoolPref("privacy.popups.firstTime")) {
  205.             displayPageReportFirstTime();
  206.  
  207.             // Now set the pref.
  208.             gPrefService.setBoolPref("privacy.popups.firstTime", "false");
  209.         }
  210.  
  211.         if (gPrefService && gPrefService.getBoolPref("privacy.popups.showBrowserMessage")) {
  212.             displayNotificationBar("popup");
  213.         }
  214.     } else {
  215.         gReportButton.removeAttribute("blocked");
  216.     }
  217. }
  218.  
  219.  
  220.  
  221. const gSessionHistoryObserver = {
  222.     observe: function(subject, topic, data)
  223.     {
  224.         if (topic != "browser:purge-session-history")
  225.             return;
  226.  
  227.         var backCommand = document.getElementById("Browser:Back");
  228.         backCommand.setAttribute("disabled", "true");
  229.         var fwdCommand = document.getElementById("Browser:Forward");
  230.         fwdCommand.setAttribute("disabled", "true");
  231.     }
  232. };
  233.  
  234. const gPopupBlockerObserver = {
  235.     _reportButton: null,
  236.     _kIPM: Components.interfaces.nsIPermissionManager,
  237.  
  238.     onUpdatePageReport: function ()
  239.     {
  240.         if (!this._reportButton)
  241.             this._reportButton = document.getElementById("page-report-button");
  242.  
  243.         if (gBrowser.selectedBrowser.pageReport) {
  244.             this._reportButton.setAttribute("blocked", "true");
  245.             if (gPrefService && gPrefService.getBoolPref("privacy.popups.showBrowserMessage")) {
  246.                 displayNotificationBar("popup");
  247.             }
  248.         }
  249.         else
  250.             this._reportButton.removeAttribute("blocked");
  251.     },
  252.  
  253.     toggleAllowPopupsForSite: function (aEvent)
  254.     {
  255.         var currentURI = gBrowser.selectedBrowser.webNavigation.currentURI;
  256.         var pm = Components.classes["@mozilla.org/permissionmanager;1"]
  257.                            .getService(this._kIPM);
  258.         var shouldBlock = aEvent.target.getAttribute("block") == "true";
  259.         var perm = shouldBlock ? this._kIPM.DENY_ACTION : this._kIPM.ALLOW_ACTION;
  260.         pm.add(currentURI, "popup", perm);
  261.  
  262.         hideNotificationBar("popup", gBrowser);
  263.         // gBrowser.hideMessage(gBrowser.selectedBrowser, "top");
  264.     },
  265.  
  266.     fillPopupList: function (aEvent)
  267.     {
  268.         var bundle_browser = document.getElementById("bundle_browser");
  269.         // XXXben - rather than using |currentURI| here, which breaks down on multi-framed sites
  270.         //          we should really walk the pageReport and create a list of "allow for <host>"
  271.         //          menuitems for the common subset of hosts present in the report, this will
  272.         //          make us frame-safe.
  273.         var uri = gBrowser.selectedBrowser.webNavigation.currentURI;
  274.         var blockedPopupAllowSite = document.getElementById("blockedPopupAllowSite");
  275.         try {
  276.             blockedPopupAllowSite.removeAttribute("hidden");
  277.  
  278.             var pm = Components.classes["@mozilla.org/permissionmanager;1"]
  279.                                .getService(this._kIPM);
  280.             if (pm.testPermission(uri, "popup") == this._kIPM.ALLOW_ACTION) {
  281.                 // Offer an item to block popups for this site, if a whitelist entry exists
  282.                 // already for it.
  283.                 var blockString = bundle_browser.getFormattedString("popupBlock", [uri.host]);
  284.                 blockedPopupAllowSite.setAttribute("label", blockString);
  285.                 blockedPopupAllowSite.setAttribute("block", "true");
  286.             }
  287.         else {
  288.             // Offer an item to allow popups for this site
  289.             var allowString = bundle_browser.getFormattedString("popupAllow", [uri.host]);
  290.             blockedPopupAllowSite.setAttribute("label", allowString);
  291.             blockedPopupAllowSite.removeAttribute("block");
  292.         }
  293.     }
  294.     catch (e) {
  295.         blockedPopupAllowSite.setAttribute("hidden", "true");
  296.     }
  297.  
  298.     var item = aEvent.target.lastChild;
  299.     while (item && item.getAttribute("observes") != "blockedPopupsSeparator") {
  300.         var next = item.previousSibling;
  301.         item.parentNode.removeChild(item);
  302.         item = next;
  303.     }
  304.     var pageReport = gBrowser.selectedBrowser.pageReport;
  305.     if (pageReport && pageReport.length > 0) {
  306.         var blockedPopupsSeparator = document.getElementById("blockedPopupsSeparator");
  307.         blockedPopupsSeparator.removeAttribute("hidden");
  308.         for (var i = 0; i < pageReport.length; ++i) {
  309.             var popupURIspec = pageReport[i].popupWindowURI.spec;
  310.             if (popupURIspec == "" || popupURIspec == "about:blank" ||
  311.                 popupURIspec == uri.spec)
  312.             {
  313.                 continue;
  314.             }
  315.  
  316.             var menuitem = document.createElement("menuitem");
  317.             var label = bundle_browser.getFormattedString("popupShowPopupPrefix",
  318.                                                           [popupURIspec]);
  319.             menuitem.setAttribute("label", label);
  320.             menuitem.setAttribute("requestingWindowURI", pageReport[i].requestingWindowURI.spec);
  321.             menuitem.setAttribute("popupWindowURI", popupURIspec);
  322.             menuitem.setAttribute("popupWindowFeatures", pageReport[i].popupWindowFeatures);
  323.             menuitem.setAttribute("oncommand", "gPopupBlockerObserver.showBlockedPopup(event);");
  324.             aEvent.target.appendChild(menuitem);
  325.         }
  326.     }
  327.     else {
  328.         var blockedPopupsSeparator = document.getElementById("blockedPopupsSeparator");
  329.         blockedPopupsSeparator.setAttribute("hidden", "true");
  330.     }
  331.  
  332.     var blockedPopupDontShowMessage = document.getElementById("blockedPopupDontShowMessage");
  333.     var showMessage = gPrefService.getBoolPref("privacy.popups.showBrowserMessage");
  334.     blockedPopupDontShowMessage.setAttribute("checked", !showMessage);
  335.     if (aEvent.target.localName == "popup")
  336.         blockedPopupDontShowMessage.setAttribute("label", bundle_browser.getString("popupWarningDontShowFromMessage"));
  337.     else
  338.         blockedPopupDontShowMessage.setAttribute("label", bundle_browser.getString("popupWarningDontShowFromStatusbar"));
  339. },
  340.  
  341. _findChildShell: function (aDocShell, aSoughtURI)
  342. {
  343.     var webNav = aDocShell.QueryInterface(Components.interfaces.nsIWebNavigation);
  344.     if (webNav.currentURI.spec == aSoughtURI.spec)
  345.     return aDocShell;
  346.  
  347.     var node = aDocShell.QueryInterface(Components.interfaces.nsIDocShellTreeNode);
  348.     for (var i = 0; i < node.childCount; ++i) {
  349.         var docShell = node.getChildAt(i);
  350.         docShell = this._findChildShell(docShell, aSoughtURI);
  351.         if (docShell)
  352.             return docShell;
  353.     }
  354.     return null;
  355. },
  356.  
  357. showBlockedPopup: function (aEvent)
  358. {
  359.     var requestingWindowURI = Components.classes["@mozilla.org/network/standard-url;1"]
  360.                                         .createInstance(Components.interfaces.nsIURI);
  361.     requestingWindowURI.spec = aEvent.target.getAttribute("requestingWindowURI");
  362.     var popupWindowURI = aEvent.target.getAttribute("popupWindowURI");
  363.     var features = aEvent.target.getAttribute("popupWindowFeatures");
  364.  
  365.     var shell = this._findChildShell(gBrowser.selectedBrowser.docShell,
  366.                                      requestingWindowURI);
  367.     if (shell) {
  368.         var ifr = shell.QueryInterface(Components.interfaces.nsIInterfaceRequestor);
  369.         var dwi = ifr.getInterface(Components.interfaces.nsIDOMWindowInternal);
  370.         // XXXben - nsIDOMPopupBlockedEvent needs to store target, too!
  371.         dwi.open(popupWindowURI, "", features);
  372.     }
  373. },
  374.  
  375. editPopupSettings: function ()
  376. {
  377.     var host = "";
  378.     try {
  379.         var uri = gBrowser.selectedBrowser.webNavigation.currentURI;
  380.         host = uri.host;
  381.     }
  382.     catch (e) { }
  383.  
  384.     var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  385.                        .getService(Components.interfaces.nsIWindowMediator);
  386.     var existingWindow = wm.getMostRecentWindow("exceptions");
  387.     if (existingWindow) {
  388.         existingWindow.setHost(host);
  389.         existingWindow.focus();
  390.     }
  391.     else {
  392.         var params = { blockVisible: false,
  393.                        allowVisible: true,
  394.                        prefilledHost: host,
  395.                        permissionType: "popup" };
  396.         window.openDialog("chrome://browser/content/cookieviewer/CookieExceptions.xul?permission=popup",
  397.                           "_blank", "chrome,modal,resizable=yes", params);
  398.     }
  399. },
  400.  
  401. dontShowMessage: function ()
  402. {
  403.     var showMessage = gPrefService.getBoolPref("privacy.popups.showBrowserMessage");
  404.     var firstTime = gPrefService.getBoolPref("privacy.popups.firstTime");
  405.  
  406.     // If the info message is showing at the top of the window, and the user has never
  407.     // hidden the message before, show an info box telling the user where the info
  408.     // will be displayed.
  409.     if (showMessage && firstTime)
  410.         this._displayPageReportFirstTime();
  411.  
  412.     gPrefService.setBoolPref("privacy.popups.showBrowserMessage", !showMessage);
  413.  
  414.     hideNotificationBar("popup", gBrowser);
  415. },
  416.  
  417. _displayPageReportFirstTime: function ()
  418. {
  419.     window.openDialog("chrome://browser/content/pageReportFirstTime.xul", "_blank",
  420.     "dependent");
  421. }
  422. };
  423.  
  424. const gXPInstallObserver = {
  425.     _findChildShell: function (aDocShell, aSoughtShell)
  426.     {
  427.         if (aDocShell == aSoughtShell)
  428.             return aDocShell;
  429.  
  430.         var node = aDocShell.QueryInterface(Components.interfaces.nsIDocShellTreeNode);
  431.         for (var i = 0; i < node.childCount; ++i) {
  432.             var docShell = node.getChildAt(i);
  433.             docShell = this._findChildShell(docShell, aSoughtShell);
  434.             if (docShell == aSoughtShell)
  435.                 return docShell;
  436.         }
  437.         return null;
  438.     },
  439.  
  440.     _getBrowser: function (aDocShell)
  441.     {
  442.         var tabbrowser = getBrowser();
  443.         for (var i = 0; i < tabbrowser.browsers.length; ++i) {
  444.             var browser = tabbrowser.getBrowserAtIndex(i);
  445.             var soughtShell = aDocShell;
  446.             var shell = this._findChildShell(browser.docShell, soughtShell);
  447.             if (shell)
  448.                 return browser;
  449.         }
  450.         return null;
  451.     },
  452.  
  453.     observe: function (aSubject, aTopic, aData)
  454.     {
  455.         var brandBundle = document.getElementById("bundle_brand");
  456.         var browserBundle = document.getElementById("bundle_browser");
  457.         switch (aTopic) {
  458.         case "xpinstall-install-blocked":
  459.             var shell = aSubject.QueryInterface(Components.interfaces.nsIDocShell);
  460.             browser = this._getBrowser(shell);
  461.             if (browser) {
  462.                 var extraData = new Array();
  463.                 extraData.push(shell);
  464.                 displayNotificationBar("xpi", extraData);
  465.             }
  466.             break;
  467.  
  468.         case "xpinstall-install-edit-prefs":
  469.             var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  470.                                .getService(Components.interfaces.nsIWindowMediator);
  471.             var optionsWindow = wm.getMostRecentWindow("Browser:Options");
  472.             if (optionsWindow) {
  473.                 optionsWindow.focus();
  474.                 optionsWindow.switchPage("catFeaturesbutton");
  475.             }
  476.             else
  477.                 openDialog("chrome://browser/content/pref/pref.xul", "PrefWindow",
  478.                            "chrome,titlebar,resizable,modal", "catFeaturesbutton");
  479.             var tabbrowser = getBrowser();
  480.             // tabbrowser.hideMessage(tabbrowser.selectedBrowser, "top");
  481.             hideNotificationBar("xpi", tabbrowser);
  482.             break;
  483.  
  484.         case "xpinstall-install-edit-permissions":
  485.             var browser = this._getBrowser(aSubject.QueryInterface(Components.interfaces.nsIDocShell));
  486.             if (browser) {
  487.                 var webNav = aSubject.QueryInterface(Components.interfaces.nsIWebNavigation);
  488.                 var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  489.                                    .getService(Components.interfaces.nsIWindowMediator);
  490.                 var existingWindow = wm.getMostRecentWindow("exceptions");
  491.                 if (existingWindow) {
  492.                     existingWindow.setHost(webNav.currentURI.host);
  493.                     existingWindow.focus();
  494.                 }
  495.                 else {
  496.                     var params = { blockVisible:    false,
  497.                     allowVisible:    true,
  498.                     prefilledHost:   webNav.currentURI.host,
  499.                     permissionType:  "install" };
  500.                     window.openDialog("chrome://browser/content/cookieviewer/CookieExceptions.xul?permission=install",
  501.                                       "_blank", "chrome,modal,resizable=yes", params);
  502.                 }
  503.                 var tabbrowser = getBrowser();
  504.                 // tabbrowser.hideMessage(tabbrowser.selectedBrowser, "top");
  505.                 hideNotificationBar("xpi", tabbrowser);
  506.             }
  507.             break;
  508.         }
  509.     }
  510. };
  511.  
  512. function Startup()
  513. {
  514.     dump("Startup()\n");
  515.     gBrowser = document.getElementById("content");
  516.  
  517.     // Allows Trident to update security (SSL) state; see nsHTMLPluginDocument.cpp.
  518.     // We can easily get fields from the window, but not from the browser object.
  519.     window.securityUI = gBrowser.securityUI;
  520.  
  521.     gPrefService = Components.classes["@mozilla.org/preferences-service;1"]
  522.                              .getService(Components.interfaces.nsIPrefBranch);
  523.     
  524.     titlebar.init();
  525.     moveMenubar();
  526.     
  527.     // Mercurial START
  528.     sitecontrols.initServices();
  529.     perfmon.initServices();
  530.     search.Init();
  531.  
  532.     passcardUtilsInit();
  533.  
  534.     // need to set up this observer early to deal with field highlighting in Passcards/Datacards
  535.     var docIsFillable=new docEndObserver();
  536.     var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  537.     os.addObserver(docIsFillable, "EndDocumentLoad", false);
  538.  
  539.     // Mercurial END
  540.  
  541.     var uriToLoad = null;
  542.     // Check for window.arguments[0]. If present, use that for uriToLoad.
  543.     if ("arguments" in window && window.arguments.length >= 1 && window.arguments[0])
  544.         uriToLoad = window.arguments[0];
  545.     // Bug #298255
  546.     try {
  547.         if (makeURL(uriToLoad).schemeIs("chrome")) {
  548.             dump("Preventing external load of chrome: URI\n");
  549.             window.close();
  550.             return;
  551.         }
  552.     } catch(e) {}
  553.  
  554.     // MERC (DP): on first startup of browser, we show the Netscape welcome page
  555.     pref = Components.classes["@mozilla.org/preferences-service;1"]
  556.                      .getService(Components.interfaces.nsIPrefBranch);
  557.     // JMC: Fix this, it causes no pages on startup bug
  558.     var firstTime = pref.getBoolPref("browser.startup.firsttime");
  559.     if (firstTime) {
  560.         uriToLoad = uriToLoad + '|' + pref.getCharPref("browser.startup.welcomepage");
  561.         pref.setBoolPref("browser.startup.firsttime", false);
  562.     }
  563.  
  564.     // MERC (rpaul) if window shaping is define, move the menu to the left and move 
  565.     // the throbber to the right
  566.     
  567.     // read the property from the properties file
  568.     // N.B. for future themers this file should be placed in the theme jar
  569.     var windowShapingBundle = document.getElementById("drawOsBorder");
  570.     var drawOsWindowBorder = windowShapingBundle.getString("ShowOSTitleBar");
  571.     
  572.     if (drawOsWindowBorder) {
  573.         if (drawOsWindowBorder == 1) {
  574.             gPrefService.setBoolPref("browser.menu_in_titlebar", false);
  575.             moveMenubar();
  576.                                                         
  577.             // remove toggle menu bar position from context menu
  578.             var toggleMenuItem = document.getElementById('menuitem_toggleMenuBar');
  579.             if (toggleMenuItem) {
  580.                 document.getElementById('toolbar-context-menu').removeChild(toggleMenuItem);
  581.             }                                        
  582.                                                         
  583.             // remove the throbber from the top-box
  584.             var throbber = document.getElementById('throbber-box');
  585.             if (throbber) {
  586.                 document.getElementById('topstack').removeChild(throbber);
  587.             }
  588.             
  589.         } else {
  590.             // not window shaping, so remove throbber as a toolbar item
  591.             var navBar = document.getElementById('nav-bar');
  592.             if (navBar) {
  593.                     var throbberToolbarItem = document.getElementById('throbber-button');
  594.                     if (throbberToolbarItem) {
  595.                         navBar.removeChild(throbberToolbarItem);
  596.                     
  597.                         // remove from default toolbar set
  598.                         var defaultSet = navBar.getAttribute('defaultset');
  599.                         var strPos;
  600.                         strPos = defaultSet.indexOf('throbber-button');
  601.                         if (strPos != -1) {
  602.                                 navBar.setAttribute('defaultset', defaultSet.substring(0, strPos-1)); 
  603.                         }
  604.                                                             
  605.                     }
  606.             }    
  607.         }    
  608.     } 
  609.     
  610.     gIsLoadingBlank = uriToLoad == "about:blank";
  611.  
  612.     if (!gIsLoadingBlank)
  613.         prepareForStartup();
  614.  
  615.  
  616.     // only load url passed in when we're not page cycling
  617.     if (uriToLoad && !gIsLoadingBlank) {
  618.         if ("arguments" in window && window.arguments.length >= 3)
  619.             loadURI(uriToLoad, window.arguments[2], null);
  620.         else
  621.         {
  622.             loadOneOrMoreURIs(uriToLoad);
  623.             // MERC (DP): select the about tab browsing tab on first time
  624.             if (firstTime)
  625.             {
  626.                 var browserTabs = gBrowser.mTabContainer.childNodes;
  627.                 gBrowser.selectedTab = browserTabs[browserTabs.length - 1];
  628.             }
  629.         }
  630.     }
  631.  
  632.  
  633.         // Determine whether to show the sidebar
  634.         var sidebarBox = document.getElementById("sidebar-box");
  635.         var sidebarSplitter = document.getElementById("sidebar-splitter");
  636.         var sidebarCmd = null;
  637.  
  638.         if (window.opener && !window.opener.closed) {
  639.             if (window.opener.gFindMode == FIND_NORMAL) {
  640.                 var openerFindBar = window.opener.document.getElementById("FindToolbar");
  641.                 if (openerFindBar && !openerFindBar.hidden)
  642.                 openFindBar();
  643.             }
  644.  
  645.             var openerSidebarBox = window.opener.document.getElementById("sidebar-box");
  646.             // The opener can be the hidden window too, if we're coming from the state
  647.             // where no windows are open, and the hidden window has no sidebar box.
  648.             if (openerSidebarBox && !openerSidebarBox.hidden) {
  649.                 sidebarBox.setAttribute("width", openerSidebarBox.boxObject.width);
  650.                 if (openerSidebarBox.hasAttribute("sidebarcommand")) {
  651.                     sidebarCmd = openerSidebarBox.getAttribute("sidebarcommand");
  652.                     sidebarBox.setAttribute("sidebarcommand", sidebarCmd);
  653.                 }
  654.             } else {
  655.                 // The opener sidebar-box is either hidden or non-existent
  656.                 sidebarBox.hidden = true;
  657.                 sidebarSplitter.hidden = true;
  658.             }
  659.         } else {
  660.             // There is no opener
  661.             if (sidebarBox.hasAttribute("sidebarcommand"))
  662.             sidebarCmd = sidebarBox.getAttribute("sidebarcommand");
  663.         }
  664.         if (sidebarCmd) {
  665.             gMustLoadSidebar = true;
  666.             sidebarBox.hidden = false;
  667.             sidebarSplitter.hidden = false;
  668.             document.getElementById(sidebarCmd).setAttribute("checked", "true");
  669.         }
  670.  
  671.         // Certain kinds of automigration rely on this notification to complete their
  672.         // tasks BEFORE the browser window is shown.
  673.         var obs = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  674.         obs.notifyObservers(null, "browser-window-before-show", "");
  675.  
  676.         // Set a sane starting width/height for all resolutions on new profiles.
  677.         if (!document.documentElement.hasAttribute("width")) {
  678.             var defaultWidth = 994, defaultHeight;
  679.             if (screen.availHeight <= 600) {
  680.                 document.documentElement.setAttribute("sizemode", "maximized");
  681.                 defaultWidth = 610;
  682.                 defaultHeight = 450;
  683.             }
  684.         else {
  685.             // Create a narrower window for large or wide-aspect displays, to suggest
  686.             // side-by-side page view.
  687.             if ((screen.availWidth / 2) >= 800)
  688.                 defaultWidth = (screen.availWidth / 2) - 20;
  689.             defaultHeight = screen.availHeight - 10;
  690.         }
  691.         document.documentElement.setAttribute("width", defaultWidth);
  692.         document.documentElement.setAttribute("height", defaultHeight);
  693.     }
  694.  
  695.     // Initialize optout list
  696.     if (!gOptout)
  697.     {
  698.         var optoutInstance = Components.classes['@mozilla.org/optout;1'].getService();
  699.         gOptout = optoutInstance.QueryInterface(Components.interfaces.nsIOptOutService);
  700.         if (!gOptout)
  701.             dump('\nbrowser.js: gOptout has NOT been initialized!\n\n\n');
  702.     }
  703.  
  704.     if (gOptout)
  705.         gOptout.RefreshSiteList();
  706.  
  707.     // update tab chrome
  708.     gBrowser.updateChromeWhenLastTab();
  709.     setTimeout(delayedStartup, 0);
  710. }
  711.  
  712. function prepareForStartup()
  713. {
  714.     dump ("prepareForStartup()\n");
  715.     gURLBar = document.getElementById("urlbar");
  716.     gNavigatorBundle = document.getElementById("bundle_browser");
  717.     gProgressMeterPanel = document.getElementById("statusbar-progresspanel");
  718.     //gBrowser.addEventListener("DOMUpdatePageReport", gPopupBlockerObserver.onUpdatePageReport, false);
  719.     gBrowser.addEventListener("DOMUpdatePageReport", UpdatePageReport, false);
  720.     gBrowser.addEventListener("DOMLinkAdded", livemarkOnLinkAdded, false);
  721.     gBrowser.addEventListener("PluginNotFound", gMissingPluginInstaller.newMissingPlugin, false);
  722.  
  723.     var webNavigation;
  724.     try {
  725.         // Create the browser instance component.
  726.         appCore = Components.classes["@mozilla.org/appshell/component/browser/instance;1"]
  727.         .createInstance(Components.interfaces.nsIBrowserInstance);
  728.         if (!appCore)
  729.         throw "couldn't create a browser instance";
  730.  
  731.         webNavigation = getWebNavigation();
  732.         if (!webNavigation)
  733.         throw "no XBL binding for browser";
  734.     } catch (e) {
  735.         alert("Error launching browser window:" + e);
  736.         window.close(); // Give up.
  737.         return;
  738.     }
  739.  
  740.     // initialize observers and listeners
  741.     // and give C++ access to gBrowser
  742.     window.XULBrowserWindow = new nsBrowserStatusHandler();
  743.     window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  744.     .getInterface(Components.interfaces.nsIWebNavigation)
  745.     .QueryInterface(Components.interfaces.nsIDocShellTreeItem).treeOwner
  746.     .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  747.     .getInterface(Components.interfaces.nsIXULWindow)
  748.     .XULBrowserWindow = window.XULBrowserWindow;
  749.     gBrowser.docShell
  750.     .QueryInterface(nsCI.nsIDocShellTreeItem)
  751.     .rootTreeItem
  752.     .QueryInterface(nsCI.nsIInterfaceRequestor)
  753.     .getInterface(nsCI.nsIDOMWindow)
  754.     .QueryInterface(nsCI.nsIInterfaceRequestor)
  755.     .getInterface(nsCI.nsIDOMWindowUtils)
  756.     .browserDOMWindow = new nsBrowserAccess();
  757.  
  758.     window.browserContentListener =
  759.     new nsBrowserContentListener(window, gBrowser);
  760.  
  761.     // set default character set if provided
  762.     if ("arguments" in window && window.arguments.length > 1 && window.arguments[1]) {
  763.         if (window.arguments[1].indexOf("charset=") != -1) {
  764.             var arrayArgComponents = window.arguments[1].split("=");
  765.             if (arrayArgComponents) {
  766.                 //we should "inherit" the charset menu setting in a new window
  767.                 getMarkupDocumentViewer().defaultCharacterSet = arrayArgComponents[1];
  768.             }
  769.         }
  770.     }
  771.  
  772.     // Initialize browser instance..
  773.     appCore.setWebShellWindow(window);
  774.  
  775.     // Wire up session and global history before any possible
  776.     // progress notifications for back/forward button updating
  777.     webNavigation.sessionHistory = Components.classes["@mozilla.org/browser/shistory;1"]
  778.     .createInstance(Components.interfaces.nsISHistory);
  779.  
  780.     // enable global history
  781.     gBrowser.docShell.QueryInterface(Components.interfaces.nsIDocShellHistory).useGlobalHistory = true;
  782.  
  783.     const selectedBrowser = gBrowser.selectedBrowser;
  784.     if (selectedBrowser.securityUI)
  785.     selectedBrowser.securityUI.init(selectedBrowser.contentWindow);
  786.  
  787.     // hook up UI through progress listener
  788.     gBrowser.addProgressListener(window.XULBrowserWindow, Components.interfaces.nsIWebProgress.NOTIFY_ALL);
  789.  
  790. }
  791.  
  792. //Added by SLiu, for customize bookmarks toolbar
  793. function populateBookmarks()
  794. {
  795.     var bt = document.getElementById("bookmarks-ptf");
  796.     if (bt)
  797.     {
  798.         var btf = BMSVC.getBookmarksToolbarFolder().Value;
  799.         bt.ref = btf;
  800.         document.getElementById("bookmarks-chevron").ref = btf;
  801.         bt.database.AddObserver(BookmarksToolbarRDFObserver);
  802.         bt.controllers.appendController(BookmarksMenuController);
  803.         bt.builder.rebuild();
  804.     }
  805.     var bm = document.getElementById("bookmarks-menu");
  806.     bm.controllers.appendController(BookmarksMenuController);
  807. }
  808.  
  809. function ShowPhishingSiteWarning() {
  810.     displayNotificationBar("phishing");
  811. }
  812. function ShowSpywareSiteWarning() {
  813.     displayNotificationBar("spyware");
  814. }
  815.  
  816. function docEndObserver()
  817. {
  818. }
  819.  
  820. docEndObserver.prototype =
  821. {
  822.     // Data is a URL
  823.     // Subject is ?
  824.     observe: function (subject, topic, data)
  825.     {
  826.         if (topic == "EndDocumentLoad") {
  827.             // dump ("EndDocumentLoad... \n");
  828.             // JMC: Check to attach formfill controller, if required.
  829.             gBrowser.attachFormFill();
  830.             
  831.             // JMC - disabling 404 
  832.             //if (this.checkRoll(subject, data))
  833.             //    return;
  834.             var docType = String(gBrowser.contentDocument.contentType);
  835.             if (docType.indexOf("/xml") > 0)
  836.             {
  837.                 var isRss = true;
  838.                 if (getWebNavigation().currentURI.spec.indexOf(".rdf") > -1) ;
  839.                 else if(getWebNavigation().currentURI.spec.indexOf(".rss") > -1) ;
  840.                 else if(gBrowser.contentDocument.getElementsByTagName('rss').length) ;
  841.                 else if (gBrowser.contentDocument.getElementsByTagNameNS('http://my.netscape.com/rdf/simple/0.9/','channel').length) ; // version 0.9
  842.                 else if (gBrowser.contentDocument.getElementsByTagNameNS('http://purl.org/rss/1.0/','channel').length) ; // version 1.0
  843.                 else if (gBrowser.contentDocument.getElementsByTagNameNS('http://purl.org/atom/ns#draft-ietf-atompub-format-08', 'entry').length) ; // atom version
  844.                 else {
  845.                     isRss = false;
  846.                 }
  847.                 
  848.                 if(isRss) {
  849.                     displayNotificationBar('rss');
  850.                 }
  851.             }
  852.             this.endDocLoad(subject);
  853.         }
  854.     },
  855.  
  856.     checkRoll : function (aWindow, aURL)
  857.     {
  858.             if (aWindow)
  859.             {
  860.                 var titleNodes = gBrowser.contentDocument.getElementsByTagName('title');
  861.                 for (var i=0; i < titleNodes.length; i++)
  862.                 {
  863.                     for (j=0; j < titleNodes.item(i).childNodes.length; j++)
  864.                     {
  865.                         if (titleNodes.item(i).childNodes[j].nodeValue.indexOf("404") > -1)
  866.                         {
  867.             
  868.                             // Find an h2 node with the text 'Error 404'
  869.                             var h2Nodes = gBrowser.contentDocument.getElementsByTagName('h2');
  870.                             dump ("ROLL: Found " + h2Nodes.length + " h2 nodes\n");
  871.                             for (var i=0; i < h2Nodes.length; i++)
  872.                             {
  873.                                 for (j=0; j < h2Nodes.item(i).childNodes.length; j++)
  874.                                 {
  875.                                         if (h2Nodes.item(i).childNodes[j].nodeValue.indexOf("Error 404") > -1)
  876.                                         {
  877.                                             var newURL = gPrefService.getCharPref('browser.redirect404.URL');
  878.                                             newURL += aURL;
  879.                                             loadURI(newURL, null, null);
  880.                                             return true;
  881.                                         }
  882.                                 }
  883.                             }
  884.                             
  885.                             var h1Nodes = gBrowser.contentDocument.getElementsByTagName('h1');
  886.                             for (var i=0; i < h1Nodes.length; i++)
  887.                             {
  888.                                 for (j=0; j < h1Nodes.item(i).childNodes.length; j++)
  889.                                 {
  890.                                     if ((h1Nodes.item(i).childNodes[j].nodeValue.indexOf("Error 404") > -1) ||
  891.                                     (h1Nodes.item(i).childNodes[j].nodeValue == "Not Found"))
  892.                                         {
  893.                                             var newURL = gPrefService.getCharPref('browser.redirect404.URL');
  894.                                             newURL += aURL;
  895.                                             loadURI(newURL, null, null);
  896.                                             return true;
  897.                                         }
  898.                                 }
  899.                             }
  900.                         }
  901.                     }
  902.                 }
  903.             }            
  904.             return false;
  905.         },
  906.  
  907.     endDocLoad : function (aWindow)
  908.     {
  909.         // dump('***** EndDocLoad: gCurrentNotificationBar: ' + gCurrentNotificationBar + '\n');
  910.         // MERC JVL: should not set to null before the message bar can clean itself up
  911.         //gCurrentNotificationBar = null;
  912.     
  913.         if (blacklistUtils.IsSiteInPhishList(gBrowser.currentURI)) {
  914.             displayNotificationBar("phishing",[gBrowser.currentURI]);
  915.             // ShowPhishingSiteWarning();
  916.         } else if (blacklistUtils.IsSiteInSpywareList(gBrowser.currentURI)) {
  917.             displayNotificationBar("spyware",[gBrowser.currentURI]);
  918.         }
  919.  
  920.         // MERC - JCH: When page has finished loading, check for password fields
  921.         // If we invoke the passcard notification bar, don't do the form fill check
  922.         var bIsPasscardable = CheckForPasscardField();
  923.  
  924.         var hpDoc = getTridentDocument();
  925.         if (!hpDoc)
  926.         {
  927.             // TODO JVL : see note in isPasscardHighlight()
  928.             if (bIsPasscardable && isPasscardHighlight() &&
  929.                 !PasscardIsSiteBlacklisted(gBrowser.currentURI))
  930.             {
  931.                 passcardDebug('highlighting in GECKO\n');
  932.                 // highlight passcard fields in the root document,
  933.                 // then the ones in each frame
  934.                 this.highlightPasscardFields(gBrowser.contentDocument);
  935.             }            
  936.         }
  937.         // Check if page datacard fillable
  938.         if (!bIsPasscardable)
  939.             datacardUtils.DoPageLoadedCheck();
  940.     }, // observe
  941.  
  942.     // highlight passcard fields in the current document
  943.     highlightPasscardFields : function (doc)        // JMC/JVL
  944.     {
  945.         if (!doc)
  946.             return;
  947.  
  948.         // highlight if we have a Passcard for the site
  949.         var domain = new Object();
  950.         gPasscardMgr.getDomain(gBrowser.currentURI, domain);
  951.         passcardDebug('HighlightPasscardFields() - host: ' + gBrowser.currentURI.host + ', domain: ' + domain.value + '\n');
  952.         if (!GetFirstPasscardForSite(domain.value))
  953.         {
  954.             var defaultPasscard = GetDefaultPasscard();
  955.             if (!defaultPasscard)
  956.                 return;
  957.  
  958.             // do not highlight if the Default Passcard's
  959.             // username and password fields are blank
  960.             if (defaultPasscard.user.length < 1 ||
  961.                 defaultPasscard.password.length < 1)
  962.             {
  963.                 return;
  964.             }
  965.         }
  966.  
  967.         var kBackgroundColor = "#ffff66";
  968.         var usernameField;
  969.         var tagList = doc.getElementsByTagName('input');
  970.         for (var i = 0; i < tagList.length; i++)
  971.         {
  972.             var tag = tagList.item(i);
  973.             if (tag)
  974.             {
  975.                 if (tag.getAttribute('type') == 'text' ||
  976.                 tag.getAttribute('type') == null)
  977.                 {
  978.                     usernameField = tag;
  979.                 }
  980.  
  981.                 if (tag.getAttribute('type') == 'password')
  982.                 {
  983.                     tag.style.backgroundColor = kBackgroundColor;
  984.  
  985.                     if (usernameField)
  986.                     {
  987.                         usernameField.style.backgroundColor = kBackgroundColor;
  988.                         usernameField = null;
  989.                     }
  990.                 }
  991.             }
  992.         }
  993.  
  994.         this.highlightPasscardFieldsInFrames(doc, 'iframe');
  995.         this.highlightPasscardFieldsInFrames(doc, 'frame');
  996.         this.highlightPasscardFieldsInFrames(doc, 'object');
  997.     },
  998.  
  999.     // highlight passcard fields in each 'frame' ('iframe' and 'object' as well) document
  1000.     highlightPasscardFieldsInFrames : function(doc, elementName)
  1001.     {
  1002.         var iframeElements = doc.getElementsByTagName(elementName);
  1003.         for (var i = 0; i < iframeElements.length; i++)
  1004.         {
  1005.             var iframeElement = iframeElements.item(i);
  1006.             if (iframeElement)
  1007.             {
  1008.                 this.highlightPasscardFields(iframeElement.contentDocument);
  1009.             }
  1010.         }
  1011.     }
  1012. }; // end docEndObserver
  1013.  
  1014.  
  1015. function toggleMenubar()
  1016. {
  1017.     // True = Right, False = Left
  1018.     gPrefService.setBoolPref("browser.menu_in_titlebar", gPrefService.getBoolPref("browser.menu_in_titlebar") != true);
  1019.     moveMenubar();
  1020. }
  1021.  
  1022. function moveMenubar()
  1023. {
  1024.     var mainMenu = document.getElementById('titlebar-menu-stack');
  1025.     var menuSpacer = document.getElementById('titlebar-menu-replacement');
  1026.  
  1027.     if (!gPrefService.getPrefType("browser.menu_in_titlebar")) return;
  1028.  
  1029.     if (gPrefService.getBoolPref("browser.menu_in_titlebar")
  1030.         != (mainMenu.parentNode.localName == 'toolbox')) return;
  1031.  
  1032.     var menuWidth=mainMenu.boxObject.width;
  1033.     mainMenu.parentNode.removeChild(mainMenu);
  1034.     var titlebarContainer = document.getElementById('titlebar-container');
  1035.     if (gPrefService.getBoolPref("browser.menu_in_titlebar")) {
  1036.         // dump(' Moving from toolbox to titlebar\n');
  1037.         if (menuSpacer) menuSpacer.parentNode.removeChild(menuSpacer);
  1038.         titlebarContainer.appendChild(mainMenu);
  1039.         //    document.getElementById('mainMenuPopupBroadcaster').setAttribute('position', 'after_end');
  1040.     } else {
  1041.         // dump(' Moving from titlebar to toolbox\n');
  1042.         var toolbox = document.getElementById('navigator-toolbox');
  1043.         toolbox.insertBefore(mainMenu, toolbox.firstChild);
  1044.         menuSpacer=document.createElement("spacer");
  1045.         menuSpacer.setAttribute("width",menuWidth + "");
  1046.         menuSpacer.setAttribute("id","titlebar-menu-replacement");
  1047.         menuSpacer.setAttribute("class",'titlebar-menu-stack');
  1048.         titlebarContainer.appendChild(menuSpacer);
  1049.         //document.getElementById('mainMenuPopupBroadcaster').setAttribute('position', 'after_start');
  1050.     }
  1051. }
  1052.  
  1053.  
  1054. function delayedStartup()
  1055. {
  1056.     dump ("delayedStartup()\n");
  1057.     var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  1058.     os.addObserver(gSessionHistoryObserver, "browser:purge-session-history", false);
  1059.  
  1060.     // We have to do this because we manually hook up history for the first browser in prepareForStartup
  1061.     os.addObserver(gBrowser.browsers[0], "browser:purge-session-history", false);
  1062.     os.addObserver(gXPInstallObserver, "xpinstall-install-blocked", false);
  1063.     os.addObserver(gXPInstallObserver, "xpinstall-install-edit-prefs", false);
  1064.     os.addObserver(gXPInstallObserver, "xpinstall-install-edit-permissions", false);
  1065.     os.addObserver(gMissingPluginInstaller, "missing-plugin", false);
  1066.  
  1067.     // MERC - JCH : To check if history is cleared
  1068.     if (!gGlobalHistory)
  1069.     gGlobalHistory = Components.classes["@mozilla.org/browser/global-history;2"]
  1070.                                .getService(Components.interfaces.nsIBrowserHistory);
  1071.     SetHistoryButton(); // JMC: Set anonymous mode button state
  1072.     BrowserOffline.init();
  1073.  
  1074.     if (gURLBar && document.documentElement.getAttribute("chromehidden").indexOf("toolbar") != -1) {
  1075.         gURLBar.setAttribute("readonly", "true");
  1076.         gURLBar.setAttribute("enablehistory", "false");
  1077.     }
  1078.  
  1079.     if (gIsLoadingBlank)
  1080.         prepareForStartup();
  1081.  
  1082.     if (gURLBar)
  1083.         gURLBar.addEventListener("dragdrop", URLBarOnDrop, true);
  1084.  
  1085. //    resizeSearchBar(); // JMC Disabled for beta
  1086.     // loads the services
  1087.     initServices();
  1088.  
  1089.     // Initialize SPUI
  1090.     if (spui) {
  1091.         // spui.RefreshComponentList();
  1092.         setTimeout( "spui.RefreshComponentList()", 0);  // this was causing crashes!
  1093.     } else dump('\nbrowser.js: SPUI has NOT been initialized!\n\n\n');
  1094.  
  1095.     initBMService();
  1096.     gBrowser.addEventListener("load", function(evt) { setTimeout(loadEventHandlers, 0, evt); }, true);
  1097.     
  1098.     // JMC - Do this earlier
  1099.     if (window.windowState == window.STATE_MAXIMIZED) {
  1100.         // call it, as we deal with the foxy theme in nsWindow
  1101.         window.maximize();        // MERC - Stevo (removed to fix bug with missing title bar on foxy
  1102.                                 //  theme when closed in maximized state and restarted.
  1103.         document.getElementById('main-window').setAttribute('sizemode', 'maximized');
  1104.         document.getElementById('restoreButtonBroadcaster').tooltipText = 'Restore Down';
  1105.         isButtonToggle = false;
  1106.     }
  1107.     
  1108.     window.addEventListener("keypress", ctrlNumberTabSelection, false);
  1109.     
  1110.     //if (gMustLoadSidebar) {
  1111.     //  var sidebar = document.getElementById("sidebar");
  1112.     //  var sidebarBox = document.getElementById("sidebar-box");
  1113.     //  sidebar.setAttribute("src", sidebarBox.getAttribute("src"));
  1114.     //}
  1115.     
  1116.     initFindBar();
  1117.     
  1118.     // now load bookmarks
  1119.     BMSVC.readBookmarks();
  1120.     var bt = document.getElementById("bookmarks-ptf");
  1121.     if (bt) {
  1122.         var btf = BMSVC.getBookmarksToolbarFolder().Value;
  1123.         bt.ref = btf;
  1124.         document.getElementById("bookmarks-chevron").ref = btf;
  1125.         bt.database.AddObserver(BookmarksToolbarRDFObserver);
  1126.         bt.controllers.appendController(BookmarksMenuController);
  1127.     }
  1128.     var bm = document.getElementById("bookmarks-menu");
  1129.     bm.controllers.appendController(BookmarksMenuController);
  1130.     
  1131.     //JA ff5->vulp //<Modified by SLiu
  1132.     populateBookmarks();
  1133.     //SLiu>
  1134.     
  1135.     window.addEventListener("resize", onWindowResize, false);
  1136.     
  1137.     // called when we go into full screen, even if it is
  1138.     // initiated by a web page script
  1139.     window.addEventListener("fullscreen", onFullScreen, false);
  1140.     
  1141.     var element;
  1142.     if (gIsLoadingBlank && gURLBar && !gURLBar.hidden && !gURLBar.parentNode.parentNode.collapsed)
  1143.         element = gURLBar;
  1144.     else
  1145.         element = _content;
  1146.  
  1147.     // This is a redo of the fix for jag bug 91884
  1148.     var ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
  1149.                        .getService(Components.interfaces.nsIWindowWatcher);
  1150.     if (window == ww.activeWindow) {
  1151.         // JMC - URLBar Focus issue debugging
  1152.         dump ("delayed Startup, setting focus to " + element.id + "\n");
  1153.         element.focus();
  1154.     } else {
  1155.         // set the element in command dispatcher so focus will restore properly
  1156.         // when the window does become active
  1157.         if (element instanceof Components.interfaces.nsIDOMWindow) {
  1158.             document.commandDispatcher.focusedWindow = element;
  1159.             document.commandDispatcher.focusedElement = null;
  1160.         } else if (element instanceof Components.interfaces.nsIDOMElement) {
  1161.             document.commandDispatcher.focusedWindow = element.ownerDocument.defaultView;
  1162.             document.commandDispatcher.focusedElement = element;
  1163.         }
  1164.     }
  1165.  
  1166.     // This trashes the urlbar favicon so carefully set up in tabbrowser.xml...
  1167.     //SetPageProxyState("invalid", null);
  1168.  
  1169.     var toolbox = document.getElementById("navigator-toolbox");
  1170.     toolbox.customizeDone = BrowserToolboxCustomizeDone;
  1171.  
  1172.     // Enable/Disable Form Fill
  1173.     gFormFillPrefListener = new FormFillPrefListener();
  1174.     var pbi = gPrefService.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
  1175.     pbi.addObserver(gFormFillPrefListener.domain, gFormFillPrefListener, false);
  1176.     gFormFillPrefListener.toggleFormFill();
  1177.  
  1178.     // Enable/Disable URL Bar Auto Fill
  1179.     gURLBarAutoFillPrefListener = new URLBarAutoFillPrefListener();
  1180.     pbi.addObserver(gURLBarAutoFillPrefListener.domain, gURLBarAutoFillPrefListener, false);
  1181.  
  1182.     pbi.addObserver(gHomeButton.prefDomain, gHomeButton, false);
  1183.     //gHomeButton.updateTooltip(); DO NOT USE..this is set in the browser.xul file
  1184.  
  1185.     // Initialize Plugin Overrides
  1186.     const kOverridePref = "browser.download.pluginOverrideTypes";
  1187.     if (gPrefService.prefHasUserValue(kOverridePref)) {
  1188.         var types = gPrefService.getCharPref(kOverridePref);
  1189.         types = types.split(",");
  1190.  
  1191.         const kPluginOverrideTypesNotHandled = "browser.download.pluginOverrideTypesNotHandled";
  1192.  
  1193.         var catman = Components.classes["@mozilla.org/categorymanager;1"].getService(Components.interfaces.nsICategoryManager);
  1194.         var typesNotHandled = "";
  1195.         for (var i = 0; i < types.length; ++i) {
  1196.             // Keep track of all overrides for plugins that aren't actually installed,
  1197.             // so we know not to show them in the plugin configuration dialog BUT
  1198.             // don't delete the overrides such that when the user actually installs the
  1199.             // plugin in this build their preferences are remembered.
  1200.             try {
  1201.                 var catEntry = catman.getCategoryEntry("Gecko-Content-Viewers", types[i]);
  1202.             }
  1203.             catch (e) {
  1204.                 catEntry = "";
  1205.             }
  1206.             if (catEntry == "")
  1207.             typesNotHandled += types[i] + ",";
  1208.  
  1209.             catman.deleteCategoryEntry("Gecko-Content-Viewers", types[i], false);
  1210.         }
  1211.  
  1212.         if (typesNotHandled) {
  1213.             typesNotHandled = typesNotHandled.substr(0, typesNotHandled.length - 1);
  1214.             gPrefService.setCharPref(kPluginOverrideTypesNotHandled, typesNotHandled);
  1215.         }
  1216.         else if (gPrefService.prefHasUserValue(kPluginOverrideTypesNotHandled))
  1217.             gPrefService.clearUserPref(kPluginOverrideTypesNotHandled);
  1218.     }
  1219.  
  1220.     gClickSelectsAll = gPrefService.getBoolPref("browser.urlbar.clickSelectsAll");
  1221.     
  1222.     clearObsoletePrefs();
  1223.  
  1224.     // Perform default browser checking (after window opens).
  1225.     var shell = getShellService();
  1226.     if (shell) {
  1227.         var shouldCheck = shell.shouldCheckDefaultBrowser;
  1228.         if (shouldCheck && !shell.isDefaultBrowser(true)) {
  1229.             var brandBundle = document.getElementById("bundle_brand");
  1230.             var shellBundle = document.getElementById("bundle_shell");
  1231.     
  1232.             var brandShortName = brandBundle.getString("brandShortName");
  1233.             var promptTitle = shellBundle.getString("setDefaultBrowserTitle");
  1234.             var promptMessage = shellBundle.getFormattedString("setDefaultBrowserMessage",
  1235.                 [brandShortName]);
  1236.             var checkboxLabel = shellBundle.getFormattedString("setDefaultBrowserDontAsk",
  1237.                 [brandShortName]);
  1238.             const IPS = Components.interfaces.nsIPromptService;
  1239.             var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
  1240.                                .getService(IPS);
  1241.             var checkEveryTime = { value: shouldCheck };
  1242.             var rv = ps.confirmEx(window, promptTitle, promptMessage,
  1243.                                   (IPS.BUTTON_TITLE_YES * IPS.BUTTON_POS_0) +
  1244.                                  (IPS.BUTTON_TITLE_NO * IPS.BUTTON_POS_1),
  1245.                                  null, null, null, checkboxLabel, checkEveryTime);
  1246.             if (rv == 0)
  1247.                 shell.setDefaultBrowser(true, false);
  1248.             shell.shouldCheckDefaultBrowser = checkEveryTime.value;
  1249.         }
  1250.     } else {
  1251.         // We couldn't get the shell service; go hide the mail toolbar button.
  1252.         var mailbutton = document.getElementById("mail-button");
  1253.         if (mailbutton)
  1254.         mailbutton.hidden = true;
  1255.     }
  1256.  
  1257.     // START Mercurial
  1258.     
  1259.     // Initialize Webmail
  1260.     webmail.Init();
  1261.     // For toolbar overflow
  1262.     var nb = document.getElementById('nav-bar');
  1263.     nb.enableOverflowMenu = true;
  1264.     var pt = document.getElementById('PersonalToolbar');
  1265.     if (pt) { pt.enableOverflowMenu = true; }
  1266.     // TODO: This form submission observer should really be singleton
  1267.     // (ie., one-per-application, not one-per-browser-window)
  1268.     datacardUtils.InitSubmitObserver();
  1269.  
  1270.     // END Mercurial
  1271.  
  1272.     var updatePanel = document.getElementById("softwareupdate");
  1273.     try {
  1274.         updatePanel.init();
  1275.     }
  1276.     catch (e) { dump("updatePanel failed with " + e + "\n"); }
  1277.     
  1278.     // BiDi UI
  1279.     if (isBidiEnabled()) {
  1280.         document.getElementById("documentDirection-separator").hidden = false;
  1281.         document.getElementById("documentDirection-swap").hidden = false;
  1282.         document.getElementById("textfieldDirection-separator").hidden = false;
  1283.         document.getElementById("textfieldDirection-swap").hidden = false;
  1284.     }
  1285.     
  1286.     // display the correct engine on startup
  1287.     UpdateStatusBarEngineIcon();
  1288. }
  1289.  
  1290. function resizeSearchBar()
  1291. {
  1292.     var searchBar = document.getElementById("searchbar");
  1293.     if(searchBar) {
  1294.         searchBar.addEventListener("dragdrop", SearchBarOnDrop, true);
  1295.         if (gPrefService.getPrefType("browser.search.size")) {
  1296.             var searchSize = gPrefService.getCharPref("browser.search.size");
  1297.             // this.parentNode.style.width = searchSize;
  1298.             // dump("SEARCH: Setting the checked attribute for search size\n");
  1299.             var sizeMenuItem = document.getAnonymousElementByAttribute(searchBar, "value", searchSize);
  1300.             if (sizeMenuItem) {
  1301.                 // dump("SEARCH: Calling doCommand on the sizeMenuItem\n");
  1302.                 sizeMenuItem.doCommand();
  1303.                 // sizeMenuItem.setAttribute('checked', 'true');
  1304.             }
  1305.         }
  1306.     }
  1307. }
  1308.  
  1309. function Shutdown()
  1310. {
  1311.     var os = Components.classes["@mozilla.org/observer-service;1"]
  1312.                        .getService(Components.interfaces.nsIObserverService);
  1313.     os.removeObserver(gSessionHistoryObserver, "browser:purge-session-history");
  1314.     os.removeObserver(gBrowser.browsers[0], "browser:purge-session-history");
  1315.     os.removeObserver(gXPInstallObserver, "xpinstall-install-blocked");
  1316.     os.removeObserver(gXPInstallObserver, "xpinstall-install-edit-permissions");
  1317.     os.removeObserver(gXPInstallObserver, "xpinstall-install-edit-prefs");
  1318.     os.removeObserver(gMissingPluginInstaller, "missing-plugin");
  1319.  
  1320.     try {
  1321.         gBrowser.removeProgressListener(window.XULBrowserWindow);
  1322.     } catch (ex) {
  1323.     }
  1324.  
  1325.     var bt = document.getElementById("bookmarks-ptf");
  1326.     if (bt) {
  1327.         try {
  1328.             bt.database.RemoveObserver(BookmarksToolbarRDFObserver);
  1329.             bt.controllers.removeController(BookmarksMenuController);
  1330.         } catch (ex) {
  1331.         }
  1332.     }
  1333.  
  1334.     try {
  1335.         var bm = document.getElementById("bookmarks-menu");
  1336.         bm.controllers.removeController(BookmarksMenuController);
  1337.     } catch (ex) {
  1338.     }
  1339.  
  1340.     try {
  1341.         var pbi = gPrefService.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
  1342.         pbi.removeObserver(gFormFillPrefListener.domain, gFormFillPrefListener);
  1343.         pbi.removeObserver(gURLBarAutoFillPrefListener.domain, gURLBarAutoFillPrefListener);
  1344.         pbi.removeObserver(gHomeButton.prefDomain, gHomeButton);
  1345.     } catch (ex) {
  1346.     }
  1347.  
  1348.     BrowserOffline.uninit();
  1349.  
  1350.     uninitFindBar();
  1351.  
  1352.     var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
  1353.     var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
  1354.     var enumerator = windowManagerInterface.getEnumerator(null);
  1355.     enumerator.getNext();
  1356.     if (!enumerator.hasMoreElements()) {
  1357.         document.persist("sidebar-box", "sidebarcommand");
  1358.         document.persist("sidebar-box", "width");
  1359.         document.persist("sidebar-box", "src");
  1360.         document.persist("sidebar-title", "value");
  1361.     }
  1362.  
  1363.     window.XULBrowserWindow.destroy();
  1364.     window.XULBrowserWindow = null;
  1365.     window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  1366.     .getInterface(Components.interfaces.nsIWebNavigation)
  1367.     .QueryInterface(Components.interfaces.nsIDocShellTreeItem).treeOwner
  1368.     .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  1369.     .getInterface(Components.interfaces.nsIXULWindow)
  1370.     .XULBrowserWindow = null;
  1371.     gBrowser.docShell
  1372.     .QueryInterface(nsCI.nsIDocShellTreeItem)
  1373.     .rootTreeItem
  1374.     .QueryInterface(nsCI.nsIInterfaceRequestor)
  1375.     .getInterface(nsCI.nsIDOMWindow)
  1376.     .QueryInterface(nsCI.nsIInterfaceRequestor)
  1377.     .getInterface(nsCI.nsIDOMWindowUtils)
  1378.     .browserDOMWindow = null;
  1379.  
  1380.     window.browserContentListener.close();
  1381.     // Close the app core.
  1382.     if (appCore)
  1383.     appCore.close();
  1384. }
  1385.  
  1386. function FormFillPrefListener()
  1387. {
  1388.     gBrowser.attachFormFill();
  1389. }
  1390.  
  1391. FormFillPrefListener.prototype =
  1392. {
  1393.     domain: "browser.formfill.enable",
  1394.     observe: function (aSubject, aTopic, aPrefName)
  1395.     {
  1396.         if (aTopic != "nsPref:changed" || aPrefName != this.domain)
  1397.         return;
  1398.  
  1399.         this.toggleFormFill();
  1400.     },
  1401.  
  1402.     toggleFormFill: function ()
  1403.     {
  1404.         try {
  1405.             gFormFillEnabled = gPrefService.getBoolPref(this.domain);
  1406.         }
  1407.         catch (e) {
  1408.         }
  1409.         var formController = Components.classes["@mozilla.org/satchel/form-fill-controller;1"].getService(Components.interfaces.nsIAutoCompleteInput);
  1410.         formController.disableAutoComplete = !gFormFillEnabled;
  1411.  
  1412.         var searchBar = document.getElementsByTagName("searchbar");
  1413.         for (var i=0; i<searchBar.length;i++) {
  1414.             if (gFormFillEnabled)
  1415.             searchBar[i].removeAttribute("disableautocomplete");
  1416.         else
  1417.             searchBar[i].setAttribute("disableautocomplete", "true");
  1418.         }
  1419.     }
  1420. }
  1421.  
  1422. function URLBarAutoFillPrefListener()
  1423. {
  1424.     this.toggleAutoFillInURLBar();
  1425. }
  1426.  
  1427. URLBarAutoFillPrefListener.prototype =
  1428. {
  1429.     domain: "browser.urlbar.autoFill",
  1430.     observe: function (aSubject, aTopic, aPrefName)
  1431.     {
  1432.         if (aTopic != "nsPref:changed" || aPrefName != this.domain)
  1433.         return;
  1434.  
  1435.         this.toggleAutoFillInURLBar();
  1436.     },
  1437.  
  1438.     toggleAutoFillInURLBar: function ()
  1439.     {
  1440.         if (!gURLBar)
  1441.         return;
  1442.  
  1443.         var prefValue = false;
  1444.         try {
  1445.             prefValue = gPrefService.getBoolPref(this.domain);
  1446.         }
  1447.         catch (e) {
  1448.         }
  1449.  
  1450.         if (prefValue)
  1451.         gURLBar.setAttribute("completedefaultindex", "true");
  1452.     else
  1453.         gURLBar.removeAttribute("completedefaultindex");
  1454.     }
  1455. }
  1456.  
  1457. function ctrlNumberTabSelection(event)
  1458. {
  1459.     if (event.altKey && event.keyCode == KeyEvent.DOM_VK_RETURN) {
  1460.         // XXXblake Proper fix is to just check whether focus is in the urlbar. However, focus with the autocomplete widget is all
  1461.         // hacky and broken and there's no way to do that right now. So this just patches it to ensure that alt+enter works when focus
  1462.         // is on a link.
  1463.     if (!(document.commandDispatcher.focusedElement instanceof HTMLAnchorElement)) {
  1464.             // Don't let winxp beep on ALT+ENTER, since the URL bar uses it.
  1465.             event.preventDefault();
  1466.             return;
  1467.         }
  1468.     }
  1469.  
  1470.         if (!event.ctrlKey)
  1471.         return;
  1472.         //JA
  1473.         const MAX_TABS = 80;//defined in nsGUIEvent.h
  1474.         var index = event.charCode - 49;//49 == '0'
  1475.         if (index < 0 || (index > 8 && (index<0x0700 || index>0x0700+MAX_TABS)) )
  1476.         return;
  1477.         if(index>=0x0700)
  1478.         index = index-0x0700;
  1479.         //JA end
  1480.         if (index >= gBrowser.tabContainer.childNodes.length)
  1481.         return;
  1482.  
  1483.         var oldTab = gBrowser.selectedTab;
  1484.         var newTab = gBrowser.tabContainer.childNodes[index];
  1485.         if (newTab != oldTab) {
  1486.             oldTab.selected = false;
  1487.             gBrowser.selectedTab = newTab;
  1488.         }
  1489.  
  1490.         event.preventDefault();
  1491.         event.preventBubble();
  1492.         event.preventCapture();
  1493.         event.stopPropagation();
  1494.     }
  1495.  
  1496.     function gotoHistoryIndex(aEvent)
  1497.     {
  1498.         var index = aEvent.target.getAttribute("index");
  1499.         if (!index)
  1500.         return false;
  1501.         /*Mercurial Start */
  1502.         //JA check if HTML plugin
  1503.         var hpDoc = getTridentDocument();
  1504.         if(hpDoc)
  1505.         {
  1506.             var docshell=getWebNavigation();;
  1507.             var sessionHistory = docshell.sessionHistory;
  1508.             sessionHistory.setCurrentIndex(index);
  1509.  
  1510.             var loadedByGecko = false;
  1511.             try
  1512.             {
  1513.                 var currURI = new Object();
  1514.                 hpDoc.getURIAtIndex(index, currURI);
  1515.                 if(currURI)
  1516.                 {
  1517.                     var site = currURI.value.host;
  1518.                     var bControlled=sitecontrols.SCSVC.isControlledSite(site);
  1519.                     if(bControlled)
  1520.                     {
  1521.                         var displayEngine=sitecontrols.SCSVC.readSiteControl(site, "displayEngine");
  1522.                         if(displayEngine=="Gecko")
  1523.                         {
  1524.                             loadedByGecko=true;
  1525.                             hpDoc.geckoLoadURI(uri, Components.interfaces.nsIDocShellLoadInfo.loadBypassHistory);
  1526.                             //hpDoc.geckoLoadURI(currURI.value, 10);
  1527.                         }
  1528.                     }
  1529.                 }
  1530.             }
  1531.             catch(ex){dump("GoForward check sitecontrols engine failed!!!\n");}
  1532.  
  1533.             if(!loadedByGecko)
  1534.             hpDoc.goCmd(-index);
  1535.             UpdateBackForwardButtons();
  1536.         }/*Mercurial Finish*/
  1537.     else {
  1538.         var where = whereToOpenLink(aEvent);
  1539.         if (where == "current") {
  1540.             // Normal click.  Go there in the current tab and update session history.
  1541.             try {
  1542.                 getWebNavigation().gotoIndex(index);
  1543.             }
  1544.             catch(ex) {
  1545.                 return false;
  1546.             }
  1547.             return true;
  1548.         }
  1549.     else {
  1550.         // Modified click.  Go there in a new tab/window.
  1551.         // This code doesn't copy history or work well with framed pages.
  1552.  
  1553.         var sessionHistory = getWebNavigation().sessionHistory;
  1554.         var entry = sessionHistory.getEntryAtIndex(index, false);
  1555.         var url = entry.URI.spec;
  1556.         openUILinkIn(url, where);
  1557.         return true;
  1558.     }
  1559. }
  1560. }
  1561.  
  1562. function BrowserForward(aEvent, aIgnoreAlt)
  1563. {
  1564.     var docshell = getWebNavigation();
  1565.     var sessionHistory = docshell.sessionHistory;
  1566.     var count = sessionHistory.count;
  1567.     var index = sessionHistory.index;
  1568.  
  1569.     //JA ff5->vulp + modif
  1570.     if (index >= count-1)
  1571.     return;//error call
  1572.  
  1573.     // Try to get handle on Trident
  1574.     var hpDoc = getTridentDocument();
  1575.     var fromEngine = 'Gecko';
  1576.     if (hpDoc)
  1577.     fromEngine = 'Trident';
  1578.  
  1579.  
  1580.     index++;
  1581.     var uri = sessionHistory.getEntryAtIndex(index, false).URI;
  1582.     // dump('  To page is ==> '+uri.spec+'\n');
  1583.     var site = sitecontrols.SCSVC.getResourceForURI(uri.spec);
  1584.     var toEngine = sitecontrols.SCSVC.readSiteControlResource(site, 'displayEngine');
  1585.     docshell.browserEngine = toEngine;
  1586.  
  1587.     if (fromEngine == 'Trident')
  1588.     {
  1589.         sessionHistory.setCurrentIndex(index);
  1590.         if (toEngine == 'Gecko'){
  1591.             // dump('BrowserForward: Trident=>Gecko\n');
  1592.             hpDoc.geckoLoadURI(uri, Components.interfaces.nsIDocShellLoadInfo.loadNormalReplace);
  1593.             gBrowser.mCurrentTab.removeAttribute("engine");
  1594.             //hpDoc.geckoLoadURI(uri, 1);
  1595.         } else {
  1596.             // dump('BrowserForward: Trident ==> Trident\n');
  1597.             hpDoc.goCmd(2);
  1598.         }
  1599.     }
  1600. else//original code
  1601.     {
  1602.         var where = whereToOpenLink(aEvent, false, aIgnoreAlt);
  1603.  
  1604.         if (where == "current") {
  1605.             try {
  1606.                 docshell.goForward();
  1607.             }
  1608.             catch(ex) { dump ("Caught Exception: " + ex + "\n");}
  1609.         }
  1610.     else {
  1611.         //JA var sessionHistory = getWebNavigation().sessionHistory;
  1612.         //JA var currentIndex = sessionHistory.index;
  1613.         //JA var entry = sessionHistory.getEntryAtIndex(currentIndex + 1, false);
  1614.         //JA var uri = entry.URI.spec;
  1615.         openUILinkIn(uri, where);
  1616.     }
  1617. }
  1618. }
  1619.  
  1620. function BrowserBack(aEvent, aIgnoreAlt)
  1621. {
  1622.     var docshell = getWebNavigation();
  1623.     var sessionHistory = docshell.sessionHistory;
  1624.     var index = sessionHistory.index;
  1625.     if (index <= 0)
  1626.     return;//error!
  1627.     // Try to get handle on Trident
  1628.     var hpDoc = getTridentDocument();
  1629.     var fromEngine = 'Gecko';
  1630.     if (hpDoc)
  1631.     fromEngine = 'Trident';
  1632.  
  1633.     index--;
  1634.     var uri = sessionHistory.getEntryAtIndex(index, false).URI;
  1635.     // dump('  To page is ==> '+uri.spec+'\n');
  1636.     var site = sitecontrols.SCSVC.getResourceForURI(uri.spec);
  1637.     var toEngine = sitecontrols.SCSVC.readSiteControlResource(site, 'displayEngine');
  1638.     getWebNavigation().browserEngine = toEngine;
  1639.     if (fromEngine == 'Trident')
  1640.     {
  1641.         sessionHistory.setCurrentIndex(index);
  1642.         if (toEngine == 'Gecko')
  1643.         {
  1644.             // dump('BrowserBack: Trident ==> Gecko\n');
  1645.             hpDoc.geckoLoadURI(uri, Components.interfaces.nsIDocShellLoadInfo.loadBypassHistory);
  1646.             // remove engine attribute from tab
  1647.             gBrowser.mCurrentTab.removeAttribute("engine");
  1648.             UpdateStatusBarEngineIcon();
  1649.             //hpDoc.geckoLoadURI(uri, 10);
  1650.         } else {
  1651.             // dump('BrowserBack: Trident ==> Trident\n');
  1652.             gBrowser.mCurrentTab.setAttribute("engine", "Trident");
  1653.             hpDoc.goCmd(1);
  1654.         }
  1655.     }
  1656. else//Gecko, original code
  1657.     {
  1658.  
  1659.         var where = whereToOpenLink(aEvent, false, aIgnoreAlt);
  1660.  
  1661.         if (where == "current") {
  1662.             try {
  1663.                 getWebNavigation().goBack();
  1664.             }
  1665.             catch(ex) { dump ("Caught Exception: " + ex + "\n");     }
  1666.         }
  1667.     else {
  1668.         //JA var sessionHistory = getWebNavigation().sessionHistory;
  1669.         //JA var currentIndex = sessionHistory.index;
  1670.         //JA var entry = sessionHistory.getEntryAtIndex(currentIndex - 1, false);
  1671.         //JA var uri = entry.URI.spec;
  1672.         openUILinkIn(uri, where);
  1673.     }
  1674. }
  1675. }
  1676.  
  1677. function BrowserHandleBackspace()
  1678. {
  1679.     BrowserBack();
  1680. }
  1681.  
  1682. function BrowserBackMenu(event)
  1683. {
  1684.     return FillHistoryMenu(event.target, "back");
  1685. }
  1686.  
  1687. function BrowserForwardMenu(event)
  1688. {
  1689.     return FillHistoryMenu(event.target, "forward");
  1690. }
  1691.  
  1692. // MERC (DP): fill in the home button dropdown with a each home page item
  1693. function BrowserHomeMenu(menu) {
  1694.     var homePage = gHomeButton.getHomePage();
  1695.     var urls = homePage.split("|");
  1696.     var separator;
  1697.     var referenceNodeList = menu.getElementsByTagName("menuseparator");
  1698.     var referenceNode = null;
  1699.  
  1700.     var children = menu.childNodes;
  1701.  
  1702.     for (var j = 0; j < children.length; j++) {
  1703.         // clear old menuitems
  1704.         try {
  1705.             var tmpElement = children[j].QueryInterface(Components.interfaces.nsIDOMElement);
  1706.             if(!tmpElement.hasAttribute("nodelete")) { //avoid deleting separators
  1707.                 menu.removeChild(children[j]);
  1708.             }
  1709.         }
  1710.         catch(e){
  1711.             dump ("Caught Exception : "+e+"\n");
  1712.             //we may still want to delete this node?
  1713.         }
  1714.  
  1715.     }
  1716.  
  1717.     //find the first separator to insert the page links before
  1718.     if (referenceNodeList.length > 0){
  1719.         referenceNode = referenceNodeList[0];
  1720.     }
  1721.  
  1722.     for (var i = 0; i < urls.length; i++) {
  1723.         var menuitem = document.createElement( "menuitem" );
  1724.         menuitem.setAttribute("label", urls[i]);
  1725.         //var tmpStr = "gBrowser.addTab('" +  urls[i] + "')";
  1726.         var tmpStr = "loadURIWithOpenPref('" +  urls[i] + "', 'browser.tabs.homepage.open');";
  1727.         menuitem.setAttribute("oncommand", tmpStr);
  1728.         menuitem.setAttribute("tooltiptext", "Go to this page");
  1729.         if (referenceNodeList.length > 0){
  1730.             menu.insertBefore( menuitem, referenceNode );
  1731.         } else  {
  1732.             menu.appendChild( menuitem );
  1733.         }
  1734.     }
  1735. }
  1736. // <MERC
  1737.  
  1738. function BrowserStop()
  1739. {
  1740.     var hpDoc = getTridentDocument();
  1741.  
  1742.     if(hpDoc)
  1743.     {
  1744.         //var stopbutton = document.getElementById("stop-button");
  1745.         //stopbutton.setAttribute("disabled", "true");
  1746. /*        var stopReloadBtn = document.getElementById("stop-reload-button");
  1747.         if (stopReloadBtn) {
  1748.             // JCH: Need to set label according to state
  1749.             stopReloadBtn.setAttribute("label","Reload");
  1750.             stopReloadBtn.setAttribute("state","reload");
  1751.             stopReloadBtn.removeAttribute("command");
  1752.             stopReloadBtn.setAttribute("oncommand","BrowserStopReload(event);");
  1753.         }*/
  1754.       var webProgress = gBrowser.webProgress;
  1755.         window.XULBrowserWindow.onStateChange(webProgress, null, Components.interfaces.nsIWebProgressListener.STATE_STOP | Components.interfaces.nsIWebProgressListener.STATE_IS_NETWORK, 0);
  1756.         hpDoc.cancelNavigation();
  1757.     } else  {
  1758.         try
  1759.         {
  1760.             const stopFlags = nsIWebNavigation.STOP_ALL;
  1761.             getWebNavigation().stop(stopFlags);
  1762.         }
  1763.         catch(ex) { dump ("Caught Exception: " + ex + "\n");}
  1764.     }
  1765. }
  1766. //MERC/>
  1767.  
  1768.  
  1769. /**
  1770. * MERC: ccampbell
  1771. * Added this function to differentiate between the way Find works in
  1772. * Gecko (a.k.a Find Bar) and Trident (old fashioned dialog)
  1773. **/
  1774. function findCommand(again) {
  1775.     var hpDoc = getTridentDocument();
  1776.     if (hpDoc) {
  1777.         // The current tab is in Trident
  1778.         gBrowser.find();
  1779.     } else {
  1780.         try {
  1781.             // The current tab is in Gecko
  1782.             if (again)
  1783.                 onFindAgainCmd();
  1784.             else
  1785.                 onFindCmd();
  1786.         } catch(ex) { dump ("Caught Exception: " + ex + "\n"); }
  1787.     }
  1788. }
  1789.  
  1790.  
  1791. ///////////////////////////////////////////////////////////////////////////////////////
  1792. //                       POPUPBLOCK BUTTON GENERAL FUNCTIONALITY                     //
  1793. ///////////////////////////////////////////////////////////////////////////////////////
  1794.  
  1795. // MERC - JCH
  1796. // Increment the global popup blocked count
  1797. function IncrementPopupsBlocked(windowDoc)
  1798. {
  1799.     if (!gBrowser)
  1800.         return;
  1801.  
  1802.     // Get the index of the relevant tab document object
  1803.     var foundIndex = gBrowser.getBrowserIndexForDocument(windowDoc);
  1804.  
  1805.     if (foundIndex < 0)
  1806.         return;
  1807.  
  1808.     // Get ref to target tab
  1809.     var browserTabs = gBrowser.mTabContainer.childNodes;
  1810.     var targetTab = browserTabs[foundIndex];
  1811.  
  1812.     // Modify the global count
  1813.     ++gBrowser.numberBlocked;
  1814.  
  1815.     // Get the browser object of the current tab
  1816.     var browserForCurrentTab = gBrowser.getBrowserForTab(gBrowser.mCurrentTab);
  1817.  
  1818.     // Get the browser object of the target tab
  1819.     var browserForTargetTab = gBrowser.getBrowserForTab(targetTab);
  1820.  
  1821.     // Compare browser that has popup with the current browser
  1822.     // If they are not the same don't update the UI
  1823.     if (browserForTargetTab != browserForCurrentTab)
  1824.     {
  1825.         return;
  1826.     }
  1827.  
  1828.     // Update UI
  1829.     SetPopupBlockToggle();
  1830.  
  1831.     // Get a handle to the button element
  1832.     var button = document.getElementById("popupblocker-button");
  1833.  
  1834.     // JMC added sanity check for when button is removed from toolbar
  1835.     if (button) {
  1836.         // Change icon for two seconds when popups are blocked
  1837.         button.setAttribute("popupDetected","true");
  1838.         // Show popup block icon for two seconds
  1839.         setTimeout("RestorePBB()", 2000);
  1840.     }
  1841. }
  1842.  
  1843.  
  1844. // MERC - JCH : Restore the look of the button
  1845. function RestorePBB()
  1846. {
  1847.     // dump("\nIn RestorePBB -> Show image\n");
  1848.  
  1849.     // Get a handle to the button element
  1850.     var button = document.getElementById("popupblocker-button");
  1851.     if (button) {
  1852.         button.setAttribute("popupDetected","false");
  1853.         SetPopupBlockToggle();
  1854.     }
  1855. }
  1856.  
  1857.  
  1858. // MERC - JCH : Determine whether blocking is on
  1859. // Called from nsGlobalWindow.cpp and nsHTMLPluginDocument.cpp
  1860. function PopupBlockingOn(windowDoc)
  1861. {
  1862.     // Get the index of the relevant tab document object
  1863.     var foundIndex = gBrowser.getBrowserIndexForDocument(windowDoc);
  1864.  
  1865.     // dump(">>>>>>  In PopupBlockingOn() foundIndex is: " + foundIndex + "\n");
  1866.     if (foundIndex < 0)
  1867.     return;
  1868.  
  1869.     // Get controlling site resource
  1870.     var site = GetSiteControlResource(gBrowser.getBrowserAtIndex(foundIndex));
  1871.  
  1872.     // If site is illegitimate and uncontrollable then block pop-ups
  1873.     if (!site)
  1874.     return false;
  1875.  
  1876.     // Get the value of the setting associated with popup blocking
  1877.     var popupsAllowed = sitecontrols.SCSVC.readSiteControlResource(site,"allowPopups");
  1878.  
  1879.     // Return whether to block popups or not
  1880.     // Assume no blocking
  1881.     var blockPopups = false;
  1882.     if (popupsAllowed.indexOf("false") > -1)
  1883.     blockPopups = true;
  1884.  
  1885.     return blockPopups;
  1886. }
  1887.  
  1888.  
  1889. // MERC - JCH : determine whether blocking sound is on
  1890. // Called from nsGlobalWindow.cpp and nsHTMLPluginDocument.cpp
  1891. function BlockingSoundOn(windowDoc)
  1892. {
  1893.     if (!gBrowser)
  1894.     return;
  1895.  
  1896.     // Get the index of the relevant tab browser object
  1897.     var foundIndex = gBrowser.getBrowserIndexForDocument(windowDoc);
  1898.  
  1899.     // dump("@@@@@ in BlockingSoundOn with index: " + foundIndex + "\n");
  1900.  
  1901.     if (foundIndex < 0)
  1902.         return false;
  1903.  
  1904.     // Get the browser object of the current tab
  1905.     var browserForTab = gBrowser.getBrowserForTab(gBrowser.mCurrentTab);
  1906.  
  1907.     // Compare browser that has popup with the current browser
  1908.     // If they are not the same don't play sound
  1909.     if (gBrowser.getBrowserAtIndex(foundIndex) != browserForTab)
  1910.         return false;
  1911.  
  1912.     if (!gPrefService)
  1913.         return false;
  1914.  
  1915.     return gPrefService.getBoolPref("privacy.popups.sound_enabled");
  1916. }
  1917.  
  1918. /**
  1919. * Returns the RDF resource for the site control applicable to the
  1920. * given browser object, or else to the current tab's if no object
  1921. * is specified
  1922. **/
  1923. function GetSiteControlResource(browser) {
  1924.     // dump('enter >> GetSiteControlResource()\n');
  1925.  
  1926.     // Grab the right browser object
  1927.     if (!browser)
  1928.         browser = gBrowser.getBrowserForTab(gBrowser.mCurrentTab);
  1929.  
  1930.     // Pull out the URI for that tab/browser
  1931.     var uri;
  1932.     if (!browser.currentURI) uri = '';
  1933.     else uri = browser.currentURI.spec;
  1934.     //dump('         uri: '+uri+'\n');
  1935.  
  1936.     // The URI must either be for a controllable site (including local files)
  1937.     // or else 'about:blank'.  Otherwise, exit without doing anything.
  1938.     if ((uri != 'about:blank') && (!sitecontrols.SCSVC.isControllableURI(uri)))
  1939.     {
  1940.         // if the site is controlled, it's rendered with Gecko, so update statusbar
  1941.         //UpdateStatusBarEngineIcon();
  1942.         // dump('         '+uri+' is not a controllable uri\n');
  1943.         return null;
  1944.     }
  1945.  
  1946.     // Site 'about:blank' is treated as if it's a DEFAULT site.
  1947.     // This should be SiteControls:Default resource.
  1948.     if (uri == 'about:blank')
  1949.     {
  1950.         //UpdateStatusBarEngineIcon();
  1951.         // dump('         '+uri+' will use default settings\n');
  1952.         uri = '';
  1953.     }
  1954.  
  1955.     // Return the RDF resource
  1956.     // Note that if site is not explicitly controlled
  1957.     // the default resource is returned
  1958.     return sitecontrols.SCSVC.getResourceForURI(uri);
  1959. }
  1960.  
  1961.  
  1962. // MERC - JCH : Updates XUL related to the popupblock button
  1963. function SetPopupBlockToggle()
  1964. {
  1965.     //dump('SetPopupBlockToggle()\n');
  1966.  
  1967.     // Get current url in proper format
  1968.     var site = GetSiteControlResource();
  1969.  
  1970.     // If site is not controllable we will use default settings for xul
  1971.     if (!site)
  1972.     site = sitecontrols.SCSVC.getResourceForURI('');
  1973.  
  1974.     // dump(">>>>>>  In SetPopupBlockToggle() site is: " + site + "\n");
  1975.  
  1976.     // Get the value of the site controls associated with popup blocking
  1977.     var popupsAllowed = sitecontrols.SCSVC.readSiteControlResource(site,"allowPopups");
  1978.  
  1979.     // Get a handle to the button element
  1980.     var button = document.getElementById("popupblocker-button");
  1981.     if (!button) return; // JMC Sanity check when button is removed from toolbar
  1982.     var popupDetected = button.getAttribute("popupDetected");
  1983.  
  1984.     // Get handles to menu checkboxes
  1985.     // Don't need sanity checks for these since they are tied to the button
  1986.     // and that's been checked above
  1987.     var menuItemBlock = document.getElementById("popupblocker-onoff");
  1988.     var menuItemCount = document.getElementById("popupblocker-showcount");
  1989.     var menuItemSound = document.getElementById("popupblocker-playsound");
  1990.  
  1991.     // Don't change icon if the blocked popup icon has not finished showing
  1992.     if (popupDetected.indexOf("false") > -1) {
  1993.         // Check if the value is true, in which case popups are allowed
  1994.         if (popupsAllowed.indexOf("true") > -1) {
  1995.             button.setAttribute("popupblocking","off");
  1996.             button.setAttribute("tooltiptext", "Turn pop-up blocking on");
  1997.             menuItemBlock.setAttribute("label", "Enable pop-up blocker");
  1998.             // DisableSoundCountDisplay
  1999.             // Disable sound/count checkboxes
  2000.         } else {
  2001.             button.setAttribute("popupblocking","on");
  2002.             menuItemBlock.setAttribute("label", "Disable pop-up blocker");
  2003.             button.setAttribute("tooltiptext", "Turn pop-up blocking off");
  2004.             menuItemCount.setAttribute('disabled','false');                // Enable count item
  2005.             menuItemSound.setAttribute('disabled','false');                // Enable sound item
  2006.         }
  2007.     }
  2008.  
  2009.     if (!gPrefService)
  2010.         return;
  2011.  
  2012.     // Pop-up count is a global pref
  2013.     var showCount = gPrefService.getBoolPref("privacy.popups.show_count");
  2014.  
  2015.     // Check if we show count of popups blocked
  2016.     if (showCount) {
  2017.         // Get number of popups blocked
  2018.         var numBlocked = gBrowser.numberBlocked;
  2019.         button.setAttribute("label", " Blocked: "+numBlocked);
  2020.         // Need to set this property so that in browser.css can override
  2021.         // no text in icons mode
  2022.         button.setAttribute("showCount", "true");
  2023.         menuItemCount.setAttribute("checked", "true");
  2024.     } else {
  2025.         // If we don't show count we show a default text if in full or text modes
  2026.         button.setAttribute("showCount", "false");
  2027.         // Get the navbar and check what mode it's in
  2028.  
  2029.         if (popupsAllowed.indexOf("true") > -1) {
  2030.             button.setAttribute("label", " Allowed");
  2031.         }
  2032.         // If popups are not allowed
  2033.         else {
  2034.             button.setAttribute("label", " Blocked");
  2035.         }
  2036.  
  2037.         // Uncheck the show count menu item
  2038.         menuItemCount.setAttribute("checked", "false");
  2039.     }
  2040.  
  2041.     // Pop-up sound is a global pref
  2042.     var playSound = gPrefService.getBoolPref("privacy.popups.sound_enabled");
  2043.  
  2044.     // Update sound menu checkbox
  2045.     if (playSound)
  2046.         menuItemSound.setAttribute("checked", "true");
  2047.     else
  2048.         menuItemSound.setAttribute("checked", "false");
  2049. }
  2050.  
  2051.  
  2052. // MERC - JCH : Handle updating site controls.
  2053. // When the button is clicked or the sound or count menu item is checked the
  2054. // update proceeds as follows: If the site is uncontrollable and not about:blank,
  2055. // then do nothing; if the site is about:blank, update default settings; if the
  2056. // site is either explicitly controlled or a local-file type uri, then update the
  2057. // corresponding SC settings; if the site is controlled by the default settings,
  2058. // then add the site to SCs and update the newly added settings.
  2059. function PBBUpdateSiteControls(controlName)
  2060. {
  2061.     if (!gBrowser)
  2062.         return;
  2063.  
  2064.     // Get current url in proper format
  2065.     var uri = gBrowser.currentURI.spec;
  2066.  
  2067.     if (!sitecontrols)
  2068.         return;
  2069.  
  2070.     // If the site is an illegitimate uncontrollable site, do nothing but return.
  2071.     if ((uri != 'about:blank') && (!sitecontrols.SCSVC.isControllableURI(uri)))
  2072.         return;
  2073.  
  2074.     // Get resource related to uri
  2075.     var siteResource = sitecontrols.SCSVC.getResourceForURI(uri);
  2076.  
  2077.     // If the site is about:blank, modify default settings.
  2078.     if (uri == 'about:blank') {
  2079.         siteResource = sitecontrols.SCSVC.getResourceForURI('');
  2080.     }
  2081.  
  2082.     // Remaining cases are local file, explicitly controlled site,
  2083.     // and the various default site types. If site is controlled by a default setting
  2084.     // it must be added as an explicitly controlled site.
  2085.     if ((uri != 'about:blank') && (siteResource.Value == sitecontrols.SC_VERIFIED_DEFAULT ||
  2086.                                    siteResource.Value == sitecontrols.SC_NOT_VERIFIED_DEFAULT ||
  2087.                                    siteResource.Value == sitecontrols.SC_WARNING_DEFAULT))
  2088.     {
  2089.         var host = sitecontrols.getStrippedHostFromURL(uri);
  2090.         sitecontrols.SCSVC.addControlledSite(host);
  2091.         siteResource = sitecontrols.SCSVC.getResourceForURI(host);
  2092.     }
  2093.  
  2094.     // Get current site control setting
  2095.     var controlValue =  sitecontrols.SCSVC.readSiteControlResource(siteResource, controlName);
  2096.  
  2097.  
  2098.     var invVal;
  2099.     if (controlValue.indexOf("true") > -1) invVal = "false";
  2100.     else invVal = "true";
  2101.  
  2102.     // Assign negation of current control value
  2103.     sitecontrols.SCSVC.updateSiteControlResource(siteResource, controlName, invVal);
  2104. }
  2105.  
  2106. /////////////////////////////////////////////////////////////////////////////////
  2107. //                POPUPBLOCK BUTTON MENU ITEMS FUNCTIONALITY                   //
  2108. /////////////////////////////////////////////////////////////////////////////////
  2109.  
  2110. // MERC - JCH: Popups are about to be allowed so disable showing count and sound
  2111. // in both the pbb drop-down menu and in the options-advanced-browsing
  2112. function DisableSoundCountDisplay() {
  2113.     //dump('DisableSoundCountDisplay()\n');
  2114.  
  2115.     // Get current url in proper format
  2116.     var ctrlSite = GetSiteControlResource();
  2117.  
  2118.     // If site is not controllable we will use default settings for xul
  2119.     if (!ctrlSite)
  2120.     ctrlSite = sitecontrols.SCSVC.getResourceForURI('');
  2121.  
  2122.     // Notation: "rg = range = array"
  2123.     var rgMenuSoundAndCount = new Array('popupblocker-showcount','popupblocker-playsound');
  2124.  
  2125.     // dump("\n####### Well here we are in the zone ######\n");
  2126.     for (var i=0; i<2; i++)
  2127.     {
  2128.         // Disable the menu item
  2129.         menuItem = document.getElementById(rgMenuSoundAndCount[i]);
  2130.         if (menuItem)
  2131.         menuItem.setAttribute('disabled','true');
  2132.     }
  2133. }
  2134.  
  2135.  
  2136. // MERC - JCH : When you click on the pop-up blocking button or the sound or
  2137. // count menu items, you first check if the dialog is supposed to show. It will
  2138. // retrieve the user's decision to change site controls. If the dialog has been
  2139. // disabled, then site controls are changed without prompting.
  2140. function DoPBBAction(event, controlName)
  2141. {
  2142.  
  2143.     //dump('DoPBBAction()\n');
  2144.  
  2145.     // Assume we are going to update site control settings
  2146.     var updateSite = true;
  2147.  
  2148.     if (!gPrefService) {
  2149.         event.preventBubble();
  2150.         return;
  2151.     }
  2152.  
  2153.     // Pop-up count is now a global pref
  2154.     if (controlName == "showBlockedCount") {
  2155.         var showCount = gPrefService.getBoolPref("privacy.popups.show_count");
  2156.         gPrefService.setBoolPref("privacy.popups.show_count", !showCount);
  2157.         SetPopupBlockToggle();
  2158.         event.preventBubble();
  2159.         return;
  2160.     }
  2161.  
  2162.     // Pop-up sound is now a global pref
  2163.     if (controlName == "playBlockedSound") {
  2164.         var playSound = gPrefService.getBoolPref("privacy.popups.sound_enabled");
  2165.         gPrefService.setBoolPref("privacy.popups.sound_enabled", !playSound);
  2166.         SetPopupBlockToggle();
  2167.         event.preventBubble();
  2168.         return;
  2169.     }
  2170.  
  2171.     // Check if we show site controls info dialog and get user's choice if we do
  2172.     if (gPrefService.getBoolPref("show.popupblockbutton.dialog"))
  2173.     {
  2174.         // Get current raw url
  2175.         if (!gBrowser) {
  2176.             event.preventBubble();
  2177.             return;
  2178.         }
  2179.  
  2180.         var uri = gBrowser.currentURI.spec;
  2181.  
  2182.         if (!sitecontrols) {
  2183.             event.preventBubble();
  2184.             return;
  2185.         }
  2186.  
  2187.         var siteString;
  2188.  
  2189.         // Get resource related to uri
  2190.         var site = sitecontrols.SCSVC.getResourceForURI(uri);
  2191.  
  2192.         // Check for about:blank URI
  2193.         if (uri == 'about:blank')
  2194.         {
  2195.             siteString = "Default Settings";
  2196.         }
  2197.         else if (site.Value == sitecontrols.SC_LOCAL)
  2198.         {
  2199.             siteString = "Local File Settings";
  2200.         }
  2201.         // If the site value is null then the site in not controllable
  2202.         else if (!site)
  2203.         {
  2204.             event.preventBubble();
  2205.             return;
  2206.         }
  2207.         // The site is controllable and not a local file, so, since we
  2208.         // are going to add it to SC, show it's stripped domain on the dialog
  2209.         else
  2210.         {
  2211.             siteString = sitecontrols.getStrippedHostFromURL(uri);
  2212.         }
  2213.  
  2214.         // Pass in the site string and the boolean set to update SC.
  2215.         // The boolean may be modified by the user depending on how
  2216.         // they respond to dialog prompt
  2217.         var args = new Object();
  2218.         args.doupdate = updateSite;
  2219.         args.site = siteString;
  2220.  
  2221.         updateSite = ShowPBBInfoDialog(args);
  2222.     }
  2223.  
  2224.     // User wants to change site control settings
  2225.     if (updateSite)
  2226.     {
  2227.         PBBUpdateSiteControls(controlName);
  2228.         SetPopupBlockToggle();
  2229.     }
  2230.  
  2231.     event.preventBubble();
  2232.     return;
  2233. }
  2234.  
  2235.  
  2236. // MERC - JCH: Invoke dialog explaining how to properly change SCs. The user can
  2237. // cancel the action as well as deactivate the dialog.
  2238. function ShowPBBInfoDialog(args)
  2239. {
  2240.  
  2241.     window.openDialog("chrome://browser/content/pbbDecisionDialog.xul",
  2242.     "Decision",
  2243.     "modal,centerscreen,chrome,resizable=no",
  2244.     args);
  2245.  
  2246.     return args.doupdate;
  2247. }
  2248.  
  2249. // MERC - JCH: open list of blocked domains with option to make a controlled site
  2250. function BlockerShowList(event)
  2251. {
  2252.     try {
  2253.         window.openDialog("chrome://browser/content/pageReport.xul", "_blank",
  2254.         "modal,resizable,centerscreen");
  2255.  
  2256.         event.preventBubble();
  2257.         return;
  2258.     } catch(ex) { dump("Exception in browser.js: BlockerShowList\n" + ex + "\n"); }
  2259. }
  2260.  
  2261. // MERC - JCH: open site controls dialog with pertinent site selected
  2262. function BlockerShowSCDialog(event)
  2263. {
  2264.     // not in tabbed mode, ignore this action
  2265.     if (gPrefService.getBoolPref("browser.tabs.autoHide") &&  gBrowser.mTabContainer.childNodes.length < 2)
  2266.         return;
  2267.  
  2268.     var myTab = gBrowser.mCurrentTab;
  2269.     
  2270.     // if we're not in tabbed mode, then do nothing
  2271.     if (!myTab) return;
  2272.     
  2273.     var siteControlPopup = document.getElementById('SiteControlsPopup');
  2274.  
  2275.     // MERC - JCH: For BLT# 147538, set the site controls popup to open the advanced tab when it opens
  2276.     var scTabbox = document.getElementById('scp_tabbox');
  2277.     if (scTabbox) 
  2278.         scTabbox.selectedIndex=1;
  2279.  
  2280.     // wrap around a timeout function to avoid conflicting popup focuses
  2281.     if (siteControlPopup) {
  2282.         setTimeout("document.getElementById('SiteControlsPopup').showPopup(gBrowser.mCurrentTab, -1, -1, 'popup', 'bottomleft', 'topleft');",100);
  2283.     }
  2284.     event.preventBubble();
  2285. }
  2286.  
  2287. // MERC - JCH: Zero the popups blocked count
  2288. function ClearPopupCount(event)
  2289. {
  2290.     if (!gBrowser)
  2291.     return;
  2292.     gBrowser.numberBlocked = 0;
  2293.  
  2294.     SetPopupBlockToggle();
  2295.     event.preventBubble();
  2296.     return;
  2297. }
  2298.  
  2299. ////////////////////////////////////////////////////////////////////////////////////
  2300. ////////////////////////////////////////////////////////////////////////////////////
  2301.  
  2302. // MERC (DP): Fired when clear histories button clicked. Will warn the user
  2303. // via a dialog that they are clearing histories.
  2304. function ClearHistoriesButtonClick(event, historyLabel)
  2305. {
  2306.     // Assume we are going to update site control settings
  2307.     var flagval = "true";
  2308.  
  2309.     // Check if we show site controls info dialog
  2310.     if (!gPrefService.getBoolPref("clearhistories.button.dialog"))
  2311.     flagval = ShowClearHistoriesInfoDialog(historyLabel);
  2312.  
  2313.     // User wants to clear histories
  2314.     if (flagval.indexOf("true") > -1) {
  2315.         PrivacyPanel.clearData['history'](false);
  2316.         SetHistoryButton();
  2317.     }
  2318.  
  2319.     event.preventBubble();
  2320.     return;
  2321. }
  2322.  
  2323. // MERC (DP): Invoke dialog explaining that user about to clear histories
  2324. function ShowClearHistoriesInfoDialog(historyLabel)
  2325. {
  2326.     // Pass "doUpdate" into dialog. If it returns 'true' then clear
  2327.     var doUpdate = new String();
  2328.     doUpdate.value = "false";
  2329.  
  2330.     window.openDialog("chrome://browser/content/clearHistoriesDecisionDialog.xul",
  2331.     "Decision",
  2332.     "modal,centerscreen,chrome,resizable=no",
  2333.     doUpdate,
  2334.     historyLabel);
  2335.  
  2336.     return doUpdate.value;
  2337. }
  2338.  
  2339. // MERC - JCH : Update the history button.
  2340. function SetHistoryButton()
  2341. {
  2342.     try {
  2343.         var button = document.getElementById("clearhistories-button");
  2344.         if (!button)
  2345.         return;
  2346.  
  2347.         if (gGlobalHistory == null)
  2348.         return;
  2349.  
  2350.         if (gPrefService == null)
  2351.         return;
  2352.  
  2353.         var isAnonymous = gPrefService.getBoolPref("privacy.anonMode.enabled");
  2354.  
  2355.         var anonMenuItem = document.getElementById("clearHistoryAnonymousMode");
  2356.         anonMenuItem.setAttribute('checked', isAnonymous);
  2357.         if (isAnonymous) {
  2358.             // dump("browser.js SetHistoryButton(): isAnonymous is " +isAnonymous+ "\n");
  2359.             button.setAttribute("historyEmpty", "anon");
  2360.             return;
  2361.         }
  2362.  
  2363.         //dump("browser.js SetHistoryButton(): gGlobalHistory.count is " +gGlobalHistory.count+ "\n");
  2364.  
  2365.         if (gGlobalHistory != null && gGlobalHistory.count == 0) {
  2366.             button.setAttribute("historyEmpty", "true");
  2367.         } else {
  2368.             button.setAttribute("historyEmpty", "false");
  2369.         }
  2370.     } catch(ex) { dump("Exception in browser.js: SetHistoryButton\n" + ex + "\n"); }
  2371. }
  2372.  
  2373. ////////////////////////////////////////////////////////////////////////////////////////////
  2374.  
  2375. //JA ff5->vulp
  2376. function BrowserReload()
  2377. {
  2378.     const reloadFlags = nsIWebNavigation.LOAD_FLAGS_NONE;
  2379.  
  2380.     // MERC (DP): we really only need to call this when the engine is Trident.
  2381.     // if Gecko, it is taken care of in the onLocationChange handler in
  2382.     // tabbrowser.xml
  2383.     try {
  2384.         UpdateSiteControlIcon();
  2385.     } catch (ex) {}
  2386.     
  2387.     UpdateStatusBarEngineIcon();
  2388.     
  2389.     return BrowserReloadWithFlags(reloadFlags);
  2390. }
  2391. //JA/>
  2392.  
  2393. // MERC (ccampbell) - command for merged stop-reload-button
  2394. function BrowserStopReload(evt) {
  2395.     var btn = document.getElementById('stop-reload-button');
  2396.     if (!btn)
  2397.     return;
  2398.  
  2399.     if (btn.getAttribute('state') == 'stop')
  2400.     {
  2401.     } // JMC- hackish fix for coming back from customize dialog, loses state
  2402. // Else if (btn.getAttribute('state') == 'reload')
  2403. else // if (btn.getAttribute('state') == 'reload')
  2404. {
  2405.     if (evt.shiftKey) BrowserReloadSkipCache();
  2406. else BrowserReload();
  2407. }
  2408. }
  2409.  
  2410. // MERC (ccampbell) - execute command for overflow toolbar item
  2411. function OverflowMenuCommand(btnId) {
  2412.     var btn = document.getElementById(btnId);
  2413.     if (!btn) return;
  2414.     if (btn.hasAttribute('overflowcommand')) {
  2415.         setTimeout(btn.getAttribute('overflowcommand'), 1);
  2416.     } else if (btn.hasAttribute('oncommand')) {
  2417.         btn.doCommand();
  2418.     } else if (btn.hasAttribute('command')) {
  2419.         var cmd = document.getElementById(btn.getAttribute('command'));
  2420.         cmd.doCommand();
  2421.     } else {
  2422.         dump('NOTHING TO DO FOR OVERFLOW MENU ITEM: '+btnId+'\n');
  2423.     }
  2424. }
  2425.  
  2426. // MERC (rpaul) - update the statusbar icon to reflect which engine we're currently in
  2427. function UpdateStatusBarEngineIcon() {
  2428.     var engineBroadcaster = document.getElementById("currentEngineBroadcaster");
  2429.     var currentEngine;
  2430.     
  2431.     // hide the engine icon if the pref isn't set
  2432.     if (!gPrefService.getBoolPref("browser.show_engine_icon")) {
  2433.         engineBroadcaster.setAttribute("collapsed", "true");
  2434.     } else {
  2435.         engineBroadcaster.removeAttribute("collapsed");
  2436.     }
  2437.     
  2438.     // MERC (rpaul)if we have a handle on a tab and we're in tabbed mode, get the current engine
  2439.     // from the tab
  2440.     if (gBrowser.mTabbedMode) {
  2441.         //currentEngine = gBrowser.getBrowserForTab(tab).docShell.browserEngine;
  2442.         currentEngine = gBrowser.mCurrentTab.getAttribute("engine");
  2443.         
  2444.         if (!currentEngine) currentEngine = "Gecko";
  2445.         else currentEngine = "Trident";     
  2446.  
  2447. } else {
  2448.         // browser isn't in tabbed mode        
  2449.     if (!gBrowser.mTabbedMode) {
  2450.         var currentTab = gBrowser.mCurrentTab;
  2451.         if (currentTab)
  2452.             currentEngine = gBrowser.getBrowserForTab(currentTab).docShell.browserEngine;
  2453.     }    
  2454. }
  2455.     
  2456.     if (currentEngine == "Gecko") {
  2457.         engineBroadcaster.setAttribute("src", "chrome://browser/skin/firefox-dropmarker-16px.png");
  2458.         engineBroadcaster.setAttribute("value", "Gecko");
  2459.                 
  2460.         //enable "Toggle Rendering engines in View menu"
  2461.       document.getElementById('viewMenuToggleRenderingEngine').removeAttribute('disabled');    
  2462.                 
  2463.         //uncheck "Display Like Internet Explorer" in status bar engine menu
  2464.         document.getElementById('displayLikeIE').removeAttribute('checked');
  2465.         document.getElementById('displayLikeIE').removeAttribute('disabled');
  2466.                 
  2467.         // check "Display Like Firefox" in status bar engine menu
  2468.         document.getElementById('displayLikeFirefox').setAttribute('checked', 'true');    
  2469.         document.getElementById('displayLikeFirefox').setAttribute('disabled', 'true');
  2470.         
  2471.         // disable "Display like firefox in view->rendering engines menu
  2472.         document.getElementById('engineIsFirefoxBroadcaster').setAttribute('disabled', 'true');
  2473.         document.getElementById('engineIsIEBroadcaster').removeAttribute('disabled');
  2474.                         
  2475.     } else if (currentEngine == "Trident") {    
  2476.         engineBroadcaster.setAttribute("src", "chrome://browser/skin/ie_icon-dropmarker.gif");
  2477.         engineBroadcaster.setAttribute("value", "IE");
  2478.         
  2479.         //enable "Toggle Rendering engines in View menu"
  2480.       document.getElementById('viewMenuToggleRenderingEngine').removeAttribute('disabled');    
  2481.                 
  2482.         //uncheck "Display Like Firefox" in status bar engine menu
  2483.         document.getElementById('displayLikeFirefox').removeAttribute('checked');
  2484.         document.getElementById('displayLikeFirefox').removeAttribute('disabled');
  2485.         
  2486.         // check "Display Like Internet Explorer" in status bar engine menu
  2487.         document.getElementById('displayLikeIE').setAttribute('checked', 'true');
  2488.         document.getElementById('displayLikeIE').setAttribute('disabled', 'true');
  2489.         
  2490.         // disable "Display like IE in view->rendering engines menu
  2491.         document.getElementById('engineIsIEBroadcaster').setAttribute('disabled', 'true');
  2492.         document.getElementById('engineIsFirefoxBroadcaster').removeAttribute('disabled');
  2493.         
  2494.     } else {
  2495.         dump("Unknown engine name: " + currentEngine + "\n");
  2496.     }
  2497. }
  2498.  
  2499. function UpdateStatusbarEngineIconTrident() {
  2500.     var engineBroadcaster = document.getElementById("currentEngineBroadcaster");
  2501.     
  2502.     engineBroadcaster.setAttribute("src", "chrome://browser/skin/ie_icon-dropmarker.gif");
  2503.     engineBroadcaster.setAttribute("value", "IE");
  2504.     
  2505.     //enable "Toggle Rendering engines in View menu"
  2506.   document.getElementById('viewMenuToggleRenderingEngine').removeAttribute('disabled');    
  2507.             
  2508.     //uncheck "Display Like Firefox" in status bar engine menu
  2509.     document.getElementById('displayLikeFirefox').removeAttribute('checked');
  2510.     document.getElementById('displayLikeFirefox').removeAttribute('disabled');
  2511.     
  2512.     // check "Display Like Internet Explorer" in status bar engine menu
  2513.     document.getElementById('displayLikeIE').setAttribute('checked', 'true');
  2514.     document.getElementById('displayLikeIE').setAttribute('disabled', 'true');
  2515.     
  2516.     // disable "Display like IE in view->rendering engines menu
  2517.     document.getElementById('engineIsIEBroadcaster').setAttribute('disabled', 'true');
  2518.     document.getElementById('engineIsFirefoxBroadcaster').removeAttribute('disabled');
  2519. }
  2520.  
  2521. // MERC (DP): populates partner icons (if any) into the status bar
  2522. function UpdateStatusbarPartnerIcons() {
  2523.     var iconContainer = document.getElementById('partner-icons-container');
  2524.  
  2525.     // clear the partner icons
  2526.     while(iconContainer.firstChild) {
  2527.         iconContainer.removeChild(iconContainer.firstChild);
  2528.     }
  2529.     
  2530.     var sc = sitecontrols.SCSVC;
  2531.     var url = gBrowser.getBrowserForTab(gBrowser.mCurrentTab).currentURI.spec;
  2532.     
  2533.     var urlArray;
  2534.     var iconArray;
  2535.     switch(sc.getSiteTrustLevel(url)) {
  2536.         case 0:
  2537.             // whitelisted
  2538.             var whiteListCode = sc.getSiteTrustLevelDetail(url, sc.SC_TRUST_WHITELIST_IDX);
  2539.             var urlStr = sc.getSiteTrustProviderURL(whiteListCode);
  2540.             urlArray = urlStr.split('|');
  2541.             var iconStr = sc.getSiteTrustProviderIcon(whiteListCode);
  2542.             iconArray = iconStr.split('|');
  2543.             break;
  2544.         case 2:
  2545.             // phish
  2546.             var phishListCode = sc.getSiteTrustLevelDetail(url, sc.SC_TRUST_PHISHLIST_IDX);
  2547.             var urlStr = sc.getSiteTrustProviderURL(phishListCode);
  2548.             urlArray = urlStr.split('|');
  2549.             var iconStr = sc.getSiteTrustProviderIcon(phishListCode);
  2550.             iconArray = iconStr.split('|');
  2551.             break;
  2552.         case 4:
  2553.             // spy
  2554.             var spyListCode = sc.getSiteTrustLevelDetail(url, sc.SC_TRUST_SPYLIST_IDX);
  2555.             var urlStr = sc.getSiteTrustProviderURL(spyListCode);
  2556.             urlArray = urlStr.split('|');
  2557.             var iconStr = sc.getSiteTrustProviderIcon(spyListCode);
  2558.             iconArray = iconStr.split('|');
  2559.             break;
  2560.         case 6:
  2561.             var phishListCode = sc.getSiteTrustLevelDetail(url, sc.SC_TRUST_PHISHLIST_IDX);
  2562.             var plistStr = sc.getSiteTrustProviderName(phishListCode);
  2563.             var plistArray = plistStr.split('|');
  2564.             var purlStr = sc.getSiteTrustProviderURL(phishListCode);
  2565.             var purlArray = purlStr.split('|');
  2566.             var piconStr = sc.getSiteTrustProviderIcon(phishListCode);
  2567.             var piconArray = piconStr.split('|');
  2568.  
  2569.             var spyListCode = sc.getSiteTrustLevelDetail(url, sc.SC_TRUST_SPYLIST_IDX);
  2570.             var slistStr = sc.getSiteTrustProviderName(spyListCode);
  2571.             var slistArray = slistStr.split('|');
  2572.             var surlStr = sc.getSiteTrustProviderURL(spyListCode);
  2573.             var surlArray = surlStr.split('|');
  2574.             var siconStr = sc.getSiteTrustProviderIcon(spyListCode);
  2575.             var siconArray = siconStr.split('|');
  2576.  
  2577.             var combinedURLArray = purlArray;
  2578.             var combinedIconArray = piconArray;
  2579.             var found;
  2580.  
  2581.             for(var arrayItem in slistArray) {
  2582.                 found = false;
  2583.                 for(var k = 0; k < plistArray.length; k++) {
  2584.                     if(slistArray[arrayItem] == plistArray[k]) {
  2585.                         found = true;
  2586.                         break;
  2587.                     }
  2588.                 }
  2589.                 if(!found) {
  2590.                     combinedURLArray.push(surlArray[arrayItem]);
  2591.                     combinedIconArray.push(siconArray[arrayItem]);
  2592.                 }
  2593.             }
  2594.             urlArray = combinedURLArray;
  2595.             iconArray = combinedIconArray;
  2596.             break;
  2597.         case 1:
  2598.         default:
  2599.             // unknown
  2600.     }
  2601.  
  2602.     if(!iconArray || !iconArray.length) {
  2603.         iconContainer.setAttribute('hidden', 'true');
  2604.     } else {
  2605.         iconContainer.removeAttribute('hidden');
  2606.         
  2607.         var iconElem;
  2608.         for(var i = 0; i < iconArray.length; i++) {
  2609.             if(iconArray[i]) {
  2610.                 iconElem = document.createElement("image");
  2611.                 iconElem.setAttribute("src", iconArray[i]);
  2612.                 iconElem.setAttribute("onclick", "loadPartnerPageFromStatusBar('" + urlArray[i] + "');");
  2613.                 iconElem.setAttribute("style", "padding-left: 4px;");
  2614.                 iconContainer.appendChild(iconElem);
  2615.             }
  2616.         }
  2617.     }
  2618. }
  2619.  
  2620. function loadPartnerPageFromStatusBar(url) {
  2621.     var trustTab = gBrowser.addTabAt(url);
  2622.     if (!gPrefService.getBoolPref("browser.tabs.loadInBackground"))
  2623.         gBrowser.selectedTab = trustTab;
  2624. }
  2625.  
  2626.  
  2627. // MERC (DP) - update the icon to match security level AND browser engine
  2628. function UpdateSiteControlIcon(tab)
  2629. {
  2630.     //dump('UpdateSiteControlIcon()\n');
  2631.     // if no tab specified, use the current tab
  2632.     if (!tab) {
  2633.         tab = gBrowser.mCurrentTab;
  2634.     }
  2635.     var tabWindow = gBrowser.getBrowserForTab(tab);
  2636.     var url = tabWindow.currentURI.spec;
  2637.     var menubutton = document.getAnonymousElementByAttribute(tab, 'anonid', 'menubutton');
  2638.  
  2639.     // MERC - JCH: Sanity check
  2640.     if (!menubutton)
  2641.         return;
  2642.  
  2643.     if (!sitecontrols.SCSVC.isControllableURI(url)) {
  2644.         menubutton.setAttribute('hidden', 'true');
  2645.     } else {
  2646.         menubutton.removeAttribute('hidden');
  2647.  
  2648.         var site;
  2649.         if(url == 'about:blank') {
  2650.             site = sitecontrols.SCSVC.getResourceForURI('');
  2651.         } else {
  2652.             site = sitecontrols.SCSVC.getResourceForURI(url);
  2653.         }
  2654.         // MERC - JCH: 'site' is already a resource
  2655.         // site = site.QueryInterface(Components.interfaces.nsIRDFResource);
  2656.  
  2657.         // if host is not controlled (default), change icon accordingly
  2658.         //  MERC - JCH: Three possible default settings now
  2659.         // if (site.Value == sitecontrols.DEFAULT_SITE)
  2660.         if ((site.Value == sitecontrols.SC_VERIFIED_DEFAULT) ||
  2661.             (site.Value == sitecontrols.SC_NOT_VERIFIED_DEFAULT) ||
  2662.             (site.Value == sitecontrols.SC_WARNING_DEFAULT))
  2663.         {
  2664.             menubutton.setAttribute("defaultSC", "true");
  2665.         }
  2666.         else
  2667.             menubutton.removeAttribute("defaultSC");
  2668.  
  2669.         var trustLevel = 1;
  2670.         try {
  2671.               // MERC - JCH: Pass host string to getSiteTrustLevel()
  2672.             if (tabWindow.currentURI.spec) {
  2673.                 trustLevel = sitecontrols.SCSVC.getSiteTrustLevel(tabWindow.currentURI.spec);
  2674.             }
  2675.         } catch (ex) {
  2676.             dump("Caught exception : " + ex + "\n\n");
  2677.         }
  2678.         menubutton.setAttribute("trustLevel", trustLevel);
  2679.  
  2680.         // if trust settings is disabled
  2681.         var securityLevel;
  2682.         if(trustLevel == -1 && !sitecontrols.SCSVC.isControlledSite(tabWindow.currentURI.host)) {
  2683.             securityLevel = gPrefService.getCharPref("trustsettings.default");
  2684.         } else {
  2685.             securityLevel = sitecontrols.SCSVC.readSiteControlResource(site, 'securityLevel');
  2686.         }
  2687.         menubutton.setAttribute("browserSetting", securityLevel);
  2688.  
  2689.         // update the down menubutton icon according to what browser engine is set
  2690.         var currentEngine = gBrowser.getBrowserForTab(tab).docShell.browserEngine;
  2691.  
  2692.         /*
  2693.         dump('********** SECURITY LEVEL ***************\n');
  2694.         dump('Host: ' + site.Value + ' - Level: ' + securityLevel + '\n');
  2695.         dump('********** Current Engine ***************\n');
  2696.         dump('engine: ' + currentEngine + '\n');
  2697.         dump('*****************************************\n');
  2698.         */
  2699.  
  2700.         if (currentEngine == "Gecko") {
  2701.             tab.removeAttribute("engine");
  2702.             menubutton.setAttribute("engine", "Gecko");
  2703.         } else if (currentEngine == "Trident") {
  2704.             tab.setAttribute("engine", "Trident");
  2705.             menubutton.setAttribute("engine", "Trident");
  2706.         } else {
  2707.             dump("Unknown engine name: " + currentEngine + "\n");
  2708.         }
  2709.         
  2710.         // MERC (rpaul) update the statusbar engine icon when the
  2711.         // the site control has been updated for a particular tab
  2712.         UpdateStatusBarEngineIcon();
  2713.     }
  2714. }
  2715.  
  2716. /*
  2717. engine    ActiveX     Javascript     Java        securityLevel
  2718. weight  8         4           2              1
  2719. Gecko     false       false          false       High
  2720. Gecko     false       false          true        Medium
  2721. Gecko     false       true           false       Medium
  2722. Gecko     false       true           true        Medium
  2723. Gecko     true        false          false       High
  2724. Gecko     true        false          true        Medium
  2725. Gecko     true        true           false       Medium
  2726. Gecko     true        true           true        Medium
  2727. Trident   false       false          false       High
  2728. Trident   false       false          true        Medium
  2729. Trident   false       true           false       Medium
  2730. Trident   false       true           true        Medium
  2731. Trident   true        false          false       Low
  2732. Trident   true        false          true        Low
  2733. Trident   true        true           false       Low
  2734. Trident   true        true           true        Low
  2735.  
  2736.  
  2737. */
  2738.  
  2739. // ********* if you change this var, you need to change in pref-sitecontrols.js as well
  2740. var gSecurityLevels= new Array('High','Medium','Medium','Medium','High','Medium','Medium','Medium', 'High','Medium', 'Medium', 'Medium', 'Low', 'Low', 'Low', 'Low');
  2741. function updateSCSecurityLevel()
  2742. {
  2743.     var wtEngine, wtActiveX, wtJS, wtJava;
  2744.  
  2745.     // Get RDF resource for the controlled site
  2746.     // *** at this point host should always be controlled since it gets added when
  2747.     // you select activex, java, js from the dropdown menu
  2748.     var site = GetSiteControlResource();
  2749.  
  2750.     var displayEngine = getWebNavigation().browserEngine;
  2751.     var enableActiveX = sitecontrols.SCSVC.readSiteControlResource(site, 'enableActiveX');
  2752.     var enableJava = sitecontrols.SCSVC.readSiteControlResource(site, 'enableJava');
  2753.     var enableJavaScript = sitecontrols.SCSVC.readSiteControlResource(site, 'enableJavaScript');
  2754.  
  2755.     var sec;
  2756.     if (displayEngine == 'Trident')
  2757.     wtEngine=8;
  2758. else
  2759.     wtEngine=0;
  2760.  
  2761.     if(enableActiveX == 'true')
  2762.     wtActiveX=4;
  2763. else
  2764.     wtActiveX=0;
  2765.  
  2766.     if(enableJavaScript == 'true')
  2767.     wtJS=2;
  2768. else
  2769.     wtJS=0;
  2770.  
  2771.     if(enableJava == 'true')
  2772.     wtJava=1;
  2773. else
  2774.     wtJava=0;
  2775.  
  2776.     var idx = wtEngine + wtActiveX + wtJS + wtJava;
  2777.     var securityLevel = gSecurityLevels[idx];
  2778.  
  2779.     /*
  2780.     dump('************** updateSCSecurityLevel() *******************\n');
  2781.     dump('host: ' + host + '\n');
  2782.     dump('displayEngine: ' + displayEngine + '\n');
  2783.     dump('enableActiveX: ' + enableActiveX + '\n');
  2784.     dump('enableJava: ' + enableJava + '\n');
  2785.     dump('enableJavaScript: ' + enableJavaScript + '\n');
  2786.     dump('securityLevel: ' + securityLevel + '\n');
  2787.     dump('idx: ' + idx + '\n');
  2788.     dump('**********************************************************\n');
  2789.     */
  2790.  
  2791.     sitecontrols.SCSVC.updateSiteControlResource(site, 'securityLevel', securityLevel);
  2792.     // sitecontrols.SCSVC.writeSiteControls();
  2793. }
  2794.  
  2795. function BrowserReloadSkipCache()
  2796. {
  2797.     // Bypass proxy and cache.
  2798.     const reloadFlags = nsIWebNavigation.LOAD_FLAGS_BYPASS_PROXY | nsIWebNavigation.LOAD_FLAGS_BYPASS_CACHE;
  2799.     return BrowserReloadWithFlags(reloadFlags);
  2800. }
  2801.  
  2802. function BrowserHome(forceNewTab)
  2803. {
  2804.     var homePage = gHomeButton.getHomePage();
  2805.     //JA ff5->vulp loadOneOrMoreURIs(homePage);
  2806.     // if overwrite: load tabs left to right - add tabs as needed
  2807.     // if new: add tabs starting at position specified browser.tabs.newTabLocation
  2808.     if(!forceNewTab && gPrefService.getCharPref("browser.tabs.homepage.open") == 'overwrite') {
  2809.         loadOneOrMoreURIsOnHomePageClick(homePage);
  2810.     } else { // else == 'new'
  2811.         addOneOrMoreURIs(homePage);
  2812.     }//JA/>
  2813. }
  2814.  
  2815. function loadOneOrMoreURIsOnHomePageClick(aURIString)
  2816. {
  2817.     if (aURIString.indexOf("|") != -1) {
  2818.         var i;
  2819.  
  2820.         // get browser tabs
  2821.         var browserTabs = gBrowser.mTabContainer.childNodes;
  2822.  
  2823.         // get URLs
  2824.         var urls = aURIString.split("|");
  2825.  
  2826.         // 3 cases:
  2827.         if (browserTabs.length < urls.length) {
  2828.             // a) if # tabs < # URLs
  2829.             for (i = 0; i < browserTabs.length; i++) {
  2830.                 gBrowser.getBrowserForTab(browserTabs[i]).loadURI(urls[i]);
  2831.             }
  2832.             for (i = browserTabs.length; i < urls.length; i++) {
  2833.                 gBrowser.addTab(urls[i]);
  2834.             }
  2835.         } else if (browserTabs.length > urls.length) {
  2836.             // b) if # tabs > # URLs
  2837.             for (i = 0; i < urls.length; i++) {
  2838.                 gBrowser.getBrowserForTab(browserTabs[i]).loadURI(urls[i]);
  2839.             }
  2840.         } else {
  2841.             // c) if # tabs == # URLs
  2842.             for (i = 0; i < urls.length; i++) {
  2843.                 gBrowser.getBrowserForTab(browserTabs[i]).loadURI(urls[i]);
  2844.             }
  2845.         }
  2846.  
  2847.         // set focus to the first tab
  2848.         gBrowser.selectedTab = browserTabs[0];
  2849.  
  2850.     } else {
  2851.         // only one URL specifed
  2852.         loadURI(aURIString, null, null);
  2853.     }
  2854.  
  2855.     // update the tab chrome
  2856.     gBrowser.updateChromeWhenLastTab();
  2857. }
  2858.  
  2859. function closeAllTabsFromSameSite() {
  2860.     var browserPanels = gBrowser.mPanelContainer.childNodes;
  2861.  
  2862.     for(var i = 0; i < browserPanels.length; i++) {
  2863.         // dump("*** URL: " + browserPanels[i].getCurrentURI() + "\n");
  2864.     }
  2865. }
  2866.  
  2867. // MERC (DP): adds tabs starting at browser.tabs.newTabLocation and subsequently
  2868. // to the right. select the first tab added after.
  2869. function addOneOrMoreURIs(aURIString)
  2870. {
  2871.     var savedSelectedTab = gBrowser.selectedTab;
  2872.     var firstAdded;
  2873.  
  2874.     if (aURIString.indexOf("|") != -1) {
  2875.         var urls = aURIString.split("|");
  2876.         gBrowser.selectedTab = gBrowser.addTabAt(urls[0]);
  2877.  
  2878.         // save the first tab add, so that we can focus it at the end
  2879.         firstAdded = gBrowser.selectedTab;
  2880.  
  2881.         for (var i = 1; i < urls.length; ++i)
  2882.         gBrowser.selectedTab = gBrowser.addTabAt(urls[i], 'right');
  2883.     }
  2884. else {
  2885.     firstAdded = gBrowser.addTabAt(aURIString);
  2886. }
  2887.  
  2888. /* comment this out because we always want to focus the first tab
  2889. if(gPrefService.getBoolPref("browser.tabs.loadInBackground")) {
  2890. // focus the tab active before addition
  2891. gBrowser.selectedTab = savedSelectedTab;
  2892. } else {
  2893. // focus the first added tab
  2894. gBrowser.selectedTab = firstAdded;
  2895. }
  2896. */
  2897.  
  2898. // focus the first added tab
  2899. gBrowser.selectedTab = firstAdded;
  2900. }
  2901.  
  2902.  
  2903. function BrowserHomeClick(aEvent)
  2904. {
  2905.     if (aEvent.button == 2) // right-click: do nothing
  2906.         return;
  2907.  
  2908.     var homePage = gHomeButton.getHomePage();
  2909.     var where = whereToOpenLink(aEvent);
  2910.     var urls;
  2911.  
  2912.     // openUILinkIn in utilityOverlay.js doesn't handle loading multiple pages
  2913.     switch (where) {
  2914.     case "save":
  2915.         urls = homePage.split("|");
  2916.         saveURL(urls[0], null, null, true);  // only save the first page
  2917.         break;
  2918.     case "current":
  2919.         loadOneOrMoreURIs(homePage);
  2920.         break;
  2921.     case "tabshifted":
  2922.     case "tab":
  2923.         urls = homePage.split("|");
  2924.         var firstTabAdded = gBrowser.addTab(urls[0]);
  2925.         for (var i = 1; i < urls.length; ++i)
  2926.             gBrowser.addTab(urls[i]);
  2927.         if ((where == "tab") ^ getBoolPref("browser.tabs.loadBookmarksInBackground", false)) {
  2928.             gBrowser.selectedTab = firstTabAdded;
  2929.             _content.focus();
  2930.             // JMC - URLBar focus bug, workin on it
  2931.             dump ("Just focused the _content, which is " + _content + "\n");
  2932.         }
  2933.         break;
  2934.     case "window":
  2935.         OpenBrowserWindow();
  2936.         break;
  2937.     }
  2938. }
  2939.  
  2940. function loadOneOrMoreURIs(aURIString)
  2941. {
  2942.     var urls = aURIString.split("|");
  2943.     loadURI(urls[0]);
  2944.     for (var i = 1; i < urls.length; ++i)
  2945.         gBrowser.addTab(urls[i]);
  2946. }
  2947.  
  2948. function constructGoMenuItem(goMenu, beforeItem, url, title)
  2949. {
  2950.     var menuitem = document.createElementNS(kXULNS, "menuitem");
  2951.     menuitem.setAttribute("statustext", url);
  2952.     menuitem.setAttribute("label", title);
  2953.     goMenu.insertBefore(menuitem, beforeItem);
  2954.     return menuitem;
  2955. }
  2956.  
  2957. function onGoMenuHidden()
  2958. {
  2959.     setTimeout(destroyGoMenuItems, 0, document.getElementById('goPopup'));
  2960. }
  2961.  
  2962. function destroyGoMenuItems(goMenu) {
  2963.     var startSeparator = document.getElementById("startHistorySeparator");
  2964.     var endSeparator = document.getElementById("endHistorySeparator");
  2965.     endSeparator.hidden = true;
  2966.  
  2967.     // Destroy the items.
  2968.     var destroy = false;
  2969.     for (var i = 0; i < goMenu.childNodes.length; i++) {
  2970.         var item = goMenu.childNodes[i];
  2971.         if (item == endSeparator)
  2972.             break;
  2973.  
  2974.         if (destroy) {
  2975.             i--;
  2976.             goMenu.removeChild(item);
  2977.         }
  2978.  
  2979.         if (item == startSeparator)
  2980.             destroy = true;
  2981.     }
  2982. }
  2983.  
  2984. function updateGoMenu(goMenu)
  2985. {
  2986.     // In case the timer didn't fire.
  2987.     destroyGoMenuItems(goMenu);
  2988.  
  2989.     var history = document.getElementById("hiddenHistoryTree");
  2990.  
  2991.     if (history.hidden) {
  2992.         history.hidden = false;
  2993.         var globalHistory = Components.classes["@mozilla.org/browser/global-history;2"]
  2994.                                       .getService(Components.interfaces.nsIRDFDataSource);
  2995.         history.database.AddDataSource(globalHistory);
  2996.     }
  2997.  
  2998.     if (!history.ref)
  2999.         history.ref = "NC:HistoryRoot";
  3000.  
  3001.     var count = history.treeBoxObject.view.rowCount;
  3002.     if (count > 10)
  3003.         count = 10;
  3004.  
  3005.     if (count == 0)
  3006.         return;
  3007.  
  3008.     const NC_NS     = "http://home.netscape.com/NC-rdf#";
  3009.  
  3010.     if (!gRDF)
  3011.         gRDF = Components.classes["@mozilla.org/rdf/rdf-service;1"]
  3012.                          .getService(Components.interfaces.nsIRDFService);
  3013.  
  3014.     var builder = history.builder.QueryInterface(Components.interfaces.nsIXULTreeBuilder);
  3015.  
  3016.     var beforeItem = document.getElementById("endHistorySeparator");
  3017.  
  3018.     var nameResource = gRDF.GetResource(NC_NS + "Name");
  3019.  
  3020.     var endSep = beforeItem;
  3021.     var showSep = false;
  3022.  
  3023.     for (var i = count-1; i >= 0; i--) {
  3024.         var res = builder.getResourceAtIndex(i);
  3025.         var url = res.Value;
  3026.         var titleRes = history.database.GetTarget(res, nameResource, true);
  3027.         if (!titleRes)
  3028.             continue;
  3029.  
  3030.         showSep = true;
  3031.         var titleLiteral = titleRes.QueryInterface(Components.interfaces.nsIRDFLiteral);
  3032.         beforeItem = constructGoMenuItem(goMenu, beforeItem, url, titleLiteral.Value);
  3033.     }
  3034.  
  3035.     if (showSep)
  3036.         endSep.hidden = false;
  3037. }
  3038.  
  3039. // MERC - JCH : Add one site to bookmarks. Referred to in browser-context.inc,
  3040. // browser-sets.inc, browser.xul, tabbox.xml, and tabbrowser.xml.
  3041. function bookmarkPage(aBrowser, aIsWebPanel)
  3042. {
  3043.     addBookmarkForBrowser(aBrowser.webNavigation, aIsWebPanel, false);
  3044. }
  3045.  
  3046. function bookmarkPageFromMultibar(aBrowser, aIsWebPanel)
  3047. {
  3048.     addBookmarkForBrowser(aBrowser.webNavigation, aIsWebPanel, true);
  3049. }
  3050.  
  3051. // MERC - JCH: Add all the current tabs to bookmarks.
  3052. function bookmarkAllTabs(aBrowser, isMultibarButton, aIsWebPanel)
  3053. {
  3054.     const browsers = aBrowser.browsers;
  3055.     if (browsers && browsers.length > 1)
  3056.         addBookmarkForTabBrowser(aBrowser, isMultibarButton);
  3057.     else addBookmarkForBrowser(aBrowser.webNavigation, aIsWebPanel, isMultibarButton);
  3058. }
  3059.  
  3060.  
  3061. function addBookmarkAs(aBrowser, aIsWebPanel, bTabGroup)
  3062. {
  3063.     const browsers = aBrowser.browsers;
  3064.     if (browsers && browsers.length > 1)
  3065.     {
  3066.         if (bTabGroup)
  3067.         {
  3068.             bookmarkAllTabs(aBrowser, true, aIsWebPanel);
  3069.         } else {
  3070.             addBookmarkForTabBrowser(aBrowser);
  3071.         }
  3072.     } else {
  3073.         addBookmarkForBrowser(aBrowser.webNavigation, aIsWebPanel);
  3074.     }
  3075. }
  3076.  
  3077. function addBookmarkForTabBrowser(aTabBrowser, aSelect)
  3078. {
  3079.     var tabsInfo = [];
  3080.     var currentTabInfo = { name: "", url: "", charset: null };
  3081.  
  3082.     const activeBrowser = aTabBrowser.selectedBrowser;
  3083.     const browsers = aTabBrowser.browsers;
  3084.     for (var i = 0; i < browsers.length; ++i) {
  3085.         var webNav = browsers[i].webNavigation;
  3086.         var url = webNav.currentURI.spec;
  3087.         var name = "";
  3088.         var charSet;
  3089.         try {
  3090.             var doc = webNav.document;
  3091.             name = doc.title || url;
  3092.             charSet = doc.characterSet;
  3093.         } catch (e) {
  3094.             name = url;
  3095.         }
  3096.         tabsInfo[i] = { name: name, url: url, charset: charSet };
  3097.         if (browsers[i] == activeBrowser)
  3098.             currentTabInfo = tabsInfo[i];
  3099.     }
  3100.  
  3101.     openDialog( "chrome://browser/content/bookmarks/addBookmark2.xul",
  3102.                 "",
  3103.                 "centerscreen,chrome,dialog,resizable,dependent",
  3104.                 currentTabInfo.name,
  3105.                 currentTabInfo.url,
  3106.                 null,
  3107.                 currentTabInfo.charset,
  3108.                 "addGroup" + (aSelect ? ",group" : ""),
  3109.                 tabsInfo,
  3110.                 null, null, null, null, null, aSelect);
  3111. }
  3112.  
  3113. function addBookmarkForBrowser(aDocShell, aIsWebPanel, cmdFromMultibar)
  3114. {
  3115.     // Bug 52536: We obtain the URL and title from the nsIWebNavigation
  3116.     // associated with a <browser/> rather than from a DOMWindow.
  3117.     // This is because when a full page plugin is loaded, there is
  3118.     // no DOMWindow (?) but information about the loaded document
  3119.     // may still be obtained from the webNavigation.
  3120.  
  3121.     var url = aDocShell.currentURI.spec;
  3122.     var title, charSet = null;
  3123.     try {
  3124.         title = aDocShell.document.title || url;
  3125.         charSet = aDocShell.document.characterSet;
  3126.     }
  3127.     catch (e) {
  3128.         title = url;
  3129.     }
  3130.     if (cmdFromMultibar) BookmarksUtils.addBookmarkFromMultibar(url, title, charSet, aIsWebPanel);
  3131.     else BookmarksUtils.addBookmark(url, title, charSet, aIsWebPanel);
  3132. }
  3133.  
  3134. // MERC (DP): this function is only called from inside tabbrowser.  It is needed
  3135. // for the case when you add a bookmark using the tab context menu from a
  3136. // non-active tab.
  3137. function bookmarkPageFromTabRightClick()
  3138. {
  3139.     var uri = gBrowser.getBrowserForTab(gBrowser.mContextTab).currentURI.spec;
  3140.     var title = gBrowser.mContextTab.label;
  3141.     
  3142.     BookmarksUtils.addBookmark(uri, title);
  3143. }
  3144.  
  3145. function openLocation()
  3146. {
  3147.     if (gURLBar && !gURLBar.parentNode.parentNode.collapsed) {
  3148.         gURLBar.focus();
  3149.         gURLBar.select();
  3150.     }
  3151. else {
  3152.     openDialog("chrome://browser/content/openLocation.xul", "_blank", "chrome,modal,titlebar", window);
  3153. }
  3154. }
  3155.  
  3156. function BrowserOpenTab()
  3157. {
  3158.     gBrowser.selectedTab = gBrowser.addTabAt('about:blank');
  3159.         
  3160.     // MERC (rpaul) update the current engine broadcaster for the statusbar
  3161.     // blank tabs are by default Gecko
  3162.     //UpdateStatusBarEngineIcon();    
  3163.     
  3164.     if (gURLBar)
  3165.         setTimeout(function() { gURLBar.focus(); }, 0);
  3166. }
  3167.  
  3168. function BrowserNetscapeTab()
  3169. {
  3170.     var url;
  3171.     var pref = Components.classes["@mozilla.org/preferences-service;1"]
  3172.                          .getService(Components.interfaces.nsIPrefBranch);
  3173.     try {
  3174.         url = gPrefService.getComplexValue("browser.netscape.homepage",
  3175.                                            Components.interfaces.nsIPrefLocalizedString).data;
  3176.     } catch(e) {dump ("Caught Exception: " + e + "\n"); }
  3177.  
  3178.     gBrowser.selectedTab = gBrowser.addTabAt(url);
  3179. }
  3180.  
  3181. //<JA ff5->vulp
  3182. var gCurrentDocCharset = null;
  3183.  
  3184. function BrowserStoreTabCharset()
  3185. {
  3186.     gCurrentDocCharset = window._content.document.characterSet;
  3187. }
  3188.  
  3189. function BrowserOpenPrefTab()
  3190. {
  3191.     gBrowser.selectedTab = gBrowser.addPrefTab();
  3192. }
  3193.  
  3194. // MERC (DP)
  3195. function BrowserOpenNewCurrentTab() {
  3196.     currentTab = gBrowser.mCurrentTab;
  3197.     var curTabBrowser=gBrowser.getBrowserForTab(currentTab);
  3198.     var sHistory=curTabBrowser.sessionHistory;
  3199.     gBrowser.selectedTab = gBrowser.addTabAtWithFlag(0,gBrowser.getBrowserForTab(currentTab).currentURI.spec);
  3200.     var newTabBrowser=gBrowser.getBrowserForTab(gBrowser.selectedTab);
  3201.     newTabBrowser.sessionHistory.appendFrom(sHistory);
  3202. }//JA/>
  3203.  
  3204. /* Called from the openLocation dialog. This allows that dialog to instruct
  3205. its opener to open a new window and then step completely out of the way.
  3206. Anything less byzantine is causing horrible crashes, rather believably,
  3207. though oddly only on Linux. */
  3208. function delayedOpenWindow(chrome,flags,url)
  3209. {
  3210.     // The other way to use setTimeout,
  3211.     // setTimeout(openDialog, 10, chrome, "_blank", flags, url),
  3212.     // doesn't work here.  The extra "magic" extra argument setTimeout adds to
  3213.     // the callback function would confuse prepareForStartup() by making
  3214.     // window.arguments[1] be an integer instead of null.
  3215.     setTimeout(function() { openDialog(chrome, "_blank", flags, url); }, 10);
  3216. }
  3217.  
  3218. /* Required because the tab needs time to set up its content viewers and get the load of
  3219. the URI kicked off before becoming the active content area. */
  3220. function delayedOpenTab(url)
  3221. {
  3222.     setTimeout(function(aTabElt) { gBrowser.selectedTab = aTabElt; }, 0, gBrowser.addTabAt(url));
  3223. }
  3224.  
  3225. function BrowserOpenFileWindow()
  3226. {
  3227.     // Get filepicker component.
  3228.     try {
  3229.         const nsIFilePicker = Components.interfaces.nsIFilePicker;
  3230.         var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  3231.         fp.init(window, gNavigatorBundle.getString("openFile"), nsIFilePicker.modeOpen);
  3232.         fp.appendFilters(nsIFilePicker.filterAll | nsIFilePicker.filterText | nsIFilePicker.filterImages |
  3233.         nsIFilePicker.filterXML | nsIFilePicker.filterHTML);
  3234.  
  3235.         if (fp.show() == nsIFilePicker.returnOK) {
  3236.             // MERC (DP): respect local file open pref
  3237.             var openPref = gPrefService.getCharPref("browser.tabs.localfile.open");
  3238.             if (openPref == 'overwrite') {
  3239.                 openTopWin(fp.fileURL.spec);
  3240.             } else {
  3241.                 // dump("Opening file: " + fp.fileURL.spec + " with addTabAt()\n");
  3242.                 var t = gBrowser.addTabAt(fp.fileURL.spec);
  3243.                 if(!gPrefService.getBoolPref("browser.tabs.loadInBackground")) {
  3244.                     gBrowser.selectedTab = t;
  3245.                 }    
  3246.             }
  3247.             // END MERC
  3248.  
  3249.         }
  3250.     } catch (ex) {
  3251.     }
  3252. }
  3253.  
  3254. function BrowserCloseCurrentTab()
  3255. {
  3256.     setTimeout("gBrowser.removeCurrentTab();", 10);
  3257. }
  3258.  
  3259. function BrowserDelayRemoveAllTabsBut()
  3260. {
  3261.     setTimeout("gBrowser.removeAllTabsBut(gBrowser.mCurrentTab);", 10 );
  3262. }
  3263.  
  3264. function BrowserDelayCloseAllTabsToLeft()
  3265. {
  3266.     setTimeout("gBrowser.closeAllTabsToLeft(gBrowser.mContextTab);", 10 );
  3267. }
  3268.  
  3269. function BrowserDelayCloseAllTabsToRight()
  3270. {
  3271.     setTimeout("gBrowser.closeAllTabsToRight(gBrowser.mContextTab);", 10 );
  3272. }
  3273.  
  3274. function BrowserDelayCloseAllBlankTabs()
  3275. {
  3276.     setTimeout("gBrowser.closeAllBlankTabs();", 10 );
  3277. }
  3278.  
  3279. function DelayCloseAllTabsFromSameSite()
  3280. {
  3281.     setTimeout("gBrowser.closeAllTabsFromSameSite(gBrowser.mContextTab);", 10 );
  3282. }
  3283.  
  3284. function DelayCloseAllTabsExceptFromSameSite()
  3285. {
  3286.     setTimeout("gBrowser.closeAllTabsExceptFromSameSite(gBrowser.mContextTab);", 10 );
  3287. }
  3288.  
  3289. function BrowserCloseTabOrWindow()
  3290. {
  3291.     //dump("\nJA~~~~~~~~~~~~~:BrowserCloseThisTabOrWindow: hpSomeDoc\n");
  3292.     if (gBrowser.localName == 'tabbrowser' && gBrowser.tabContainer.childNodes.length > 1)
  3293.     { // Just close up a tab.
  3294.         gBrowser.removeCurrentTab();
  3295.         return;
  3296.     }
  3297.  
  3298.     BrowserCloseWindow();
  3299. }
  3300.  
  3301. //JA
  3302. function BrowserGetTabsCount()
  3303. {
  3304.     return gBrowser.tabContainer.childNodes.length;
  3305. }
  3306.  
  3307. function BrowserCloseThisTabOrWindow(hpSomeDoc)
  3308. {
  3309.     //dump("\nJA~~~~~~~~~~~~~:BrowserCloseThisTabOrWindow: hpSomeDoc ="+hpSomeDoc+"\n");
  3310.     if(!hpSomeDoc)
  3311.         return false;//err
  3312.     var cnTabs = gBrowser.tabContainer.childNodes;
  3313.     var numtabs = cnTabs.length;
  3314.     if (numtabs>1)
  3315.     {
  3316.         for (var i = 0; i < numtabs; ++i)
  3317.         {
  3318.             var doc = gBrowser.getBrowserForTab(cnTabs[i]).contentDocument;
  3319.             if (doc == hpSomeDoc)
  3320.             {    //dump("!!!!!~~~~~~~~~~~~~~Found in tab# "+i+"\n");
  3321.                 cnTabs[i].isClosing = true;
  3322.                 setTimeout(function(n){ gBrowser.removeTab(gBrowser.tabContainer.childNodes[n]); }, 0, i);
  3323.                 //gBrowser.removeTab(cnTabs[i]);crashes plugin!
  3324.                 return true;
  3325.             }
  3326.         }
  3327.     }
  3328.     else if(numtabs ==1 && hpSomeDoc == gBrowser.getBrowserForTab(cnTabs[0]).contentDocument)
  3329.     {
  3330.         //dump("~~~~~~~~~~~~~~~~Found in the only tab!\n\n");
  3331.         setTimeout("BrowserCloseWindow()");
  3332.         return true;
  3333.     }
  3334.  
  3335.     //dump("~~~~~~~~~~Couldn't find hpSomeDoc!\n\n");
  3336.     return false;
  3337. }
  3338. //end JA
  3339.  
  3340. function BrowserTryToCloseWindow()
  3341. {
  3342.     //give tryToClose a chance to veto if it is defined
  3343.     if (typeof(window.tryToClose) != "function" || window.tryToClose())
  3344.     BrowserCloseWindow();
  3345. }
  3346.  
  3347. function BrowserCloseWindow()
  3348. {
  3349.     // This code replicates stuff in Shutdown().  It is here because
  3350.     // window.screenX and window.screenY have real values.  We need
  3351.     // to fix this eventually but by replicating the code here, we
  3352.     // provide a means of saving position (it just requires that the
  3353.     // user close the window via File->Close (vs. close box).
  3354.  
  3355.     // Get the current window position/size.
  3356.     var x = window.screenX;
  3357.     var y = window.screenY;
  3358.     var h = window.outerHeight;
  3359.     var w = window.outerWidth;
  3360.  
  3361.     // Store these into the window attributes (for persistence).
  3362.     var win = document.getElementById( "main-window" );
  3363.     win.setAttribute( "x", x );
  3364.     win.setAttribute( "y", y );
  3365.     win.setAttribute( "height", h );
  3366.     win.setAttribute( "width", w );
  3367.  
  3368.     closeWindow(true);
  3369. }
  3370.  
  3371.  
  3372. function loadURI(uri, referrer, postData)
  3373. {
  3374.  
  3375.     // dump('************ loadURI('+uri+') *******************\n');
  3376.     var docshell = getWebNavigation();
  3377.     var hpDoc;
  3378.  
  3379.     if (docshell.browserEngine == 'Trident')
  3380.     hpDoc = getTridentDocument();
  3381.  
  3382.     //JA if we have Trident running, check if we have to switch to Gecko, otherwise
  3383.     //JA decision about engine is made in nsContenDLF.cpp!
  3384.     if (hpDoc)
  3385.     {
  3386.         var sc = sitecontrols.SCSVC;
  3387.         // this will put a http:// in front of the uri if needed
  3388.         if (!gURIFixup)
  3389.             gURIFixup = Components.classes["@mozilla.org/docshell/urifixup;1"]
  3390.                                   .getService(Components.interfaces.nsIURIFixup);
  3391.         
  3392.         var urispec;
  3393.         if (!uri || (uri == '')) urispec = 'about:blank';
  3394.         else urispec = gURIFixup.createFixupURI(uri, 0).spec;
  3395.  
  3396.         if ((urispec != 'about:blank') && (!sc.isControllableURI(urispec))) {
  3397.             // Generally speaking, for non-controllable URIs we want to force
  3398.             // the engine into Gecko...
  3399.             docshell.browserEngine = 'Gecko';
  3400.         } else {
  3401.             // At this point we know that the URI is either controllable or else
  3402.             // is 'about:blank', so the engine to use will be dictated by
  3403.             // Site Controls
  3404.             var site;
  3405.             if (uri == 'about:blank') {
  3406.                 // We will treat this as if it's a DEFAULT site
  3407.                 // This should be SiteControls:Default resource
  3408.                 site = sc.getResourceForURI('');
  3409.             }
  3410.             else
  3411.                 site = sc.getResourceForURI(uri);
  3412.  
  3413.             docshell.browserEngine = sc.readSiteControlResource(site, "displayEngine");
  3414.         
  3415.         }
  3416.     }     
  3417.     // Check current engine
  3418.     try {
  3419.         if (docshell.browserEngine == 'Trident' && hpDoc) {
  3420.             hpDoc.navigateToURL(uri,null);
  3421.         } else {
  3422.             if (postData === undefined)
  3423.                 postData = null;
  3424.             //var webnav = getWebNavigation();
  3425.             docshell.loadURI(uri, nsIWebNavigation.LOAD_FLAGS_NONE, referrer, postData, null);
  3426.             gBrowser.mCurrentTab.removeAttribute("engine");
  3427.             // MERC - SL - set focus to url bar for blank page loads (always gecko)
  3428.             if (uri == "about:blank") {
  3429.                var urlbar = document.getElementById("urlbar");
  3430.             urlbar.focus();            
  3431.          }   
  3432.             
  3433.         }
  3434.     } catch(e) {dump ("Caught Exception: " + e + "\n");    }
  3435.     // dump('************ END loadURI('+uri+') *******************\n');
  3436. }
  3437.  
  3438.  
  3439. // MERC (DP):
  3440. // uses openPref to determine whether to open URI in current tab or new tab.
  3441. // set focus according to 'browser.tabs.loadInBackground'
  3442. function loadURIWithOpenPref(uri, openPref, referrer, postData) {
  3443.     if (gPrefService.getCharPref(openPref) == 'overwrite') {
  3444.         loadURI(uri, referrer, postData);
  3445.     } else { // == 'new'
  3446.         var theTab = gBrowser.addTabAt(uri, undefined, referrer, null, postData);
  3447.         if (!gPrefService.getBoolPref("browser.tabs.loadInBackground"))
  3448.             gBrowser.selectedTab = theTab;
  3449.     }
  3450. }
  3451.  
  3452.  
  3453. /* trim leading and trailing whitespace from a string */
  3454. function trim(str)
  3455. {
  3456.     str=str.replace(/^\s*/,"");
  3457.     str=str.replace(/\s*$/,"");
  3458.     return str;
  3459. }
  3460.  
  3461.  
  3462. /**
  3463. * Given keywords in uri variable, simulate typing
  3464. * stuff into search-bar
  3465. **/
  3466. function BrowserSearchURL(uri, referrer, postData)
  3467. {
  3468.     dump('browser.js: BrowserSearchURL('+uri+')\n');
  3469.  
  3470.     // trim whitespace from either end of the uri
  3471.     var trimuri = trim(uri);
  3472.     if (trimuri)
  3473.         search.AddToHistory(trimuri);
  3474.  
  3475.     var searchURL = gPrefService.getCharPref('keyword.URL')
  3476.                     + encodeURIComponent(trimuri);
  3477.     loadURIWithOpenPref(searchURL,
  3478.                         "browser.tabs.searchbarresult.open",
  3479.                         referrer, postData);
  3480.     var searchSvc =
  3481.         Components.classes["@mozilla.org/rdf/datasource;1?name=internetsearch"]
  3482.                   .getService(Components.interfaces.nsIInternetSearchService);
  3483.     searchSvc.FindInternetSearchResults(searchURL);
  3484. }
  3485.  
  3486.  
  3487. // MERC (DP):
  3488. // added the param bOpenWithPref. this determines whether to open the URL
  3489. // in current OR new tab
  3490. function BrowserLoadURL(aTriggeringEvent, aPostData, aOpenWithPref)
  3491. {
  3492.     if (!gURLBar)
  3493.         gURLBar = document.getElementById("urlbar");    
  3494.     var url = gURLBar.value;
  3495.     
  3496.     dump('browser.js: BrowserLoadURL(): '+url+'\n');
  3497.     // MERC (DP): save the current URL
  3498.     var currURL = getWebNavigation().currentURI.spec;
  3499.  
  3500.     if (url.match(/^view-source:/)) {
  3501.         BrowserViewSourceOfURL(url.replace(/^view-source:/, ""), null, null);
  3502.     } else if (url.match(/^search:/)) {
  3503.         BrowserSearchURL(url.replace(/^search:/, ""), null, aPostData);
  3504.     } else {
  3505.         if (gBrowser.localName == "tabbrowser" &&
  3506.             aTriggeringEvent && 'altKey' in aTriggeringEvent &&
  3507.             aTriggeringEvent.altKey)
  3508.         {
  3509.             _content.focus();
  3510.             // JMC - only happens on an altKey load
  3511.             
  3512.             // MERC (DP): add tab and focus according to prefs
  3513.             var t = gBrowser.addTabAt(url, undefined, null, null, aPostData); // open link in new tab
  3514.             if (!gPrefService.getBoolPref("browser.tabs.loadInBackground")) {
  3515.                 gBrowser.selectedTab = t;
  3516.                 gURLBar.value = url;
  3517.             } else {
  3518.                 gURLBar.value = currURL;
  3519.             }
  3520.             //dump('browser.js: gURLbar.value = '+gURLBar.value+'\n\n');
  3521.             // END MERC
  3522.             event.preventDefault();
  3523.             event.preventBubble();
  3524.             event.preventCapture();
  3525.             event.stopPropagation();
  3526.         } else {
  3527.             // if no pref passed in, load in current tab.
  3528.             // otherwise open url according to pref
  3529.             if (aOpenWithPref) {
  3530.                 loadURIWithOpenPref(url, aOpenWithPref, null, aPostData);
  3531.             } else {
  3532.                 loadURI(url, null, aPostData);
  3533.             }
  3534.         }
  3535.         dump ("BrowserLoadURL: Currently focused element is : " + document.commandDispatcher.focusedElement.getAttribute('anonid') + ", at least that's what commandDispatcher thinks.\n");
  3536.         
  3537.         if (document.commandDispatcher.focusedElement.getAttribute('anonid') != 'input')
  3538.         {
  3539.             _content.focus();
  3540.             dump ("Now the _content is focused, which is : " + _content + "\n");
  3541.         } else {
  3542.             gBrowser.userTypedValue = null;
  3543.             gBrowser.userTypedClear = true;
  3544.             SetPageProxyState("valid", null); // XXX Build a URI and pass it in here.
  3545.         } // JMC - Note that this hack doesn't work in trident navigation
  3546.         // JMC - Is this URLBar defocusing?
  3547.         
  3548.     }
  3549.     UpdateStatusBarEngineIcon();
  3550. }
  3551.  
  3552. function SearchLoadURL(aURL, aTriggeringEvent, reuseTab)
  3553. {
  3554. //   dump ("SearchLoadURL : " + aURL + "\t");
  3555. //    showStack();
  3556.     // We need to add a flag to reuse the same tab for browsing.
  3557.     // First search through the tabs to see if we have a "search" tab
  3558.     var cnTabs = gBrowser.tabContainer.childNodes;
  3559.     var numtabs = cnTabs.length;
  3560.     var tabBrowser = getBrowser();
  3561.     
  3562.     // MERC (rpaul) only reuse a tab if called from showMoreResults()
  3563.     if (numtabs>=1 && reuseTab)
  3564.     {
  3565.         for (var i = 0; i < numtabs; ++i)
  3566.         {
  3567.             var searchAttrib = cnTabs[i].getAttribute("searchtab");
  3568.             if (searchAttrib) {
  3569.                 // This tab is usable as a search tab
  3570.                 gBrowser.selectedTab = cnTabs[i];
  3571.                 loadURI(aURL,null,null);    
  3572.                 return;                    
  3573.             } else {
  3574.                 cnTabs[i].removeAttribute("searchtab");
  3575.             }
  3576.         } 
  3577.         loadURIWithOpenPref(aURL, "browser.tabs.searchbarresult.open", null, null);
  3578.         gBrowser.selectedTab.setAttribute("searchtab", "true");
  3579.     } else {            
  3580.         // clear any existing searchtab attributes from tabs
  3581.         for (var j = 0; j < numtabs; ++j) {
  3582.             if (cnTabs[j].getAttribute("searchtab")) {
  3583.                 cnTabs[j].removeAttribute("searchtab");
  3584.             }            
  3585.         }
  3586.         // Load according to preferences since we are not reusing a search tab
  3587.         loadURIWithOpenPref(aURL, "browser.tabs.searchbarresult.open", null, null);
  3588.         var curTab = gBrowser.selectedTab;
  3589.         if (curTab) {
  3590.             curTab.setAttribute("searchtab","true");
  3591.         }
  3592.     }
  3593.  
  3594.     _content.focus();
  3595.       
  3596.     var internetSearch =
  3597.         Components.classes["@mozilla.org/rdf/datasource;1?name=internetsearch"]
  3598.                   .getService(nsIInternetSearchService);
  3599.     internetSearch.FindInternetSearchResults(aURL);
  3600. }
  3601.  
  3602.  
  3603. function getShortcutOrURI(aURL, aPostDataRef)
  3604. {
  3605.     // rjc: added support for URL shortcuts (3/30/1999)
  3606.     try {
  3607.         var shortcutURL = BMSVC.resolveKeyword(aURL, aPostDataRef);
  3608.         if (!shortcutURL) {
  3609.             // rjc: add support for string substitution with shortcuts (4/4/2000)
  3610.             //      (see bug # 29871 for details)
  3611.             var aOffset = aURL.indexOf(" ");
  3612.             if (aOffset > 0) {
  3613.                 var cmd = aURL.substr(0, aOffset);
  3614.                 var text = aURL.substr(aOffset+1);
  3615.                 shortcutURL = BMSVC.resolveKeyword(cmd, aPostDataRef);
  3616.                 if (shortcutURL && text) {
  3617.                     if (aPostDataRef && aPostDataRef.value) {
  3618.                         // XXXben - currently we only support "application/x-www-form-urlencoded"
  3619.                         //          enctypes.
  3620.                         aPostDataRef.value = unescape(aPostDataRef.value);
  3621.                         if (aPostDataRef.value.match(/%s/)) {
  3622.                             aPostDataRef.value = getPostDataStream(aPostDataRef.value, text,
  3623.                                                                    "application/x-www-form-urlencoded");
  3624.                         } else {
  3625.                             shortcutURL = null;
  3626.                             aPostDataRef.value = null;
  3627.                         }
  3628.                     }
  3629.                 else
  3630.                     shortcutURL = shortcutURL.match(/%s/) ? shortcutURL.replace(/%s/g, encodeURIComponent(text)) : null;
  3631.                 }
  3632.             }
  3633.         }
  3634.     
  3635.         if (shortcutURL)
  3636.             aURL = shortcutURL;
  3637.     
  3638.     } catch (ex) { }
  3639.     return aURL;
  3640. }
  3641.  
  3642.  
  3643. function getPostDataStream(aStringData, aKeyword, aType)
  3644. {
  3645.     var dataStream = Components.classes["@mozilla.org/io/string-input-stream;1"]
  3646.                                .createInstance(Components.interfaces.nsIStringInputStream);
  3647.     aStringData = aStringData.replace(/%s/g, encodeURIComponent(aKeyword));
  3648.     dataStream.setData(aStringData, aStringData.length);
  3649.  
  3650.     var mimeStream = Components.classes["@mozilla.org/network/mime-input-stream;1"]
  3651.                                .createInstance(Components.interfaces.nsIMIMEInputStream);
  3652.     mimeStream.addHeader("Content-Type", aType);
  3653.     mimeStream.addContentLength = true;
  3654.     mimeStream.setData(dataStream);
  3655.     return mimeStream.QueryInterface(Components.interfaces.nsIInputStream);
  3656. }
  3657.  
  3658.  
  3659. function readFromClipboard()
  3660. {
  3661.     var url;
  3662.  
  3663.     try {
  3664.         // Get clipboard.
  3665.         var clipboard = Components.classes["@mozilla.org/widget/clipboard;1"]
  3666.         .getService(Components.interfaces.nsIClipboard);
  3667.  
  3668.         // Create tranferable that will transfer the text.
  3669.         var trans = Components.classes["@mozilla.org/widget/transferable;1"]
  3670.         .createInstance(Components.interfaces.nsITransferable);
  3671.  
  3672.         trans.addDataFlavor("text/unicode");
  3673.  
  3674.         // If available, use selection clipboard, otherwise global one
  3675.         if (clipboard.supportsSelectionClipboard())
  3676.             clipboard.getData(trans, clipboard.kSelectionClipboard);
  3677.         else
  3678.             clipboard.getData(trans, clipboard.kGlobalClipboard);
  3679.  
  3680.         var data = {};
  3681.         var dataLen = {};
  3682.         trans.getTransferData("text/unicode", data, dataLen);
  3683.  
  3684.         if (data) {
  3685.             data = data.value.QueryInterface(Components.interfaces.nsISupportsString);
  3686.             url = data.data.substring(0, dataLen.value / 2);
  3687.         }
  3688.     } catch (ex) {
  3689.     }
  3690.  
  3691.     return url;
  3692. }
  3693.  
  3694. function BrowserViewSourceOfDocument(aDocument)
  3695. {
  3696.     var docCharset;
  3697.     var pageCookie;
  3698.     var webNav;
  3699.  
  3700.     // Get the document charset
  3701.     docCharset = "charset=" + aDocument.characterSet;
  3702.  
  3703.     // Get the nsIWebNavigation associated with the document
  3704.     try {
  3705.         var win;
  3706.         var ifRequestor;
  3707.  
  3708.         // Get the DOMWindow for the requested document.  If the DOMWindow
  3709.         // cannot be found, then just use the _content window...
  3710.         //
  3711.         // XXX:  This is a bit of a hack...
  3712.         win = aDocument.defaultView;
  3713.         if (win == window) {
  3714.             win = _content;
  3715.         }
  3716.         ifRequestor = win.QueryInterface(Components.interfaces.nsIInterfaceRequestor);
  3717.  
  3718.         webNav = ifRequestor.getInterface(nsIWebNavigation);
  3719.     } catch(err) {
  3720.         // If nsIWebNavigation cannot be found, just get the one for the whole
  3721.         // window...
  3722.         webNav = getWebNavigation();
  3723.     }
  3724.     //
  3725.     // Get the 'PageDescriptor' for the current document. This allows the
  3726.     // view-source to access the cached copy of the content rather than
  3727.     // refetching it from the network...
  3728.     //
  3729.     try {
  3730.         var PageLoader = webNav.QueryInterface(Components.interfaces.nsIWebPageDescriptor);
  3731.         pageCookie = PageLoader.currentDescriptor;
  3732.     } catch(err) {
  3733.         // If no page descriptor is available, just use the view-source URL...
  3734.     }
  3735.  
  3736.     BrowserViewSourceOfURL(webNav.currentURI.spec, docCharset, pageCookie);
  3737. }
  3738.  
  3739. function BrowserViewSourceOfURL(url, charset, pageCookie)
  3740. {
  3741.     // try to open a view-source window while inheriting the charset (if any)
  3742.     openDialog("chrome://global/content/viewSource.xul",
  3743.                "_blank",
  3744.                "scrollbars,resizable,chrome,dialog=no",
  3745.                url, charset, pageCookie);
  3746. }
  3747.  
  3748. // doc=null for regular page info, doc=owner document for frame info.
  3749. function BrowserPageInfo(doc)
  3750. {
  3751.     var hpDoc = getTridentDocument();
  3752.     if (hpDoc) {
  3753.         hpDoc.showPageInfo();
  3754.     } else {
  3755.         window.openDialog("chrome://browser/content/pageInfo.xul",
  3756.         "_blank",
  3757.         "chrome,dialog=no",
  3758.         doc);
  3759.     }
  3760. }
  3761.  
  3762.  
  3763. function checkForDirectoryListing()
  3764. {
  3765.     if ( "HTTPIndex" in _content &&
  3766.     _content.HTTPIndex instanceof Components.interfaces.nsIHTTPIndex ) {
  3767.         _content.defaultCharacterset = getMarkupDocumentViewer().defaultCharacterSet;
  3768.     }
  3769. }
  3770.  
  3771. function URLBarFocusHandler(aEvent, aElt)
  3772. {
  3773.     if (gIgnoreFocus)
  3774.         gIgnoreFocus = false;
  3775.     else if (gClickSelectsAll)
  3776.         aElt.select();
  3777. }
  3778.  
  3779. function URLBarMouseDownHandler(aEvent, aElt)
  3780. {
  3781.     if (aElt.hasAttribute("focused")) {
  3782.         gIgnoreClick = true;
  3783.     } else {
  3784.         gIgnoreFocus = true;
  3785.         gIgnoreClick = false;
  3786.         aElt.setSelectionRange(0, 0);
  3787.     }
  3788. }
  3789.  
  3790. function URLBarClickHandler(aEvent, aElt)
  3791. {
  3792.     if (!gIgnoreClick && gClickSelectsAll && aElt.selectionStart == aElt.selectionEnd)
  3793.     aElt.select();
  3794. }
  3795.  
  3796. // If "ESC" is pressed in the url bar, we replace the urlbar's value with the url of the page
  3797. // and highlight it, unless it is about:blank, where we reset it to "".
  3798. function handleURLBarRevert()
  3799. {
  3800.     dump ("handleURLBarRevent()\n");
  3801.     var url = getWebNavigation().currentURI.spec;
  3802.     var throbberElement = document.getElementById("throbberBroadcaster");
  3803.  
  3804.     var isScrolling = gURLBar.popupOpen;
  3805.  
  3806.     // don't revert to last valid url unless page is NOT loading
  3807.     // and user is NOT key-scrolling through autocomplete list
  3808.     if ((!throbberElement || !throbberElement.hasAttribute("busy")) && !isScrolling) {
  3809.         if (url != "about:blank") {
  3810.             gURLBar.value = url;
  3811.             gURLBar.select();
  3812.             SetPageProxyState("valid", null); // XXX Build a URI and pass it in here.
  3813.         } else { //if about:blank, urlbar becomes ""
  3814.             gURLBar.value = "";
  3815.         }
  3816.     }
  3817.  
  3818.     gBrowser.userTypedValue = null;
  3819.  
  3820.     // tell widget to revert to last typed text only if the user
  3821.     // was scrolling when they hit escape
  3822.     return !isScrolling;
  3823. }
  3824.  
  3825. function TextIsURI(selectedText)
  3826. {
  3827.     return selectedText && /^http:\/\/|^https:\/\/|^file:\/\/|\
  3828.     ^ftp:\/\/|^about:|^mailto:|^news:|^snews:|^telnet:|^ldap:|\
  3829.     ^ldaps:|^gopher:|^finger:|^javascript:/i.test(selectedText);
  3830. }
  3831.  
  3832. function shouldPrependSearch(url)
  3833. {
  3834.     // if search: is already at the beginning, don't add it again
  3835.     if (/^search:/.test(url)) {
  3836.         return false;
  3837.     }
  3838.  
  3839.     // trim leading/trailing whitespace
  3840.     trimmedURL = url.replace(/^\s*/, '').replace(/\s*$/, '');
  3841.  
  3842.     // if string is empty do not prepend
  3843.     if (!trimmedURL) return false;
  3844.  
  3845.     // if string has protocol, do not prepend
  3846.     if( /^http:\/\/|^https:\/\/|^file:\/\/|\
  3847.     ^ftp:\/\/|^about:|^mailto:|^news:|^snews:|^telnet:|^ldap:|\
  3848.     ^ldaps:|^gopher:|^finger:|^javascript:/i.test(trimmedURL) )
  3849.     {
  3850.         return false;
  3851.     }
  3852.  
  3853.     // if the string looks like a path to a local file, do not prepend
  3854.     if (/^[a-z]:\\/.test(trimmedURL)) {
  3855.         return false;
  3856.     }
  3857.  
  3858.     // if whitespace occurs in the url, treat it as a search
  3859.     if (/\s+/.test(trimmedURL)) {
  3860.         return true;
  3861.     }
  3862.  
  3863.     // if any dots occur in the url, DO NOT treat as search
  3864.     if (/\./.test(url)) {
  3865.         return false;
  3866.     }
  3867.  
  3868.     return false;
  3869. }
  3870.  
  3871. function handleURLBarCommand(aTriggeringEvent)
  3872. {
  3873.     var postData = { };
  3874.     canonizeUrl(aTriggeringEvent, postData);
  3875.  
  3876.     try {
  3877.         addToUrlbarHistory();
  3878.     } catch (ex) {
  3879.         // Things may go wrong when adding url to session history,
  3880.         // but don't let that interfere with the loading of the url.
  3881.     }
  3882.  
  3883.     BrowserLoadURL(aTriggeringEvent, postData.value);
  3884.     // BrowserLoadURL(aTriggeringEvent, postData.value, "browser.tabs.history.open");
  3885. }
  3886.  
  3887. function canonizeUrl(aTriggeringEvent, aPostDataRef)
  3888. {
  3889.     if (!gURLBar || gURLBar.value == '')
  3890.         return;
  3891.  
  3892.     var url = gURLBar.value;
  3893.  
  3894.     if (shouldPrependSearch(url)) {
  3895.         url = 'search:'+url;
  3896.     }
  3897.     // Prevent suffix when already exists www , http , /
  3898.     else if (!/^(www|http)|\/\s*$/i.test(url)) {
  3899.         var suffix = null;
  3900.  
  3901.         if (aTriggeringEvent && 'ctrlKey' in aTriggeringEvent &&
  3902.             aTriggeringEvent.ctrlKey && 'shiftKey' in aTriggeringEvent &&
  3903.             aTriggeringEvent.shiftKey)
  3904.         {
  3905.             suffix = ".org/";
  3906.         }
  3907.         else if (aTriggeringEvent && 'ctrlKey' in aTriggeringEvent &&
  3908.                  aTriggeringEvent.ctrlKey)
  3909.         {
  3910.             suffix = ".com/";
  3911.         }
  3912.         else if (aTriggeringEvent && 'shiftKey' in aTriggeringEvent &&
  3913.                  aTriggeringEvent.shiftKey)
  3914.         {
  3915.             suffix = ".net/";
  3916.         }
  3917.         
  3918.         if (suffix != null) {
  3919.             // trim leading/trailing spaces (bug 233205)
  3920.             url = url.replace(/^\s+/, "");
  3921.             url = url.replace(/\s+$/, "");
  3922.             // Tack www. and suffix on.
  3923.             url = "http://www." + url + suffix;
  3924.         }
  3925.     }
  3926.     gURLBar.value = getShortcutOrURI(url, aPostDataRef);
  3927. }
  3928.  
  3929. function UpdatePageProxyState()
  3930. {
  3931.     if (gURLBar && gURLBar.value != gLastValidURLStr)
  3932.     SetPageProxyState("invalid", null);
  3933. }
  3934.  
  3935.  
  3936. // MERC - JCH: Called in nsHTMLPluginDocument.cpp to update favicons
  3937. //function UpdateFavIcons(windowDoc)
  3938. // MRR - This function signature will change when nsHTMLPluginDocument is rationalized.
  3939. //       Will become: function UpdateFavIcons(windowDoc, aHref)
  3940. function UpdateFavIcons( aHref, dummy1, dummy2, dummy3, windowDoc)
  3941. {
  3942.     if (windowDoc == null) return false;
  3943.  
  3944.     var tabIndex = gBrowser.getBrowserIndexForDocument(windowDoc);
  3945.     if (tabIndex < 0) return false;
  3946.  
  3947.     var aTab = gBrowser.tabContainer.childNodes[tabIndex];
  3948.     if (aTab == null) return false;
  3949.  
  3950.     var tabUri = gBrowser.getBrowserForTab(aTab).currentURI;
  3951.  
  3952. //    dump( "))      WMWMWMWMWMW===> UpdateFavIcons(\""+tabUri.spec+"\")  from TRIDENT\n" );
  3953. //    dump( "))      WMWMWMWMWMW===> UpdateFavIcons - Trident passed \""+aHref+"\"\n" );
  3954.  
  3955.     if (gBrowser.shouldLoadFavIcon(tabUri))
  3956.     {
  3957.         var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  3958.         var favIconURI = ios.newURI(aHref, null, tabUri);
  3959.         var favIconURIstr = "";
  3960.         if ( aHref == "" ) {
  3961.             favIconURIstr = gBrowser.buildFavIconString(tabUri);
  3962.             favIconURI.spec = favIconURIstr;
  3963.         } else {
  3964.             favIconURIstr = favIconURI.spec;
  3965.         }
  3966. //        dump( "))      WMWMWMWMWMW===> UpdateFavIcons - Yay; Built \""+favIconURI.spec+"\"\n" );
  3967.  
  3968.         // This sets the icon on the tab.
  3969.         gBrowser.mCurrentBrowser.mFavIconURL = favIconURIstr;
  3970.         aTab.setAttribute('image', favIconURIstr);
  3971.  
  3972.         // This sets the icon on the listener, so switch tabs synchs the icon in URL bar.
  3973.         if (gBrowser.mTabbedMode)
  3974.             gBrowser.mTabListeners[tabIndex].mIcon = gBrowser.mCurrentBrowser.mFavIconURL;
  3975.         // This sets the icon on the URL bar.
  3976.         PageProxySetIcon(gBrowser.mCurrentBrowser.mFavIconURL);
  3977.     } else {
  3978.         //dump( "---------- UpdateFavIcons: Clearing icon\n");
  3979.         aTab.removeAttribute("image");
  3980.         gBrowser.mCurrentBrowser.mFavIconURL = null;
  3981.         if (gBrowser.mTabListeners[tabIndex])
  3982.         {
  3983.             gBrowser.mTabListeners[tabIndex].mIcon = null;
  3984.             PageProxyClearIcon();
  3985.         }
  3986.     }
  3987.     return true;
  3988. }
  3989.  
  3990. function StartTabProgress(hpSomeDoc)
  3991. {
  3992.     //dump("\nJA~~~~~~~~~~~~~:StartTabProgress(): hpSomeDoc ="+hpSomeDoc+"\n");
  3993.     if(!hpSomeDoc)
  3994.         return false;//err
  3995.     
  3996.     // loop through all the tabs and match which trident document this event has originated from
  3997.     var cnTabs = gBrowser.tabContainer.childNodes;
  3998.     var numtabs = cnTabs.length;
  3999.     var tabBrowser = getBrowser();
  4000.     if (numtabs>=1)
  4001.     {
  4002.         for (var i = 0; i < numtabs; ++i)
  4003.         {
  4004.             var doc = gBrowser.getBrowserForTab(cnTabs[i]).contentDocument;
  4005.             if (doc && doc == hpSomeDoc)
  4006.             {    
  4007.                 //dump("!!!!!~~~~~~~~~~~~~~Found in tab# "+i+"\n");
  4008.                 cnTabs[i].setAttribute("busy", "true");
  4009.                 cnTabs[i].label = tabBrowser.mStringBundle.getString("tabs.loading");
  4010.                 cnTabs[i].removeAttribute("image"); 
  4011.                 cnTabs[i].mIcon = null;
  4012.                 cnTabs[i].setAttribute("engine", "Trident");
  4013.                 if (cnTabs[i].getAttribute("selected") == "true") {
  4014.                     // Start Progress Listener
  4015.             var webProgress = gBrowser.getBrowserForTab(cnTabs[i]).webProgress;
  4016.                     window.XULBrowserWindow.onStateChange(webProgress, null, Components.interfaces.nsIWebProgressListener.STATE_START | Components.interfaces.nsIWebProgressListener.STATE_IS_NETWORK, 0);
  4017.                     UpdateStatusBarEngineIcon();
  4018.                 }                
  4019.                 return true;
  4020.             }
  4021.         }
  4022.     }
  4023.     //dump("~~~~~~~~~~Couldn't find hpSomeDoc!\n\n");
  4024.     return false;
  4025. }
  4026.  
  4027. function EndTabProgress(hpSomeDoc) {
  4028.     
  4029.     // loop through all the tabs and match which trident document this event has originated from
  4030.     if(!hpSomeDoc)
  4031.         return false;//err
  4032.     var cnTabs = gBrowser.tabContainer.childNodes;
  4033.     var numtabs = cnTabs.length;
  4034.     var tabBrowser = getBrowser();
  4035.     if (numtabs>=1)
  4036.     {
  4037.         for (var i = 0; i < numtabs; ++i)
  4038.         {
  4039.             var doc = gBrowser.getBrowserForTab(cnTabs[i]).contentDocument;
  4040.             if (doc && doc == hpSomeDoc)
  4041.             {    
  4042.                 //dump("!!!!!~~~~~~~~~~~~~~Found in tab# "+i+"\n");
  4043.                 cnTabs[i].removeAttribute("busy")
  4044.                 tabBrowser.setTabTitle(cnTabs[i]);
  4045.                 
  4046.                 if (cnTabs[i].getAttribute("selected") == "true") {
  4047.                     // Stop Progress Listener
  4048.             var webProgress = gBrowser.getBrowserForTab(cnTabs[i]).webProgress;
  4049.                     window.XULBrowserWindow.onStateChange(webProgress, null, Components.interfaces.nsIWebProgressListener.STATE_STOP | Components.interfaces.nsIWebProgressListener.STATE_IS_NETWORK, 0);
  4050.                 }
  4051.                 return true;
  4052.             }
  4053.         }
  4054.     }
  4055.     //dump("~~~~~~~~~~Couldn't find hpSomeDoc!\n\n");
  4056.     return false;
  4057. }
  4058.  
  4059.  
  4060. function SetPageProxyState(aState, aURI)
  4061. {
  4062.     if (!gURLBar)
  4063.         return;
  4064.  
  4065.     if (!gProxyButton)
  4066.         gProxyButton = document.getElementById("page-proxy-button");
  4067.     if (!gProxyFavIcon)
  4068.         gProxyFavIcon = document.getElementById("page-proxy-favicon");
  4069.     if (!gProxyDeck)
  4070.         gProxyDeck = document.getElementById("page-proxy-deck");
  4071.  
  4072.     gProxyButton.setAttribute("pageproxystate", aState);
  4073.  
  4074. //    if ( aURI )
  4075. //        dump( "))      WMWMWMWMWMW===> SetPageProxyState(\""+aURI.spec+"\") - gProxyFavIcon is: \""+gProxyFavIcon.getAttribute("src")+"\"\n" );
  4076. //    else
  4077. //        dump( "))      WMWMWMWMWMW===> SetPageProxyState(null) - gProxyFavIcon is: \""+gProxyFavIcon.getAttribute("src")+"\"\n" );
  4078.  
  4079.     // the page proxy state is set to valid via OnLocationChange, which
  4080.     // gets called when we switch tabs.  We'll let updatePageFavIcon
  4081.     // take care of updating the mFavIconURL because it knows exactly
  4082.     // for which tab to update things, instead of confusing the issue
  4083.     // here.
  4084.     if (aState == "valid") {
  4085.         gLastValidURLStr = gURLBar.value;
  4086.         gURLBar.addEventListener("input", UpdatePageProxyState, false);
  4087.  
  4088.         if (gBrowser.mCurrentBrowser.mFavIconURL != null) {
  4089.             if (gBrowser.isFavIconKnownMissing(gBrowser.mCurrentBrowser.mFavIconURL)) {
  4090.                 gBrowser.mFavIconURL = null;
  4091. //                dump( "))      WMWMWMWMWMW===> SetPageProxyState() - clearing icon (#1)\n" );
  4092.                 PageProxyClearIcon();
  4093.             } else {
  4094.                 PageProxySetIcon(gBrowser.mCurrentBrowser.mFavIconURL);
  4095.             }
  4096.         } else {
  4097. //            dump( "))      WMWMWMWMWMW===> SetPageProxyState() - clearing icon (#2)\n" );
  4098.             PageProxyClearIcon();
  4099.         }
  4100.     } else if (aState == "invalid") {
  4101.         gURLBar.removeEventListener("input", UpdatePageProxyState, false);
  4102.         PageProxyClearIcon();
  4103.     }
  4104. }
  4105.  
  4106. function PageProxySetIcon (aURL)
  4107. {
  4108.     if (!gProxyFavIcon)
  4109.         return;
  4110.     if (gProxyFavIcon.getAttribute("src") != aURL)
  4111.         gProxyFavIcon.setAttribute("src", aURL);
  4112.  
  4113.     if (gProxyDeck && gProxyDeck.selectedIndex != 1 && gProxyFavIcon.getAttribute("src"))
  4114.         gProxyDeck.selectedIndex = 1;
  4115.     else if (gProxyDeck && gProxyDeck.selectedIndex != 0 && !gProxyFavIcon.getAttribute("src"))
  4116.         gProxyDeck.selectedIndex = 0;
  4117.  
  4118. //    dump( "))      WMWMWMWMWMW===> PageProxySetIcon(\""+aURL+"\"); index="+gProxyDeck.selectedIndex+"\n" );
  4119. }
  4120.  
  4121. function PageProxyClearIcon ()
  4122. {
  4123. //    dump( "))      WMWMWMWMWMW===> PageProxyClearIcon()\n" );
  4124.     if (gProxyDeck && gProxyDeck.selectedIndex != 0)
  4125.         gProxyDeck.selectedIndex = 0;
  4126.     if (gProxyFavIcon && gProxyFavIcon.hasAttribute("src"))
  4127.         gProxyFavIcon.removeAttribute("src");
  4128. }
  4129.  
  4130. function PageProxyDragGesture(aEvent)
  4131. {
  4132.     if (gProxyButton.getAttribute("pageproxystate") == "valid") {
  4133.         nsDragAndDrop.startDrag(aEvent, proxyIconDNDObserver);
  4134.         return true;
  4135.     }
  4136.     return false;
  4137. }
  4138.  
  4139.  
  4140. function URLBarOnDrop(evt)
  4141. {
  4142.     nsDragAndDrop.drop(evt, urlbarObserver);
  4143. }
  4144.  
  4145. var urlbarObserver = {
  4146.     onDrop: function (aEvent, aXferData, aDragSession)
  4147.     {
  4148.         var url = transferUtils.retrieveURLFromData(aXferData.data, aXferData.flavour.contentType);
  4149.  
  4150.         // The URL bar automatically handles inputs with newline characters,
  4151.         // so we can get away with treating text/x-moz-url flavours as text/unicode.
  4152.         if (url) {
  4153.             getBrowser().dragDropSecurityCheck(aEvent, aDragSession, url);
  4154.  
  4155.             // XXXBlake Workaround caret crash when you try to set the textbox's value on dropping
  4156.             setTimeout(function(u) { gURLBar.value = u; handleURLBarCommand(); }, 0, url);
  4157.         }
  4158.     },
  4159.     getSupportedFlavours: function ()
  4160.     {
  4161.         var flavourSet = new FlavourSet();
  4162.  
  4163.         // Plain text drops are often misidentified as "text/x-moz-url", so favor plain text.
  4164.         flavourSet.appendFlavour("text/unicode");
  4165.         flavourSet.appendFlavour("text/x-moz-url");
  4166.         flavourSet.appendFlavour("application/x-moz-file", "nsIFile");
  4167.         return flavourSet;
  4168.     }
  4169. }
  4170.  
  4171. function SearchBarOnDrop(evt)
  4172. {
  4173.     nsDragAndDrop.drop(evt, searchbarObserver);
  4174. }
  4175.  
  4176. var searchbarObserver = {
  4177.     onDrop: function (aEvent, aXferData, aDragSession)
  4178.     {
  4179.         var data = transferUtils.retrieveURLFromData(aXferData.data, aXferData.flavour.contentType);
  4180.         if (data) {
  4181.             // XXXBlake Workaround caret crash when you try to set the textbox's value on dropping
  4182.             var field = document.getElementById("search-bar");
  4183.             setTimeout(function(field, data, evt) { field.value = data; field.onTextEntered(evt); }, 0, field, data, aEvent);
  4184.         }
  4185.     },
  4186.     getSupportedFlavours: function ()
  4187.     {
  4188.         var flavourSet = new FlavourSet();
  4189.  
  4190.         flavourSet.appendFlavour("text/unicode");
  4191.         flavourSet.appendFlavour("text/x-moz-url");
  4192.         flavourSet.appendFlavour("application/x-moz-file", "nsIFile");
  4193.         return flavourSet;
  4194.     }
  4195. }
  4196.  
  4197. function SearchBarPopupShowing(aEvent)
  4198. {
  4199. }
  4200.  
  4201. function SearchBarPopupCommand(aEvent)
  4202. {
  4203.  
  4204.     if (!aEvent.target.id)
  4205.         return;
  4206.  
  4207.     if (aEvent.target.id == "miAddEngines") {
  4208.         var regionBundle = document.getElementById("bundle_browser_region");
  4209.         loadURI(regionBundle.getString("searchEnginesURL"), null, null);
  4210.         return;
  4211.     }
  4212.  
  4213.     document.getElementById("search-bar").currentEngine = aEvent.target.id;
  4214. }
  4215.  
  4216. function showSearchEnginePopup()
  4217. {
  4218.     var searchEnginePopup = document.getElementById("SearchBarPopup");
  4219.     var searchEngineButton = document.getElementById("search-proxy-button");
  4220.     searchEnginePopup.showPopup(searchEngineButton);
  4221. }
  4222.  
  4223. function updateToolbarStates(toolbarMenuElt)
  4224. {
  4225.     if (!gHaveUpdatedToolbarState) {
  4226.         var mainWindow = document.getElementById("main-window");
  4227.         if (mainWindow.hasAttribute("chromehidden")) {
  4228.             gHaveUpdatedToolbarState = true;
  4229.             var i;
  4230.             for (i = 0; i < toolbarMenuElt.childNodes.length; ++i)
  4231.             document.getElementById(toolbarMenuElt.childNodes[i].getAttribute("observes")).removeAttribute("checked");
  4232.             var toolbars = document.getElementsByTagName("toolbar");
  4233.  
  4234.             // Start i at 1, since we skip the menubar.
  4235.             for (i = 1; i < toolbars.length; ++i) {
  4236.                 if (toolbars[i].getAttribute("class").indexOf("chromeclass") != -1)
  4237.                 toolbars[i].setAttribute("collapsed", "true");
  4238.             }
  4239.  
  4240.             toolbars = document.getElementsByTagName("multibar");
  4241.             for (i = 0; i < toolbars.length; ++i) {
  4242.                 if (toolbars[i].getAttribute("class").indexOf("chromeclass") != -1)
  4243.                 toolbars[i].setAttribute("collapsed", "true");
  4244.             }
  4245.  
  4246.             var statusbars = document.getElementsByTagName("statusbar");
  4247.             for (i = 1; i < statusbars.length; ++i) {
  4248.                 if (statusbars[i].getAttribute("class").indexOf("chromeclass") != -1)
  4249.                 statusbars[i].setAttribute("collapsed", "true");
  4250.             }
  4251.             
  4252.             var toolbox = document.getElementById("navigator-toolbox");    
  4253.             toolbox.reorderToolbars();        
  4254.             
  4255.             mainWindow.removeAttribute("chromehidden");
  4256.         }
  4257.     }
  4258. }
  4259.  
  4260. function BrowserImport()
  4261. {
  4262.         var features = "modal,centerscreen,chrome,resizable=no";
  4263.         window.openDialog("chrome://browser/content/migration/migration.xul", "migration", features);
  4264.     }
  4265.     
  4266.     function BrowserFullScreen()
  4267.     {
  4268.         window.fullScreen = !window.fullScreen;
  4269.     }
  4270.  
  4271.     function BrowserToggleMaximize()
  4272.     {
  4273.         if (window.windowState == window.STATE_MAXIMIZED) {
  4274.             window.restore();
  4275.             document.getElementById('main-window').setAttribute('sizemode', 'normal');
  4276.             document.getElementById('restoreButtonBroadcaster').tooltipText = 'Maximize';
  4277.             isButtonToggle = true;
  4278.         } else {
  4279.             window.maximize();
  4280.             document.getElementById('main-window').setAttribute('sizemode', 'maximized');
  4281.             document.getElementById('restoreButtonBroadcaster').tooltipText = 'Restore Down';
  4282.             isButtonToggle = false;    
  4283.         }
  4284.         reshuffleToolbars();
  4285.     }
  4286.     function onWindowResize()
  4287.     {
  4288.             if (window.windowState == window.STATE_MAXIMIZED)
  4289.                 document.getElementById('restoreButtonBroadcaster').tooltipText = 'Restore Down';
  4290.             else if (window.windowState == window.STATE_NORMAL)
  4291.                 document.getElementById('restoreButtonBroadcaster').tooltipText = 'Maximize';
  4292.             BookmarksToolbar.resizeFunc();
  4293.     }
  4294.     function onFullScreen()
  4295.     {
  4296.         if(isButtonToggle) {
  4297.             if (window.windowState == window.STATE_MAXIMIZED) {
  4298.                 document.getElementById('main-window').setAttribute('sizemode', 'normal');
  4299.                 document.getElementById('restoreButtonBroadcaster').tooltipText = 'Maximize';
  4300.             } else {
  4301.                 document.getElementById('main-window').setAttribute('sizemode', 'maximized');
  4302.                 document.getElementById('restoreButtonBroadcaster').tooltipText = 'Restore Down';
  4303.             }
  4304.         }
  4305.         else {
  4306.             document.getElementById('main-window').setAttribute('sizemode', 'maximized');
  4307.             document.getElementById('restoreButtonBroadcaster').tooltipText = 'Restore Down';
  4308.         }
  4309.         
  4310.         FullScreen.toggle();
  4311.     }
  4312.  
  4313.     function getWebNavigation()
  4314.     {
  4315.         try {
  4316.             return gBrowser.webNavigation;
  4317.         } catch (e) {
  4318.             return null;
  4319.         }
  4320.     }
  4321.  
  4322.     function BrowserReloadWithFlags(reloadFlags)
  4323.     {
  4324.         // MERC JVL
  4325.         // stop the browser first (within the context) before proceeding with the reload
  4326.         BrowserStop();
  4327.  
  4328.         //JA
  4329.         var hpDoc;
  4330.         var webNav = getWebNavigation();
  4331.         if(webNav.browserEngine=="Trident")
  4332.             hpDoc=getTridentDocument();
  4333.         if(hpDoc) {
  4334.         var webProgress = gBrowser.webProgress;
  4335.             window.XULBrowserWindow.onStateChange(webProgress, null, Components.interfaces.nsIWebProgressListener.STATE_START | Components.interfaces.nsIWebProgressListener.STATE_IS_NETWORK, 0);
  4336.             hpDoc.reloadDocument();//end JA
  4337.         }
  4338.         else //default
  4339.         {
  4340.             /* First, we'll try to use the session history object to reload so
  4341.             * that framesets are handled properly. If we're in a special
  4342.             * window (such as view-source) that has no session history, fall
  4343.             * back on using the web navigation's reload method.
  4344.             */
  4345.             // check site control to try to switch engine
  4346.             var needSwitchEngine=false;
  4347.             var bRedirected;
  4348.             try
  4349.             {
  4350.                 var site = webNav.currentURI.host;
  4351.                 var bControlled=sitecontrols.SCSVC.isControlledSite(site);
  4352.                 var displayEngine;
  4353.                 if(bControlled)
  4354.                     displayEngine=sitecontrols.SCSVC.readSiteControl(site, "displayEngine");
  4355.                 else
  4356.                     displayEngine=sitecontrols.SCSVC.readSiteControl(sitecontrols.DEFAULT_SITE, "displayEngine");
  4357.                 if (displayEngine=="Trident")
  4358.                 {
  4359.                     needSwitchEngine=true;
  4360.                     webNav.browserEngine='Trident';
  4361.                 }
  4362.                 if (needSwitchEngine)
  4363.                 {
  4364.                     var filePath=webNav.currentURI.path;
  4365.                     //SLiu, if it is a image url, and reload will cause switch engine from Gecko to Trident
  4366.                     //we let browser load a Trident blank page first then navigate to the image url
  4367.                     var len=filePath.length;
  4368.                     var isImgURL=false;
  4369.                     if (len > 4) //".jpg"
  4370.                     {
  4371.                         var fileType=filePath.substr(len-3, 3);
  4372.                         fileType.toLowerCase();
  4373.                         var imgExtList= new Array('gif','jpg','bmp','png');
  4374.                         var i;
  4375.                         for (i=0;i<imgExtList.length;i++)
  4376.                         {
  4377.                             if (fileType==imgExtList[i])
  4378.                             {
  4379.                                 isImgURL=true;
  4380.                                 break;
  4381.                             }
  4382.                         }
  4383.                     }
  4384.                     if(isImgURL)
  4385.                     {
  4386.                         bRedirected=true;
  4387.                         var urlStr = Components.classes["@mozilla.org/supports-string;1"]
  4388.                             .createInstance(Components.interfaces.nsISupportsString);
  4389.                         urlStr.data = webNav.currentURI.spec;
  4390.                         gPrefService.setComplexValue("browser.navigation.nexturl",
  4391.                             Components.interfaces.nsISupportsString,
  4392.                             urlStr);
  4393.                         var blankPage="about:blank";
  4394.                         webNav.loadURI(blankPage, nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null);
  4395.                     }
  4396.                 }
  4397.             }//end default
  4398.             catch(ex){ dump ("Caught Exception: " + ex + "\n");}
  4399.  
  4400.             try
  4401.             {
  4402.                 if(!bRedirected)
  4403.                 {
  4404.                     // dump ("~~~~~~~~browser.js: webNav.reload(...)\n");
  4405.                     webNav.reload(reloadFlags);
  4406.                 }
  4407.             }
  4408.             catch(ex){ dump ("Caught Exception: " + ex + "\n");}
  4409.         }
  4410.     }
  4411.  
  4412.     function toggleAffectedChrome(aHide)
  4413.     {
  4414.         // chrome to toggle includes:
  4415.         //   (*) menubar
  4416.         //   (*) navigation bar
  4417.         //   (*) bookmarks toolbar
  4418.         //   (*) sidebar
  4419.         //   (*) find bar
  4420.         //   (*) statusbar
  4421.  
  4422.         var menuBar = document.getElementById("menubar-items");
  4423.         if (menuBar) menuBar.hidden = aHide;
  4424.         var navToolbox = document.getElementById("navigator-toolbox");
  4425.         navToolbox.hidden = aHide;
  4426.         var statusbar = document.getElementById("status-bar");
  4427.         statusbar.hidden = aHide;
  4428.         var throbber = document.getElementById("throbber-box");
  4429.         if (throbber) {
  4430.             throbber.hidden = aHide;
  4431.         }
  4432.         if (aHide)
  4433.         {
  4434.             gChromeState = {};
  4435.             var sidebar = document.getElementById("sidebar-box");
  4436.             gChromeState.sidebarOpen = !sidebar.hidden;
  4437.             gSidebarCommand = sidebar.getAttribute("sidebarcommand");
  4438.  
  4439.             var findBar = document.getElementById("FindToolbar");
  4440.             gChromeState.findOpen = !findBar.hidden;
  4441.             closeFindBar();
  4442.         }
  4443.     else {
  4444.         if (gChromeState.findOpen)
  4445.             openFindBar();
  4446.     }
  4447.  
  4448.     if (gChromeState.sidebarOpen)
  4449.         toggleSidebar(gSidebarCommand);
  4450. }
  4451.  
  4452. function onEnterPrintPreview()
  4453. {
  4454.     toggleAffectedChrome(true);
  4455. }
  4456.  
  4457. function onExitPrintPreview()
  4458. {
  4459.     // restore chrome to original state
  4460.     toggleAffectedChrome(false);
  4461.     if (spui) spui.RedrawComponents();
  4462. }
  4463.  
  4464. function browserDoOLECmd(iCmd)
  4465. {
  4466.     //Mercurial start
  4467.     var hpDoc = getTridentDocument();
  4468.  
  4469.     try
  4470.     {
  4471.         switch(iCmd)
  4472.         {
  4473.         case 0://Page Setup
  4474.             if(hpDoc)
  4475.                 hpDoc.doOLECmd(0);
  4476.             else
  4477.                 PrintUtils.showPageSetup();
  4478.             break;
  4479.         case 1://Print Preview
  4480.             // dump("Customize printpreview!\n");
  4481.             if (hpDoc)
  4482.             {
  4483.                 if (hpDoc.loadingState==nsIHTMLPluginDocument.LOADING)
  4484.                 {
  4485.                     ShowPrintErrorDialogForTrident(PRINT_PREVIEW_REQ_WHILE_TRIDENT_LOADING_ERROR);
  4486.                     //alert("Page loading not finished, please wait!");
  4487.                 }
  4488.                 else
  4489.                     hpDoc.doOLECmd(1);
  4490.             }
  4491.             else
  4492.                 PrintUtils.printPreview(onEnterPrintPreview, onExitPrintPreview);
  4493.             break;
  4494.         case 2:
  4495.             if (hpDoc)
  4496.             {
  4497.                 if (hpDoc.loadingState==nsIHTMLPluginDocument.LOADING)
  4498.                 {
  4499.                     ShowPrintErrorDialogForTrident(PRINT_REQ_WHILE_TRIDENT_LOADING_ERROR);
  4500.                     //alert("Page loading not finished, please wait!");
  4501.                 }
  4502.                 else
  4503.                     hpDoc.doOLECmd(2);
  4504.             }
  4505.             else
  4506.                 PrintUtils.print();
  4507.             break;
  4508.         case 4:
  4509.             if (hpDoc) hpDoc.doOLECmd(4);
  4510.             else ZoomManager.prototype.getInstance().reduce();
  4511.             break;
  4512.         case 5:
  4513.             if (hpDoc) hpDoc.doOLECmd(5);
  4514.             else ZoomManager.prototype.getInstance().enlarge();
  4515.             break;
  4516.         }
  4517.     }
  4518.     catch(e){ dump ("Caught Exception: " + e + "\n");}
  4519. }
  4520.  
  4521.  
  4522. function getMarkupDocumentViewer()
  4523. {
  4524.     return gBrowser.markupDocumentViewer;
  4525. }
  4526.  
  4527. /**
  4528. * Content area tooltip.
  4529. * XXX - this must move into XBL binding/equiv! Do not want to pollute
  4530. *       browser.js with functionality that can be encapsulated into
  4531. *       browser widget. TEMPORARY!
  4532. *
  4533. * NOTE: Any changes to this routine need to be mirrored in ChromeListener::FindTitleText()
  4534. *       (located in mozilla/embedding/browser/webBrowser/nsDocShellTreeOwner.cpp)
  4535. *       which performs the same function, but for embedded clients that
  4536. *       don't use a XUL/JS layer. It is important that the logic of
  4537. *       these two routines be kept more or less in sync.
  4538. *       (pinkerton)
  4539. **/
  4540. function FillInHTMLTooltip(tipElement)
  4541. {
  4542.     var retVal = false;
  4543.     if (tipElement.namespaceURI == "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul")
  4544.     return retVal;
  4545.  
  4546.     const XLinkNS = "http://www.w3.org/1999/xlink";
  4547.  
  4548.     var titleText = null;
  4549.     var XLinkTitleText = null;
  4550.  
  4551.     while (!titleText && !XLinkTitleText && tipElement) {
  4552.         if (tipElement.nodeType == Node.ELEMENT_NODE) {
  4553.             titleText = tipElement.getAttribute("title");
  4554.             XLinkTitleText = tipElement.getAttributeNS(XLinkNS, "title");
  4555.         }
  4556.         tipElement = tipElement.parentNode;
  4557.     }
  4558.  
  4559.     var texts = [titleText, XLinkTitleText];
  4560.     var tipNode = document.getElementById("aHTMLTooltip");
  4561.  
  4562.     for (var i = 0; i < texts.length; ++i) {
  4563.         var t = texts[i];
  4564.         if (t && t.search(/\S/) >= 0) {
  4565.             tipNode.setAttribute("label", t);
  4566.             retVal = true;
  4567.         }
  4568.     }
  4569.  
  4570.     return retVal;
  4571. }
  4572.  
  4573. var proxyIconDNDObserver = {
  4574.     onDragStart: function (aEvent, aXferData, aDragAction)
  4575.     {
  4576.         var value = gURLBar.value;
  4577.         // XXX - do we want to allow the user to set a blank page to their homepage?
  4578.         //       if so then we want to modify this a little to set about:blank as
  4579.         //       the homepage in the event of an empty urlbar.
  4580.         if (!value) return;
  4581.  
  4582.         var urlString = value + "\n" + window._content.document.title;
  4583.         var htmlString = "<a href=\"" + value + "\">" + value + "</a>";
  4584.  
  4585.         aXferData.data = new TransferData();
  4586.         aXferData.data.addDataForFlavour("text/x-moz-url", urlString);
  4587.         aXferData.data.addDataForFlavour("text/unicode", value);
  4588.         aXferData.data.addDataForFlavour("text/html", htmlString);
  4589.  
  4590.         // we're copying the URL from the proxy icon, not moving
  4591.         // we specify all of them though, because d&d sucks and OS's
  4592.         // get confused if they don't get the one they want
  4593.         aDragAction.action =
  4594.         Components.interfaces.nsIDragService.DRAGDROP_ACTION_COPY |
  4595.         Components.interfaces.nsIDragService.DRAGDROP_ACTION_MOVE |
  4596.         Components.interfaces.nsIDragService.DRAGDROP_ACTION_LINK;
  4597.     }
  4598. }
  4599.  
  4600. var homeButtonObserver = {
  4601.     onDrop: function (aEvent, aXferData, aDragSession)
  4602.     {
  4603.         var url = transferUtils.retrieveURLFromData(aXferData.data, aXferData.flavour.contentType);
  4604.         setTimeout(openHomeDialog, 0, url);
  4605.     },
  4606.  
  4607.     onDragOver: function (aEvent, aFlavour, aDragSession)
  4608.     {
  4609.         var statusTextFld = document.getElementById("statusbar-display");
  4610.         statusTextFld.label = gNavigatorBundle.getString("droponhomebutton");
  4611.         aDragSession.dragAction = Components.interfaces.nsIDragService.DRAGDROP_ACTION_LINK;
  4612.     },
  4613.  
  4614.     onDragExit: function (aEvent, aDragSession)
  4615.     {
  4616.         var statusTextFld = document.getElementById("statusbar-display");
  4617.         statusTextFld.label = "";
  4618.     },
  4619.  
  4620.     getSupportedFlavours: function ()
  4621.     {
  4622.         var flavourSet = new FlavourSet();
  4623.         flavourSet.appendFlavour("application/x-moz-file", "nsIFile");
  4624.         flavourSet.appendFlavour("text/x-moz-url");
  4625.         flavourSet.appendFlavour("text/unicode");
  4626.         return flavourSet;
  4627.     }
  4628. }
  4629.  
  4630. function openHomeDialog(aURL)
  4631. {
  4632.     var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
  4633.     var promptTitle = gNavigatorBundle.getString("droponhometitle");
  4634.     var promptMsg   = gNavigatorBundle.getString("droponhomemsg");
  4635.     var pressedVal  = promptService.confirmEx(window, promptTitle, promptMsg,
  4636.         (promptService.BUTTON_TITLE_YES * promptService.BUTTON_POS_0) +
  4637.         (promptService.BUTTON_TITLE_NO * promptService.BUTTON_POS_1),
  4638.         null, null, null, null, {value:0});
  4639.  
  4640.     if (pressedVal == 0) {
  4641.         try {
  4642.             var str = Components.classes["@mozilla.org/supports-string;1"]
  4643.                                 .createInstance(Components.interfaces.nsISupportsString);
  4644.             str.data = aURL;
  4645.             gPrefService.setComplexValue("browser.startup.homepage",
  4646.                                          Components.interfaces.nsISupportsString, str);
  4647.             var homeButton = document.getElementById("home-button");
  4648.             //homeButton.setAttribute("tooltiptext", aURL); //replaced as this is reported as a bug..JC
  4649.         } catch (ex) {
  4650.             dump("Failed to set the home page.\n"+ex+"\n");
  4651.         }
  4652.     }
  4653. }
  4654.  
  4655. var bookmarksButtonObserver = {
  4656.     onDrop: function (aEvent, aXferData, aDragSession)
  4657.     {
  4658.         var split = aXferData.data.split("\n");
  4659.         var url = split[0];
  4660.         if (url != aXferData.data) {  //do nothing if it's not a valid URL
  4661.             var name = split[1];
  4662.             openDialog("chrome://browser/content/bookmarks/addBookmark2.xul", "",
  4663.                        "centerscreen,chrome,dialog,resizable,dependent", name, url);
  4664.         }
  4665.     },
  4666.  
  4667.     onDragOver: function (aEvent, aFlavour, aDragSession)
  4668.     {
  4669.         var statusTextFld = document.getElementById("statusbar-display");
  4670.         statusTextFld.label = gNavigatorBundle.getString("droponbookmarksbutton");
  4671.         aDragSession.dragAction = Components.interfaces.nsIDragService.DRAGDROP_ACTION_LINK;
  4672.     },
  4673.  
  4674.     onDragExit: function (aEvent, aDragSession)
  4675.     {
  4676.         var statusTextFld = document.getElementById("statusbar-display");
  4677.         statusTextFld.label = "";
  4678.     },
  4679.  
  4680.     getSupportedFlavours: function ()
  4681.     {
  4682.         var flavourSet = new FlavourSet();
  4683.         flavourSet.appendFlavour("application/x-moz-file", "nsIFile");
  4684.         flavourSet.appendFlavour("text/x-moz-url");
  4685.         flavourSet.appendFlavour("text/unicode");
  4686.         return flavourSet;
  4687.     }
  4688. }
  4689.  
  4690. var goButtonObserver = {
  4691.     onDragOver: function(aEvent, aFlavour, aDragSession)
  4692.     {
  4693.         var statusTextFld = document.getElementById("statusbar-display");
  4694.         statusTextFld.label = gNavigatorBundle.getString("dropongobutton");
  4695.         aEvent.target.setAttribute("dragover", "true");
  4696.         return true;
  4697.     },
  4698.     onDragExit: function (aEvent, aDragSession)
  4699.     {
  4700.         var statusTextFld = document.getElementById("statusbar-display");
  4701.         statusTextFld.label = "";
  4702.         aEvent.target.removeAttribute("dragover");
  4703.     },
  4704.     onDrop: function (aEvent, aXferData, aDragSession)
  4705.     {
  4706.         var xferData = aXferData.data.split("\n");
  4707.         var uri = xferData[0] ? xferData[0] : xferData[1];
  4708.         if (uri) {
  4709.             getBrowser().dragDropSecurityCheck(aEvent, aDragSession, uri);
  4710.             loadURI(uri, null, null);
  4711.         }
  4712.     },
  4713.     getSupportedFlavours: function ()
  4714.     {
  4715.         var flavourSet = new FlavourSet();
  4716.         flavourSet.appendFlavour("application/x-moz-file", "nsIFile");
  4717.         flavourSet.appendFlavour("text/x-moz-url");
  4718.         flavourSet.appendFlavour("text/unicode");
  4719.         return flavourSet;
  4720.     }
  4721. }
  4722.  
  4723. var DownloadsButtonDNDObserver = {
  4724.     /////////////////////////////////////////////////////////////////////////////
  4725.     // nsDragAndDrop
  4726.     onDragOver: function (aEvent, aFlavour, aDragSession)
  4727.     {
  4728.         var statusTextFld = document.getElementById("statusbar-display");
  4729.         statusTextFld.label = gNavigatorBundle.getString("dropondownloadsbutton");
  4730.         aDragSession.canDrop = (aFlavour.contentType == "text/x-moz-url" ||
  4731.         aFlavour.contentType == "text/unicode");
  4732.     },
  4733.  
  4734.     onDragExit: function (aEvent, aDragSession)
  4735.     {
  4736.         var statusTextFld = document.getElementById("statusbar-display");
  4737.         statusTextFld.label = "";
  4738.     },
  4739.  
  4740.     onDrop: function (aEvent, aXferData, aDragSession)
  4741.     {
  4742.         var split = aXferData.data.split("\n");
  4743.         var url = split[0];
  4744.         if (url != aXferData.data) {  //do nothing, not a valid URL
  4745.             getBrowser().dragDropSecurityCheck(aEvent, aDragSession, url);
  4746.  
  4747.             var name = split[1];
  4748.             saveURL(url, name, null, true, true);
  4749.         }
  4750.     },
  4751.     getSupportedFlavours: function ()
  4752.     {
  4753.         var flavourSet = new FlavourSet();
  4754.         flavourSet.appendFlavour("text/x-moz-url");
  4755.         flavourSet.appendFlavour("text/unicode");
  4756.         return flavourSet;
  4757.     }
  4758. }
  4759.  
  4760. function focusSearchBar()
  4761. {
  4762.    dump ("focusSearchBar()");
  4763.     var searchBar = document.getElementsByTagName("searchbar");
  4764.     if (searchBar.length > 0) {
  4765.         searchBar[0].select();
  4766.         searchBar[0].focus();
  4767.     }
  4768. }
  4769.  
  4770.  
  4771. // MERC - JCH: Wrapper for OpenSearch, called from nsHTMLPluginDocument.cpp
  4772. function WrapperOpenSearch(searchStr)
  4773. {
  4774.     OpenSearch("internet", searchStr);
  4775. }
  4776.  
  4777.  
  4778. // MERC - JCH: Slightly modified version of onTextEntered() from search.xml
  4779. function OpenSearch(tabName, searchStr, newTabFlag)
  4780. {
  4781.     dump("OpenSearch called. tabName : " + tabName + ", searchStr : " + searchStr + ", newTabFlag : " + newTabFlag);
  4782.     // dump("\nINPUT SEARCH STRING: " +searchStr+ "\n");
  4783.  
  4784.     var searchURL = null;
  4785.  
  4786.     var PREF = Components.classes["@mozilla.org/preferences-service;1"]
  4787.                          .getService(Components.interfaces.nsIPrefService)
  4788.                          .getBranch(null);
  4789.  
  4790.     var ISEARCHSVC = Components.classes["@mozilla.org/rdf/datasource;1?name=internetsearch"]
  4791.                                .getService(Components.interfaces.nsIInternetSearchService);
  4792.  
  4793.  
  4794.     // GET THE SEARCH ENGINE AS SET IN SIDEBAR SEARCH OR NAV BAR SEARCH DROPDOWN MENUS
  4795.     var broadcaster = document.getElementById('searchEngineBroadcaster');
  4796.     var currentEngine = broadcaster.getAttribute("searchengine");
  4797.  
  4798.     // JMC : If it's netscape, use the context menu link, not the default from the .src file
  4799.     // dump("JMC: currentEngine is " + currentEngine + "\n");
  4800.  
  4801.     if (currentEngine.indexOf('NetscapeSearch') > -1)
  4802.     {
  4803.         searchURL = gPrefService.getCharPref('browser.contextSearch.URL') +(searchStr? encodeURIComponent(searchStr):"");
  4804.         // searchURL = gPrefService.getCharPref('browser.contextSearch.URL') + (searchStr? searchStr:"");
  4805.     } else {
  4806.         // NOW GET THE WHOLE SEARCH URI
  4807.         searchURL = ISEARCHSVC.GetInternetSearchURL(
  4808.             currentEngine, searchStr? encodeURIComponent(searchStr):"",
  4809.             0, 0, {value:0});
  4810.     }
  4811.     
  4812.     // dump("\nOUTPUT SEARCH STRING: " +searchURL+ "\n");
  4813.  
  4814.     // if the search box is empty, let's go to netscape search
  4815.     if (!searchURL) {
  4816.         // GO TO FALLBACK POSITION, WHICH IS NETSCAPE SEARCH PAGE
  4817.         // This gets chrome URL from browser\base\content\browser-sets.inc
  4818.         var navigatorRegionBundle = document.getElementById("bundle_browser_region");
  4819.         searchURL = navigatorRegionBundle.getString("fallbackDefaultSearchURL");
  4820.     }
  4821.     SearchLoadURL(searchURL, null);
  4822. }
  4823.  
  4824.  
  4825. // MERC - JCH: Made changes to regular expression which selects a valid URI.
  4826. // There is no internetsearch.rdf file so I commented out a bunch of
  4827. // code that tries to access it. The URIs associated with 'fallbackDefaultSearchURL'
  4828. // and 'browser.search.defaulturl' were changed to ones that work. See region.properties file.
  4829. function OpenSearchBAK(tabName, searchStr, newTabFlag)
  4830. {
  4831.     //This function needs to be split up someday.
  4832.     //XXXnoririty I don't want any prefs switching open by tabs to window
  4833.     //XXXpch: this routine needs to be cleaned up.
  4834.  
  4835.     // GET FALLBACK SEARCH ENGINE: jch set it to google.
  4836.     var defaultSearchURL = null;
  4837.     // This gets chrome URL from browser\base\content\browser-sets.inc
  4838.     var navigatorRegionBundle = document.getElementById("bundle_browser_region");
  4839.     var fallbackDefaultSearchURL = navigatorRegionBundle.getString("fallbackDefaultSearchURL");
  4840.  
  4841.     dump("#$#$#$  OpenSearch(): Search String : " +searchStr+ "\n");
  4842.  
  4843.     //Check to see if search string contains "://" or "ftp." or white space.
  4844.     //If it does treat as url and match for pattern
  4845.     //var urlmatch= /(:\/\/|^ftp\.)[^ \S]+$/
  4846.     var urlmatch = /^(http|https|ftp|chrome|file):\/\/.+|^www\..+/;
  4847.     var forceAsURL = urlmatch.test(searchStr);
  4848.  
  4849.     dump("#$#$#$  OpenSearch() FORCE TO A URL : " +forceAsURL+ "\n");
  4850.  
  4851.     // TRY TO GET PREFERRED SEARCH ENGINE
  4852.     try {
  4853.         defaultSearchURL = gPrefService.getComplexValue("browser.search.defaulturl",
  4854.         Components.interfaces.nsIPrefLocalizedString).data;
  4855.     } catch (ex) {}
  4856.  
  4857.     // Fallback to a default url (one that we can get sidebar search results for)
  4858.     if (!defaultSearchURL)
  4859.     defaultSearchURL = fallbackDefaultSearchURL;
  4860.  
  4861.     if (!defaultSearchURL) return;
  4862.  
  4863.     dump("#$#$#$  OpenSearch(): Default String : " +defaultSearchURL+ "\n");
  4864.  
  4865.     if (!searchStr) {
  4866.         return;
  4867.         // BrowserSearchInternet();
  4868.     } else {
  4869.  
  4870.         //Check to see if location bar field is a url
  4871.         //If it is a url go to URL.  A Url is "://" or "." as commented above
  4872.         //Otherwise search on entry
  4873.         if (forceAsURL) {
  4874.             if (!newTabFlag) {
  4875.                 loadURI(searchStr, null, null);
  4876.             }
  4877.         else {
  4878.             var newTab = getBrowser().addTab(searchStr);
  4879.             if (!pref.getBoolPref("browser.tabs.loadInBackground"))
  4880.             getBrowser().selectedTab = newTab;
  4881.         }
  4882.  
  4883.         return;
  4884.         // BrowserLoadURL(null, null)
  4885.     } else {
  4886.         if (searchStr) {
  4887.             var escapedSearchStr = encodeURIComponent(searchStr);
  4888.             defaultSearchURL += escapedSearchStr;
  4889.  
  4890.  
  4891.             /*
  4892.             var searchDS = Components.classes["@mozilla.org/rdf/datasource;1?name=internetsearch"]
  4893.             .getService(Components.interfaces.nsIInternetSearchService);
  4894.  
  4895.  
  4896.             searchDS.RememberLastSearchText(escapedSearchStr);
  4897.             try {
  4898.             var searchEngineURI = gPrefService.getCharPref("browser.search.defaultengine");
  4899.             if (searchEngineURI) {
  4900.             var searchURL = getSearchUrl("actionButton");
  4901.  
  4902.             if (searchURL) {
  4903.             defaultSearchURL = searchURL + escapedSearchStr;
  4904.             } else {
  4905.             searchURL = searchDS.GetInternetSearchURL(searchEngineURI, escapedSearchStr, 0, 0, {value:0});
  4906.             if (searchURL)
  4907.             defaultSearchURL = searchURL;
  4908.             }
  4909.             }
  4910.             } catch (ex) {
  4911.             }
  4912.             */
  4913.  
  4914.             dump("#$#$#$ Complete string : " +defaultSearchURL+ "\n");
  4915.  
  4916.             if (!newTabFlag) {
  4917.                 loadURI(defaultSearchURL, null, null);
  4918.             }
  4919.         else {
  4920.             var newTab = getBrowser().addTab(defaultSearchURL);
  4921.             if (!pref.getBoolPref("browser.tabs.loadInBackground"))
  4922.             getBrowser().selectedTab = newTab;
  4923.         }
  4924.     }
  4925. }
  4926. }
  4927. }
  4928.  
  4929. function FillHistoryMenu(aParent, aMenu)
  4930. {
  4931.     // Remove old entries if any
  4932.     deleteHistoryItems(aParent);
  4933.  
  4934.     var sessionHistory = getWebNavigation().sessionHistory;
  4935.  
  4936.     var count = sessionHistory.count;
  4937.     var index = sessionHistory.index;
  4938.     var end;
  4939.     var j;
  4940.     var entry;
  4941.  
  4942.     switch (aMenu)
  4943.     {
  4944.         case "back":
  4945.         end = (index > MAX_HISTORY_MENU_ITEMS) ? index - MAX_HISTORY_MENU_ITEMS : 0;
  4946.         if ((index - 1) < end) return false;
  4947.         for (j = index - 1; j >= end; j--)
  4948.         {
  4949.             entry = sessionHistory.getEntryAtIndex(j, false);
  4950.             if (entry)
  4951.             var menuItem = createMenuItem(aParent, j, entry.title);
  4952.             if (menuItem)
  4953.                 menuItem.setAttribute("tooltiptext", "Go back to "+menuItem.label);
  4954.         }
  4955.         break;
  4956.         case "forward":
  4957.         end  = ((count-index) > MAX_HISTORY_MENU_ITEMS) ? index + MAX_HISTORY_MENU_ITEMS : count;
  4958.         if ((index + 1) >= end) return false;
  4959.         for (j = index + 1; j < end; j++)
  4960.         {
  4961.             entry = sessionHistory.getEntryAtIndex(j, false);
  4962.             if (entry)
  4963.             var menuItem = createMenuItem(aParent, j, entry.title);
  4964.             if (menuItem)
  4965.                 menuItem.setAttribute("tooltiptext", "Go forward to "+menuItem.label);
  4966.         }
  4967.         break;
  4968.         case "go":
  4969.         aParent.lastChild.hidden = (count == 0);
  4970.         end = count > MAX_HISTORY_MENU_ITEMS ? count - MAX_HISTORY_MENU_ITEMS : 0;
  4971.         for (j = count - 1; j >= end; j--)
  4972.         {
  4973.             entry = sessionHistory.getEntryAtIndex(j, false);
  4974.             if (entry)
  4975.             createRadioMenuItem(aParent, j, entry.title, j==index);
  4976.         }
  4977.         break;
  4978.     }
  4979.     return true;
  4980. }
  4981.  
  4982. function addToUrlbarHistory()
  4983. {
  4984.     var urlToAdd = gURLBar.value;
  4985.     if (!urlToAdd)
  4986.     return;
  4987.     if (urlToAdd.search(/[\x00-\x1F]/) != -1) // don't store bad URLs
  4988.     return;
  4989.  
  4990.     if (!gGlobalHistory)
  4991.     gGlobalHistory = Components.classes["@mozilla.org/browser/global-history;2"]
  4992.     .getService(Components.interfaces.nsIBrowserHistory);
  4993.  
  4994.     if (!gURIFixup)
  4995.     gURIFixup = Components.classes["@mozilla.org/docshell/urifixup;1"]
  4996.     .getService(Components.interfaces.nsIURIFixup);
  4997.     try {
  4998.         if (urlToAdd.indexOf(" ") == -1) {
  4999.             var fixedUpURI = gURIFixup.createFixupURI(urlToAdd, 0);
  5000.             if(fixedUpURI.spec=="about:blank")
  5001.             return;
  5002.             // MERC (DP): history debug
  5003.  
  5004.             gGlobalHistory.markPageAsTyped(fixedUpURI);
  5005.         }
  5006.     }
  5007.     catch(ex) { dump ("Caught Exception: " + ex + "\n");   }
  5008. }
  5009.  
  5010. function createMenuItem( aParent, aIndex, aLabel)
  5011. {
  5012.     var menuitem = document.createElement( "menuitem" );
  5013.     menuitem.setAttribute( "label", aLabel );
  5014.     menuitem.setAttribute( "index", aIndex );
  5015.     aParent.appendChild( menuitem );
  5016.     return menuitem;
  5017. }
  5018.  
  5019. function createRadioMenuItem( aParent, aIndex, aLabel, aChecked)
  5020. {
  5021.     var menuitem = document.createElement( "menuitem" );
  5022.     menuitem.setAttribute( "type", "radio" );
  5023.     menuitem.setAttribute( "label", aLabel );
  5024.     menuitem.setAttribute( "index", aIndex );
  5025.     if (aChecked==true)
  5026.     menuitem.setAttribute( "checked", "true" );
  5027.     aParent.appendChild( menuitem );
  5028. }
  5029.  
  5030. function deleteHistoryItems(aParent)
  5031. {
  5032.     var children = aParent.childNodes;
  5033.     for (var i = 0; i < children.length; i++)
  5034.     {
  5035.         var index = children[i].getAttribute("index");
  5036.         if (index)
  5037.         aParent.removeChild(children[i]);
  5038.     }
  5039. }
  5040.  
  5041. function toJavaScriptConsole()
  5042. {
  5043.     toOpenWindowByType("global:console", "chrome://global/content/console.xul");
  5044. }
  5045.  
  5046. function toOpenWindowByType(inType, uri, features)
  5047. {
  5048.     var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
  5049.     var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
  5050.     var topWindow = windowManagerInterface.getMostRecentWindow(inType);
  5051.  
  5052.     if (topWindow)
  5053.         topWindow.focus();
  5054.     else if (features)
  5055.         window.open(uri, "_blank", features);
  5056.     else
  5057.         window.open(uri, "_blank", "chrome,extrachrome,menubar,resizable,scrollbars,status,toolbar");
  5058. }
  5059.  
  5060. // MERC (DP): when the user presses CTRL-N we look at the pref
  5061. // browser.tabs.newtabinsteadofwindow to determine whether to open
  5062. // a new window or a new tab.  effectively if the pref is on,
  5063. // pressing CTRL-N is equiv to pressing CTRL-T
  5064. function OpenBrowserWindowWithPref()
  5065. {
  5066.     if (gPrefService.getBoolPref("browser.tabs.newtabinsteadofwindow"))
  5067.     {
  5068.         BrowserHome(true);
  5069.     } else {
  5070.         OpenBrowserWindow();
  5071.     }
  5072. }
  5073.  
  5074. function tridentStartNav(urlStr)
  5075. {
  5076.     // dump ("\nStarting trident navigation to url " + urlStr);    
  5077.     getBrowser().userTypedClear = true;
  5078.     // JMC - Ought to call observer service notify for startDocumentLoad
  5079.     // But need to haul out the trident-hacked code there first
  5080.  
  5081. }
  5082.  
  5083. function tridentStartSubFrameNav(urlStr)
  5084. {
  5085.     // dump ("\nStarting trident subframe navigation to url " + urlStr);    
  5086. }
  5087.  
  5088. function tridentEndNav(urlStr)
  5089. {
  5090.     // dump ("\nStopping trident navigation to : " + urlStr);    
  5091.     // JMC - Ought to call observer service notify for endDocumentLoad
  5092.     // But need to haul out the trident-hacked code there first
  5093. }
  5094.  
  5095. function tridentEndSubFrameNav(urlStr)
  5096. {
  5097.     // dump ("\nStopping trident subframe navigation to : " + urlStr);    
  5098.     // JMC - Ought to call observer service notify for endDocumentLoad
  5099.     // But need to haul out the trident-hacked code there first
  5100. }
  5101.  
  5102.  
  5103.  
  5104. function OpenBrowserWindow()
  5105. {
  5106.     var charsetArg = new String();
  5107.     var handler = Components.classes['@mozilla.org/commandlinehandler/general-startup;1?type=browser'];
  5108.     handler = handler.getService();
  5109.     handler = handler.QueryInterface(Components.interfaces.nsICmdLineHandler);
  5110.     var startpage = handler.defaultArgs;
  5111.     var url = handler.chromeUrlForTask;
  5112.     var wintype = document.firstChild.getAttribute('windowtype');
  5113.  
  5114.     // if and only if the current window is a browser window and it has a document with a character
  5115.     // set, then extract the current charset menu setting from the current document and use it to
  5116.     // initialize the new browser window...
  5117.     if (window && (wintype == "navigator:browser") && window._content && window._content.document)
  5118.     {
  5119.         var DocCharset = window._content.document.characterSet;
  5120.         charsetArg = "charset="+DocCharset;
  5121.  
  5122.         //we should "inherit" the charset menu setting in a new window
  5123.         window.openDialog(url, "_blank", "chrome,all,dialog=no", startpage, charsetArg);
  5124.     }
  5125. else // forget about the charset information.
  5126.     {
  5127.         window.openDialog(url, "_blank", "chrome,all,dialog=no", startpage);
  5128.     }
  5129. }
  5130.  
  5131. function openAboutDialog()
  5132. {
  5133.     window.openDialog("chrome://browser/content/aboutDialog.xul", "About", "modal,centerscreen,chrome,resizable=no");
  5134. }
  5135.  
  5136. function BrowserCustomizeToolbar()
  5137. {
  5138.     // Disable the toolbar context menu items
  5139.     var menubar = document.getElementById("main-menubar");
  5140.     for (var i = 0; i < menubar.childNodes.length; ++i)
  5141.     menubar.childNodes[i].setAttribute("disabled", true);
  5142.  
  5143.     var cmd = document.getElementById("cmd_CustomizeToolbars");
  5144.     cmd.setAttribute("disabled", "true");
  5145.  
  5146.     window.openDialog("chrome://global/content/customizeToolbar.xul", "CustomizeToolbar",
  5147.     "chrome,dependent,dialog", document.getElementById("navigator-toolbox"));
  5148. }
  5149.  
  5150. function BrowserToolboxCustomizeDone(aToolboxChanged)
  5151. {
  5152.     // Update global UI elements that may have been added or removed
  5153.     if (aToolboxChanged) {
  5154.         gURLBar = document.getElementById("urlbar");
  5155.         gProxyButton = document.getElementById("page-proxy-button");
  5156.         gProxyFavIcon = document.getElementById("page-proxy-favicon");
  5157.         gProxyDeck = document.getElementById("page-proxy-deck");
  5158.         //gHomeButton.updateTooltip();  DO NOT USE..this is set in the browser.xul file
  5159.         //<added by SLiu , fixing customize personal bookmarks toolbar
  5160.         var ptf = document.getElementById("personal-bookmarks");
  5161.         if (ptf) populateBookmarks();
  5162.  
  5163.         //<added by MSD , fixing webmail button
  5164.         webmail.fixMenus();
  5165.  
  5166.         window.XULBrowserWindow.init();
  5167.     }
  5168.  
  5169.     // Update the urlbar
  5170.     var url = getWebNavigation().currentURI.spec;
  5171.     if (gURLBar) {
  5172.         gURLBar.value = url;
  5173.         var uri = Components.classes["@mozilla.org/network/standard-url;1"]
  5174.                             .createInstance(Components.interfaces.nsIURI);
  5175.         uri.spec = url;
  5176.         SetPageProxyState("valid", uri);
  5177.     }
  5178.  
  5179.     // Re-enable parts of the UI we disabled during the dialog
  5180.     var menubar = document.getElementById("main-menubar");
  5181.     for (var i = 0; i < menubar.childNodes.length; ++i)
  5182.         menubar.childNodes[i].setAttribute("disabled", false);
  5183.     var cmd = document.getElementById("cmd_CustomizeToolbars");
  5184.     cmd.removeAttribute("disabled");
  5185.  
  5186.     // fix up the personal toolbar folder
  5187.     var bt = document.getElementById("bookmarks-ptf");
  5188.     if (bt) {
  5189.         var btf = BMSVC.getBookmarksToolbarFolder().Value;
  5190.         var btchevron = document.getElementById("bookmarks-chevron");
  5191.         bt.ref = btf;
  5192.         btchevron.ref = btf;
  5193.         // no uniqueness is guaranteed, so we have to remove first
  5194.         try {
  5195.             bt.database.RemoveObserver(BookmarksToolbarRDFObserver);
  5196.             bt.controllers.removeController(BookmarksMenuController);
  5197.         } catch (ex) {
  5198.             // ignore
  5199.         }
  5200.         bt.database.AddObserver(BookmarksToolbarRDFObserver);
  5201.         bt.controllers.appendController(BookmarksMenuController);
  5202.         bt.builder.rebuild();
  5203.         btchevron.builder.rebuild();
  5204.  
  5205.         // fake a resize; this function takes care of flowing bookmarks
  5206.         // from the bar to the overflow item
  5207.         BookmarksToolbar.resizeFunc(null);
  5208.     }
  5209.  
  5210.     // Initialize SPUI
  5211.     // JMC - NEEDS to refresh spui components here, but this is not quite right
  5212.     // if (spui) spui.RefreshComponentList();
  5213.     if (spui) spui.RedrawComponents();
  5214.     reshuffleToolbars(true);
  5215.     // XXX Shouldn't have to do this, but I do
  5216.     
  5217.     // JMC - Don't like this...
  5218.     dump("Focusing the window\n");
  5219.     window.focus();
  5220. }
  5221.  
  5222. function reshuffleToolbars(aForce)
  5223. {
  5224.     var toolbox = document.getElementById("navigator-toolbox");
  5225.     var toolbars = toolbox.getElementsByTagName('toolbar');
  5226.     for (var i = 0; i < toolbars.length; i++) {
  5227.         var toolbar = toolbars.item(i);
  5228.           try {
  5229.               toolbar.allocateItems(aForce);
  5230.           } catch (ex) {
  5231.               // not a overflow toolbar
  5232.           }
  5233.     }
  5234.     toolbars = toolbox.getElementsByTagName('multibartray');
  5235.     for (var i = 0; i < toolbars.length; i++) {
  5236.         var toolbar = toolbars.item(i);
  5237.           try {
  5238.               toolbar.allocateItems(aForce);
  5239.           } catch (ex) {
  5240.               // not a overflow toolbar
  5241.           }
  5242.     }
  5243. }
  5244.  
  5245. var FullScreen =
  5246. {
  5247.     toggle: function()
  5248.     {
  5249.         // show/hide all menubars, toolbars, and statusbars (except the full screen toolbar)
  5250.         this.showXULChrome("toolbar", window.fullScreen);
  5251.         this.showXULChrome("multibar", window.fullScreen);
  5252.         this.showXULChrome("statusbar", window.fullScreen);
  5253.         var throbberBox = document.getElementById('throbber-box');
  5254.         if (throbberBox) {
  5255.             throbberBox.setAttribute('hidden', !window.fullScreen); //JMC : hide throbber in fullscreen
  5256.         }
  5257.         var popupBlockerButton = document.getElementById("popupblocker-button");
  5258.         if (popupBlockerButton)
  5259.             popupBlockerButton.setAttribute('hideLabel', !window.fullScreen);
  5260.     },
  5261.  
  5262.     showXULChrome: function(aTag, aShow)
  5263.     {
  5264.         var XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  5265.         var els = document.getElementsByTagNameNS(XULNS, aTag);
  5266.  
  5267.         var i;
  5268.         for (i = 0; i < els.length; ++i) {
  5269.             // XXX don't interfere with previously collapsed toolbars
  5270.             if (els[i].getAttribute("fullscreentoolbar") == "true") {
  5271.                 if (!aShow) {
  5272.                     var toolbarMode = els[i].getAttribute("mode");
  5273.                     var iconSize = els[i].getAttribute("iconsize");
  5274.                     var contextMenu = els[i].getAttribute("context");
  5275.  
  5276.                     if (toolbarMode != "text") {
  5277.                         els[i].setAttribute("saved-mode", toolbarMode);
  5278.                         els[i].setAttribute("saved-iconsize", iconSize);
  5279.                         els[i].setAttribute("mode", "icons");
  5280.                         els[i].setAttribute("iconsize", "small");
  5281.                     }
  5282.  
  5283.                     // XXX See bug 202978: we disable the context menu
  5284.                     // to prevent customization while in fullscreen, which
  5285.                     // causes menu breakage.
  5286.                     els[i].setAttribute("saved-context", contextMenu);
  5287.                     els[i].removeAttribute("context");
  5288.                 }
  5289.             else {
  5290.                 if (els[i].hasAttribute("saved-mode")) {
  5291.                     var savedMode = els[i].getAttribute("saved-mode");
  5292.                     els[i].setAttribute("mode", savedMode);
  5293.                     els[i].removeAttribute("saved-mode");
  5294.                 }
  5295.  
  5296.                 if (els[i].hasAttribute("saved-iconsize")) {
  5297.                     var savedIconSize = els[i].getAttribute("saved-iconsize");
  5298.                     els[i].setAttribute("iconsize", savedIconSize);
  5299.                     els[i].removeAttribute("saved-iconsize");
  5300.                 }
  5301.  
  5302.                 // XXX see above.
  5303.                 if (els[i].hasAttribute("saved-context")) {
  5304.                     var savedContext = els[i].getAttribute("saved-context");
  5305.                     els[i].setAttribute("context", savedContext);
  5306.                     els[i].removeAttribute("saved-context");
  5307.                 }
  5308.             }
  5309.         } else {
  5310.             // use moz-collapsed so it doesn't persist hidden/collapsed,
  5311.             // so that new windows don't have missing toolbars
  5312.             if (aShow)
  5313.             els[i].removeAttribute("moz-collapsed");
  5314.         else
  5315.             els[i].setAttribute("moz-collapsed", "true");
  5316.         }
  5317.     }
  5318.     var controls = document.getElementsByAttribute("fullscreencontrol", "true");
  5319.     for (i = 0; i < controls.length; ++i)
  5320.     controls[i].hidden = aShow;
  5321.  
  5322. }
  5323. };
  5324.  
  5325. function nsBrowserStatusHandler()
  5326. {
  5327.     this.init();
  5328. }
  5329.  
  5330. nsBrowserStatusHandler.prototype =
  5331. {
  5332.     // Stored Status, Link and Loading values
  5333.     status : "",
  5334.     defaultStatus : "",
  5335.     jsStatus : "",
  5336.     jsDefaultStatus : "",
  5337.     overLink : "",
  5338.     startTime : 0,
  5339.     statusText: "",
  5340.     lastURI: null,
  5341.  
  5342.     statusTimeoutInEffect : false,
  5343.  
  5344.     QueryInterface : function(aIID)
  5345.     {
  5346.         if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
  5347.         aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
  5348.         aIID.equals(Components.interfaces.nsIXULBrowserWindow) ||
  5349.         aIID.equals(Components.interfaces.nsISupports))
  5350.         return this;
  5351.         throw Components.results.NS_NOINTERFACE;
  5352.     },
  5353.  
  5354.     init : function()
  5355.     {
  5356.         this.throbberElement = document.getElementById("throbberBroadcaster");
  5357.         this.statusMeter     = document.getElementById("statusbar-icon");
  5358.         this.stopCommand     = document.getElementById("Browser:Stop");
  5359.         this.stopReloadBtn   = document.getElementById("stop-reload-button");
  5360.         this.statusTextField = document.getElementById("statusbar-display");
  5361.         this.securityButton  = document.getElementById("security-button");
  5362.         this.urlBar          = document.getElementById("urlbar");
  5363.  
  5364.         // Initialize the security button's state and tooltip text
  5365.         const nsIWebProgressListener = Components.interfaces.nsIWebProgressListener;
  5366.         this.onSecurityChange(null, null, nsIWebProgressListener.STATE_IS_INSECURE);
  5367.     },
  5368.  
  5369.     destroy : function()
  5370.     {
  5371.         // XXXjag to avoid leaks :-/, see bug 60729
  5372.         this.throbberElement = null;
  5373.         this.statusMeter     = null;
  5374.         this.stopCommand     = null;
  5375.         this.stopReloadBtn   = null;
  5376.         this.statusTextField = null;
  5377.         this.securityButton  = null;
  5378.         this.urlBar          = null;
  5379.         this.statusText      = null;
  5380.         this.lastURI         = null;
  5381.     },
  5382.  
  5383.     setJSStatus : function(status)
  5384.     {
  5385.         this.jsStatus = status;
  5386.         this.updateStatusField();
  5387.     },
  5388.  
  5389.     setJSDefaultStatus : function(status)
  5390.     {
  5391.         this.jsDefaultStatus = status;
  5392.         this.updateStatusField();
  5393.     },
  5394.  
  5395.     setDefaultStatus : function(status)
  5396.     {
  5397.         this.defaultStatus = status;
  5398.         this.updateStatusField();
  5399.     },
  5400.  
  5401.     setOverLink : function(link, b)
  5402.     {
  5403.         this.overLink = link;
  5404.         this.updateStatusField();
  5405.     },
  5406.  
  5407.     updateStatusField : function()
  5408.     {
  5409.         var text = this.overLink || this.status || this.jsStatus || this.jsDefaultStatus || this.defaultStatus;
  5410.  
  5411.         // check the current value so we don't trigger an attribute change
  5412.         // and cause needless (slow!) UI updates
  5413.         if (this.statusText != text) {
  5414.             this.statusTextField.label = text;
  5415.             this.statusText = text;
  5416.         }
  5417.     },
  5418.  
  5419.     onLinkIconAvailable : function(aBrowser, aHref)
  5420.     {
  5421. //        dump( "))      WMWMWMWMWMW===> onLinkIconAvailable(aBowser, \""+aHref+"\")\n" );
  5422.         if (gProxyFavIcon &&
  5423.         gBrowser.mCurrentBrowser == aBrowser &&
  5424.         gBrowser.userTypedValue === null)
  5425.         {
  5426.             PageProxySetIcon(aHref);
  5427.         }
  5428.  
  5429.         aBrowser.mFavIconURL = aHref;
  5430.     },
  5431.  
  5432.     onProgressChange : function (aWebProgress, aRequest,
  5433.     aCurSelfProgress, aMaxSelfProgress,
  5434.     aCurTotalProgress, aMaxTotalProgress)
  5435.     {
  5436.         if (aMaxTotalProgress > 0) {
  5437.             // This is highly optimized.  Don't touch this code unless
  5438.             // you are intimately familiar with the cost of setting
  5439.             // attrs on XUL elements. -- hyatt
  5440.             var percentage = (aCurTotalProgress * 100) / aMaxTotalProgress;
  5441.             this.statusMeter.value = percentage;
  5442.         }
  5443.     },
  5444.  
  5445.     onStateChange : function(aWebProgress, aRequest, aStateFlags, aStatus)
  5446.     {
  5447.         var docshell = getWebNavigation();
  5448.         
  5449.         if (aRequest) {
  5450.             blacklistUtils.debug('\nonStateChange('+aRequest.name+')\n');
  5451.             if (blacklistUtils.IsSiteInPhishList(aRequest.originalURI)) {
  5452.                 // ShowPhishingSiteWarning();
  5453.                 displayNotificationBar("phishing",[aRequest.originalURI]);
  5454.                 //aRequest.suspend();
  5455.                 //aRequest.cancel(Components.results.NS_BINDING_ABORTED);
  5456.             } else if (blacklistUtils.IsSiteInSpywareList(aRequest.originalURI)) {
  5457.                 //ShowSpywareSiteWarning();
  5458.                 displayNotificationBar("spyware",[aRequest.originalURI]);
  5459.             }
  5460.         }
  5461.         /*
  5462.         if (aRequest) {
  5463.         for (var p in aRequest) {
  5464.         dump(' aRequest.'+p+': '+aRequest[p]+'\n');
  5465.         }
  5466.         }
  5467.         */
  5468.  
  5469.         const nsIWebProgressListener = Components.interfaces.nsIWebProgressListener;
  5470.         const nsIChannel = Components.interfaces.nsIChannel;
  5471.         if (aStateFlags & nsIWebProgressListener.STATE_START) {
  5472.             // This (thanks to the filter) is a network start or the first
  5473.             // stray request (the first request outside of the document load),
  5474.             // initialize the throbber and his friends.
  5475.  
  5476.             // always reset the favicon
  5477.             if (gBrowser.mTabbedMode) {
  5478.                 var browserIndex = gBrowser.getBrowserIndexForDocument(aWebProgress.DOMWindow);
  5479.                 if (browserIndex != -1)
  5480.                 gBrowser.getBrowserAtIndex(browserIndex).mFavIconURL = null;
  5481.             }
  5482.         else
  5483.             gBrowser.mCurrentBrowser.mFavIconURL = null;
  5484.  
  5485.             // Call start document load listeners (only if this is a network load)
  5486.             if (aStateFlags & nsIWebProgressListener.STATE_IS_NETWORK &&
  5487.             aRequest && aWebProgress.DOMWindow == content)
  5488.             this.startDocumentLoad(aRequest);
  5489.  
  5490.             if (this.throbberElement) {
  5491.                 // Turn the throbber on.
  5492.                 this.throbberElement.setAttribute("busy", "true");
  5493.             }
  5494.  
  5495.             // Turn the status meter on.
  5496.             this.statusMeter.value = 0;  // be sure to clear the progress bar
  5497.             if (gProgressCollapseTimer) {
  5498.                 window.clearTimeout(gProgressCollapseTimer);
  5499.                 gProgressCollapseTimer = null;
  5500.             }
  5501.         else
  5502.             this.statusMeter.parentNode.collapsed = false;
  5503.  
  5504.             // XXX: This needs to be based on window activity...
  5505.             this.stopCommand.removeAttribute("disabled");
  5506.             if (this.stopReloadBtn) {
  5507.                 // JCH: Need to set label according to state
  5508.                 this.stopReloadBtn.setAttribute("label","Stop");
  5509.                 this.stopReloadBtn.setAttribute("state","stop");
  5510.                 this.stopReloadBtn.removeAttribute("oncommand");
  5511.                 this.stopReloadBtn.setAttribute("command","Browser:Stop");
  5512.             }
  5513.         }
  5514.     else if (aStateFlags & nsIWebProgressListener.STATE_STOP) {
  5515.         if (aStateFlags & nsIWebProgressListener.STATE_IS_NETWORK) {
  5516.             if (aRequest) {
  5517.                 if (aWebProgress.DOMWindow == content)
  5518.                 this.endDocumentLoad(aRequest, aStatus);
  5519.             }
  5520.         }
  5521.  
  5522.         // This (thanks to the filter) is a network stop or the last
  5523.         // request stop outside of loading the document, stop throbbers
  5524.         // and progress bars and such
  5525.         if (aRequest) {
  5526.             var msg = "";
  5527.             // Get the channel if the request is a channel
  5528.             var channel;
  5529.             try {
  5530.                 channel = aRequest.QueryInterface(nsIChannel);
  5531.             }
  5532.             catch(e) { };
  5533.             if (channel) {
  5534.                 var location = channel.URI;
  5535.  
  5536.                 // For keyword URIs clear the user typed value since they will be changed into real URIs
  5537.                 if (location.scheme == "keyword" && aWebProgress.DOMWindow == content)
  5538.                     getBrowser().userTypedValue = null;
  5539.  
  5540.                 if (location.spec != "about:blank") {
  5541.                     const kErrorBindingAborted = 0x804B0002;
  5542.                     const kErrorNetTimeout = 0x804B000E;
  5543.                     switch (aStatus) {
  5544.                         case kErrorBindingAborted:
  5545.                         msg = gNavigatorBundle.getString("nv_stopped");
  5546.                         break;
  5547.                         case kErrorNetTimeout:
  5548.                         msg = gNavigatorBundle.getString("nv_timeout");
  5549.                         break;
  5550.                     }
  5551.                 }
  5552.             }
  5553.             // If msg is false then we did not have an error (channel may have
  5554.             // been null, in the case of a stray image load).
  5555.             if (!msg) {
  5556.                 msg = gNavigatorBundle.getString("nv_done");
  5557.             }
  5558.             this.status = "";
  5559.             this.setDefaultStatus(msg);
  5560.         }
  5561.  
  5562.         // Turn the progress meter and throbber off.
  5563.         gProgressCollapseTimer = window.setTimeout(
  5564.         function() {
  5565.             gProgressMeterPanel.collapsed = true;
  5566.             gProgressCollapseTimer = null;
  5567.         }, 100);
  5568.  
  5569.         if (this.throbberElement)
  5570.         this.throbberElement.removeAttribute("busy");
  5571.  
  5572.         this.stopCommand.setAttribute("disabled", "true");
  5573.         if (this.stopReloadBtn) {
  5574.             // JCH: Need to set label according to state
  5575.             this.stopReloadBtn.setAttribute("label","Reload");
  5576.             this.stopReloadBtn.setAttribute("state","reload");
  5577.             this.stopReloadBtn.removeAttribute("command");
  5578.             //this.stopReloadBtn.setAttribute("oncommand","BrowserStopReload(event);");
  5579.             this.stopReloadBtn.setAttribute("oncommand","BrowserReload(event);");
  5580.         }
  5581.     }
  5582. },
  5583.  
  5584. onLocationChange : function(aWebProgress, aRequest, aLocation)
  5585. {
  5586.     var location = aLocation.spec;
  5587.     if (location == "about:blank") location = "";
  5588.     // dump("browser.js: onLocationChange: location = "+location+"\n");
  5589.  
  5590.     if (blacklistUtils.IsSiteInPhishList(aLocation)) {
  5591.         // Get partners who think it's bad
  5592.         displayNotificationBar("phishing", [aLocation]);
  5593.     } else if (blacklistUtils.IsSiteInSpywareList(aLocation)) {
  5594.         // ShowSpywareSiteWarning();
  5595.         displayNotificationBar("spyware", [aLocation]);
  5596.     }
  5597.  
  5598.     // This code here does not compare uris exactly when determining
  5599.     // whether or not the message should be hidden since the message
  5600.     // may be prematurely hidden when an install is invoked by a click
  5601.     // on a link that looks like this:
  5602.     //
  5603.     // <a href="#" onclick="return install();">Install Foo</a>
  5604.     //
  5605.     // - which fires a onLocationChange message to uri + '#'...
  5606.     var selectedBrowser = getBrowser().selectedBrowser;
  5607.     if (selectedBrowser.lastURI) {
  5608.         var oldSpec = selectedBrowser.lastURI.spec;
  5609.         var oldIndexOfHash = oldSpec.indexOf("#");
  5610.         if (oldIndexOfHash != -1)
  5611.         oldSpec = oldSpec.substr(0, oldIndexOfHash);
  5612.         var newSpec = aLocation.spec;
  5613.         var newIndexOfHash = newSpec.indexOf("#");
  5614.         if (newIndexOfHash != -1)
  5615.         newSpec = newSpec.substr(0, newSpec.indexOf("#"));
  5616.         
  5617.         if (newSpec != oldSpec) {
  5618.             var tabbrowser = getBrowser();
  5619.             tabbrowser.hideMessage(tabbrowser.selectedBrowser, "both");
  5620.             gCurrentNotificationBar = null;
  5621.         } else {
  5622.             // MERC (DP): added this ELSE branch to fix BLT # 129362 - popup message bar doesn't
  5623.             // disappear when you turn off blocking and reload page.
  5624.             var site = sitecontrols.SCSVC.getResourceForURI(gBrowser.currentURI.spec);
  5625.             var blockState = sitecontrols.SCSVC.readSiteControlResource(site, 'allowPopups');
  5626.             if (blockState == 'true' && gCurrentNotificationBar == 'popup') {
  5627.                 var tabbrowser = getBrowser();
  5628.                 tabbrowser.hideMessage(tabbrowser.selectedBrowser, "top");
  5629.                 gCurrentNotificationBar = null;
  5630.             }
  5631.         }
  5632.     }
  5633.     selectedBrowser.lastURI = aLocation;
  5634.  
  5635.     this.setOverLink("", null);
  5636.  
  5637.     // MERC - JCH : update popup block button
  5638.     SetPopupBlockToggle();
  5639.  
  5640.     // We should probably not do this if the value has changed since the user
  5641.     // searched
  5642.     // Update urlbar only if a new page was loaded on the primary content area
  5643.     // Do not update urlbar if there was a subframe navigation
  5644.  
  5645.     var browser = getBrowser().selectedBrowser;
  5646.     var findField = document.getElementById("find-field");
  5647.  
  5648.     // MERC: set up for Trident
  5649.     var hpDoc = getTridentDocument();
  5650.  
  5651.     if (aWebProgress.DOMWindow == content) {
  5652.         // The document loaded correctly, clear the value if we should
  5653.         if (browser.userTypedClear)
  5654.         {
  5655.             // dump("Going to clear user's typed values\n");
  5656.             browser.userTypedValue = null;
  5657.         }
  5658.         
  5659.         if (findField)
  5660.             setTimeout(function() { findField.value = browser.findString; }, 0, findField, browser);
  5661.  
  5662.         //XXXBlake don't we have to reinit this.urlBar, etc.
  5663.         //         when the toolbar changes?
  5664.  
  5665.         if (hpDoc) {
  5666.             //clean it here as we are not using startDocumentLoad
  5667.             // JMC - trying to fix clobbering of urlbar
  5668.             // If the typedValue is the same as where we are, clear it
  5669.             // dump ("/nJMC Trying to clear userTypedValue when appropriate");
  5670.             // dump ("Location is : " + location + ", userTypedValue : " + browser.userTypedValue);
  5671.             
  5672.             if (browser.userTypedClear || browser.userTypedValue == location)
  5673.             {
  5674.                 // dump("Going to clear user's typed values because we're hpDoc?\n");
  5675.                 browser.userTypedValue = null;
  5676.             }
  5677.             if (findField)
  5678.                 closeFindBar();
  5679.         }
  5680.         if (gURLBar) {
  5681.             var userTypedValue = browser.userTypedValue;
  5682.             if (!userTypedValue) {
  5683.                 // If the url has "wyciwyg://" as the protocol, strip it off.
  5684.                 // Nobody wants to see it on the urlbar for dynamically generated
  5685.                 // pages.
  5686.                 if (!gURIFixup) {
  5687.                     gURIFixup = Components.classes["@mozilla.org/docshell/urifixup;1"]
  5688.                                           .getService(Components.interfaces.nsIURIFixup);
  5689.                 }
  5690.                 if (location && gURIFixup) {
  5691.                     try {
  5692.                         var locationURI = gURIFixup.createExposableURI(aLocation);
  5693.                         location = locationURI.spec;
  5694.                     } catch (exception) {}
  5695.                 }
  5696.  
  5697.                 if (getBrowser().forceSyncURLBarUpdate) {
  5698.                     gURLBar.value = ""; // hack for bug 249322
  5699.                     gURLBar.value = location;
  5700.                     SetPageProxyState("valid", aLocation);
  5701.                 } else {
  5702.                     setTimeout(function(loc, aloc) {
  5703.                         gURLBar.value = ""; // hack for bug 249322
  5704.                         gURLBar.value = loc;
  5705.                         SetPageProxyState("valid", aloc);
  5706.                     }, 0, location, aLocation);
  5707.                 }
  5708.  
  5709.                 // Setting the urlBar value in some cases causes userTypedValue to
  5710.                 // become set because of oninput, so reset it to its old value.
  5711.                 browser.userTypedValue = userTypedValue;
  5712.             } else {
  5713.                 // JMC - introduced bug with urlBarValue
  5714.                 dump ("userTYpedValue is non-null, setting invalid proxy state\n");
  5715.                 gURLBar.value = userTypedValue;
  5716.                 SetPageProxyState("invalid", null);
  5717.             }
  5718.         }
  5719.     }
  5720.     //MERC - Durga : display default passcard on toolbar in text mode
  5721.     // TODO (DP): this should be in the onClick handler of tabbrowser as well
  5722.     SetPasscard();
  5723.  
  5724.     UpdateBackForwardButtons();
  5725.  
  5726.     if (findField && gFindMode != FIND_NORMAL) {
  5727.         // Close the Find toolbar if we're in old-style TAF mode
  5728.         closeFindBar();
  5729.         gBackProtectBuffer = 0;
  5730.     }
  5731.  
  5732.     //fix bug 253793 - turn off highlight when page changes
  5733.     if (document.getElementById("highlight").checked)
  5734.         document.getElementById("highlight").removeAttribute("checked");
  5735.  
  5736.     // clear missing plugins
  5737.     gMissingPluginInstaller.clearMissingPlugins(getBrowser().selectedTab);
  5738.  
  5739.     setTimeout(function () { updatePageLivemarks(); }, 0);
  5740. },
  5741.  
  5742. onStatusChange : function(aWebProgress, aRequest, aStatus, aMessage)
  5743. {
  5744.     this.status = aMessage;
  5745.     this.updateStatusField();
  5746. },
  5747.  
  5748. onSecurityChange : function(aWebProgress, aRequest, aState)
  5749. {
  5750.     const wpl = Components.interfaces.nsIWebProgressListener;
  5751.     this.securityButton.removeAttribute("label");
  5752.  
  5753.     switch (aState) {
  5754.     case wpl.STATE_IS_SECURE | wpl.STATE_SECURE_HIGH:
  5755.         this.securityButton.setAttribute("level", "high");
  5756.         if (this.urlBar)
  5757.         this.urlBar.setAttribute("level", "high");
  5758.         try {
  5759.             this.securityButton.setAttribute("label",
  5760.             gBrowser.contentWindow.location.host);
  5761.         } catch(exception) {}
  5762.         break;
  5763.     case wpl.STATE_IS_SECURE | wpl.STATE_SECURE_LOW:
  5764.         this.securityButton.setAttribute("level", "low");
  5765.         if (this.urlBar)
  5766.         this.urlBar.setAttribute("level", "low");
  5767.         try {
  5768.             this.securityButton.setAttribute("label",
  5769.             gBrowser.contentWindow.location.host);
  5770.         } catch(exception) {}
  5771.         break;
  5772.     case wpl.STATE_IS_BROKEN:
  5773.         this.securityButton.setAttribute("level", "broken");
  5774.         if (this.urlBar)
  5775.         this.urlBar.setAttribute("level", "broken");
  5776.         break;
  5777.     case wpl.STATE_IS_INSECURE:
  5778.     default:
  5779.         this.securityButton.removeAttribute("level");
  5780.         if (this.urlBar)
  5781.         this.urlBar.removeAttribute("level");
  5782.         break;
  5783.     }
  5784.  
  5785.     var securityUI = gBrowser.securityUI;
  5786.     if (securityUI) {
  5787.         this.securityButton.setAttribute("tooltiptext", securityUI.tooltipText);
  5788.         if (this.urlBar)
  5789.         this.urlBar.setAttribute("infotext", securityUI.tooltipText);
  5790.     }
  5791. else {
  5792.     this.securityButton.setAttribute("tooltiptext", securityUI.tooltipText);
  5793.     if (this.urlBar)
  5794.     this.urlBar.removeAttribute("infotext");
  5795. }
  5796. },
  5797.  
  5798. startDocumentLoad : function(aRequest)
  5799. {
  5800.     dump("StartDocumentLoad\n");
  5801.     dump("removing engine attribute\n");
  5802.     //MERC (rpaul) remove the engine for the tab
  5803.     //gBrowser.mCurrentTab.removeAttribute("engine");
  5804.     
  5805.     
  5806.     // It's okay to clear what the user typed when we start
  5807.     // loading a document. If the user types, this flag gets
  5808.     // set to false, if the document load ends without an
  5809.     // onLocationChange, this flag also gets set to false
  5810.     // (so we keep it while switching tabs after failed load
  5811.     getBrowser().userTypedClear = true;
  5812.  
  5813.     // clear out livemark data
  5814.     gBrowser.mCurrentBrowser.livemarkLinks = null;
  5815.     
  5816.     // hide all message bars on reload
  5817.     gBrowser.hideMessage(gBrowser.mCurrentBrowser, "both");
  5818.     gCurrentNotificationBar = null;
  5819.  
  5820.     const nsIChannel = Components.interfaces.nsIChannel;
  5821.     var urlStr = aRequest.QueryInterface(nsIChannel).URI.spec;
  5822.     var observerService = Components.classes["@mozilla.org/observer-service;1"]
  5823.     .getService(Components.interfaces.nsIObserverService);
  5824.     try {
  5825.         observerService.notifyObservers(_content, "StartDocumentLoad", urlStr);
  5826.     } catch (e) {
  5827.     }
  5828. },
  5829.  
  5830. endDocumentLoad : function(aRequest, aStatus)
  5831. {
  5832.     dump ("endDocumentLoad\n");
  5833.     // The document is done loading, it's okay to clear
  5834.     // the value again.
  5835.     getBrowser().userTypedClear = false;
  5836.  
  5837.     const nsIChannel = Components.interfaces.nsIChannel;
  5838.     var urlStr = aRequest.QueryInterface(nsIChannel).originalURI.spec;
  5839.  
  5840.     var observerService = Components.classes["@mozilla.org/observer-service;1"]
  5841.     .getService(Components.interfaces.nsIObserverService);
  5842.  
  5843.     var notification = Components.isSuccessCode(aStatus) ? "EndDocumentLoad" : "FailDocumentLoad";
  5844.     try {
  5845.         observerService.notifyObservers(_content, notification, urlStr);
  5846.     } catch (e) {
  5847.     }
  5848.     setTimeout(function() { if (document.getElementById("highlight").checked) toggleHighlight(true); }, 0);
  5849.     
  5850.     UpdateStatusbarPartnerIcons();
  5851.     
  5852. }
  5853. }
  5854.  
  5855. function nsBrowserAccess()
  5856. {
  5857. }
  5858.  
  5859. nsBrowserAccess.prototype =
  5860. {
  5861.     QueryInterface : function(aIID)
  5862.     {
  5863.         if (aIID.equals(nsCI.nsIBrowserDOMWindow) ||
  5864.         aIID.equals(nsCI.nsISupports))
  5865.         return this;
  5866.         throw Components.results.NS_NOINTERFACE;
  5867.     },
  5868.  
  5869.     openURI : function(aURI, aOpener, aWhere, aContext)
  5870.     {
  5871.         var newWindow = null;
  5872.         var referrer = null;
  5873.         // Bug #298255
  5874.         var isExternal = (aContext == nsCI.nsIBrowserDOMWindow.OPEN_EXTERNAL);
  5875.  
  5876.         if (isExternal && aURI && aURI.schemeIs("chrome"))
  5877.             return null;
  5878.  
  5879.         var loadflags = isExternal ?
  5880.                 nsCI.nsIWebNavigation.LOAD_FLAGS_FROM_EXTERNAL :
  5881.                 nsCI.nsIWebNavigation.LOAD_FLAGS_NONE;
  5882.  
  5883.         if (aWhere == nsCI.nsIBrowserDOMWindow.OPEN_DEFAULTWINDOW) {
  5884.             switch (aContext) {
  5885.                 case nsCI.nsIBrowserDOMWindow.OPEN_EXTERNAL :
  5886.                 aWhere = gPrefService.getIntPref("browser.link.open_external");
  5887.                 break;
  5888.                 default : // OPEN_NEW or an illegal value
  5889.                 aWhere = gPrefService.getIntPref("browser.link.open_newwindow");
  5890.             }
  5891.         }
  5892.         var url = aURI ? aURI.spec : "about:blank";
  5893.         switch(aWhere) {
  5894.             case nsCI.nsIBrowserDOMWindow.OPEN_NEWWINDOW :
  5895.             newWindow = openDialog(getBrowserURL(), "_blank", "all,dialog=no", url);
  5896.             break;
  5897.             case nsCI.nsIBrowserDOMWindow.OPEN_NEWTAB :
  5898.             var newTab = gBrowser.addTab("about:blank");
  5899.             if (!gPrefService.getBoolPref("browser.tabs.loadDivertedInBackground"))
  5900.             gBrowser.selectedTab = newTab;
  5901.             newWindow = gBrowser.getBrowserForTab(newTab).docShell
  5902.             .QueryInterface(nsCI.nsIInterfaceRequestor)
  5903.             .getInterface(nsCI.nsIDOMWindow);
  5904.             try {
  5905.                 if (aOpener) {
  5906.                     referrer = Components.classes["@mozilla.org/network/standard-url;1"]
  5907.                     .createInstance(nsCI.nsIURI);
  5908.                     referrer.spec = Components.lookupMethod(aOpener,"location")
  5909.                     .call(aOpener);
  5910.                 }
  5911.                 newWindow.QueryInterface(nsCI.nsIInterfaceRequestor)
  5912.                 .getInterface(nsCI.nsIWebNavigation)
  5913.                 .loadURI(url, loadflags, referrer, null, null);
  5914.             } catch(e) {
  5915.             }
  5916.             break;
  5917.             default : // OPEN_CURRENTWINDOW or an illegal value
  5918.             try {
  5919.                 if (aOpener) {
  5920.                     newWindow = Components.lookupMethod(aOpener,"top")
  5921.                     .call(aOpener);
  5922.                     referrer = Components.classes["@mozilla.org/network/standard-url;1"]
  5923.                     .createInstance(nsCI.nsIURI);
  5924.                     referrer.spec = Components.lookupMethod(aOpener,"location")
  5925.                     .call(aOpener);
  5926.                     newWindow.QueryInterface(nsCI.nsIInterfaceRequestor)
  5927.                     .getInterface(nsIWebNavigation)
  5928.                     .loadURI(url, loadflags, referrer, null, null);
  5929.                 } else {
  5930.                     newWindow = gBrowser.selectedBrowser.docShell
  5931.                     .QueryInterface(nsCI.nsIInterfaceRequestor)
  5932.                     .getInterface(nsCI.nsIDOMWindow);
  5933.                     getWebNavigation().loadURI(url, loadflags, null, null, null);
  5934.                 }
  5935.             } catch(e) {
  5936.             }
  5937.         }
  5938.         return newWindow;
  5939.     }
  5940. }
  5941.  
  5942. function onViewToolbarsPopupShowing(aEvent)
  5943. {
  5944.     var popup = aEvent.target;
  5945.     var i;
  5946.  
  5947.     // Empty the menu
  5948.     for (i = popup.childNodes.length-1; i >= 0; --i) {
  5949.         var deadItem = popup.childNodes[i];
  5950.         if (deadItem.hasAttribute("toolbarindex"))
  5951.         popup.removeChild(deadItem);
  5952.     }
  5953.  
  5954.     var firstMenuItem = popup.firstChild;
  5955.     var highestOrdinal = 0;
  5956.     
  5957.     var toolbox = document.getElementById("navigator-toolbox");
  5958.     for (i = 0; i < toolbox.childNodes.length; ++i) {
  5959.         var toolbar = toolbox.childNodes[i];
  5960.         var toolbarName = toolbar.getAttribute("toolbarname");
  5961.         var type = toolbar.getAttribute("type");
  5962.         if (toolbarName && type != "menubar") {
  5963.             var menuItem = document.createElement("menuitem");
  5964.             menuItem.setAttribute("toolbarindex", i);
  5965.             menuItem.setAttribute("type", "checkbox");
  5966.             menuItem.setAttribute("label", toolbarName);
  5967.             menuItem.setAttribute("accesskey", toolbar.getAttribute("accesskey"));
  5968.             menuItem.setAttribute("checked", toolbar.getAttribute("collapsed") != "true");
  5969.             // JMC- Hack to order the items to match the toolbar orders
  5970.             var toolbarordinal = toolbar.getAttribute("ordinal");
  5971.             menuItem.setAttribute('ordinal',toolbarordinal);
  5972.             if (toolbarordinal > highestOrdinal)
  5973.                 highestOrdinal = toolbarordinal;
  5974.             popup.insertBefore(menuItem, firstMenuItem);
  5975.  
  5976.             menuItem.addEventListener("command", onViewToolbarCommand, false);
  5977.         }
  5978.         // JMC: Iterate through all multibartrays, too
  5979.         // toolbar = toolbar.nextSibling;
  5980.         if (toolbar.localName == 'multibar')
  5981.         toolbar = toolbar.firstChild;
  5982.     else if (toolbar.localName == 'multibartray' && (!toolbar.nextSibling)) {
  5983.         toolbar = toolbar.parentNode.nextSibling;
  5984.     } else {
  5985.         toolbar = toolbar.nextSibling;
  5986.     }
  5987. }
  5988. firstMenuItem.setAttribute('ordinal',highestOrdinal + 1);
  5989. firstMenuItem.nextSibling.setAttribute('ordinal',highestOrdinal + 2);
  5990. if (firstMenuItem.nextSibling.nextSibling)
  5991.     firstMenuItem.nextSibling.nextSibling.setAttribute('ordinal',highestOrdinal + 3);
  5992. // JMC :  HACK HACK HACK
  5993. }
  5994.  
  5995. function onViewToolbarCommand(aEvent)
  5996. {
  5997.     var toolbox = document.getElementById("navigator-toolbox");
  5998.     var index = aEvent.originalTarget.getAttribute("toolbarindex");
  5999.     var toolbar = toolbox.childNodes[index];
  6000.  
  6001.     toolbar.collapsed = aEvent.originalTarget.getAttribute("checked") != "true";
  6002.     document.persist(toolbar.id, "collapsed");
  6003.     toolbox.reorderToolbars();
  6004. }
  6005.  
  6006. function displaySecurityInfo()
  6007. {
  6008.     // MERC - JCH: Temporary fix to show a Properties dialog
  6009.     // when lock icon is clicked and Trident is the engine. This code triggers
  6010.     // a Trident Properties dialog when Trident is the engine. It would be better
  6011.     // to show Gecko pageInfo dialog that has appropriate info.
  6012.  
  6013.     var docshell = getWebNavigation();
  6014.  
  6015.     if (docshell.browserEngine=="Trident")
  6016.     {
  6017.         var hpDoc = getTridentDocument();
  6018.         if(hpDoc)
  6019.         {
  6020.             hpDoc.showPageInfo();
  6021.         }
  6022.     } else {
  6023.         window.openDialog("chrome://browser/content/pageInfo.xul", "_blank",
  6024.         "dialog=no", null, "securityTab");
  6025.     }
  6026. }
  6027.  
  6028.  
  6029. function displayPageReportFirstTime()
  6030. {
  6031.     window.openDialog("chrome://browser/content/pageReportFirstTime.xul", "_blank",
  6032.     "dependent");
  6033. }
  6034.  
  6035. function displayPageReport()
  6036. {
  6037.     window.openDialog("chrome://browser/content/pageReport.xul", "_blank",
  6038.     "dialog,modal,resizable");
  6039. }
  6040. function nsBrowserContentListener(toplevelWindow, contentWindow)
  6041. {
  6042.     // this one is not as easy as you would hope.
  6043.     // need to convert toplevelWindow to an XPConnected object, instead
  6044.     // of a DOM-based object, to be able to QI() it to nsIXULWindow
  6045.  
  6046.     this.init(toplevelWindow, contentWindow);
  6047. }
  6048.  
  6049. /* implements nsIURIContentListener */
  6050.  
  6051. nsBrowserContentListener.prototype =
  6052. {
  6053.     init: function(toplevelWindow, contentWindow)
  6054.     {
  6055.         const nsIWebBrowserChrome = Components.interfaces.nsIWebBrowserChrome;
  6056.         this.toplevelWindow = toplevelWindow;
  6057.         this.contentWindow = contentWindow;
  6058.  
  6059.         // hook up the whole parent chain thing
  6060.         var windowDocShell = this.convertWindowToDocShell(toplevelWindow);
  6061.         if (windowDocShell)
  6062.         windowDocshell.parentURIContentListener = this;
  6063.  
  6064.         var registerWindow = false;
  6065.         try {
  6066.             var treeItem = contentWindow.docShell.QueryInterface(Components.interfaces.nsIDocShellTreeItem);
  6067.             var treeOwner = treeItem.treeOwner;
  6068.             var interfaceRequestor = treeOwner.QueryInterface(Components.interfaces.nsIInterfaceRequestor);
  6069.             var webBrowserChrome = interfaceRequestor.getInterface(nsIWebBrowserChrome);
  6070.             if (webBrowserChrome)
  6071.             {
  6072.                 var chromeFlags = webBrowserChrome.chromeFlags;
  6073.                 var res = chromeFlags & nsIWebBrowserChrome.CHROME_ALL;
  6074.                 var res2 = chromeFlags & nsIWebBrowserChrome.CHROME_DEFAULT;
  6075.                 if ( res == nsIWebBrowserChrome.CHROME_ALL || res2 == nsIWebBrowserChrome.CHROME_DEFAULT)
  6076.                 {
  6077.                     registerWindow = true;
  6078.                 }
  6079.             }
  6080.         } catch (ex) {}
  6081.  
  6082.         // register ourselves
  6083.         if (registerWindow)
  6084.         {
  6085.             var uriLoader = Components.classes["@mozilla.org/uriloader;1"].getService(Components.interfaces.nsIURILoader);
  6086.             uriLoader.registerContentListener(this);
  6087.         }
  6088.     },
  6089.     close: function()
  6090.     {
  6091.         this.contentWindow = null;
  6092.         var uriLoader = Components.classes["@mozilla.org/uriloader;1"].getService(Components.interfaces.nsIURILoader);
  6093.  
  6094.         uriLoader.unRegisterContentListener(this);
  6095.     },
  6096.     QueryInterface: function(iid)
  6097.     {
  6098.         if (iid.equals(Components.interfaces.nsIURIContentListener) ||
  6099.         iid.equals(Components.interfaces.nsISupportsWeakReference) ||
  6100.         iid.equals(Components.interfaces.nsISupports))
  6101.         return this;
  6102.         throw Components.results.NS_NOINTERFACE;
  6103.     },
  6104.     onStartURIOpen: function(uri)
  6105.     {
  6106.         // ignore and don't abort
  6107.         return false;
  6108.     },
  6109.  
  6110.     doContent: function(contentType, isContentPreferred, request, contentHandler)
  6111.     {
  6112.         // forward the doContent to our content area webshell
  6113.         var docShell = this.contentWindow.docShell;
  6114.         var contentListener;
  6115.         try {
  6116.             contentListener =
  6117.             docShell.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  6118.             .getInterface(Components.interfaces.nsIURIContentListener);
  6119.         } catch (ex) {
  6120.             dump(ex);
  6121.         }
  6122.  
  6123.         if (!contentListener) return false;
  6124.  
  6125.         return contentListener.doContent(contentType, isContentPreferred, request, contentHandler);
  6126.  
  6127.     },
  6128.  
  6129.     isPreferred: function(contentType, desiredContentType)
  6130.     {
  6131.         // seems like we should be getting this from helper apps or something
  6132.         switch(contentType) {
  6133.             case "text/html":
  6134.             case "text/xul":
  6135.             case "text/rdf":
  6136.             case "text/xml":
  6137.             case "text/css":
  6138.             case "image/gif":
  6139.             case "image/jpeg":
  6140.             case "image/png":
  6141.             case "text/plain":
  6142.             case "application/http-index-format":
  6143.             return true;
  6144.         }
  6145.         return false;
  6146.     },
  6147.     canHandleContent: function(contentType, isContentPreferred, desiredContentType)
  6148.     {
  6149.         var docShell = this.contentWindow.docShell;
  6150.         var contentListener;
  6151.         try {
  6152.             contentListener =
  6153.             docShell.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIURIContentListener);
  6154.         } catch (ex) {
  6155.             dump(ex);
  6156.         }
  6157.         if (!contentListener) return false;
  6158.  
  6159.         return contentListener.canHandleContent(contentType, isContentPreferred, desiredContentType);
  6160.     },
  6161.     convertWindowToDocShell: function(win) {
  6162.         // don't know how to do this
  6163.         return null;
  6164.     },
  6165.     loadCookie: null,
  6166.     parentContentListener: null
  6167. }
  6168.  
  6169. // |forceOpen| is a bool that indicates that the sidebar should be forced open.  In other words
  6170. // the toggle won't be allowed to close the sidebar.
  6171. function toggleSidebar(aCommandID, forceOpen) {
  6172.  
  6173.     var sidebarBox = document.getElementById("sidebar-box");
  6174.     if (!aCommandID)
  6175.     aCommandID = sidebarBox.getAttribute("sidebarcommand");
  6176.  
  6177.     var elt = document.getElementById(aCommandID);
  6178.     if (!elt) return;
  6179.  
  6180.     var sidebar = document.getElementById("sidebar");
  6181.     var sidebarSplitter = document.getElementById("sidebar-splitter");
  6182.  
  6183.     if (!forceOpen && elt.getAttribute("checked") == "true") {
  6184.         elt.removeAttribute("checked");
  6185.         sidebarBox.setAttribute("sidebarcommand", "");
  6186.         sidebarBox.hidden = true;
  6187.         sidebarSplitter.hidden = true;
  6188.         _content.focus();
  6189.         return;
  6190.     }
  6191.  
  6192.     var elts = document.getElementsByAttribute("group", "sidebar");
  6193.     for (var i = 0; i < elts.length; ++i)
  6194.     elts[i].removeAttribute("checked");
  6195.  
  6196.     elt.setAttribute("checked", "true");;
  6197.  
  6198.     if (sidebarBox.hidden) {
  6199.         sidebarBox.hidden = false;
  6200.         sidebarSplitter.hidden = false;
  6201.     }
  6202.  
  6203.     var url = elt.getAttribute("sidebarurl");
  6204.     var title = elt.getAttribute("sidebartitle");
  6205.     if (!title)
  6206.     title = elt.getAttribute("label");
  6207.     sidebar.setAttribute("src", url);
  6208.     sidebarBox.setAttribute("src", url);
  6209.     sidebarBox.setAttribute("sidebarcommand", elt.id);
  6210.     if (aCommandID != "viewWebPanelsSidebar") { // no searchbox there
  6211.         // if the sidebar we want is already constructed, focus the searchbox
  6212.         if ((aCommandID == "viewBookmarksSidebar" && sidebar.contentDocument.getElementById("bookmarksPanel"))
  6213.         || (aCommandID == "viewHistorySidebar" && sidebar.contentDocument.getElementById("history-panel")))
  6214.         sidebar.contentDocument.getElementById("search-box").focus();
  6215.         // otherwiese, attach an onload handler
  6216.     else
  6217.         sidebar.addEventListener("load", asyncFocusSearchBox, true);
  6218.     }
  6219. }
  6220.  
  6221. function asyncFocusSearchBox(event)
  6222. {
  6223.     var sidebar = document.getElementById("sidebar");
  6224.     var searchBox = sidebar.contentDocument.getElementById("search-box");
  6225.     searchBox.focus();
  6226.     sidebar.removeEventListener("load", asyncFocusSearchBox, true);
  6227. }
  6228.  
  6229. function openPreferences()
  6230. {
  6231.     // dump ("The parent browser window is : " + window);
  6232.     /*JA ff5->vulp gPrefWindow =*/ 
  6233.     openDialog("chrome://browser/content/pref/pref.xul","PrefWindow",
  6234.                "chrome,titlebar,resizable,modal");
  6235. }
  6236.  
  6237. var gHomeButton = {
  6238.     prefDomain: "browser.startup.homepage",
  6239.     observe: function (aSubject, aTopic, aPrefName)
  6240.     {
  6241.         if (aTopic != "nsPref:changed" || aPrefName != this.prefDomain)
  6242.         return;
  6243.  
  6244.         this.updateTooltip();
  6245.     },
  6246.  
  6247.     updateTooltip: function ()
  6248.     {
  6249.         var homeButton = document.getElementById("home-button");
  6250.         if (homeButton) {
  6251.             var homePage = this.getHomePage();
  6252.             homePage = homePage.replace(/\|/g,', ');
  6253.             homeButton.setAttribute("tooltiptext", homePage);
  6254.         }
  6255.     },
  6256.  
  6257.     getHomePage: function ()
  6258.     {
  6259.         var url;
  6260.         try {
  6261.             url = gPrefService.getComplexValue(this.prefDomain,
  6262.             Components.interfaces.nsIPrefLocalizedString).data;
  6263.         } catch (e) {
  6264.         }
  6265.  
  6266.         // use this if we can't find the pref
  6267.         if (!url) {
  6268.             var navigatorRegionBundle = document.getElementById("bundle_browser_region");
  6269.             url = navigatorRegionBundle.getString("homePageDefault");
  6270.         }
  6271.  
  6272.         return url;
  6273.     }
  6274. };
  6275.  
  6276. function nsContextMenu( xulMenu ) {
  6277.     this.target         = null;
  6278.     this.menu           = null;
  6279.     this.onTextInput    = false;
  6280.     this.onKeywordField = false;
  6281.     this.onImage        = false;
  6282.     this.onLink         = false;
  6283.     this.onMailtoLink   = false;
  6284.     this.onSaveableLink = false;
  6285.     this.onMetaDataItem = false;
  6286.     this.onMathML       = false;
  6287.     this.link           = false;
  6288.     this.inFrame        = false;
  6289.     this.hasBGImage     = false;
  6290.     this.isTextSelected = false;
  6291.     this.inDirList      = false;
  6292.     this.shouldDisplay  = true;
  6293.  
  6294.     // Initialize new menu.
  6295.     this.initMenu( xulMenu );
  6296. }
  6297.  
  6298. // Prototype for nsContextMenu "class."
  6299. nsContextMenu.prototype = {
  6300.     // onDestroy is a no-op at this point.
  6301.     onDestroy : function () {
  6302.     },
  6303.     // Initialize context menu.
  6304.     initMenu : function ( popup ) {
  6305.         // Save menu.
  6306.         this.menu = popup;
  6307.  
  6308.         // Get contextual info.
  6309.         this.setTarget( document.popupNode );
  6310.  
  6311.         this.isTextSelected = this.isTextSelection();
  6312.  
  6313.         // Initialize (disable/remove) menu items.
  6314.         this.initItems();
  6315.     },
  6316.     initItems : function () {
  6317.         this.initTridentSwitchItem();  // MERC (DP): disable/enable Trident switch
  6318.         this.initOpenItems();
  6319.         this.initNavigationItems();
  6320.         this.initViewItems();
  6321.         this.initMiscItems();
  6322.         this.initSaveItems();
  6323.         this.initClipboardItems();
  6324.         this.initMetadataItems();
  6325.         this.initPrintItems();
  6326.     },
  6327.     // MERC (DP): this function will disable the Trident switch menu item.
  6328.     // for all 'about:*' we disable, except for 'about:blank' - allow engine switch on blank page
  6329.     initTridentSwitchItem : function () {
  6330.         //dump('*** target: ' + this.target.localName + '\n');
  6331.  
  6332.         var engineMenuItem = document.getElementById('switchToTrident');
  6333.         //dump('*** switch to trident menu item: ' + engineMenuItem.getAttribute('label') + '\n');
  6334.  
  6335.         var url = gBrowser.getBrowserForTab(gBrowser.mCurrentTab).currentURI.spec;
  6336.  
  6337.         var regex = /^about:/;
  6338.         if(regex.test(url) && url != 'about:blank') {
  6339.             engineMenuItem.setAttribute('disabled', 'true');
  6340.         } else {
  6341.             engineMenuItem.removeAttribute('disabled');
  6342.         }
  6343.  
  6344.         this.showItem( "switchToTrident", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
  6345.     },
  6346.     initOpenItems : function () {
  6347.         this.showItem( "context-openlink", this.onSaveableLink || ( this.inDirList && this.onLink ) );
  6348.         this.showItem( "context-openlinkintab", this.onSaveableLink || ( this.inDirList && this.onLink ) );
  6349.  
  6350.         //this.showItem( "context-sep-open", this.onSaveableLink || ( this.inDirList && this.onLink ) );
  6351.         this.showItem( "context-sep-open", false );
  6352.     },
  6353.     initNavigationItems : function () {
  6354.         // Back determined by canGoBack broadcaster.
  6355.         this.setItemAttrFromNode( "context-back", "disabled", "canGoBack" );
  6356.  
  6357.         // Forward determined by canGoForward broadcaster.
  6358.         this.setItemAttrFromNode( "context-forward", "disabled", "canGoForward" );
  6359.  
  6360.         this.showItem( "context-back", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
  6361.         this.showItem( "context-forward", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
  6362.  
  6363.         this.showItem( "context-reload", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
  6364.  
  6365.         this.showItem( "context-stop", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
  6366.         this.showItem( "context-sep-stop", !( this.isTextSelected || this.onTextInput || this.onImage ) );
  6367.  
  6368.         // XXX: Stop is determined in navigator.js; the canStop broadcaster is broken
  6369.         //this.setItemAttrFromNode( "context-stop", "disabled", "canStop" );
  6370.     },
  6371.     initSaveItems : function () {
  6372.         this.showItem( "context-savepage", !( this.inDirList || this.isTextSelected || this.onTextInput || this.onLink || this.onImage ));
  6373.         this.showItem( "context-sendpage", !( this.inDirList || this.isTextSelected || this.onTextInput || this.onLink || this.onImage ));
  6374.  
  6375.         // Save link depends on whether we're in a link.
  6376.         this.showItem( "context-savelink", this.onSaveableLink );
  6377.  
  6378.         // Save image depends on whether there is one.
  6379.         this.showItem( "context-saveimage", this.onImage );
  6380.  
  6381.         this.showItem( "context-sendimage", this.onImage );
  6382.  
  6383.         // Send link depends on whether we're in a link.
  6384.         //this.showItem( "context-sendlink", this.onSaveableLink );
  6385.         this.showItem( "context-sendlink", false );
  6386.     },
  6387.     initViewItems : function () {
  6388.         // View source is always OK, unless in directory listing.
  6389.         this.showItem( "context-viewpartialsource-selection", this.isTextSelected );
  6390.         this.showItem( "context-viewpartialsource-mathml", this.onMathML && !this.isTextSelected );
  6391.         this.showItem( "context-viewsource", !( this.inDirList || this.onImage || this.isTextSelected || this.onLink || this.onTextInput ) );
  6392.         this.showItem( "context-viewinfo", !( this.inDirList || this.onImage || this.isTextSelected || this.onLink || this.onTextInput ) );
  6393.  
  6394.         this.showItem( "context-sep-properties", !( this.inDirList || this.isTextSelected || this.onTextInput ) );
  6395.         // Set As Wallpaper depends on whether an image was clicked on, and only works if we have a shell service.
  6396.         var haveSetWallpaper = false;
  6397.         // Only enable set as wallpaper if we can get the shell service.
  6398.         var shell = getShellService();
  6399.         if (shell)
  6400.         haveSetWallpaper = true;
  6401.         this.showItem( "context-setWallpaper", haveSetWallpaper && this.onImage );
  6402.  
  6403.         if( haveSetWallpaper && this.onImage ) {
  6404.             // Disable the Set As Wallpaper menu item if we're still trying to load the image or the load failed
  6405.             const nsIImageLoadingContent = Components.interfaces.nsIImageLoadingContent;
  6406.             var disableSetWallpaper = false;
  6407.             if (("complete" in this.target) && !this.target.complete)
  6408.                  disableSetWallpaper = true;
  6409.             else if (this.target instanceof nsIImageLoadingContent) {
  6410.                 var request = this.target.QueryInterface(nsIImageLoadingContent)
  6411.                                   .getRequest(nsIImageLoadingContent.CURRENT_REQUEST);
  6412.                 if (!request)
  6413.                     disableSetWallpaper = true;
  6414.             }
  6415.             else if (makeURL(this.target.src).scheme == "javascript")
  6416.                 disableSetWallpaper = true;
  6417.               
  6418.             this.setItemAttr( "context-setWallpaper", "disabled", disableSetWallpaper);
  6419.         }
  6420.  
  6421.         // View Image depends on whether an image was clicked on.
  6422.         this.showItem( "context-viewimage", this.onImage );
  6423.  
  6424.         // View background image depends on whether there is one.
  6425.         this.showItem( "context-viewbgimage", !( this.inDirList || this.onImage || this.isTextSelected || this.onLink || this.onTextInput ) );
  6426.         this.showItem( "context-sep-viewbgimage", !( this.inDirList || this.onImage || this.isTextSelected || this.onLink || this.onTextInput ) );
  6427.         this.setItemAttr( "context-viewbgimage", "disabled", this.hasBGImage ? null : "true");
  6428.     },
  6429.     initMiscItems : function () {
  6430.         // Use "Bookmark This Link" if on a link.
  6431.         this.showItem( "context-bookmarkpage", !( this.isTextSelected || this.onTextInput || this.onLink || this.onImage ) );
  6432.         //this.showItem( "context-bookmarklink", this.onLink && !this.onMailtoLink );
  6433.         this.showItem( "context-bookmarklink", false );
  6434.         this.showItem( "context-addBookmarkAsTabGrp", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
  6435.         //this.showItem( "context-addBookmarkAsTabGrp", false);
  6436.         this.showItem( "context-searchselect", this.isTextSelected );
  6437.         //this.showItem( "context-keywordfield", this.onTextInput && this.onKeywordField );
  6438.         this.showItem( "context-keywordfield", false );
  6439.         this.showItem( "frame", this.inFrame );
  6440.         this.showItem( "frame-sep", this.inFrame );
  6441.         /* MERC: ccampbell: commented this out because it needs to be updated to use Site Controls instead
  6442.         this.showItem( "context-blockimage", this.onImage);
  6443.  
  6444.         // BiDi UI
  6445.         var showBIDI = isBidiEnabled();
  6446.         this.showItem( "context-sep-bidi", showBIDI);
  6447.         this.showItem( "context-bidi-text-direction-toggle", this.onTextInput && showBIDI);
  6448.         this.showItem( "context-bidi-page-direction-toggle", !this.onTextInput && showBIDI);
  6449.  
  6450.         if (this.onImage) {
  6451.         var blockImage = document.getElementById("context-blockimage");
  6452.  
  6453.         var uri = Components.classes['@mozilla.org/network/standard-url;1'].createInstance(Components.interfaces.nsIURI);
  6454.         uri.spec = this.imageURL;
  6455.  
  6456.         var shortenedUriHost = uri.host.replace(/^www\./i,"");
  6457.         if (shortenedUriHost.length > 15)
  6458.         shortenedUriHost = shortenedUriHost.substr(0,15) + "...";
  6459.         blockImage.label = gNavigatorBundle.getFormattedString ("blockImages", [shortenedUriHost]);
  6460.  
  6461.         if (this.isImageBlocked()) {
  6462.         blockImage.setAttribute("checked", "true");
  6463.         }
  6464.         else
  6465.         blockImage.removeAttribute("checked");
  6466.         }
  6467.         */
  6468.     },
  6469.     initClipboardItems : function () {
  6470.  
  6471.         // Copy depends on whether there is selected text.
  6472.         // Enabling this context menu item is now done through the global
  6473.         // command updating system
  6474.         // this.setItemAttr( "context-copy", "disabled", !this.isTextSelected() );
  6475.  
  6476.         goUpdateGlobalEditMenuItems();
  6477.  
  6478.         this.showItem( "context-undo", this.onTextInput );
  6479.         this.showItem( "context-sep-undo", this.onTextInput );
  6480.         this.showItem( "context-cut", this.onTextInput );
  6481.         this.showItem( "context-copy", this.isTextSelected || this.onTextInput );
  6482.         this.showItem( "context-paste", this.onTextInput );
  6483.         this.showItem( "context-delete", this.onTextInput );
  6484.         this.showItem( "context-sep-paste", this.onTextInput );
  6485.         this.showItem( "context-selectall", !( this.onLink || this.onImage ) );
  6486.         //this.showItem( "context-sep-selectall", this.isTextSelected );
  6487.         //this.showItem( "context-sep-selectall", true );
  6488.         this.showItem( "context-sep-selectall", !( this.isTextSelected || this.onLink || this.onImage || this.onTextInput ) );
  6489.  
  6490.         // XXX dr
  6491.         // ------
  6492.         // nsDocumentViewer.cpp has code to determine whether we're
  6493.         // on a link or an image. we really ought to be using that...
  6494.  
  6495.         // Copy email link depends on whether we're on an email link.
  6496.         this.showItem( "context-copyemail", this.onMailtoLink );
  6497.  
  6498.         // Copy link location depends on whether we're on a link.
  6499.         this.showItem( "context-copylink", this.onLink );
  6500.         //this.showItem( "context-copylink", false );
  6501.         this.showItem( "context-sep-copylink", this.onLink && this.onImage);
  6502.         //this.showItem( "context-sep-copylink", false );
  6503.  
  6504.         // Copy image contents depends on whether we're on an image.
  6505.         //this.showItem( "context-copyimage-contents", this.onImage );
  6506.         this.showItem( "context-copyimage-contents", false );
  6507.         // Copy image location depends on whether we're on an image.
  6508.         //this.showItem( "context-copyimage", this.onImage );
  6509.         this.showItem( "context-copyimage", false );
  6510.         this.showItem( "context-sep-copyimage", this.onImage && this.onLink );
  6511.         this.showItem( "context-sep-copyimage", false );
  6512.     },
  6513.     initMetadataItems : function () {
  6514.         // Show if user clicked on something which has metadata.
  6515.         this.showItem( "context-metadata", this.onMetaDataItem );
  6516.     },
  6517.     // MERC (DP): control the print menu items
  6518.     initPrintItems : function () {
  6519.         this.showItem( "context-sep-print", !( this.inDirList || this.onImage || this.isTextSelected || this.onLink || this.onTextInput ) );
  6520.         this.showItem( "context-print", !( this.inDirList || this.onImage || this.isTextSelected || this.onLink || this.onTextInput ) );
  6521.     },
  6522.     // Set various context menu attributes based on the state of the world.
  6523.     setTarget : function ( node ) {
  6524.         const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  6525.         if ( node.namespaceURI == xulNS ) {
  6526.             this.shouldDisplay = false;
  6527.             return;
  6528.         }
  6529.         // Initialize contextual info.
  6530.         this.onImage    = false;
  6531.         this.onMetaDataItem = false;
  6532.         this.onTextInput = false;
  6533.         this.onKeywordField = false;
  6534.         this.imageURL   = "";
  6535.         this.onLink     = false;
  6536.         this.onMathML   = false;
  6537.         this.inFrame    = false;
  6538.         this.hasBGImage = false;
  6539.         this.bgImageURL = "";
  6540.  
  6541.         // Remember the node that was clicked.
  6542.         this.target = node;
  6543.  
  6544.         // See if the user clicked on an image.
  6545.         if ( this.target.nodeType == Node.ELEMENT_NODE ) {
  6546.              if ( this.target instanceof HTMLImageElement ) {
  6547.                 this.onImage = true;
  6548.                 this.imageURL = this.target.src;
  6549.                 // Look for image map.
  6550.                 var mapName = this.target.getAttribute( "usemap" );
  6551.                 if ( mapName ) {
  6552.                     // Find map.
  6553.                     var map = this.target.ownerDocument.getElementById( mapName.substr(1) );
  6554.                     if ( map ) {
  6555.                         // Search child <area>s for a match.
  6556.                         var areas = map.childNodes;
  6557.                         //XXX Client side image maps are too hard for now!
  6558.                         areas.length = 0;
  6559.                         for ( var i = 0; i < areas.length && !this.onLink; i++ ) {
  6560.                             var area = areas[i];
  6561.                             if ( area instanceof HTMLAreaElement ) {
  6562.                                 // Get type (rect/circle/polygon/default).
  6563.                                 var type = area.getAttribute( "type" );
  6564.                                 var coords = this.parseCoords( area );
  6565.                                 switch ( type.toUpperCase() ) {
  6566.                                     case "RECT":
  6567.                                     case "RECTANGLE":
  6568.                                         break;
  6569.                                     case "CIRC":
  6570.                                     case "CIRCLE":
  6571.                                         break;
  6572.                                     case "POLY":
  6573.                                     case "POLYGON":
  6574.                                         break;
  6575.                                     case "DEFAULT":
  6576.                                         // Default matches entire image.
  6577.                                         this.onLink = true;
  6578.                                         this.link = area;
  6579.                                         this.onSaveableLink = this.isLinkSaveable( this.link );
  6580.                                         break;
  6581.                                 }
  6582.                             }
  6583.                         }
  6584.                     }
  6585.                 }
  6586.              } else if ( this.target instanceof HTMLObjectElement
  6587.             &&
  6588.             // See if object tag is for an image.
  6589.             this.objectIsImage( this.target ) ) {
  6590.                 // This is an image.
  6591.                 this.onImage = true;
  6592.                 // URL must be constructed.
  6593.                 this.imageURL = this.objectImageURL( this.target );
  6594.              } else if ( this.target instanceof HTMLInputElement) {
  6595.                 type = this.target.getAttribute("type");
  6596.                 if(type && type.toUpperCase() == "IMAGE") {
  6597.                     this.onImage = true;
  6598.                     // Convert src attribute to absolute URL.
  6599.                     this.imageURL = makeURLAbsolute( this.target.baseURI,
  6600.                     this.target.src );
  6601.                 } else /* if (this.target.getAttribute( "type" ).toUpperCase() == "TEXT") */ {
  6602.                     this.onTextInput = this.isTargetATextBox(this.target);
  6603.                     this.onKeywordField = this.isTargetAKeywordField(this.target);
  6604.                 }
  6605.             } else if ( this.target instanceof HTMLTextAreaElement ) {
  6606.                  this.onTextInput = true;
  6607.             } else if ( this.target instanceof HTMLHtmlElement ) {
  6608.                 // pages with multiple <body>s are lame. we'll teach them a lesson.
  6609.                 var bodyElt = this.target.ownerDocument.getElementsByTagName("body")[0];
  6610.                 if ( bodyElt ) {
  6611.                     var computedURL = this.getComputedURL( bodyElt, "background-image" );
  6612.                     if ( computedURL ) {
  6613.                         this.hasBGImage = true;
  6614.                         this.bgImageURL = makeURLAbsolute( bodyElt.baseURI,
  6615.                         computedURL );
  6616.                     }
  6617.                 }
  6618.             } else if ( "HTTPIndex" in _content &&
  6619.             _content.HTTPIndex instanceof Components.interfaces.nsIHTTPIndex ) {
  6620.                 this.inDirList = true;
  6621.                 // Bubble outward till we get to an element with URL attribute
  6622.                 // (which should be the href).
  6623.                 var root = this.target;
  6624.                 while ( root && !this.link ) {
  6625.                     if ( root.tagName == "tree" ) {
  6626.                         // Hit root of tree; must have clicked in empty space;
  6627.                         // thus, no link.
  6628.                         break;
  6629.                     }
  6630.                     if ( root.getAttribute( "URL" ) ) {
  6631.                         // Build pseudo link object so link-related functions work.
  6632.                         this.onLink = true;
  6633.                         this.link = { href : root.getAttribute("URL"),
  6634.                         getAttribute: function (attr) {
  6635.                             if (attr == "title") {
  6636.                                 return root.firstChild.firstChild.getAttribute("label");
  6637.                             } else {
  6638.                                 return "";
  6639.                             }
  6640.                         }
  6641.                     };
  6642.                     // If element is a directory, then you can't save it.
  6643.                     if ( root.getAttribute( "container" ) == "true" ) {
  6644.                         this.onSaveableLink = false;
  6645.                     } else {
  6646.                         this.onSaveableLink = true;
  6647.                     }
  6648.                 } else {
  6649.                     root = root.parentNode;
  6650.                 }
  6651.             }
  6652.         }
  6653.     }
  6654.  
  6655.     // We have meta data on images.
  6656.     this.onMetaDataItem = this.onImage;
  6657.  
  6658.     // See if the user clicked on MathML
  6659.     const NS_MathML = "http://www.w3.org/1998/Math/MathML";
  6660.     if ((this.target.nodeType == Node.TEXT_NODE &&
  6661.     this.target.parentNode.namespaceURI == NS_MathML)
  6662.     || (this.target.namespaceURI == NS_MathML))
  6663.     this.onMathML = true;
  6664.  
  6665.     // See if the user clicked in a frame.
  6666.     if ( this.target.ownerDocument != window._content.document ) {
  6667.         this.inFrame = true;
  6668.     }
  6669.  
  6670.     // Bubble out, looking for items of interest
  6671.     var elem = this.target;
  6672.     while ( elem ) {
  6673.         if ( elem.nodeType == Node.ELEMENT_NODE ) {
  6674.             // Link?
  6675.             if ( !this.onLink &&
  6676.                     ( (elem instanceof HTMLAnchorElement && elem.href) ||
  6677.                       elem instanceof HTMLAreaElement ||
  6678.                       elem instanceof HTMLLinkElement ||
  6679.             elem.getAttributeNS( "http://www.w3.org/1999/xlink", "type") == "simple" ) ) {
  6680.                 // Clicked on a link.
  6681.                 this.onLink = true;
  6682.                 this.onMetaDataItem = true;
  6683.                 // Remember corresponding element.
  6684.                 this.link = elem;
  6685.                 this.onMailtoLink = this.isLinkType( "mailto:", this.link );
  6686.                 // Remember if it is saveable.
  6687.                 this.onSaveableLink = this.isLinkSaveable( this.link );
  6688.             }
  6689.  
  6690.             // Text input?
  6691.             if ( !this.onTextInput ) {
  6692.                 // Clicked on a link.
  6693.                 this.onTextInput = this.isTargetATextBox(elem);
  6694.             }
  6695.  
  6696.             // Metadata item?
  6697.             if ( !this.onMetaDataItem ) {
  6698.                 // We currently display metadata on anything which fits
  6699.                 // the below test.
  6700.                     if ( ( elem instanceof HTMLQuoteElement && elem.cite)    ||
  6701.                          ( elem instanceof HTMLTableElement && elem.summary) ||
  6702.                          ( elem instanceof HTMLModElement &&
  6703.                              ( elem.cite || elem.dateTime ) )                ||
  6704.                          ( elem instanceof HTMLElement &&
  6705.                              ( elem.title || elem.lang ) ) ) {
  6706.                         this.onMetaDataItem = true;
  6707.                 }
  6708.             }
  6709.  
  6710.             // Background image?  Don't bother if we've already found a
  6711.             // background image further down the hierarchy.  Otherwise,
  6712.             // we look for the computed background-image style.
  6713.             if ( !this.hasBGImage ) {
  6714.                 var bgImgUrl = this.getComputedURL( elem, "background-image" );
  6715.                 if ( bgImgUrl ) {
  6716.                     this.hasBGImage = true;
  6717.                     this.bgImageURL = makeURLAbsolute( elem.baseURI,
  6718.                     bgImgUrl );
  6719.                 }
  6720.             }
  6721.         }
  6722.         elem = elem.parentNode;
  6723.     }
  6724. },
  6725. // Returns the computed style attribute for the given element.
  6726. getComputedStyle: function( elem, prop ) {
  6727.     return elem.ownerDocument.defaultView.getComputedStyle( elem, '' ).getPropertyValue( prop );
  6728. },
  6729. // Returns a "url"-type computed style attribute value, with the url() stripped.
  6730. getComputedURL: function( elem, prop ) {
  6731.     var url = elem.ownerDocument.defaultView.getComputedStyle( elem, '' ).getPropertyCSSValue( prop );
  6732.     return ( url.primitiveType == CSSPrimitiveValue.CSS_URI ) ? url.getStringValue() : null;
  6733. },
  6734. // Returns true iff clicked on link is saveable.
  6735. isLinkSaveable : function ( link ) {
  6736.     // We don't do the Right Thing for news/snews yet, so turn them off
  6737.     // until we do.
  6738.     return !(this.isLinkType( "mailto:" , link )     ||
  6739.     this.isLinkType( "javascript:" , link ) ||
  6740.     this.isLinkType( "news:", link )        ||
  6741.     this.isLinkType( "snews:", link ) );
  6742. },
  6743. // Returns true iff clicked on link is of type given.
  6744. isLinkType : function ( linktype, link ) {
  6745.     try {
  6746.         // Test for missing protocol property.
  6747.         if ( !link.protocol ) {
  6748.             // We must resort to testing the URL string :-(.
  6749.             var protocol;
  6750.             var wrapper = new XPCNativeWrapper(link, "href",
  6751.             "getAttributeNS()");
  6752.             if (wrapper.href) {
  6753.                 protocol = wrapper.href.substr(0, linktype.length);
  6754.             } else {
  6755.                 protocol = wrapper.getAttributeNS("http://www.w3.org/1999/xlink","href");
  6756.                 if (protocol) {
  6757.                     protocol = protocol.substr(0, linktype.length);
  6758.                 }
  6759.             }
  6760.             return protocol.toLowerCase() === linktype;
  6761.         } else {
  6762.             // Presume all but javascript: urls are saveable.
  6763.             return link.protocol.toLowerCase() === linktype;
  6764.         }
  6765.     } catch (e) {
  6766.         // something was wrong with the link,
  6767.         // so we won't be able to save it anyway
  6768.         return false;
  6769.     }
  6770. },
  6771. // Open linked-to URL in a new window.
  6772. openLink : function () {
  6773.     // Determine linked-to URL.
  6774.     openNewWindowWith(this.linkURL(), this.link, true);
  6775. },
  6776. // Open linked-to URL in a new tab.
  6777. openLinkInTab : function () {
  6778.     // Determine linked-to URL.
  6779.     openNewTabWith(this.linkURL(), this.link, null, true);
  6780. },
  6781. // Open frame in a new tab.
  6782. openFrameInTab : function () {
  6783.     // Determine linked-to URL.
  6784.     openNewTabWith(this.target.ownerDocument.location.href, null, null, true);
  6785. },
  6786. // Reload clicked-in frame.
  6787. reloadFrame : function () {
  6788.     this.target.ownerDocument.location.reload();
  6789. },
  6790. // Open clicked-in frame in its own window.
  6791. openFrame : function () {
  6792.     openNewWindowWith(this.target.ownerDocument.location.href, null, true);
  6793. },
  6794. // Open clicked-in frame in the same window
  6795. showOnlyThisFrame : function () {
  6796.     window.loadURI(this.target.ownerDocument.location.href, null, null);
  6797. },
  6798. // View Partial Source
  6799. viewPartialSource : function ( context ) {
  6800.     var focusedWindow = document.commandDispatcher.focusedWindow;
  6801.     if (focusedWindow == window)
  6802.     focusedWindow = _content;
  6803.     var docCharset = null;
  6804.     if (focusedWindow)
  6805.     docCharset = "charset=" + focusedWindow.document.characterSet;
  6806.  
  6807.         // "View Selection Source" and others such as "View MathML Source"
  6808.         // are mutually exclusive, with the precedence given to the selection
  6809.         // when there is one
  6810.         var reference = null;
  6811.         if (context == "selection")
  6812.           reference = focusedWindow.getSelection();
  6813.         else if (context == "mathml")
  6814.           reference = this.target;
  6815.         else
  6816.           throw "not reached";
  6817.  
  6818.     var docUrl = null; // unused (and play nice for fragments generated via XSLT too)
  6819.     window.openDialog("chrome://global/content/viewPartialSource.xul",
  6820.     "_blank", "scrollbars,resizable,chrome,dialog=no",
  6821.     docUrl, docCharset, reference, context);
  6822. },
  6823. // Open new "view source" window with the frame's URL.
  6824. viewFrameSource : function () {
  6825.     BrowserViewSourceOfDocument(this.target.ownerDocument);
  6826. },
  6827. viewInfo : function () {
  6828.     BrowserPageInfo();
  6829. },
  6830. viewFrameInfo : function () {
  6831.     BrowserPageInfo(this.target.ownerDocument);
  6832. },
  6833. // Change current window to the URL of the image.
  6834. viewImage : function (e) {
  6835.         urlSecurityCheck( this.imageURL, document )
  6836.     openUILink( this.imageURL, e );
  6837. },
  6838. // Change current window to the URL of the background image.
  6839. viewBGImage : function (e) {
  6840.         urlSecurityCheck( this.bgImageURL, document )
  6841.     openUILink( this.bgImageURL, e );
  6842. },
  6843. setWallpaper: function() {
  6844.     // Confirm since it's annoying if you hit this accidentally.
  6845.     openDialog("chrome://browser/content/setWallpaper.xul", "",
  6846.     "centerscreen,chrome,dialog,modal,dependent",
  6847.     this.target);
  6848. },
  6849. // Save URL of clicked-on frame.
  6850. saveFrame : function () {
  6851.     saveDocument( this.target.ownerDocument );
  6852. },
  6853. // Save URL of clicked-on link.
  6854. saveLink : function () {
  6855.     saveURL( this.linkURL(), this.linkText(), null, true, false );
  6856. },
  6857. sendLink : function () {
  6858.     MailIntegration.sendMessage( this.linkURL(), "" ); // we don't know the title of the link so pass in an empty string
  6859. },
  6860. // Save URL of clicked-on image.
  6861. saveImage : function () {
  6862.     saveURL( this.imageURL, null, "SaveImageTitle", false );
  6863. },
  6864. sendImage : function () {
  6865.     MailIntegration.sendMessage(this.imageURL, "");
  6866. },
  6867. toggleImageBlocking : function (aBlock) {
  6868.     var nsIPermissionManager = Components.interfaces.nsIPermissionManager;
  6869.     var permissionmanager =
  6870.     Components.classes["@mozilla.org/permissionmanager;1"]
  6871.     .getService(nsIPermissionManager);
  6872.     var uri = Components.classes["@mozilla.org/network/standard-url;1"]
  6873.     .createInstance(Components.interfaces.nsIURI);
  6874.     uri.spec = this.imageURL;
  6875.     permissionmanager.add(uri, "image",
  6876.     aBlock ? nsIPermissionManager.DENY_ACTION : nsIPermissionManager.ALLOW_ACTION);
  6877. },
  6878. isImageBlocked : function() {
  6879.     var nsIPermissionManager = Components.interfaces.nsIPermissionManager;
  6880.     var permissionmanager =
  6881.     Components.classes["@mozilla.org/permissionmanager;1"]
  6882.     .getService(Components.interfaces.nsIPermissionManager);
  6883.     var uri = Components.classes["@mozilla.org/network/standard-url;1"]
  6884.     .createInstance(Components.interfaces.nsIURI);
  6885.     uri.spec = this.imageURL;
  6886.     return permissionmanager.testPermission(uri, "image") == nsIPermissionManager.DENY_ACTION;
  6887. },
  6888. // Generate email address and put it on clipboard.
  6889. copyEmail : function () {
  6890.     // Copy the comma-separated list of email addresses only.
  6891.     // There are other ways of embedding email addresses in a mailto:
  6892.     // link, but such complex parsing is beyond us.
  6893.     var url = this.linkURL();
  6894.     var qmark = url.indexOf( "?" );
  6895.     var addresses;
  6896.  
  6897.     if ( qmark > 7 ) {                   // 7 == length of "mailto:"
  6898.         addresses = url.substring( 7, qmark );
  6899.     } else {
  6900.         addresses = url.substr( 7 );
  6901.     }
  6902.  
  6903.     // Let's try to unescape it using a character set
  6904.     // in case the address is not ASCII.
  6905.     try {
  6906.         var characterSet = Components.lookupMethod(this.target.ownerDocument, "characterSet")
  6907.         .call(this.target.ownerDocument);
  6908.         const textToSubURI = Components.classes["@mozilla.org/intl/texttosuburi;1"]
  6909.         .getService(Components.interfaces.nsITextToSubURI);
  6910.         addresses = textToSubURI.unEscapeNonAsciiURI(characterSet, addresses);
  6911.     }
  6912.     catch(ex) {
  6913.         // Do nothing.
  6914.     }
  6915.  
  6916.     var clipboard = this.getService( "@mozilla.org/widget/clipboardhelper;1",
  6917.     Components.interfaces.nsIClipboardHelper );
  6918.     clipboard.copyString(addresses);
  6919. },
  6920. addBookmark : function() {
  6921.     var docshell = document.getElementById( "content" ).webNavigation;
  6922.     BookmarksUtils.addBookmark( docshell.currentURI.spec,
  6923.     docshell.document.title,
  6924.     docshell.document.charset);
  6925. },
  6926. addBookmarkForFrame : function() {
  6927.     var doc = this.target.ownerDocument;
  6928.     var uri = doc.location.href;
  6929.     var title = doc.title;
  6930.     if ( !title )
  6931.     title = uri;
  6932.     BookmarksUtils.addBookmark(uri, title, doc.charset);
  6933. },
  6934. // Open Metadata window for node
  6935. showMetadata : function () {
  6936.     window.openDialog(  "chrome://browser/content/metaData.xul",
  6937.     "_blank",
  6938.     "scrollbars,resizable,chrome,dialog=no",
  6939.     this.target);
  6940. },
  6941.  
  6942. ///////////////
  6943. // Utilities //
  6944. ///////////////
  6945.  
  6946. // Create instance of component given contractId and iid (as string).
  6947. createInstance : function ( contractId, iidName ) {
  6948.     var iid = Components.interfaces[ iidName ];
  6949.     return Components.classes[ contractId ].createInstance( iid );
  6950. },
  6951. // Get service given contractId and iid (as string).
  6952. getService : function ( contractId, iidName ) {
  6953.     var iid = Components.interfaces[ iidName ];
  6954.     return Components.classes[ contractId ].getService( iid );
  6955. },
  6956. // Show/hide one item (specified via name or the item element itself).
  6957. showItem : function ( itemOrId, show ) {
  6958.     var item = itemOrId.constructor == String ? document.getElementById(itemOrId) : itemOrId;
  6959.     if (item)
  6960.     item.hidden = !show;
  6961. },
  6962. // Set given attribute of specified context-menu item.  If the
  6963. // value is null, then it removes the attribute (which works
  6964. // nicely for the disabled attribute).
  6965. setItemAttr : function ( id, attr, val ) {
  6966.     var elem = document.getElementById( id );
  6967.     if ( elem ) {
  6968.         if ( val == null ) {
  6969.             // null indicates attr should be removed.
  6970.             elem.removeAttribute( attr );
  6971.         } else {
  6972.             // Set attr=val.
  6973.             elem.setAttribute( attr, val );
  6974.         }
  6975.     }
  6976. },
  6977. // Set context menu attribute according to like attribute of another node
  6978. // (such as a broadcaster).
  6979. setItemAttrFromNode : function ( item_id, attr, other_id ) {
  6980.     var elem = document.getElementById( other_id );
  6981.     if ( elem && elem.getAttribute( attr ) == "true" ) {
  6982.         this.setItemAttr( item_id, attr, "true" );
  6983.     } else {
  6984.         this.setItemAttr( item_id, attr, null );
  6985.     }
  6986. },
  6987. // Temporary workaround for DOM api not yet implemented by XUL nodes.
  6988. cloneNode : function ( item ) {
  6989.     // Create another element like the one we're cloning.
  6990.     var node = document.createElement( item.tagName );
  6991.  
  6992.     // Copy attributes from argument item to the new one.
  6993.     var attrs = item.attributes;
  6994.     for ( var i = 0; i < attrs.length; i++ ) {
  6995.         var attr = attrs.item( i );
  6996.         node.setAttribute( attr.nodeName, attr.nodeValue );
  6997.     }
  6998.  
  6999.     // Voila!
  7000.     return node;
  7001. },
  7002. // Generate fully-qualified URL for clicked-on link.
  7003. linkURL : function () {
  7004.     var wrapper = new XPCNativeWrapper(this.link, "href", "baseURI",
  7005.     "getAttributeNS()");
  7006.     if (wrapper.href) {
  7007.         return wrapper.href;
  7008.     }
  7009.     var href = wrapper.getAttributeNS("http://www.w3.org/1999/xlink",
  7010.     "href");
  7011.     if (!href || !href.match(/\S/)) {
  7012.         throw "Empty href"; // Without this we try to save as the current doc, for example, HTML case also throws if empty
  7013.     }
  7014.     href = makeURLAbsolute(wrapper.baseURI, href);
  7015.     return href;
  7016. },
  7017. // Get text of link.
  7018. linkText : function () {
  7019.     var text = gatherTextUnder( this.link );
  7020.     if (!text || !text.match(/\S/)) {
  7021.         text = this.link.getAttribute("title");
  7022.         if (!text || !text.match(/\S/)) {
  7023.             text = this.link.getAttribute("alt");
  7024.             if (!text || !text.match(/\S/)) {
  7025.                 var wrapper = new XPCNativeWrapper(this.link, "href", "baseURI",
  7026.                 "getAttributeNS()");
  7027.  
  7028.                 if (wrapper.href) {
  7029.                     text = wrapper.href;
  7030.                 } else {
  7031.                     text = wrapper.getAttributeNS("http://www.w3.org/1999/xlink",
  7032.                     "href");
  7033.                     if (text && text.match(/\S/)) {
  7034.                         text = makeURLAbsolute(wrapper.baseURI, text);
  7035.                     }
  7036.                 }
  7037.             }
  7038.         }
  7039.     }
  7040.  
  7041.     return text;
  7042. },
  7043.  
  7044. //Get selected object and convert it to a string to get
  7045. //selected text.   Only use the first 15 chars.
  7046. isTextSelection : function() {
  7047.     var result = false;
  7048.     var selection = this.searchSelected(16);
  7049.  
  7050.     var searchSelectText;
  7051.     if (selection) {
  7052.         searchSelectText = selection.toString();
  7053.  
  7054.         dump("1: In isTextSelection(): " +searchSelectText+ "\n");
  7055.  
  7056.  
  7057.         if (searchSelectText.length > 15)
  7058.         searchSelectText = searchSelectText.substr(0,15) + "...";
  7059.         result = true;
  7060.  
  7061.         // format "Search for <selection>" string to show in menu
  7062.         searchSelectText = gNavigatorBundle.getFormattedString("searchText", [searchSelectText]);
  7063.  
  7064.         dump("2: In isTextSelection(): " +searchSelectText+ "\n");
  7065.  
  7066.         this.setItemAttr("context-searchselect", "label", searchSelectText);
  7067.     }
  7068.     return result;
  7069. },
  7070.  
  7071. searchSelected : function( charlen ) {
  7072.     var focusedWindow = document.commandDispatcher.focusedWindow;
  7073.         var searchStr = focusedWindow.getSelection();
  7074.     searchStr = searchStr.toString();
  7075.  
  7076.     dump("In searchSelected(): " +searchStr+ "\n");
  7077.  
  7078.     // searching for more than 150 chars makes no sense
  7079.     if (!charlen)
  7080.     charlen = 150;
  7081.     if (charlen < searchStr.length) {
  7082.         // only use the first charlen important chars. see bug 221361
  7083.         var pattern = new RegExp("^(?:\\s*.){0," + charlen + "}");
  7084.         pattern.test(searchStr);
  7085.         searchStr = RegExp.lastMatch;
  7086.     }
  7087.     searchStr = searchStr.replace(/\s*(.*?)\s*$/, "$1");
  7088.     searchStr = searchStr.replace(/\s+/g, " ");
  7089.     return searchStr;
  7090. },
  7091.  
  7092. // Determine if target <object> is an image.
  7093. objectIsImage : function ( objElem ) {
  7094.     var result = false;
  7095.     // Get type and data attributes.
  7096.     var type = objElem.getAttribute( "type" );
  7097.     var data = objElem.getAttribute( "data" );
  7098.     // Presume any mime type of the form "image/..." is an image.
  7099.     // There must be a data= attribute with an URL, also.
  7100.     if ( type.substring( 0, 6 ) == "image/" && data) {
  7101.         result = true;
  7102.     }
  7103.     return result;
  7104. },
  7105. // Extract image URL from <object> tag.
  7106. objectImageURL : function ( objElem ) {
  7107.     // Extract url from data= attribute.
  7108.     var data = objElem.getAttribute( "data" );
  7109.     // Make it absolute.
  7110.     return makeURLAbsolute( objElem.baseURI, data );
  7111. },
  7112. // Parse coords= attribute and return array.
  7113. parseCoords : function ( area ) {
  7114.     return [];
  7115. },
  7116. toString : function () {
  7117.     return "contextMenu.target     = " + this.target + "\n" +
  7118.     "contextMenu.onImage    = " + this.onImage + "\n" +
  7119.     "contextMenu.onLink     = " + this.onLink + "\n" +
  7120.     "contextMenu.link       = " + this.link + "\n" +
  7121.     "contextMenu.inFrame    = " + this.inFrame + "\n" +
  7122.     "contextMenu.hasBGImage = " + this.hasBGImage + "\n";
  7123. },
  7124. isTargetATextBox : function ( node )
  7125. {
  7126.       if (node instanceof HTMLInputElement)
  7127.         return (node.type == "text" || node.type == "password")
  7128.  
  7129.       return (node instanceof HTMLTextAreaElement);
  7130. },
  7131. isTargetAKeywordField : function ( node )
  7132. {
  7133.     var form = node.form;
  7134.     if (!form)
  7135.     return false;
  7136.     var method = form.method.toUpperCase();
  7137.  
  7138.     // These are the following types of forms we can create keywords for:
  7139.     //
  7140.     // method   encoding type       can create keyword
  7141.     // GET      *                                 YES
  7142.     //          *                                 YES
  7143.     // POST                                       YES
  7144.     // POST     application/x-www-form-urlencoded YES
  7145.     // POST     text/plain                        NO (a little tricky to do)
  7146.     // POST     multipart/form-data               NO
  7147.     // POST     everything else                   YES
  7148.     return (method == "GET" || method == "") ||
  7149.     (form.enctype != "text/plain") && (form.enctype != "multipart/form-data");
  7150. },
  7151.  
  7152. // Determines whether or not the separator with the specified ID should be
  7153. // shown or not by determining if there are any non-hidden items between it
  7154. // and the previous separator.
  7155. shouldShowSeparator : function ( aSeparatorID )
  7156. {
  7157.     var separator = document.getElementById(aSeparatorID);
  7158.     if (separator) {
  7159.         var sibling = separator.previousSibling;
  7160.         while (sibling && sibling.localName != "menuseparator") {
  7161.             if (sibling.getAttribute("hidden") != "true")
  7162.             return true;
  7163.             sibling = sibling.previousSibling;
  7164.         }
  7165.     }
  7166.     return false;
  7167. }
  7168. }
  7169.  
  7170. var gWebPanelURI;
  7171. function openWebPanel(aTitle, aURI)
  7172. {
  7173.     // Ensure that the web panels sidebar is open.
  7174.     toggleSidebar('viewWebPanelsSidebar', true);
  7175.  
  7176.     // Set the title of the panel.
  7177.     document.getElementById("sidebar-title").value = aTitle;
  7178.  
  7179.     // Tell the Web Panels sidebar to load the bookmark.
  7180.     var sidebar = document.getElementById("sidebar");
  7181.     if (sidebar.contentDocument && sidebar.contentDocument.getElementById('web-panels-browser')) {
  7182.         sidebar.contentWindow.loadWebPanel(aURI);
  7183.         if (gWebPanelURI) {
  7184.             gWebPanelURI = "";
  7185.             sidebar.removeEventListener("load", asyncOpenWebPanel, true);
  7186.         }
  7187.     }
  7188. else {
  7189.     // The panel is still being constructed.  Attach an onload handler.
  7190.     if (!gWebPanelURI)
  7191.     sidebar.addEventListener("load", asyncOpenWebPanel, true);
  7192.     gWebPanelURI = aURI;
  7193. }
  7194. }
  7195.  
  7196. function asyncOpenWebPanel(event)
  7197. {
  7198.     var sidebar = document.getElementById("sidebar");
  7199.     if (gWebPanelURI && sidebar.contentDocument && sidebar.contentDocument.getElementById('web-panels-browser'))
  7200.     sidebar.contentWindow.loadWebPanel(gWebPanelURI);
  7201.     gWebPanelURI = "";
  7202.     sidebar.removeEventListener("load", asyncOpenWebPanel, true);
  7203. }
  7204.  
  7205. /*
  7206. * - [ Dependencies ] ---------------------------------------------------------
  7207. *  utilityOverlay.js:
  7208. *    - gatherTextUnder
  7209. */
  7210.  
  7211. // Called whenever the user clicks in the content area,
  7212. // except when left-clicking on links (special case)
  7213. // should always return true for click to go through
  7214. function contentAreaClick(event, fieldNormalClicks)
  7215. {
  7216.     if (!event.isTrusted) {
  7217.         return true;
  7218.     }
  7219.  
  7220.     var target = event.target;
  7221.     var linkNode;
  7222.  
  7223.    if (target instanceof HTMLAnchorElement ||
  7224.        target instanceof HTMLAreaElement ||
  7225.        target instanceof HTMLLinkElement) {
  7226.      if (target.hasAttribute("href"))
  7227.        linkNode = target;
  7228.    }
  7229.    else {
  7230.      linkNode = event.originalTarget;
  7231.      while (linkNode && !(linkNode instanceof HTMLAnchorElement))
  7232.        linkNode = linkNode.parentNode;
  7233.         // <a> cannot be nested.  So if we find an anchor without an
  7234.         // href, there is no useful <a> around the target
  7235.         if (linkNode && !linkNode.hasAttribute("href"))
  7236.         linkNode = null;
  7237.     }
  7238.     if (linkNode) {
  7239.              var wrapper = new XPCNativeWrapper(linkNode, "href", "getAttribute()", "ownerDocument");
  7240.         if (event.button == 0 && !event.ctrlKey && !event.shiftKey &&
  7241.         !event.altKey && !event.metaKey) {
  7242.             // A Web panel's links should target the main content area.  Do this
  7243.             // if no modifier keys are down and if there's no target or the target equals
  7244.             // _main (the IE convention) or _content (the Mozilla convention).
  7245.             // The only reason we field _main and _content here is for the markLinkVisited
  7246.             // hack.
  7247.                target = wrapper.getAttribute("target");
  7248.                var docWrapper = new XPCNativeWrapper(wrapper.ownerDocument, "location");
  7249.                var locWrapper = new XPCNativeWrapper(docWrapper.location, "href");
  7250.             if (fieldNormalClicks &&
  7251.             (!target || target == "_content" || target  == "_main"))
  7252.             // IE uses _main, SeaMonkey uses _content, we support both
  7253.                {
  7254.                  if (!wrapper.href) 
  7255.                    return true;
  7256.                  if (wrapper.getAttribute("onclick")) 
  7257.                    return true;
  7258.                  // javascript links should be executed in the current browser
  7259.                  if (wrapper.href.substr(0, 11) === "javascript:")
  7260.                    return true;
  7261.          // data links should be executed in the current browser
  7262.          if (wrapper.href.substr(0, 5) === "data:")
  7263.            return true;
  7264.  
  7265.                  if (!webPanelSecurityCheck(locWrapper.href, wrapper.href))
  7266.                    return false;
  7267.  
  7268.                 var postData = { };
  7269.                 var url = getShortcutOrURI(wrapper.href, postData);
  7270.                 if (!url)
  7271.                 return true;
  7272.                 markLinkVisited(wrapper.href, linkNode);
  7273.                 loadURI(url, null, postData.value);
  7274.                 event.preventDefault();
  7275.                 return false;
  7276.             }
  7277.         else if (linkNode.getAttribute("rel") == "sidebar") {
  7278.             // This is the Opera convention for a special link that - when clicked - allows
  7279.             // you to add a sidebar panel.  We support the Opera convention here.  The link's
  7280.             // title attribute contains the title that should be used for the sidebar panel.
  7281.             openDialog("chrome://browser/content/bookmarks/addBookmark2.xul", "",
  7282.             "centerscreen,chrome,dialog,resizable,dependent",
  7283.             wrapper.getAttribute("title"),
  7284.             wrapper.href, null, null, null, null, true);
  7285.             event.preventDefault();
  7286.             return false;
  7287.         }
  7288.     else if (target == "_search") {
  7289.         // Used in WinIE as a way of transiently loading pages in a sidebar.  We
  7290.         // mimic that WinIE functionality here and also load the page transiently.
  7291.  
  7292.              // javascript links targeting the sidebar shouldn't be allowed
  7293.              // we copied this from IE, and IE blocks this completely
  7294.              if (wrapper.href.substr(0, 11) === "javascript:")
  7295.                return false;
  7296.  
  7297.              // data: URIs are just as dangerous
  7298.              if (wrapper.href.substr(0, 5) === "data:")
  7299.                return false;
  7300.  
  7301.              if (!webPanelSecurityCheck(locWrapper.href, wrapper.href))
  7302.                return false;
  7303.  
  7304.         openWebPanel(gNavigatorBundle.getString("webPanels"), wrapper.href);
  7305.         event.preventDefault();
  7306.         return false;
  7307.     }
  7308. }
  7309. else {
  7310.     handleLinkClick(event, wrapper.href, linkNode);
  7311. }
  7312.  
  7313. return true;
  7314. } else {
  7315.     // Try simple XLink
  7316.     var href;
  7317.     linkNode = target;
  7318.     while (linkNode) {
  7319.         if (linkNode.nodeType == Node.ELEMENT_NODE) {
  7320.             var wrapper = new XPCNativeWrapper(linkNode, "getAttributeNS()");
  7321.  
  7322.             href = wrapper.getAttributeNS("http://www.w3.org/1999/xlink", "href");
  7323.             break;
  7324.         }
  7325.         linkNode = linkNode.parentNode;
  7326.     }
  7327.     if (href) {
  7328.         var baseURI = new XPCNativeWrapper(linkNode, "baseURI").baseURI;
  7329.         href = makeURLAbsolute(baseURI, href);
  7330.         handleLinkClick(event, href, null);
  7331.         return true;
  7332.     }
  7333. }
  7334. if (event.button == 1 &&
  7335.        !event.getPreventDefault() &&
  7336. gPrefService.getBoolPref("middlemouse.contentLoadURL")) {
  7337.     middleMousePaste(event);
  7338. }
  7339. return true;
  7340. }
  7341.  
  7342. function handleLinkClick(event, href, linkNode)
  7343. {
  7344.     switch (event.button) {
  7345.         case 0:
  7346.                 if (event.ctrlKey) {
  7347.                     openNewTabWith(href, linkNode, event, true);
  7348.                     event.preventBubble();
  7349.                     return true;
  7350.                 }
  7351.                 // if left button clicked
  7352.                 if (event.shiftKey) {
  7353.                     openNewWindowWith(href, linkNode, true);
  7354.                     event.preventBubble();
  7355.                     return true;
  7356.                 }
  7357.  
  7358.                 if (event.altKey) {
  7359.                     saveURL(href, linkNode ? gatherTextUnder(linkNode) : "", null, true, true);
  7360.                     return true;
  7361.                 }
  7362.  
  7363.                 return false;
  7364.                 case 1:                                                         // if middle button clicked
  7365.                 var tab;
  7366.                 try {
  7367.                     tab = gPrefService.getBoolPref("browser.tabs.opentabfor.middleclick")
  7368.                 }
  7369.                 catch(ex) {
  7370.                     tab = true;
  7371.                 }
  7372.                 if (tab)
  7373.                 openNewTabWith(href, linkNode, event, true);
  7374.             else
  7375.                 openNewWindowWith(href, linkNode, true);
  7376.                 event.preventBubble();
  7377.                 return true;
  7378.             }
  7379.             return false;
  7380.         }
  7381.  
  7382.         function middleMousePaste(event)
  7383.         {
  7384.             var url = readFromClipboard();
  7385.             if (!url)
  7386.     return;
  7387.   var postData = { };
  7388.   url = getShortcutOrURI(url, postData);
  7389.   if (!url)
  7390.     return;
  7391.  
  7392.   openUILink(url,
  7393.              event,
  7394.              true /* ignore the fact this is a middle click */);
  7395.  
  7396.   event.preventBubble();
  7397.             }
  7398.  
  7399.             function makeURLAbsolute( base, url )
  7400.             {
  7401.                 // Construct nsIURL.
  7402.                 var ioService = Components.classes["@mozilla.org/network/io-service;1"]
  7403.                 .getService(Components.interfaces.nsIIOService);
  7404.                 var baseURI  = ioService.newURI(base, null, null);
  7405.  
  7406.                 return ioService.newURI(baseURI.resolve(url), null, null).spec;
  7407. }
  7408.  
  7409.             function saveFrameDocument()
  7410.             {
  7411.                 var focusedWindow = document.commandDispatcher.focusedWindow;
  7412.                 if (isContentFrame(focusedWindow))
  7413.                 saveDocument(focusedWindow.document);
  7414.             }
  7415.  
  7416.             /*
  7417.             * Note that most of this routine has been moved into C++ in order to
  7418.             * be available for all <browser> tags as well as gecko embedding. See
  7419.             * mozilla/content/base/src/nsContentAreaDragDrop.cpp.
  7420.             *
  7421.             * Do not add any new fuctionality here other than what is needed for
  7422.             * a standalone product.
  7423.             */
  7424.  
  7425.             var contentAreaDNDObserver = {
  7426.                 onDrop: function (aEvent, aXferData, aDragSession)
  7427.                 {
  7428.                     var url = transferUtils.retrieveURLFromData(aXferData.data, aXferData.flavour.contentType);
  7429.  
  7430.                     // valid urls don't contain spaces ' '; if we have a space it
  7431.                     // isn't a valid url, or if it's a javascript: or data: url,
  7432.                     // bail out
  7433.                     if (!url || !url.length || url.indexOf(" ", 0) != -1 ||
  7434.                     /^\s*(javascript|data):/.test(url)) 
  7435.                         return;
  7436.  
  7437.                     getBrowser().dragDropSecurityCheck(aEvent, aDragSession, url);
  7438.  
  7439.                     switch (document.firstChild.getAttribute('windowtype')) {
  7440.                         case "navigator:browser":
  7441.                         var postData = { };
  7442.                         var uri = getShortcutOrURI(url, postData);
  7443.                         loadURI(uri, null, postData.value);
  7444.                         break;
  7445.                         case "navigator:view-source":
  7446.                         viewSource(url);
  7447.                         break;
  7448.                     }
  7449.  
  7450.                     // keep the event from being handled by the dragDrop listeners
  7451.                     // built-in to gecko if they happen to be above us.
  7452.                     aEvent.preventDefault();
  7453.                 },
  7454.  
  7455.                 getSupportedFlavours: function ()
  7456.                 {
  7457.                     var flavourSet = new FlavourSet();
  7458.                     flavourSet.appendFlavour("text/x-moz-url");
  7459.                     flavourSet.appendFlavour("text/unicode");
  7460.                     flavourSet.appendFlavour("application/x-moz-file", "nsIFile");
  7461.                     return flavourSet;
  7462.                 }
  7463.  
  7464.             };
  7465.  
  7466.             // For extensions
  7467.             function getBrowser()
  7468.             {
  7469.                 if (!gBrowser)
  7470.                 gBrowser = document.getElementById("content");
  7471.                 return gBrowser;
  7472.             }
  7473.  
  7474.             function MultiplexHandler(event)
  7475.             { try {
  7476.                 var node = event.target;
  7477.                 var name = node.getAttribute('name');
  7478.  
  7479.                 if (name == 'detectorGroup') {
  7480.                     SetForcedDetector(true);
  7481.                     SelectDetector(event, false);
  7482.                 } else if (name == 'charsetGroup') {
  7483.                     var charset = node.getAttribute('id');
  7484.                     charset = charset.substring('charset.'.length, charset.length)
  7485.                     SetForcedCharset(charset);
  7486.                     SetDefaultCharacterSet(charset);
  7487.                 } else if (name == 'charsetCustomize') {
  7488.                     //do nothing - please remove this else statement, once the charset prefs moves to the pref window
  7489.                 } else {
  7490.                     SetForcedCharset(node.getAttribute('id'));
  7491.                     SetDefaultCharacterSet(node.getAttribute('id'));
  7492.                 }
  7493.             } catch(ex) { dump ("Caught Exception: " + ex + "\n"); }
  7494.         }
  7495.  
  7496.         function SetDefaultCharacterSet(charset)
  7497.         {
  7498.             BrowserSetDefaultCharacterSet(charset);
  7499.         }
  7500.  
  7501.         function SelectDetector(event, doReload)
  7502.         {
  7503.             var uri =  event.target.getAttribute("id");
  7504.             var prefvalue = uri.substring('chardet.'.length, uri.length);
  7505.             if ("off" == prefvalue) { // "off" is special value to turn off the detectors
  7506.                 prefvalue = "";
  7507.             }
  7508.  
  7509.             try {
  7510.                 var pref = Components.classes["@mozilla.org/preferences-service;1"]
  7511.                 .getService(Components.interfaces.nsIPrefBranch);
  7512.                 var str =  Components.classes["@mozilla.org/supports-string;1"]
  7513.                 .createInstance(Components.interfaces.nsISupportsString);
  7514.  
  7515.                 str.data = prefvalue;
  7516.                 pref.setComplexValue("intl.charset.detector",
  7517.                 Components.interfaces.nsISupportsString, str);
  7518.                 if (doReload) window._content.location.reload();
  7519.             }
  7520.             catch (ex) {
  7521.                 dump("Failed to set the intl.charset.detector preference.\n");
  7522.             }
  7523.         }
  7524.  
  7525.         function SetForcedDetector(doReload)
  7526.         {
  7527.             BrowserSetForcedDetector(doReload);
  7528.         }
  7529.  
  7530.         function SetForcedCharset(charset)
  7531.         {
  7532.             BrowserSetForcedCharacterSet(charset);
  7533.         }
  7534.  
  7535.         function BrowserSetDefaultCharacterSet(aCharset)
  7536.         {
  7537.             // no longer needed; set when setting Force; see bug 79608
  7538.         }
  7539.  
  7540.         function BrowserSetForcedCharacterSet(aCharset)
  7541.         {
  7542.             var docCharset = getBrowser().docShell.QueryInterface(
  7543.             Components.interfaces.nsIDocCharset);
  7544.             docCharset.charset = aCharset;
  7545.             BrowserReloadWithFlags(nsIWebNavigation.LOAD_FLAGS_CHARSET_CHANGE);
  7546.         }
  7547.  
  7548.         function BrowserSetForcedDetector(doReload)
  7549.         {
  7550.             getBrowser().documentCharsetInfo.forcedDetector = true;
  7551.             if (doReload)
  7552.             BrowserReloadWithFlags(nsIWebNavigation.LOAD_FLAGS_CHARSET_CHANGE);
  7553.         }
  7554.  
  7555.         function UpdateCurrentCharset()
  7556.         {
  7557.             var menuitem = null;
  7558.  
  7559.             // exctract the charset from DOM
  7560.             var wnd = document.commandDispatcher.focusedWindow;
  7561.             if ((window == wnd) || (wnd == null)) wnd = window._content;
  7562.             menuitem = document.getElementById('charset.' + wnd.document.characterSet);
  7563.  
  7564.             if (menuitem) {
  7565.                 // uncheck previously checked item to workaround Mac checkmark problem
  7566.                 // bug 98625
  7567.                 if (gPrevCharset) {
  7568.                     var pref_item = document.getElementById('charset.' + gPrevCharset);
  7569.                     if (pref_item)
  7570.                     pref_item.setAttribute('checked', 'false');
  7571.                 }
  7572.                 menuitem.setAttribute('checked', 'true');
  7573.             }
  7574.         }
  7575.  
  7576.         function UpdateCharsetDetector()
  7577.         {
  7578.             // showStack();
  7579.             var prefvalue;
  7580.  
  7581.             try {
  7582.                 var pref = Components.classes["@mozilla.org/preferences-service;1"]
  7583.                 .getService(Components.interfaces.nsIPrefBranch);
  7584.                 prefvalue = pref.getComplexValue("intl.charset.detector",
  7585.                 Components.interfaces.nsIPrefLocalizedString).data;
  7586.             }
  7587.             catch (ex) {
  7588.                 prefvalue = "";
  7589.             }
  7590.  
  7591.             if (prefvalue == "") prefvalue = "off";
  7592.             // dump("intl.charset.detector = "+ prefvalue + "\n");
  7593.  
  7594.             prefvalue = 'chardet.' + prefvalue;
  7595.             var menuitem = document.getElementById(prefvalue);
  7596.  
  7597.             if (menuitem) {
  7598.                 menuitem.setAttribute('checked', 'true');
  7599.             }
  7600.         }
  7601.  
  7602.         function UpdateMenus(event)
  7603.         {
  7604.             // use setTimeout workaround to delay checkmark the menu
  7605.             // when onmenucomplete is ready then use it instead of oncreate
  7606.             // see bug 78290 for the detail
  7607.             UpdateCurrentCharset();
  7608.             setTimeout(UpdateCurrentCharset, 0);
  7609.             UpdateCharsetDetector();
  7610.             setTimeout(UpdateCharsetDetector, 0);
  7611.         }
  7612.  
  7613.         function CreateMenu(node)
  7614.         {
  7615.             // dump (" Calling CreateMenu to make a charset menu from within Browser.js\n\n");
  7616.             // showStack();
  7617.             var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  7618.             observerService.notifyObservers(null, "charsetmenu-selected", node);
  7619.         }
  7620.  
  7621.         function charsetLoadListener (event)
  7622.         {
  7623.             var charset = window._content.document.characterSet;
  7624.  
  7625.             if (charset.length > 0 && (charset != gLastBrowserCharset)) {
  7626.                 if (!gCharsetMenu)
  7627.                 gCharsetMenu = Components.classes['@mozilla.org/rdf/datasource;1?name=charset-menu'].getService().QueryInterface(Components.interfaces.nsICurrentCharsetListener);
  7628.                 gCharsetMenu.SetCurrentCharset(charset);
  7629.                 gPrevCharset = gLastBrowserCharset;
  7630.                 gLastBrowserCharset = charset;
  7631.             }
  7632.         }
  7633.  
  7634.  
  7635.         /* Begin Page Style Functions */
  7636.         function getStyleSheetArray(frame)
  7637.         {
  7638.             var styleSheets = frame.document.styleSheets;
  7639.             var styleSheetsArray = new Array(styleSheets.length);
  7640.             for (var i = 0; i < styleSheets.length; i++) {
  7641.                 styleSheetsArray[i] = styleSheets[i];
  7642.             }
  7643.             return styleSheetsArray;
  7644.         }
  7645.  
  7646.         function getAllStyleSheets(frameset)
  7647.         {
  7648.             var styleSheetsArray = getStyleSheetArray(frameset);
  7649.             for (var i = 0; i < frameset.frames.length; i++) {
  7650.                 var frameSheets = getAllStyleSheets(frameset.frames[i]);
  7651.                 styleSheetsArray = styleSheetsArray.concat(frameSheets);
  7652.             }
  7653.             return styleSheetsArray;
  7654.         }
  7655.  
  7656.         function stylesheetFillPopup(menuPopup)
  7657.         {
  7658.             var noStyle = menuPopup.firstChild;
  7659.             var persistentOnly = noStyle.nextSibling;
  7660.             var sep = persistentOnly.nextSibling;
  7661.             while (sep.nextSibling)
  7662.             menuPopup.removeChild(sep.nextSibling);
  7663.  
  7664.             var styleSheets = getAllStyleSheets(window._content);
  7665.             var currentStyleSheets = [];
  7666.             var styleDisabled = getMarkupDocumentViewer().authorStyleDisabled;
  7667.             var haveAltSheets = false;
  7668.             var altStyleSelected = false;
  7669.  
  7670.             for (var i = 0; i < styleSheets.length; ++i) {
  7671.                 var currentStyleSheet = styleSheets[i];
  7672.  
  7673.                 // Skip any stylesheets that don't match the screen media type.
  7674.                 var media = currentStyleSheet.media.mediaText.toLowerCase();
  7675.                 if (media && (media.indexOf("screen") == -1) && (media.indexOf("all") == -1))
  7676.                 continue;
  7677.  
  7678.                 if (currentStyleSheet.title) {
  7679.                     if (!currentStyleSheet.disabled)
  7680.                     altStyleSelected = true;
  7681.  
  7682.                     haveAltSheets = true;
  7683.  
  7684.                     var lastWithSameTitle = null;
  7685.                     if (currentStyleSheet.title in currentStyleSheets)
  7686.                     lastWithSameTitle = currentStyleSheets[currentStyleSheet.title];
  7687.  
  7688.                     if (!lastWithSameTitle) {
  7689.                         var menuItem = document.createElement("menuitem");
  7690.                         menuItem.setAttribute("type", "radio");
  7691.                         menuItem.setAttribute("label", currentStyleSheet.title);
  7692.                         menuItem.setAttribute("data", currentStyleSheet.title);
  7693.                         menuItem.setAttribute("checked", !currentStyleSheet.disabled && !styleDisabled);
  7694.                         menuPopup.appendChild(menuItem);
  7695.                         currentStyleSheets[currentStyleSheet.title] = menuItem;
  7696.                     } else {
  7697.                         if (currentStyleSheet.disabled)
  7698.                         lastWithSameTitle.removeAttribute("checked");
  7699.                     }
  7700.                 }
  7701.             }
  7702.  
  7703.             noStyle.setAttribute("checked", styleDisabled);
  7704.             persistentOnly.setAttribute("checked", !altStyleSelected && !styleDisabled);
  7705.             persistentOnly.hidden = (window._content.document.preferredStylesheetSet) ? true : false;
  7706.             sep.hidden = (noStyle.hidden && persistentOnly.hidden) || !haveAltSheets;
  7707.             return true;
  7708.         }
  7709.  
  7710.         function stylesheetInFrame(frame, title) {
  7711.             var docStyleSheets = frame.document.styleSheets;
  7712.  
  7713.             for (var i = 0; i < docStyleSheets.length; ++i) {
  7714.                 if (docStyleSheets[i].title == title)
  7715.                 return true;
  7716.             }
  7717.             return false;
  7718.         }
  7719.  
  7720.         function stylesheetSwitchFrame(frame, title) {
  7721.             var docStyleSheets = frame.document.styleSheets;
  7722.  
  7723.             for (var i = 0; i < docStyleSheets.length; ++i) {
  7724.                 var docStyleSheet = docStyleSheets[i];
  7725.  
  7726.                 if (title == "_nostyle")
  7727.                 docStyleSheet.disabled = true;
  7728.             else if (docStyleSheet.title)
  7729.             docStyleSheet.disabled = (docStyleSheet.title != title);
  7730.         else if (docStyleSheet.disabled)
  7731.         docStyleSheet.disabled = false;
  7732.     }
  7733. }
  7734.  
  7735. function stylesheetSwitchAll(frameset, title) {
  7736.     if (!title || title == "_nostyle" || stylesheetInFrame(frameset, title)) {
  7737.         stylesheetSwitchFrame(frameset, title);
  7738.     }
  7739.     for (var i = 0; i < frameset.frames.length; i++) {
  7740.         stylesheetSwitchAll(frameset.frames[i], title);
  7741.     }
  7742. }
  7743.  
  7744. function setStyleDisabled(disabled) {
  7745.     getMarkupDocumentViewer().authorStyleDisabled = disabled;
  7746. }
  7747.  
  7748. /* End of the Page Style functions */
  7749.  
  7750. function clearObsoletePrefs()
  7751. {
  7752.     // removed 10/03/2003
  7753.     try {
  7754.         PREF.clearUserPref("timebomb.first_launch_time");
  7755.     } catch (e) {}
  7756.  
  7757.     // removed 10/16/2003
  7758.     // migrate firebird cookie prefs, if they exist.
  7759.     try {
  7760.         PREF.clearUserPref("network.cookie.enable");
  7761.         // No error: it means this pref was not the default one, cookie were disabled.
  7762.         PREF.SetIntPref("network.cookie.cookieBehavior", 2);
  7763.     } catch (e) {
  7764.         try {
  7765.             PREF.clearUserPref("network.cookie.enableForOriginatingWebsiteOnly");
  7766.             // No error: it means that enableForOriginatingWebsiteOnly was true.
  7767.             PREF.SetIntPref("network.cookie.cookieBehavior", 1);
  7768.         } catch (e) {
  7769.             // here, either we already have migrated the cookie pref
  7770.             // or the new and old behavior are the same (0). In any case: nothing to do.
  7771.         }
  7772.     }
  7773.  
  7774.     // removed 03/09/2003
  7775.     // last of the forked cookie prefs
  7776.     try {
  7777.         PREF.clearUserPref("network.cookie.enableForCurrentSessionOnly");
  7778.         // No error, therefore we were limiting cookies to session
  7779.         PREF.setIntPref("network.cookie.lifetimePolicy", 2);
  7780.     } catch (e) {
  7781.         // nothing to do in this case
  7782.     }
  7783.  
  7784.     try {
  7785.         PREF.clearUserPref("network.cookie.warnAboutCookies");
  7786.         // No error: the pref is set to ask for cookies, set the correct pref
  7787.         // This will replace the setting if enableForCurrentSessionOnly was
  7788.         // also true, because dialogs explictly allow accepting for session
  7789.         PREF.setIntPref("network.cookie.lifetimePolicy", 1);
  7790.     } catch (e) {
  7791.         // nothing to do in this case
  7792.     }
  7793.  
  7794.     // removed 10/22/2003
  7795.     try {
  7796.         PREF.clearUserPref("browser.search.defaultengine");
  7797.     } catch (e) {}
  7798.  
  7799.     // removed 11/01/2003
  7800.     try {
  7801.         PREF.clearUserPref("print.use_global_printsettings");
  7802.     } catch (e) {}
  7803.     try {
  7804.         PREF.clearUserPref("print.save_print_settings");
  7805.     } catch (e) {}
  7806.  
  7807. }
  7808.  
  7809. var BrowserOffline = {
  7810.     /////////////////////////////////////////////////////////////////////////////
  7811.     // BrowserOffline Public Methods
  7812.     init: function ()
  7813.     {
  7814.         var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  7815.         os.addObserver(this, "network:offline-status-changed", false);
  7816.  
  7817.         if (!this._uiElement)
  7818.         this._uiElement = document.getElementById("goOfflineMenuitem");
  7819.  
  7820.         // set the initial state
  7821.         var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  7822.         var isOffline = false;
  7823.         try {
  7824.             isOffline = gPrefService.getBoolPref("browser.offline");
  7825.         }
  7826.         catch (e) { }
  7827.         ioService.offline = isOffline;
  7828.  
  7829.         this._updateOfflineUI(isOffline);
  7830.     },
  7831.  
  7832.     uninit: function ()
  7833.     {
  7834.         try {
  7835.             var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  7836.             os.removeObserver(this, "network:offline-status-changed");
  7837.         } catch (ex) {
  7838.         }
  7839.     },
  7840.  
  7841.     toggleOfflineStatus: function ()
  7842.     {
  7843.         if (!this._canGoOffline()) {
  7844.             this._updateOfflineUI(false);
  7845.             return;
  7846.         }
  7847.  
  7848.         var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  7849.         ioService.offline = !ioService.offline;
  7850.  
  7851.         gPrefService.setBoolPref("browser.offline", ioService.offline);
  7852.     },
  7853.  
  7854.     /////////////////////////////////////////////////////////////////////////////
  7855.     // nsIObserver
  7856.     observe: function (aSubject, aTopic, aState)
  7857.     {
  7858.         if (aTopic != "network:offline-status-changed")
  7859.         return;
  7860.  
  7861.         this._updateOfflineUI(aState == "offline");
  7862.     },
  7863.  
  7864.     /////////////////////////////////////////////////////////////////////////////
  7865.     // BrowserOffline Implementation Methods
  7866.     _canGoOffline: function ()
  7867.     {
  7868.         var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  7869.         if (os) {
  7870.             try {
  7871.                 var cancelGoOffline = Components.classes["@mozilla.org/supports-PRBool;1"].createInstance(Components.interfaces.nsISupportsPRBool);
  7872.                 os.notifyObservers(cancelGoOffline, "offline-requested", null);
  7873.  
  7874.                 // Something aborted the quit process.
  7875.                 if (cancelGoOffline.data)
  7876.                 return false;
  7877.             }
  7878.             catch (ex) {
  7879.             }
  7880.         }
  7881.         return true;
  7882.     },
  7883.  
  7884.     _uiElement: null,
  7885.     _updateOfflineUI: function (aOffline)
  7886.     {
  7887.         var offlineLocked = gPrefService.prefIsLocked("network.online");
  7888.         if (offlineLocked)
  7889.         this._uiElement.setAttribute("disabled", "true");
  7890.  
  7891.         this._uiElement.setAttribute("checked", aOffline);
  7892.     }
  7893. };
  7894.  
  7895. function WindowIsClosing()
  7896. {
  7897.     var browser = getBrowser();
  7898.     var cn = browser.tabContainer.childNodes;
  7899.     var numtabs = cn.length;
  7900.     var reallyClose = browser.warnAboutClosingTabs(true);
  7901.  
  7902.     for (var i = 0; reallyClose && i < numtabs; ++i) {
  7903.         var ds = browser.getBrowserForTab(cn[i]).docShell;
  7904.  
  7905.         if (ds.contentViewer && !ds.contentViewer.permitUnload())
  7906.         reallyClose = false;
  7907.     }
  7908.  
  7909.     if (reallyClose)
  7910.     return closeWindow(false);
  7911.  
  7912.     return reallyClose;
  7913. }
  7914.  
  7915. var MailIntegration = {
  7916.     sendLinkForContent: function ()
  7917.     {
  7918.         this.sendMessage(Components.lookupMethod(window._content, 'location').call(window._content).href,
  7919.         Components.lookupMethod(window._content.document, 'title').call(window._content.document));
  7920.     },
  7921.  
  7922.     sendMessage: function (aBody, aSubject)
  7923.     {
  7924.         // generate a mailto url based on the url and the url's title
  7925.         var mailtoUrl = aBody ? "mailto:?body=" + encodeURIComponent(aBody) + "&subject=" + encodeURIComponent(aSubject) : "mailto:";
  7926.  
  7927.         var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  7928.         var uri = ioService.newURI(mailtoUrl, null, null);
  7929.  
  7930.         // now pass this url to the operating system
  7931.         this._launchExternalUrl(uri);
  7932.     },
  7933.  
  7934.     // a generic method which can be used to pass arbitrary urls to the operating system.
  7935.     // aURL --> a nsIURI which represents the url to launch
  7936.     _launchExternalUrl: function(aURL)
  7937.     {
  7938.         var extProtocolSvc = Components.classes["@mozilla.org/uriloader/external-protocol-service;1"].getService(Components.interfaces.nsIExternalProtocolService);
  7939.         if (extProtocolSvc)
  7940.             extProtocolSvc.loadUrl(aURL);
  7941.     },
  7942.  
  7943.     readMail: function ()
  7944.     {
  7945.         var shell = getShellService();
  7946.         if (shell)
  7947.             shell.openPreferredApplication(Components.interfaces.nsIShellService.APPLICATION_MAIL);
  7948.     },
  7949.  
  7950.     readNews: function ()
  7951.     {
  7952.         var shell = getShellService();
  7953.         if (shell)
  7954.             shell.openPreferredApplication(Components.interfaces.nsIShellService.APPLICATION_NEWS);
  7955.     },
  7956.  
  7957.     updateUnreadCount: function ()
  7958.     {
  7959.         var shell = Components.classes["@mozilla.org/browser/shell-service;1"]
  7960.                               .getService(Components.interfaces.nsIWindowsShellService);
  7961.         var unreadCount = shell.unreadMailCount;
  7962.         var message = gNavigatorBundle.getFormattedString("mailUnreadTooltip", [unreadCount]);
  7963.         var element = document.getElementById("mail-button");
  7964.         if (element)
  7965.             element.setAttribute("tooltiptext", message);
  7966.  
  7967.         message = gNavigatorBundle.getFormattedString("mailUnreadMenuitem", [unreadCount]);
  7968.         element = document.getElementById("Browser:ReadMail");
  7969.         if (element)
  7970.             element.setAttribute("label", message);
  7971.     }
  7972. };
  7973.  
  7974. function BrowserOpenExtensions(aOpenMode)
  7975. {
  7976.     const EMTYPE = "Extension:Manager";
  7977.  
  7978.     var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  7979.     .getService(Components.interfaces.nsIWindowMediator);
  7980.     var needToOpen = true;
  7981.     var windowType = EMTYPE + "-" + aOpenMode;
  7982.     var windows = wm.getEnumerator(windowType);
  7983.     while (windows.hasMoreElements()) {
  7984.         var theEM = windows.getNext().QueryInterface(Components.interfaces.nsIDOMWindowInternal);
  7985.         if (theEM.document.documentElement.getAttribute("windowtype") == windowType) {
  7986.             theEM.focus();
  7987.             needToOpen = false;
  7988.             break;
  7989.         }
  7990.     }
  7991.  
  7992.     if (needToOpen) {
  7993.         const EMURL = "chrome://mozapps/content/extensions/extensions.xul?type=" + aOpenMode;
  7994.         const EMFEATURES = "chrome,dialog=no,resizable";
  7995.         window.openDialog(EMURL, "", EMFEATURES);
  7996.     }
  7997. }
  7998.  
  7999. function AutofillEdit()
  8000. {
  8001.     const EMTYPE = "AutoFill:Manager";
  8002.  
  8003.     var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  8004.     .getService(Components.interfaces.nsIWindowMediator);
  8005.     var needToOpen = true;
  8006.     var windowType = EMTYPE;
  8007.     var windows = wm.getEnumerator(windowType);
  8008.     while (windows.hasMoreElements()) {
  8009.         var theEM = windows.getNext().QueryInterface(Components.interfaces.nsIDOMWindowInternal);
  8010.         var wtype=theEM.document.documentElement.getAttribute("windowtype");
  8011.         dump("window type:"+wtype+"\n");
  8012.         if (theEM.document.documentElement.getAttribute("windowtype") == windowType) {
  8013.             theEM.focus();
  8014.             needToOpen = false;
  8015.             break;
  8016.         }
  8017.     }
  8018.     if (needToOpen) {
  8019.         const EMURL = "chrome://browser/content/pref/pref.xul";
  8020.         const EMFEATURES = "chrome,dialog=no,resizable";
  8021.         window.openDialog(EMURL, "", EMFEATURES);
  8022.     }
  8023. }
  8024.  
  8025. // MERC - JCH: Combined datacard and passcard button behaviour.
  8026. // Check whether page is passcardable first. If page isn't, then
  8027. // assume it's datacardable.
  8028. function DoCombinedAutofill()
  8029. {
  8030.     // Does page have password/username fields?
  8031.     // (The boolean means: true = ignore whether there is text in fields,
  8032.     // false = insist that both fields have text otherwise return false).
  8033.     if (CheckIsPasscardable(true)) {
  8034.         DoPasscardOneTime();
  8035.     } else {
  8036.         datacardButton();
  8037.     }
  8038. }
  8039.  
  8040. // MERC - JCH: Fired when datacard-passcard button fill form menu item invoked.
  8041. function DoCombinedFill(menuitem, doSubmit)
  8042. {
  8043.     if (CheckIsPasscardable(true)) {
  8044.         fillUsernamePassword(menuitem, doSubmit);
  8045.     } else {
  8046.         if (doSubmit)
  8047.             datacardUtils.DoAutoFillAndSubmit();
  8048.         else
  8049.             datacardUtils.DoAutoFill();
  8050.     }
  8051. }
  8052.  
  8053. // MERC - JCH: Fired when datacard-passcard button save form menu item invoked.
  8054. function DoCombinedSave()
  8055. {
  8056.     if (CheckIsPasscardable(true)) {
  8057.         savePasscard();
  8058.     } else {
  8059.         datacardUtils.SaveDatacard();
  8060.     }
  8061. }
  8062.  
  8063. // MERC - JCH: Fired when datacard-passcard button drop-down menu is opened.
  8064. function UpdateCombinedMenu(menuitem)
  8065. {
  8066.     clearDatacardMenu();
  8067.     clearPasscardMenu();
  8068.     if (CheckIsPasscardable(true)) {
  8069.         updatePasscardMenu(menuitem);
  8070.     } else {
  8071.         updateDatacardMenu();
  8072.     }
  8073. }
  8074.  
  8075.  
  8076. function AddKeywordForSearchField()
  8077. {
  8078.     var node = document.popupNode;
  8079.     var ioService = Components.classes["@mozilla.org/network/io-service;1"]
  8080.                               .getService(Components.interfaces.nsIIOService);
  8081.     var uri = Components.classes["@mozilla.org/network/standard-url;1"]
  8082.                         .getService(Components.interfaces.nsIURI);
  8083.     uri.spec = node.ownerDocument.URL;
  8084.  
  8085.     var keywordURL = ioService.newURI(node.form.action, node.ownerDocument.characterSet, uri);
  8086.     var spec = keywordURL.spec;
  8087.     var postData = "";
  8088.  
  8089.     if (node.form.method.toUpperCase() == "POST" &&
  8090.     (node.form.enctype == "application/x-www-form-urlencoded" || node.form.enctype == "")) {
  8091.         for (var i = 0; i < node.form.elements.length; ++i) {
  8092.             var e = node.form.elements[i];
  8093.             if (e.type.toLowerCase() == "text" || e.type.toLowerCase() == "hidden" ||
  8094.           e instanceof HTMLTextAreaElement)
  8095.             postData += escape(e.name + "=" + (e == node ? "%s" : e.value)) + "&";
  8096.       else if (e instanceof HTMLSelectElement && e.selectedIndex >= 0)
  8097.         postData += escape(e.name + "=" + e.options[e.selectedIndex].value) + "&";
  8098.     else if ((e.type.toLowerCase() == "checkbox" ||
  8099.     e.type.toLowerCase() == "radio") && e.checked)
  8100.     postData += escape(e.name + "=" + e.value) + "&";
  8101. }
  8102. }
  8103. else {
  8104.     spec += "?" + escape(node.name) + "=%s";
  8105.     for (var i = 0; i < node.form.elements.length; ++i) {
  8106.         var e = node.form.elements[i];
  8107.         if (e == node) // avoid duplication of the target field value, which was populated above.
  8108.         continue;
  8109.  
  8110.         if (e.type.toLowerCase() == "text" || e.type.toLowerCase() == "hidden" ||
  8111.           e instanceof HTMLTextAreaElement)
  8112.         spec += "&" + escape(e.name) + "=" + escape(e.value);
  8113.       else if (e instanceof HTMLSelectElement && e.selectedIndex >= 0)
  8114.     spec += "&" + escape(e.name) + "=" + escape(e.options[e.selectedIndex].value);
  8115. else if ((e.type.toLowerCase() == "checkbox" ||
  8116. e.type.toLowerCase() == "radio") && e.checked)
  8117. spec += "&" + escape(e.name) + "=" + escape(e.value);
  8118. }
  8119. }
  8120. openDialog("chrome://browser/content/bookmarks/addBookmark2.xul", "",
  8121. "centerscreen,chrome,dialog,resizable,dependent",
  8122. "", spec, null, node.ownerDocument.characterSet, null, null,
  8123. false, "", true, postData);
  8124. }
  8125.  
  8126. // MERC - This function opens the options panel as specified by the
  8127. // optionToOpen parameter we need to setup string constants for all of these
  8128. // panels, ie WEB_FEATURES = 2 so anyone can call any panel
  8129. function openPrefs(optionToOpen) {
  8130.     // WARNING: KLUGE ALERT!!!
  8131.     gPrefService.setIntPref('browser.preferences.lastpanel', optionToOpen);
  8132.     openPreferences();
  8133. }
  8134.  
  8135. // MERC (DP): opens the site controls prefs dialog with the entry for the
  8136. // current tab selected.
  8137. function openSiteControlPrefs() {
  8138.     var url = gBrowser.currentURI.spec;
  8139.  
  8140.     // is this a controlled site?
  8141.     var controlledSite = sitecontrols.getControlledSiteFromURL(url);
  8142.     var site;
  8143.     if (!controlledSite) {
  8144.         site = sitecontrols.DEFAULT_SITE;
  8145.     } else {
  8146.         site = controlledSite;
  8147.     }
  8148.  
  8149.     gPrefService.setCharPref('browser.preferences.selectedSite', site);
  8150.     openPrefs(3);
  8151. }
  8152.  
  8153. function getTridentDocument()
  8154. {
  8155.     var hpDoc = null;
  8156.     try
  8157.     {
  8158.         hpDoc = gBrowser.contentDocument.QueryInterface(nsIHTMLPluginDocument);
  8159.     }
  8160.     catch(e) { } // Not trident
  8161.     return hpDoc;
  8162. }
  8163.  
  8164. // MERC (DP): enables/disables the "Clear Download Manager History" menu item in the
  8165. // downloads toolbar button dropdown
  8166. function updateDownloadsMenu(menu) {
  8167.     var dlMgr = Components.classes["@mozilla.org/download-manager;1"].getService(Components.interfaces.nsIDownloadManager);
  8168.  
  8169.     var clearDownloadsItem = document.getElementById('clearDownloadsHistory');
  8170.     var clearDownloadsCmd = document.getElementById('History:ClearDownloads');
  8171.  
  8172.     if(dlMgr.canCleanUp) {
  8173.         clearDownloadsItem.removeAttribute('disabled');
  8174.         clearDownloadsCmd.removeAttribute('disabled');
  8175.     } else {
  8176.         clearDownloadsItem.setAttribute('disabled', 'true');
  8177.         clearDownloadsCmd.setAttribute('disabled', 'true');
  8178.     }
  8179. }
  8180.  
  8181.  
  8182. // Clear out the specific datacards from the menu
  8183. function clearDatacardMenu() {
  8184.     var menu = document.getElementById('combinedFormFillPopup');
  8185.     if (!menu) return;
  8186.     var dcSep = document.getElementById('combinedFormFillDatacardSep');
  8187.     if (!dcSep) return;
  8188.     dcSep.setAttribute('hidden', 'true');
  8189.     var node = dcSep;
  8190.     while (node) {
  8191.         var temp = node;
  8192.         node = node.nextSibling;
  8193.         if (temp.hasAttribute('datacard'))
  8194.             menu.removeChild(temp);
  8195.     }
  8196. }
  8197.  
  8198. // MERC - JCH: Element IDs were modified to work with the 
  8199. // new combined datacard-passcard button.
  8200. function updateDatacardMenu() {
  8201.     // Grab the menu items
  8202.     var formFill = document.getElementById('combinedFillFormMenuItem');
  8203.     var formFillAndSubmit = document.getElementById('combinedFillAndSubmitMenuItem');
  8204.     var save = document.getElementById('combinedSaveMenuItem');
  8205.     // See if the current page is fillable
  8206.     var htmlFields = datacardUtils.RipFields();
  8207.     var fillable = datacardUtils.IsPageAutoFillable(
  8208.                                    gBrowser.currentURI,
  8209.                                    htmlFields,
  8210.                                    true);  // check for data
  8211.     var isBlacklisted = datacardUtils.IsSiteBlacklisted(gBrowser.currentURI);
  8212.     if (fillable) {
  8213.         if (!isBlacklisted && datacardUtils.DatacardsExist()) {
  8214.             var menu = document.getElementById('combinedFormFillPopup');
  8215.             var dcSep = document.getElementById('combinedFormFillDatacardSep');
  8216.             var pcSep = document.getElementById('combinedFormFillPasscardSep');
  8217.             formFill.removeAttribute('disabled');
  8218.             formFillAndSubmit.removeAttribute('disabled');
  8219.             dcSep.removeAttribute('hidden');
  8220.             var allDatacards = datacardUtils.GetDatacardList();
  8221.             var siteDatacard = datacardUtils.FindDatacardForURI(gBrowser.currentURI);
  8222.             for (var i = 0; i < allDatacards.length; i++) {
  8223.                 var item = document.createElement('menuitem');
  8224.                 item.setAttribute('label', allDatacards[i]);
  8225.                 item.setAttribute('type', 'checkbox');
  8226.                 item.setAttribute('tooltiptext', 'Use this datacard');
  8227.                 item.setAttribute('datacard', 'true');
  8228.                 if (allDatacards[i] == siteDatacard)
  8229.                     item.setAttribute('checked', 'true');
  8230.                 item.setAttribute('oncommand', 'datacardUtils.DoAutoFill(undefined,"'+allDatacards[i]+'");');
  8231.                 menu.insertBefore(item, pcSep);
  8232.             }
  8233.         } else {
  8234.             formFill.setAttribute('disabled','true');
  8235.             formFillAndSubmit.setAttribute('disabled','true');
  8236.         }
  8237.     } else {
  8238.         formFill.setAttribute('disabled','true');
  8239.         formFillAndSubmit.setAttribute('disabled','true');
  8240.     }
  8241.  
  8242.     // check if the user has entered any data on the page    
  8243.     var bHasData = false;
  8244.     for (var j = 0; j < htmlFields.values.length; j++) {
  8245.         if (htmlFields.values[j] != '') {
  8246.             bHasData = true;
  8247.             break;
  8248.         }
  8249.     }
  8250.  
  8251.     // enable/disable the Save Form menu option
  8252.     if (!isBlacklisted && (fillable || bHasData))
  8253.         save.removeAttribute('disabled');
  8254.     else
  8255.         save.setAttribute('disabled','true');
  8256. }
  8257.  
  8258. function datacardButton() {
  8259.     if (gPrefService.getPrefType('datacard.fillandsubmit') &&
  8260.         gPrefService.getBoolPref('datacard.fillandsubmit'))
  8261.     {
  8262.         datacardUtils.DoAutoFillAndSubmit();
  8263.     } else {
  8264.         datacardUtils.DoAutoFill();
  8265.     }
  8266. }
  8267.  
  8268.  
  8269. var gCurrentNotificationBar = null;
  8270.  
  8271. /*
  8272. JMC: Enforces order of precedence between all possible
  8273. simultaneous notification bars...
  8274. */
  8275. function displayNotificationBar(barId, extraData)
  8276. {
  8277.     dump("browser.js: Trying to show notification bar for : " + barId + "\n");
  8278.     // Simple case - no other bars
  8279.     if (!gCurrentNotificationBar) {
  8280.         showNBar(barId, extraData);
  8281.     } else if (barPriority(barId) >= barPriority(gCurrentNotificationBar)) {
  8282.         showNBar(barId, extraData);
  8283.     } else {
  8284.         dump("browser.js: Not showing it - not important enough.\n");
  8285.     }
  8286. }
  8287.  
  8288.  
  8289. function hideNotificationBar(barId, thisBrowser)
  8290. {
  8291.     if (gCurrentNotificationBar == barId) {
  8292.         thisBrowser.hideMessage(thisBrowser.selectedBrowser, "top");
  8293.         gCurrentNotificationBar = null;
  8294.     }
  8295. }
  8296.  
  8297.  
  8298. function barPriority(barId)
  8299. {
  8300.     var priority;
  8301.     switch (barId) {
  8302.     case "phishing" :
  8303.         priority = 9;
  8304.         break;
  8305.     case "spyware" :
  8306.         priority = 10;
  8307.         break;
  8308.     case "webmail" :
  8309.         priority = 1;
  8310.         break;
  8311.     case "rss" :
  8312.         priority = 2;
  8313.         break;
  8314.     case "popup" :
  8315.         priority = 3;
  8316.         break;
  8317.     case "datacard" :
  8318.         priority = 4;
  8319.         break;
  8320.     case "passcard" :
  8321.         priority = 5;
  8322.         break;
  8323.     case "xpi" :
  8324.         priority = 6;
  8325.         break;
  8326.     case "missing-plugin" :
  8327.         priority = 6;
  8328.         break;
  8329.     }
  8330.     return priority;
  8331. }
  8332.  
  8333.  
  8334. function showNBar(barId, extraData)
  8335. {
  8336.     dump("browser.js: Showing bar : " + barId + "\n");
  8337.     var browser = gBrowser.selectedBrowser;
  8338.     var tabbrowser = getBrowser();
  8339.     var bundle_browser = document.getElementById("bundle_browser");
  8340.     var brandBundle = document.getElementById("bundle_brand");
  8341.     var brandShortName = brandBundle.getString("brandShortName");
  8342.     var imgIcon = "chrome://browser/skin/Info.png";
  8343.     var message = "";
  8344.     var buttonString = "";
  8345.     var deckIdx = 0;
  8346.     var aSource;
  8347.     var aPopup;
  8348.     var aDocShell;
  8349.  
  8350.     switch (barId) {
  8351.     case "phishing" :
  8352.         // don't show bar if pref is not set
  8353.         if (!gPrefService.getBoolPref("trustsettings.showwarnings")) return;
  8354.         var siteURL = extraData[0];
  8355.         var matchingPartners = blacklistUtils.lastSitePartners.join(", ");
  8356.         message = bundle_browser.getFormattedString("phishingNotification", [siteURL.host, matchingPartners]);
  8357.         deckIdx = 3;
  8358.         break;
  8359.  
  8360.     case "spyware" :
  8361.         // don't show bar if pref is not set
  8362.         if (!gPrefService.getBoolPref("trustsettings.showwarnings")) return;
  8363.         var siteURL = extraData[0];
  8364.         var matchingPartners = blacklistUtils.lastSitePartners.join(", ");
  8365.         message = bundle_browser.getFormattedString("spywareNotification", [siteURL.host, matchingPartners]);
  8366.         deckIdx = 4;
  8367.         break;
  8368.  
  8369.     case "webmail" :
  8370.         deckIdx = 5;
  8371.         imgIcon = extraData[0];
  8372.         message = extraData[1];
  8373.         break;
  8374.  
  8375.     case "rss" :
  8376.         deckIdx = 0;
  8377.         message = bundle_browser.getFormattedString("rssWarning", [brandShortName]);
  8378.         aPopup = "blockedRSSOptions";
  8379.         imgIcon = "chrome://browser/skin/page-livemarks.png";
  8380.         break;
  8381.  
  8382.     case "popup" :
  8383.         deckIdx = 6;
  8384.         //var popupCount = gBrowser.selectedBrowser.pageReport.length;
  8385.         //if (popupCount > 1)
  8386.         //    message = bundle_browser.getFormattedString("popupWarningMultiple", [brandShortName, popupCount]);
  8387.         //else
  8388.         message = bundle_browser.getFormattedString("popupWarning", [brandShortName]);
  8389.         break;
  8390.  
  8391.     case "datacard" :
  8392.         deckIdx = 2;
  8393.         break;
  8394.  
  8395.     case "passcard" :
  8396.         deckIdx = 1;
  8397.         message = bundle_browser.getString("passcardMsg");
  8398.         imgIcon = "chrome://browser/skin/icons/passwordsm_h.png";
  8399.         break;
  8400.  
  8401.     case "xpi" :
  8402.         deckIdx = 0;
  8403.         imgIcon = "chrome://mozapps/skin/xpinstall/xpinstallItemGeneric.png";
  8404.         var messageKey = "xpinstallWarning";
  8405.         var buttonKey = "xpinstallWarningButton";
  8406.         var shell = extraData[0];
  8407.         var host = browser.docShell.QueryInterface(Components.interfaces.nsIWebNavigation).currentURI.host;
  8408.         aSource = "xpinstall-install-edit-permissions";
  8409.         if (!gPrefService.getBoolPref("xpinstall.enabled")) {
  8410.             message = bundle_browser.getFormattedString("xpinstallDisabledWarning",    [brandShortName, host]);
  8411.             buttonString = bundle_browser.getString("xpinstallDisabledWarningButton");
  8412.         }
  8413.         else {
  8414.             message = bundle_browser.getFormattedString(messageKey, [brandShortName, host]);
  8415.             buttonString = bundle_browser.getString(buttonKey);
  8416.         }
  8417.         aDocShell = shell;
  8418.         break;
  8419.  
  8420.     case "missing-plugin" :
  8421.         browser = extraData[0];
  8422.         imgIcon = "chrome://mozapps/skin/xpinstall/xpinstallItemGeneric.png";
  8423.         message = bundle_browser.getString("missingpluginsMessage.title");
  8424.         buttonString = bundle_browser.getString("missingpluginsMessage.button.label");
  8425.         aSource = "missing-plugin";
  8426.         break;
  8427.     }
  8428.  
  8429.     gBrowser.hideMessage(browser, "both");
  8430.     dump('Bar will show message : ' + message + '\n');
  8431.     gBrowser.showMessage(browser, imgIcon, message, buttonString,
  8432.                          aDocShell, aSource, aPopup, "top", true, deckIdx);
  8433.     gCurrentNotificationBar = barId;
  8434. }
  8435.  
  8436.  
  8437. // MERC - JCH
  8438. function openFormfillPrefs()
  8439. {
  8440.     gPrefService.setCharPref('browser.preferences.formfillORpasscard', 'formfilltab');
  8441.     openPrefs(5);
  8442. }
  8443.  
  8444.  
  8445. // MERC - JCH: This is called from nsHTMLPluginDocument.cpp.
  8446. function IsTridentFillable()
  8447. {
  8448.     if (blacklistUtils.IsSiteInPhishList(gBrowser.currentURI)) {
  8449.             displayNotificationBar("phishing",[gBrowser.currentURI]);
  8450.             // ShowPhishingSiteWarning();
  8451.         } else if (blacklistUtils.IsSiteInSpywareList(gBrowser.currentURI)) {
  8452.             displayNotificationBar("spyware",[gBrowser.currentURI]);
  8453.         }
  8454.         
  8455.     datacardUtils.DoPageLoadedCheck();
  8456. }
  8457.  
  8458.  
  8459. // MERC (DP): simply calls toggleDisplayEngineSiteControl() for the current tab.
  8460. // called from nsHTMLPluginDocument::ToggleEngine()
  8461. function BrowserToggleDisplayEngineSiteControl()
  8462. {
  8463.     //dump("Browser Engine Toggle : \n\n");
  8464.     //showStack();
  8465.     gBrowser.mCurrentTab.toggleDisplayEngineSiteControl();
  8466. }
  8467.  
  8468.  
  8469. function BrowserClosedByCloseButton()
  8470. {
  8471.     var webBrowserPrint = PrintUtils.getWebBrowserPrint();
  8472.     if (webBrowserPrint.doingPrintPreview) {
  8473.         // setTimeout(FinallyClose, 10);
  8474.         PrintUtils.exitPrintPreview();
  8475.     }
  8476.     else {
  8477.         FinallyClose();
  8478.     }
  8479. }
  8480.  
  8481.  
  8482. function FinallyClose()
  8483. {
  8484.     if (WindowIsClosing())
  8485.         window.close();
  8486. }
  8487.  
  8488. //Merc , SLiu
  8489. function ShowPrintErrorDialogForTrident(errorId)
  8490. {
  8491.     const bundleURL = "chrome://global/locale/printing.properties";
  8492.  
  8493.     const sbsContractID = "@mozilla.org/intl/stringbundle;1";
  8494.     const sbsIID = Components.interfaces.nsIStringBundleService;
  8495.     const sbs = Components.classes[sbsContractID].getService(sbsIID);
  8496.  
  8497.     const lsContractID = "@mozilla.org/intl/nslocaleservice;1";
  8498.     const lsIID = Components.interfaces.nsILocaleService;
  8499.     const ls = Components.classes[lsContractID].getService(lsIID);
  8500.     var appLocale = ls.getApplicationLocale();
  8501.     var strBundle = sbs.createBundle(bundleURL, appLocale);
  8502.     var titleStr=null;
  8503.     var msg=null;
  8504.     if(errorId==PRINT_PREVIEW_REQ_WHILE_TRIDENT_LOADING_ERROR)
  8505.     {
  8506.         titleStr=strBundle.GetStringFromName("printpreview_error_dialog_title");
  8507.         msg=strBundle.GetStringFromName("NS_ERROR_GFX_PRINTER_DOC_IS_BUSY_PP");
  8508.     }
  8509. else if(errorId==PRINT_REQ_WHILE_TRIDENT_LOADING_ERROR)
  8510. {
  8511.     titleStr=strBundle.GetStringFromName("print_req_error_dialog_title");
  8512.     msg=strBundle.GetStringFromName("NS_ERROR_GFX_PRINTER_DOC_IS_BUSY");
  8513. }
  8514. if(titleStr && msg)
  8515. {
  8516.     var promptSvc = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
  8517.     promptSvc.alert(null,titleStr, msg);
  8518. }
  8519. }
  8520.  
  8521. /////////////// livemark handling
  8522.  
  8523. // MERC - JCH: Receives RSS data from Trident. Called from nsHTMLPluginDocument.cpp.
  8524. function OnTridentLinkFound(href, rel, title, type, doc)
  8525. {
  8526.     var link = document.createElementNS(XHTML_NS, "link");
  8527.     link.setAttribute("href", href);
  8528.     link.setAttribute("title", title);
  8529.     link.setAttribute("type", type);
  8530.     link.setAttribute("rel", rel);
  8531.     
  8532.     var event = new Object();
  8533.     event.target = link;
  8534.     event.isTrusted = true;
  8535.     livemarkOnLinkAdded(event, doc);
  8536. }
  8537.  
  8538.  
  8539.  
  8540. // XXX this event listener can/should probably be combined with the onLinkAdded
  8541. // listener in tabbrowser.xml, which only listens for favicons and then passes
  8542. // them to onLinkIconAvailable in the ProgressListener.  We could extend the
  8543. // progress listener to have a generic onLinkAvailable and have tabbrowser pass
  8544. // along all events.  It should give us the browser for the tab, as well as
  8545. // the actual event.
  8546. // MERC - JCH: Added the extra 'doc' argument to allow Trident RSS feed data
  8547. // to display properly.
  8548. function livemarkOnLinkAdded(event, doc)
  8549. {
  8550.     dump("~~~~~~ BROWSER.JS livemarkOnLinkAdded() ~~~~~~~~\n");
  8551.  
  8552.     // dump ("Think doc is " + doc);
  8553.  
  8554.       if (!event.isTrusted)
  8555.         return;
  8556.  
  8557.     if (!gLivemarksButton)
  8558.     gLivemarksButton = document.getElementById("livemark-button");
  8559.  
  8560.     // from tabbrowser.xml
  8561.     // mechanism for reading properties of the underlying XPCOM object
  8562.     // (ignoring potential getters/setters added by malicious content)
  8563.     var safeGetProperty = function(obj, propname) {
  8564.         return Components.lookupMethod(obj, propname).call(obj);
  8565.     }
  8566.  
  8567.     var erel = event.target.rel;
  8568.     var etype = event.target.type;
  8569.     var etitle = event.target.title;
  8570.  
  8571.     // this is a blogger post service URL; so skip it
  8572.     if (erel && erel == "service.post")
  8573.     return;
  8574.  
  8575.     if (etype == "application/rss+xml" ||
  8576.     etype == "application/atom+xml" ||
  8577.     etype == "application/x.atom+xml" ||
  8578.     etitle.indexOf("RSS") != -1 ||
  8579.     etitle.indexOf("Atom") != -1 ||
  8580.     etitle.indexOf("rss") != -1)
  8581.     {
  8582.         // const targetDoc;
  8583.         var targetDoc;
  8584.         if (doc != null) {
  8585.             targetDoc = doc;
  8586.         } else {
  8587.             targetDoc = safeGetProperty(event.target, "ownerDocument");
  8588.         }
  8589.  
  8590.         // find which tab this is for, and set the attribute on the browser
  8591.         // should there be a getTabForDocument method on tabbedbrowser?
  8592.         var browserForLink = null;
  8593.         if (gBrowser.mTabbedMode) {
  8594.             var browserIndex = gBrowser.getBrowserIndexForDocument(targetDoc);
  8595.             if (browserIndex == -1) {
  8596.                 dump ("Uhoh - couldn't get browserindex for targetdoc");
  8597.                 
  8598.                 return;
  8599.             }
  8600.             browserForLink = gBrowser.getBrowserAtIndex(browserIndex);
  8601.         } else if (gBrowser.mCurrentBrowser.contentDocument == targetDoc) {
  8602.             browserForLink = gBrowser.mCurrentBrowser;
  8603.         }
  8604.         
  8605.  
  8606.         if (!browserForLink) {
  8607.             // ??? this really shouldn't happen..
  8608.             dump("Uhoh - couldn't find browserForLink");
  8609.             return;
  8610.         }
  8611.  
  8612.         var livemarkLinks = [];
  8613.         if (browserForLink.livemarkLinks != null)
  8614.             livemarkLinks = browserForLink.livemarkLinks;
  8615.  
  8616.         var wrapper = new XPCNativeWrapper(event.target, "href", "type", "title");
  8617.  
  8618.         livemarkLinks.push({ href: wrapper.href,
  8619.                              type: wrapper.type,
  8620.                              title: wrapper.title});
  8621.  
  8622.         browserForLink.livemarkLinks = livemarkLinks;
  8623.         if ((browserForLink == gBrowser || browserForLink == gBrowser.mCurrentBrowser) && gLivemarksButton)
  8624.         gLivemarksButton.setAttribute("livemarks", "true");
  8625.  
  8626.     }
  8627. }
  8628.  
  8629. // this is called both from onload and also whenever the user
  8630. // switches tabs; we update whether we show or hide the livemark
  8631. // button based on whether the window has livemarks set.
  8632. function updatePageLivemarks()
  8633. {
  8634.     // dump("~~~~~~ BROWSER.JS updatePageLivemarks() ~~~~~~~~\n");
  8635.     
  8636.     if (!gLivemarksButton)
  8637.     gLivemarksButton = document.getElementById("livemark-button");
  8638.  
  8639.     if (!gLivemarksButton)
  8640.         return;
  8641.  
  8642.     var livemarkLinks = gBrowser.mCurrentBrowser.livemarkLinks;
  8643.     if (!livemarkLinks || livemarkLinks.length == 0) {
  8644.         gLivemarksButton.removeAttribute("livemarks");
  8645.         gLivemarksButton.setAttribute("tooltiptext", gNavigatorBundle.getString("livemarkNoLivemarksTooltip"));
  8646.     } else {
  8647.         gLivemarksButton.setAttribute("livemarks", "true");
  8648.         gLivemarksButton.setAttribute("tooltiptext", gNavigatorBundle.getString("livemarkHasLivemarksTooltip"));
  8649.     }
  8650. }
  8651.  
  8652. // MERC - JCH: Called from nsHTMLPluginDocument.cpp to remove livemarks button
  8653. function wrappedUpdatePageLivemarks()
  8654. {
  8655.     // Clear livemark data
  8656.     gBrowser.mCurrentBrowser.livemarkLinks = null;
  8657.  
  8658.     updatePageLivemarks();
  8659. }
  8660.  
  8661.  
  8662. function livemarkFillPopup(menuPopup)
  8663. {
  8664.     dump("~~~~~~ BROWSER.JS livemarkFillPopup() ~~~~~~~~\n");
  8665.     var livemarkLinks = gBrowser.mCurrentBrowser.livemarkLinks;
  8666.     if (livemarkLinks == null) {
  8667.         // XXX hack -- menu opening depends on setting of an "open"
  8668.         // attribute, and the menu refuses to open if that attribute is
  8669.         // set (because it thinks it's already open).  onpopupshowing gets
  8670.         // called after the attribute is unset, and it doesn't get unset
  8671.         // if we return false.  so we unset it here; otherwise, the menu
  8672.         // refuses to work past this point.
  8673.         menuPopup.parentNode.removeAttribute("open");
  8674.         return false;
  8675.     }
  8676.  
  8677.     while (menuPopup.firstChild) {
  8678.         menuPopup.removeChild(menuPopup.firstChild);
  8679.     }
  8680.  
  8681.     for (var i = 0; i < livemarkLinks.length; i++) {
  8682.         var markinfo = livemarkLinks[i];
  8683.  
  8684.         var menuItem = document.createElement("menuitem");
  8685.         var baseTitle = markinfo.title || markinfo.href;
  8686.         var labelStr = gNavigatorBundle.getFormattedString("livemarkSubscribeTo", [baseTitle]);
  8687.         menuItem.setAttribute("label", labelStr);
  8688.         menuItem.setAttribute("data", markinfo.href);
  8689.         menuItem.setAttribute("tooltiptext", markinfo.href);
  8690.         menuPopup.appendChild(menuItem);
  8691.     }
  8692.  
  8693.     return true;
  8694. }
  8695.  
  8696. function livemarkAddMark(wincontent, data, altRef) 
  8697. {
  8698.     dump("~~~~~~ BROWSER.JS livemarkAddMark() ~~~~~~~~\n");
  8699.     var title = wincontent.document.title;
  8700.     //  BookmarksUtils.addLivemark(wincontent.document.baseURI, data, title);
  8701.     var refURI;
  8702.     if (altRef) {
  8703.         try {
  8704.             var channels = gBrowser.contentDocument.getElementsByTagName('channel');
  8705.             refURI = channels[0].getAttribute('rdf:about');
  8706.         } catch (ex) {}
  8707.     }
  8708.     if (!refURI) {
  8709.         refURI = wincontent.document.baseURI;
  8710.     }
  8711.  
  8712.     spui.addLivemark(refURI, data, title);
  8713.     reshuffleToolbars(true);
  8714. }
  8715.  
  8716. function updatePageFavIcon(aBrowser, aListener) {
  8717.     var uri = aBrowser.currentURI;
  8718.  
  8719.     if (!gBrowser.shouldLoadFavIcon(uri))
  8720.     return;
  8721.  
  8722.     // if we made it here with this null, then no <link> was found for
  8723.     // the page load.  We try to fetch a generic favicon.ico.
  8724.     if (aBrowser.mFavIconURL == null) {
  8725.         aBrowser.mFavIconURL = gBrowser.buildFavIconString(uri);
  8726. //        dump( "))      WMWMWMWMWMW===> updatePageFavIcon built default path: \""+aBrowser.mFavIconURL+"\"\n" );
  8727.         // give it to the listener as well
  8728.         // XXX - there is no listener for non-tabbed-mode: this is why
  8729.         // the urlbar has no favicon when you switch from tabbed mode to
  8730.         // non-tabbed-mode.
  8731.         if (aListener)
  8732.         aListener.mIcon = aBrowser.mFavIconURL;
  8733.     }
  8734. //    dump( "))      WMWMWMWMWMW===> updatePageFavIcon resulted in: \""+aBrowser.mFavIconURL+"\"\n" );
  8735.  
  8736.     if (aBrowser == gBrowser.mCurrentBrowser)
  8737.     PageProxySetIcon(aBrowser.mFavIconURL);
  8738.  
  8739.     if (aBrowser.mFavIconURL != null)
  8740.     BookmarksUtils.loadFavIcon(uri.spec, aBrowser.mFavIconURL);
  8741. }
  8742.  
  8743. function getUILink(item)
  8744. {
  8745.     var regionBundle = document.getElementById("bundle_browser_region");
  8746.  
  8747.     if (item == "tellAFriend")
  8748.     return regionBundle.getString("tellAFriendURL");
  8749.  
  8750.     if (item == "promote")
  8751.     return regionBundle.getString("promoteURL");
  8752.  
  8753.     return "";
  8754. }
  8755.  
  8756. function isBidiEnabled(){
  8757.     var rv = false;
  8758.  
  8759.     var systemLocale;
  8760.     try {
  8761.         var localService = Components.classes["@mozilla.org/intl/nslocaleservice;1"]
  8762.         .getService(Components.interfaces.nsILocaleService);
  8763.         systemLocale = localService.getSystemLocale().getCategory("NSILOCALE_CTYPE").substr(0,3);
  8764.     } catch (e){}
  8765.  
  8766.     rv = ( (systemLocale == "he-") || (systemLocale == "ar-") || (systemLocale == "syr") ||
  8767.     (systemLocale == "fa-") || (systemLocale == "ur-") );
  8768.  
  8769.     if (!rv) {
  8770.         // check the overriding pref
  8771.         var mPrefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  8772.         try {
  8773.             rv = mPrefs.getBoolPref("bidi.browser.ui");
  8774.         }
  8775.         catch (e){}
  8776.     }
  8777.  
  8778.     return rv;
  8779. }
  8780.  
  8781. function GetFrameDocumentsFromWindow(aWindow){
  8782.     if (aWindow.getComputedStyle(aWindow.document.body, "").direction == "ltr")
  8783.     aWindow.document.dir = "rtl";
  8784. else
  8785.     aWindow.document.dir = "ltr";
  8786.  
  8787.     for (var run = 0; run < aWindow.frames.length; run++)
  8788.     GetFrameDocumentsFromWindow(aWindow.frames[run]);
  8789. }
  8790.  
  8791. function SwitchDocumentDirection(){
  8792.     GetFrameDocumentsFromWindow(window.content);
  8793. }
  8794.  
  8795. function SwitchFocusedTextEntryDirection() {
  8796.     if (isBidiEnabled())
  8797.     {
  8798.         var focusedElement = document.commandDispatcher.focusedElement;
  8799.         if (focusedElement)
  8800.         if (window.getComputedStyle(focusedElement, "").direction == "ltr")
  8801.         focusedElement.style.direction = "rtl";
  8802.     else
  8803.         focusedElement.style.direction = "ltr";
  8804.     }
  8805. }
  8806.  
  8807.  
  8808. function missingPluginInstaller(){
  8809.     this.missingPlugins = new Object();
  8810. }
  8811.  
  8812. missingPluginInstaller.prototype.installSinglePlugin = function(aEvent){
  8813.   // Check if the event is trust-worthy.
  8814.   if (!aEvent.isTrusted) {
  8815.     return;
  8816.   }
  8817.     var tabbrowser = getBrowser();
  8818.     var missingPluginsArray = new Object;
  8819.  
  8820.     var tagMimetype;
  8821.     var pluginsPage;
  8822.   if (aEvent.target instanceof HTMLAppletElement) {
  8823.         tagMimetype = "application/x-java-vm";
  8824.   } else if (aEvent.target instanceof HTMLObjectElement) {
  8825.         tagMimetype = aEvent.target.type;
  8826.         pluginsPage = aEvent.target.getAttribute("codebase");
  8827.     } else {
  8828.         tagMimetype = aEvent.target.type;
  8829.         pluginsPage = aEvent.target.getAttribute("pluginspage");
  8830.     }
  8831.  
  8832.     missingPluginsArray[tagMimetype] = {mimetype: tagMimetype, pluginsPage: pluginsPage};
  8833.  
  8834.     if (missingPluginsArray) {
  8835.         window.openDialog("chrome://mozapps/content/plugins/pluginInstallerWizard.xul",
  8836.         "PFSWindow", "modal,chrome,resizable=yes", {plugins: missingPluginsArray, tab: tabbrowser.mCurrentTab});
  8837.     }
  8838.  
  8839.     aEvent.preventDefault();
  8840. }
  8841.  
  8842. missingPluginInstaller.prototype.newMissingPlugin = function(aEvent){
  8843.   // Check if the event is trust-worthy.
  8844.   if (!aEvent.isTrusted) {
  8845.     return;
  8846.   }
  8847.     // For broken non-object plugin tags, register a click handler so
  8848.     // that the user can click the plugin replacement to get the new
  8849.     // plugin. Object tags can, and often do, deal with that themselves,
  8850.     // so don't stomp on the page developers toes.
  8851.  
  8852.   if (!(aEvent.target instanceof HTMLObjectElement)) {
  8853.         aEvent.target.addEventListener("click",
  8854.         gMissingPluginInstaller.installSinglePlugin,
  8855.         false);
  8856.     }
  8857.  
  8858.     var tabbrowser = getBrowser();
  8859.     const browsers = tabbrowser.mPanelContainer.childNodes;
  8860.  
  8861.     var window = aEvent.target.ownerDocument.__parent__;
  8862.     // walk up till the toplevel window
  8863.     while (window.parent != window)
  8864.     window = window.parent;
  8865.  
  8866.     var i = 0;
  8867.     for (; i < browsers.length; i++) {
  8868.         if (tabbrowser.getBrowserAtIndex(i).contentWindow == window)
  8869.         break;
  8870.     }
  8871.  
  8872.     var tab = tabbrowser.mTabContainer.childNodes[i];
  8873.  
  8874.     if (!gMissingPluginInstaller.missingPlugins)
  8875.     gMissingPluginInstaller.missingPlugins = new Object();
  8876.  
  8877.     if (!gMissingPluginInstaller.missingPlugins[tab])
  8878.     gMissingPluginInstaller.missingPlugins[tab] = new Object();
  8879.  
  8880.     var tagMimetype;
  8881.     var pluginsPage;
  8882.   if (aEvent.target instanceof HTMLAppletElement) {
  8883.         tagMimetype = "application/x-java-vm";
  8884.   } else if (aEvent.target instanceof HTMLObjectElement) {
  8885.         tagMimetype = aEvent.target.type;
  8886.         pluginsPage = aEvent.target.getAttribute("codebase");
  8887.     } else {
  8888.         tagMimetype = aEvent.target.type;
  8889.         pluginsPage = aEvent.target.getAttribute("pluginspage");
  8890.     }
  8891.  
  8892.     gMissingPluginInstaller.missingPlugins[tab][tagMimetype] = {
  8893.         mimetype: tagMimetype,
  8894.         pluginsPage: pluginsPage
  8895.     };
  8896.  
  8897.         displayNotificationBar("missing-plugin", [tabbrowser.getBrowserAtIndex(i)]);
  8898. }
  8899.  
  8900. missingPluginInstaller.prototype.clearMissingPlugins = function(aTab){
  8901.     this.missingPlugins[aTab] = null;
  8902. }
  8903.  
  8904.  
  8905. missingPluginInstaller.prototype.observe = function(aSubject, aTopic, aData){
  8906.     switch (aTopic) {
  8907.         case "missing-plugin":
  8908.         // get the urls of missing plugins
  8909.         var tabbrowser = getBrowser();
  8910.         var missingPluginsArray = gMissingPluginInstaller.missingPlugins[tabbrowser.mCurrentTab];
  8911.  
  8912.         if (missingPluginsArray) {
  8913.             window.openDialog("chrome://mozapps/content/plugins/pluginInstallerWizard.xul",
  8914.             "PFSWindow", "modal,chrome,resizable=yes", {plugins: missingPluginsArray, tab: tabbrowser.mCurrentTab});
  8915.         }
  8916.         hideNotificationBar(tabbrowser, "xpi");
  8917.         // tabbrowser.hideMessage(tabbrowser.selectedBrowser, "top");
  8918.         break;
  8919.     }
  8920. }
  8921. var gMissingPluginInstaller = new missingPluginInstaller();
  8922.  
  8923. function AboutTabBrowsing() {
  8924.     var aboutPage = gPrefService.getCharPref("browser.tabs.abouturl");
  8925.  
  8926.     loadURI(aboutPage);
  8927. }
  8928.  
  8929. function AboutSiteControls() {
  8930.     var aboutPage = gPrefService.getCharPref("browser.sitecontrols.abouturl");
  8931.  
  8932.     loadURI(aboutPage);
  8933. }
  8934.  
  8935.  
  8936. function submitFormdata(fNew,fAction,fMeathod,elementList) {
  8937.     // fNew is boolean: true means open in a new tab, false means open in this tab
  8938.     // fAction is the URL for the post
  8939.     // fMeathod is "post" or "get"
  8940.     // elementList must be an Array() of element-value pairs
  8941.     //             where elementList[n].value is put into elementList[n].name input
  8942.     //                         NOTE: if elementList[n].type is defined it will be set as well
  8943.     //                               i.e. for passwords
  8944.     //initially, it puts the form onto an existing tab
  8945.     try {
  8946.         if (fNew) {
  8947.             BrowserOpenTab();
  8948.         }
  8949.         var myDoc=document.getElementById("content").selectedBrowser.contentDocument;
  8950.         var retval=document.getElementById("content").selectedBrowser;
  8951.         var body=myDoc.getElementsByTagName("body")[0];
  8952.         var myForm=myDoc.createElement("form");
  8953.         myForm.name="readyForMe";
  8954.         var newInput;
  8955.         if (!elementList || elementList.length < 1) {
  8956.             dump("submitFormdata not doing much: no elements\n");
  8957.         } else {
  8958.             for (var i = 0;i<elementList.length;i++) {
  8959.                 newInput=myDoc.createElement("input");
  8960.                 newInput.name=elementList[i].name;
  8961.                 newInput.value=elementList[i].value;
  8962.                 if (elementList[i].type) {
  8963.                     newInput.type=elementList[i].type;
  8964.                 }
  8965.                 myForm.appendChild(newInput);
  8966.                 dump("Added input name="+elementList[i].name+"\n");
  8967.             }
  8968.         }
  8969.         myForm.action=fAction;
  8970.         myForm.method=fMeathod;
  8971.         myForm.target="_self";
  8972.         body.appendChild(myForm);
  8973.         dump("submitting form\n");
  8974.         myForm.submit();
  8975.         dump("done submitPost()\n");
  8976.     } catch (ex) {
  8977.         dump("Exception in browser.js: submitFormdata\n");
  8978.         dump(ex);
  8979.     }
  8980. }
  8981.  
  8982. function webmailHandleURI(urlStr,extra) {
  8983.     webmail.debug("webmailHandleURI();");
  8984.     webmail.handleURI(urlStr);
  8985. }
  8986.  
  8987. function SetTridentCookies(cookieStr)
  8988. {
  8989. //    dump ("Setting Trident Cookies with " + cookieStr + "\n\n");
  8990.     return true;
  8991. }
  8992.  
  8993. function OpenSecurityCenter() {
  8994.     // MERC (rpaul) quick function to open security center tab of site control preferences
  8995.     var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  8996.     if (prefs)
  8997.             prefs.setCharPref("browser.sitecontrols.prefs", "prefsTab");
  8998.     
  8999.     openPrefs(3);
  9000. }