2002-10-10 21:54:02 +00:00
# - * - Mode : Java ; tab - width : 2 ; indent - tabs - mode : nil ; c - basic - offset : 2 - * -
# * * * * * BEGIN LICENSE BLOCK * * * * *
2005-02-01 17:36:54 +00:00
# Version : MPL 1.1 / GPL 2.0 / LGPL 2.1
2002-10-10 21:54:02 +00:00
#
2005-02-01 17:36:54 +00:00
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 ( the "License" ) ; you may not use this file except in compliance with
# the License . You may obtain a copy of the License at
# http : //www.mozilla.org/MPL/
2002-10-10 21:54:02 +00:00
#
# Software distributed under the License is distributed on an "AS IS" basis ,
# WITHOUT WARRANTY OF ANY KIND , either express or implied . See the License
# for the specific language governing rights and limitations under the
# License .
#
# The Original Code is mozilla . org code .
#
2005-02-01 17:36:54 +00:00
# The Initial Developer of the Original Code is
2002-10-10 21:54:02 +00:00
# Netscape Communications Corporation .
# Portions created by the Initial Developer are Copyright ( C ) 1998
# the Initial Developer . All Rights Reserved .
#
# Contributor ( s ) :
2004-11-30 08:23:02 +00:00
# Blake Ross < blake @ cs . stanford . edu >
2003-08-03 08:25:19 +00:00
# David Hyatt < hyatt @ mozilla . org >
2002-10-10 21:54:02 +00:00
# Peter Annema < disttsc @ bart . nl >
# Dean Tessman < dean _tessman @ hotmail . com >
2005-08-12 06:55:54 +00:00
# Kevin Puetz < puetzk @ iastate . edu >
2005-02-01 17:36:54 +00:00
# Ben Goodger < ben @ netscape . com >
2002-10-10 21:54:02 +00:00
# Pierre Chanial < chanial @ noos . fr >
# Jason Eager < jce2 @ po . cwru . edu >
# Joe Hewitt < hewitt @ netscape . com >
# Alec Flett < alecf @ netscape . com >
2005-02-14 19:26:50 +00:00
# Asaf Romano < mozilla . mano @ sent . com >
2005-04-26 16:55:59 +00:00
# Jason Barnabe < jason _barnabe @ fastmail . fm >
2005-07-13 18:18:47 +00:00
# Peter Parente < parente @ cs . unc . edu >
2005-07-20 19:47:09 +00:00
# Giorgio Maone < g . maone @ informaction . com >
2005-08-12 00:34:19 +00:00
# Tom Germeau < tom . germeau @ epigoon . com >
2005-08-12 06:55:54 +00:00
# Jesse Ruderman < jruderman @ gmail . com >
2006-03-07 00:52:35 +00:00
# Joe Hughes < joe @ retrovirus . com >
2006-05-06 02:37:51 +00:00
# Pamela Greene < pamg . bugs @ gmail . com >
2002-10-10 21:54:02 +00:00
#
# Alternatively , the contents of this file may be used under the terms of
2005-02-01 17:36:54 +00:00
# either the GNU General Public License Version 2 or later ( the "GPL" ) , or
2002-10-10 21:54:02 +00:00
# the GNU Lesser General Public License Version 2.1 or later ( the "LGPL" ) ,
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above . If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL , and not to allow others to
2005-02-01 17:36:54 +00:00
# use your version of this file under the terms of the MPL , indicate your
2002-10-10 21:54:02 +00:00
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL . If you do not delete
# the provisions above , a recipient may use your version of this file under
2005-02-01 17:36:54 +00:00
# the terms of any one of the MPL , the GPL or the LGPL .
2002-10-10 21:54:02 +00:00
#
# * * * * * END LICENSE BLOCK * * * * *
2002-08-04 02:53:09 +00:00
2002-10-13 05:23:24 +00:00
const NS _ERROR _MODULE _NETWORK = 2152398848 ;
const NS _NET _STATUS _READ _FROM = NS _ERROR _MODULE _NETWORK + 8 ;
const NS _NET _STATUS _WROTE _TO = NS _ERROR _MODULE _NETWORK + 9 ;
2005-06-14 10:15:58 +00:00
const kXULNS =
2003-08-08 07:44:06 +00:00
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" ;
2002-10-13 05:23:24 +00:00
2006-03-22 01:19:05 +00:00
# ifndef MOZ _PLACES
// For Places-enabled builds, this is in
// chrome://browser/content/places/controller.js
var Ci = Components . interfaces ;
var Cc = Components . classes ;
var Cr = Components . results ;
# endif
2004-11-30 08:23:02 +00:00
const nsCI = Components . interfaces ;
const nsIWebNavigation = nsCI . nsIWebNavigation ;
2002-10-13 05:23:24 +00:00
const MAX _HISTORY _MENU _ITEMS = 15 ;
2004-11-30 08:23:02 +00:00
2005-04-21 09:29:59 +00:00
// bookmark dialog features
# ifdef XP _MACOSX
const BROWSER _ADD _BM _FEATURES = "centerscreen,chrome,dialog,resizable,modal" ;
# else
const BROWSER _ADD _BM _FEATURES = "centerscreen,chrome,dialog,resizable,dependent" ;
# endif
2006-04-27 00:24:12 +00:00
const TYPE _MAYBE _FEED = "application/vnd.mozilla.maybe.feed" ;
const TYPE _XUL = "application/vnd.mozilla.xul+xml" ;
2005-08-23 16:38:28 +00:00
var gBrowserGlue = Components . classes [ "@mozilla.org/browser/browserglue;1" ]
. getService ( nsCI . nsIBrowserGlue ) ;
2002-10-13 05:23:24 +00:00
var gRDF = null ;
var gGlobalHistory = null ;
var gURIFixup = null ;
2004-11-30 08:23:02 +00:00
var gPageStyleButton = null ;
2002-10-13 16:39:47 +00:00
var gCharsetMenu = null ;
var gLastBrowserCharset = null ;
2002-10-13 22:22:38 +00:00
var gPrevCharset = null ;
2002-08-04 02:53:09 +00:00
var gURLBar = null ;
var gProxyButton = null ;
var gProxyFavIcon = null ;
var gProxyDeck = null ;
2002-11-08 04:50:05 +00:00
var gNavigatorBundle = null ;
var gIsLoadingBlank = false ;
2002-08-04 02:53:09 +00:00
var gLastValidURLStr = "" ;
var gLastValidURL = null ;
var gHaveUpdatedToolbarState = false ;
2004-01-18 06:20:54 +00:00
var gClickSelectsAll = false ;
2002-09-28 22:55:58 +00:00
var gMustLoadSidebar = false ;
2002-10-09 09:15:21 +00:00
var gProgressMeterPanel = null ;
var gProgressCollapseTimer = null ;
2002-09-18 20:11:30 +00:00
var gPrefService = null ;
2002-08-04 02:53:09 +00:00
var appCore = null ;
var gBrowser = null ;
2004-11-30 08:23:02 +00:00
var gSidebarCommand = "" ;
2002-08-04 02:53:09 +00:00
// Global variable that holds the nsContextMenu instance.
var gContextMenu = null ;
var gChromeState = null ; // chrome state before we went into print preview
2003-12-31 22:02:03 +00:00
2005-02-25 09:07:58 +00:00
var gSanitizeListener = null ;
2003-12-31 22:02:03 +00:00
var gFormFillPrefListener = null ;
2002-09-29 20:06:57 +00:00
var gFormHistory = null ;
2003-02-01 09:13:33 +00:00
var gFormFillEnabled = true ;
2002-08-04 02:53:09 +00:00
2004-05-05 23:24:45 +00:00
var gURLBarAutoFillPrefListener = null ;
2005-02-14 19:26:50 +00:00
var gAutoHideTabbarPrefListener = null ;
2004-05-05 23:24:45 +00:00
2006-04-20 22:35:06 +00:00
# ifdef XP _MACOSX
var gClickAndHoldTimer = null ;
# endif
2002-08-04 02:53:09 +00:00
/ * *
* We can avoid adding multiple load event listeners and save some time by adding
* one listener that calls all real handlers .
* /
2005-06-15 23:52:46 +00:00
function pageShowEventHandlers ( event )
2002-08-04 02:53:09 +00:00
{
// Filter out events that are not about the document load we are interested in
2005-01-28 16:06:56 +00:00
if ( event . originalTarget == content . document ) {
2002-08-04 02:53:09 +00:00
checkForDirectoryListing ( ) ;
2002-10-13 16:39:47 +00:00
charsetLoadListener ( event ) ;
2006-03-09 02:08:45 +00:00
XULBrowserWindow . asyncUpdateUI ( ) ;
2002-08-04 02:53:09 +00:00
}
2004-07-29 23:49:31 +00:00
2004-08-17 22:36:43 +00:00
// some event handlers want to be told what the original browser/listener is
2004-07-29 23:49:31 +00:00
var targetBrowser = null ;
if ( gBrowser . mTabbedMode ) {
2004-11-30 08:23:02 +00:00
var targetBrowserIndex = gBrowser . getBrowserIndexForDocument ( event . originalTarget ) ;
if ( targetBrowserIndex == - 1 )
return ;
targetBrowser = gBrowser . getBrowserAtIndex ( targetBrowserIndex ) ;
} else {
2004-07-29 23:49:31 +00:00
targetBrowser = gBrowser . mCurrentBrowser ;
}
2005-12-16 08:32:28 +00:00
# ifndef MOZ _PLACES
2004-11-30 08:23:02 +00:00
// update the last visited date
if ( targetBrowser . currentURI . spec )
BMSVC . updateLastVisitedDate ( targetBrowser . currentURI . spec ,
targetBrowser . contentDocument . characterSet ) ;
2005-12-16 08:32:28 +00:00
# endif
2002-08-04 02:53:09 +00:00
}
/ * *
* Determine whether or not the content area is displaying a page with frames ,
* and if so , toggle the display of the 'save frame as' menu item .
* * /
function getContentAreaFrameCount ( )
{
2002-08-10 02:58:38 +00:00
var saveFrameItem = document . getElementById ( "menu_saveFrame" ) ;
2005-02-16 23:58:35 +00:00
if ( ! content || ! content . frames . length || ! isContentFrame ( document . commandDispatcher . focusedWindow ) )
2002-08-04 02:53:09 +00:00
saveFrameItem . setAttribute ( "hidden" , "true" ) ;
else
saveFrameItem . removeAttribute ( "hidden" ) ;
}
function UpdateBackForwardButtons ( )
{
2002-08-09 01:41:39 +00:00
var backBroadcaster = document . getElementById ( "Browser:Back" ) ;
var forwardBroadcaster = document . getElementById ( "Browser:Forward" ) ;
2005-06-14 10:15:58 +00:00
2002-11-16 17:14:12 +00:00
var webNavigation = gBrowser . webNavigation ;
2002-08-04 02:53:09 +00:00
// Avoid setting attributes on broadcasters if the value hasn't changed!
// Remember, guys, setting attributes on elements is expensive! They
// get inherited into anonymous content, broadcast to other widgets, etc.!
// Don't do it if the value hasn't changed! - dwh
2002-11-09 01:21:19 +00:00
var backDisabled = backBroadcaster . hasAttribute ( "disabled" ) ;
var forwardDisabled = forwardBroadcaster . hasAttribute ( "disabled" ) ;
if ( backDisabled == webNavigation . canGoBack ) {
if ( backDisabled )
backBroadcaster . removeAttribute ( "disabled" ) ;
else
backBroadcaster . setAttribute ( "disabled" , true ) ;
2002-08-04 02:53:09 +00:00
}
2005-06-14 10:15:58 +00:00
2002-11-09 01:21:19 +00:00
if ( forwardDisabled == webNavigation . canGoForward ) {
if ( forwardDisabled )
forwardBroadcaster . removeAttribute ( "disabled" ) ;
else
forwardBroadcaster . setAttribute ( "disabled" , true ) ;
2002-08-04 02:53:09 +00:00
}
}
2006-04-20 22:35:06 +00:00
# ifdef XP _MACOSX
/ * *
* Click - and - Hold implementation for the Back and Forward buttons
* XXXmano : should this live in toolbarbutton . xml ?
* /
function ClickAndHoldMouseDownCallback ( aButton )
{
aButton . open = true ;
gClickAndHoldTimer = null ;
}
function ClickAndHoldMouseDown ( aEvent )
{
2006-05-30 14:10:32 +00:00
if ( aEvent . button != 0 || aEvent . target . getAttribute ( "anonid" ) != "button" )
2006-04-20 22:35:06 +00:00
return ;
2006-05-30 14:10:32 +00:00
// relying on button.xml#menu-button-base internals for improved theme compatibility
var button = aEvent . target . _menubuttonParent ;
2006-04-20 22:35:06 +00:00
if ( ! button . disabled )
gClickAndHoldTimer = setTimeout ( ClickAndHoldMouseDownCallback , 500 , button ) ;
}
function MayStopClickAndHoldTimer ( aEvent )
{
// Note passing null here is a no-op
clearTimeout ( gClickAndHoldTimer ) ;
}
2006-05-30 14:10:32 +00:00
function ClickAndHoldStopEvent ( aEvent )
{
if ( aEvent . target . _menubuttonParent . open )
aEvent . stopPropagation ( ) ;
}
2006-04-20 22:35:06 +00:00
function SetClickAndHoldHandlers ( )
{
function _addClickAndHoldListenersOnElement ( aElm )
{
aElm . addEventListener ( "mousedown" ,
ClickAndHoldMouseDown ,
false ) ;
aElm . addEventListener ( "mouseup" ,
MayStopClickAndHoldTimer ,
false ) ;
aElm . addEventListener ( "mouseout" ,
MayStopClickAndHoldTimer ,
false ) ;
2006-05-30 14:10:32 +00:00
// don't propagate onclick and oncommand events after
// click-and-hold opened the drop-down menu
aElm . addEventListener ( "command" ,
ClickAndHoldStopEvent ,
false ) ;
aElm . addEventListener ( "click" ,
ClickAndHoldStopEvent ,
false ) ;
2006-04-20 22:35:06 +00:00
}
// The click-and-hold area does not include the dropmarkers of the buttons
var backButton = document . getAnonymousElementByAttribute
( document . getElementById ( "back-button" ) , "anonid" , "button" ) ;
2006-05-30 14:10:32 +00:00
if ( backButton )
_addClickAndHoldListenersOnElement ( backButton ) ;
2006-04-20 22:35:06 +00:00
var forwardButton = document . getAnonymousElementByAttribute
( document . getElementById ( "forward-button" ) , "anonid" , "button" ) ;
2006-05-30 14:10:32 +00:00
if ( forwardButton )
_addClickAndHoldListenersOnElement ( forwardButton ) ;
2006-04-20 22:35:06 +00:00
}
# endif
2006-03-09 02:08:45 +00:00
# ifndef MOZ _PLACES
2005-08-12 00:42:16 +00:00
function UpdateBookmarkAllTabsMenuitem ( )
{
var tabbrowser = getBrowser ( ) ;
2005-08-29 22:09:37 +00:00
var numTabs = 0 ;
if ( tabbrowser )
numTabs = tabbrowser . tabContainer . childNodes . length ;
2005-08-12 00:42:16 +00:00
var bookmarkAllCommand = document . getElementById ( "Browser:BookmarkAllTabs" ) ;
if ( numTabs > 1 )
bookmarkAllCommand . removeAttribute ( "disabled" ) ;
else
bookmarkAllCommand . setAttribute ( "disabled" , "true" ) ;
}
function addBookmarkMenuitems ( )
{
var tabbrowser = getBrowser ( ) ;
var tabMenu = document . getAnonymousElementByAttribute ( tabbrowser , "anonid" , "tabContextMenu" ) ;
var bookmarkAllTabsItem = document . createElement ( "menuitem" ) ;
bookmarkAllTabsItem . setAttribute ( "label" , gNavigatorBundle . getString ( "bookmarkAllTabs_label" ) ) ;
bookmarkAllTabsItem . setAttribute ( "accesskey" , gNavigatorBundle . getString ( "bookmarkAllTabs_accesskey" ) ) ;
bookmarkAllTabsItem . setAttribute ( "command" , "Browser:BookmarkAllTabs" ) ;
2005-08-29 22:09:37 +00:00
// set up the bookmarkAllTabs menu item correctly when the menu popup is shown
tabMenu . addEventListener ( "popupshowing" , UpdateBookmarkAllTabsMenuitem , false ) ;
2005-08-12 00:42:16 +00:00
var bookmarkCurTabItem = document . createElement ( "menuitem" ) ;
bookmarkCurTabItem . setAttribute ( "label" , gNavigatorBundle . getString ( "bookmarkCurTab_label" ) ) ;
bookmarkCurTabItem . setAttribute ( "accesskey" , gNavigatorBundle . getString ( "bookmarkCurTab_accesskey" ) ) ;
2005-08-15 23:44:17 +00:00
bookmarkCurTabItem . setAttribute ( "oncommand" , "BookmarkThisTab();" ) ;
2005-08-12 00:42:16 +00:00
var menuseparator = document . createElement ( "menuseparator" ) ;
var insertPos = tabMenu . lastChild . previousSibling ;
tabMenu . insertBefore ( bookmarkAllTabsItem , insertPos ) ;
tabMenu . insertBefore ( bookmarkCurTabItem , bookmarkAllTabsItem ) ;
tabMenu . insertBefore ( menuseparator , bookmarkCurTabItem ) ;
}
2005-08-15 23:44:17 +00:00
function BookmarkThisTab ( )
{
var tab = getBrowser ( ) . mContextTab ;
if ( tab . localName != "tab" )
tab = getBrowser ( ) . mCurrentTab ;
addBookmarkAs ( tab . linkedBrowser , false ) ;
}
2006-03-09 02:08:45 +00:00
# endif
2005-08-15 23:44:17 +00:00
2004-11-30 08:23:02 +00:00
const gSessionHistoryObserver = {
observe : function ( subject , topic , data )
{
if ( topic != "browser:purge-session-history" )
return ;
2002-10-08 23:14:45 +00:00
2004-11-30 08:23:02 +00:00
var backCommand = document . getElementById ( "Browser:Back" ) ;
backCommand . setAttribute ( "disabled" , "true" ) ;
var fwdCommand = document . getElementById ( "Browser:Forward" ) ;
fwdCommand . setAttribute ( "disabled" , "true" ) ;
2006-02-01 15:22:15 +00:00
//Clear undo history of all URL Bars
var windowManager = Components . classes [ '@mozilla.org/appshell/window-mediator;1' ] . getService ( ) ;
var windowManagerInterface = windowManager . QueryInterface ( Components . interfaces . nsIWindowMediator ) ;
var windows = windowManagerInterface . getEnumerator ( "navigator:browser" ) ;
while ( windows . hasMoreElements ( ) ) {
var urlBar = windows . getNext ( ) . gURLBar ;
if ( urlBar ) {
urlBar . editor . enableUndo ( false ) ;
urlBar . editor . enableUndo ( true ) ;
}
}
2004-11-30 08:23:02 +00:00
}
} ;
2002-10-09 01:41:08 +00:00
2005-08-12 00:34:19 +00:00
/ * *
* Given a starting docshell and a URI to look up , find the docshell the URI
* is loaded in .
* @ param aDocument
* A document to find instead of using just a URI - this is more specific .
* @ param aDocShell
* The doc shell to start at
* @ param aSoughtURI
* The URI that we ' re looking for
* @ returns The doc shell that the sought URI is loaded in . Can be in
* subframes .
* /
function findChildShell ( aDocument , aDocShell , aSoughtURI ) {
aDocShell . QueryInterface ( Components . interfaces . nsIWebNavigation ) ;
aDocShell . QueryInterface ( Components . interfaces . nsIInterfaceRequestor ) ;
var doc = aDocShell . getInterface ( Components . interfaces . nsIDOMDocument ) ;
2005-08-25 16:40:42 +00:00
if ( ( aDocument && doc == aDocument ) ||
( aSoughtURI && aSoughtURI . spec == aDocShell . currentURI . spec ) )
2005-08-12 00:34:19 +00:00
return aDocShell ;
var node = aDocShell . QueryInterface ( Components . interfaces . nsIDocShellTreeNode ) ;
for ( var i = 0 ; i < node . childCount ; ++ i ) {
var docShell = node . getChildAt ( i ) ;
docShell = findChildShell ( aDocument , docShell , aSoughtURI ) ;
if ( docShell )
return docShell ;
}
return null ;
}
2004-11-30 08:23:02 +00:00
const gPopupBlockerObserver = {
_reportButton : null ,
_kIPM : Components . interfaces . nsIPermissionManager ,
2005-06-14 10:15:58 +00:00
2004-11-30 08:23:02 +00:00
onUpdatePageReport : function ( )
{
2005-06-14 10:15:58 +00:00
if ( ! this . _reportButton )
2004-11-30 08:23:02 +00:00
this . _reportButton = document . getElementById ( "page-report-button" ) ;
2005-06-14 10:15:58 +00:00
2004-11-30 08:23:02 +00:00
if ( gBrowser . selectedBrowser . pageReport ) {
this . _reportButton . setAttribute ( "blocked" , "true" ) ;
2005-08-27 17:19:08 +00:00
if ( ! gPrefService )
gPrefService = Components . classes [ "@mozilla.org/preferences-service;1" ]
. getService ( Components . interfaces . nsIPrefBranch ) ;
if ( gPrefService . getBoolPref ( "privacy.popups.showBrowserMessage" ) ) {
2004-11-30 08:23:02 +00:00
var bundle _browser = document . getElementById ( "bundle_browser" ) ;
var brandBundle = document . getElementById ( "bundle_brand" ) ;
var brandShortName = brandBundle . getString ( "brandShortName" ) ;
var message ;
var popupCount = gBrowser . selectedBrowser . pageReport . length ;
2005-06-07 20:16:29 +00:00
# ifdef XP _WIN
2005-04-28 17:28:00 +00:00
var popupButtonText = bundle _browser . getString ( "popupWarningButton" ) ;
2005-07-13 18:18:47 +00:00
var popupButtonAccesskey = bundle _browser . getString ( "popupWarningButton.accesskey" ) ;
2005-06-07 20:16:29 +00:00
# else
var popupButtonText = bundle _browser . getString ( "popupWarningButtonUnix" ) ;
2005-07-13 18:18:47 +00:00
var popupButtonAccesskey = bundle _browser . getString ( "popupWarningButtonUnix.accesskey" ) ;
2005-06-07 20:16:29 +00:00
# endif
2005-06-14 10:15:58 +00:00
if ( popupCount > 1 )
2004-11-30 08:23:02 +00:00
message = bundle _browser . getFormattedString ( "popupWarningMultiple" , [ brandShortName , popupCount ] ) ;
else
message = bundle _browser . getFormattedString ( "popupWarning" , [ brandShortName ] ) ;
2005-04-28 17:28:00 +00:00
2006-04-19 20:50:25 +00:00
var notificationBox = gBrowser . getNotificationBox ( ) ;
var notification = notificationBox . getNotificationWithValue ( "popup-blocked" ) ;
if ( notification ) {
notification . label = message ;
}
else {
var buttons = [ {
label : popupButtonText ,
accessKey : popupButtonAccesskey ,
popup : "blockedPopupOptions" ,
callback : null
} ] ;
const priority = notificationBox . PRIORITY _WARNING _MEDIUM ;
notificationBox . appendNotification ( message , "popup-blocked" ,
"chrome://browser/skin/Info.png" ,
priority , buttons ) ;
}
2004-11-30 08:23:02 +00:00
}
2002-10-09 01:26:47 +00:00
}
2004-11-30 08:23:02 +00:00
else
this . _reportButton . removeAttribute ( "blocked" ) ;
} ,
2005-06-14 10:15:58 +00:00
2004-11-30 08:23:02 +00:00
toggleAllowPopupsForSite : function ( aEvent )
{
var currentURI = gBrowser . selectedBrowser . webNavigation . currentURI ;
var pm = Components . classes [ "@mozilla.org/permissionmanager;1" ]
. getService ( this . _kIPM ) ;
var shouldBlock = aEvent . target . getAttribute ( "block" ) == "true" ;
var perm = shouldBlock ? this . _kIPM . DENY _ACTION : this . _kIPM . ALLOW _ACTION ;
pm . add ( currentURI , "popup" , perm ) ;
2005-06-14 10:15:58 +00:00
2006-04-19 20:50:25 +00:00
gBrowser . getNotificationBox ( ) . removeCurrentNotification ( ) ;
2004-11-30 08:23:02 +00:00
} ,
2005-06-14 10:15:58 +00:00
2004-11-30 08:23:02 +00:00
fillPopupList : function ( aEvent )
{
var bundle _browser = document . getElementById ( "bundle_browser" ) ;
// XXXben - rather than using |currentURI| here, which breaks down on multi-framed sites
// we should really walk the pageReport and create a list of "allow for <host>"
// menuitems for the common subset of hosts present in the report, this will
// make us frame-safe.
var uri = gBrowser . selectedBrowser . webNavigation . currentURI ;
var blockedPopupAllowSite = document . getElementById ( "blockedPopupAllowSite" ) ;
try {
blockedPopupAllowSite . removeAttribute ( "hidden" ) ;
2005-06-14 10:15:58 +00:00
2004-11-30 08:23:02 +00:00
var pm = Components . classes [ "@mozilla.org/permissionmanager;1" ]
. getService ( this . _kIPM ) ;
if ( pm . testPermission ( uri , "popup" ) == this . _kIPM . ALLOW _ACTION ) {
// Offer an item to block popups for this site, if a whitelist entry exists
// already for it.
var blockString = bundle _browser . getFormattedString ( "popupBlock" , [ uri . host ] ) ;
blockedPopupAllowSite . setAttribute ( "label" , blockString ) ;
blockedPopupAllowSite . setAttribute ( "block" , "true" ) ;
}
else {
// Offer an item to allow popups for this site
var allowString = bundle _browser . getFormattedString ( "popupAllow" , [ uri . host ] ) ;
blockedPopupAllowSite . setAttribute ( "label" , allowString ) ;
blockedPopupAllowSite . removeAttribute ( "block" ) ;
}
}
catch ( e ) {
blockedPopupAllowSite . setAttribute ( "hidden" , "true" ) ;
}
2005-06-14 10:15:58 +00:00
2004-11-30 08:23:02 +00:00
var item = aEvent . target . lastChild ;
while ( item && item . getAttribute ( "observes" ) != "blockedPopupsSeparator" ) {
var next = item . previousSibling ;
item . parentNode . removeChild ( item ) ;
item = next ;
}
2006-03-28 02:16:06 +00:00
var foundUsablePopupURI = false ;
2004-11-30 08:23:02 +00:00
var pageReport = gBrowser . selectedBrowser . pageReport ;
2006-03-28 02:16:06 +00:00
if ( pageReport ) {
2004-11-30 08:23:02 +00:00
for ( var i = 0 ; i < pageReport . length ; ++ i ) {
var popupURIspec = pageReport [ i ] . popupWindowURI . spec ;
2006-03-28 02:16:06 +00:00
// Sometimes the popup URI that we get back from the pageReport
// isn't useful (for instance, netscape.com's popup URI ends up
// being "http://www.netscape.com", which isn't really the URI of
// the popup they're trying to show). This isn't going to be
// useful to the user, so we won't create a menu item for it.
2004-11-30 08:23:02 +00:00
if ( popupURIspec == "" || popupURIspec == "about:blank" ||
popupURIspec == uri . spec )
continue ;
2006-03-28 02:16:06 +00:00
// Because of the short-circuit above, we may end up in a situation
// in which we don't have any usable popup addresses to show in
// the menu, and therefore we shouldn't show the separator. However,
// since we got past the short-circuit, we must've found at least
// one usable popup URI and thus we'll turn on the separator later.
foundUsablePopupURI = true ;
2004-11-30 08:23:02 +00:00
var menuitem = document . createElement ( "menuitem" ) ;
2005-06-14 10:15:58 +00:00
var label = bundle _browser . getFormattedString ( "popupShowPopupPrefix" ,
2004-11-30 08:23:02 +00:00
[ popupURIspec ] ) ;
menuitem . setAttribute ( "label" , label ) ;
menuitem . setAttribute ( "requestingWindowURI" , pageReport [ i ] . requestingWindowURI . spec ) ;
menuitem . setAttribute ( "popupWindowURI" , popupURIspec ) ;
menuitem . setAttribute ( "popupWindowFeatures" , pageReport [ i ] . popupWindowFeatures ) ;
2006-01-31 20:27:20 +00:00
# ifndef MOZILLA _1 _8 _BRANCH
# bug 314700
2005-12-28 00:39:10 +00:00
menuitem . setAttribute ( "popupWindowName" , pageReport [ i ] . popupWindowName ) ;
2006-01-31 20:27:20 +00:00
# endif
2004-11-30 08:23:02 +00:00
menuitem . setAttribute ( "oncommand" , "gPopupBlockerObserver.showBlockedPopup(event);" ) ;
aEvent . target . appendChild ( menuitem ) ;
}
}
2006-03-28 02:16:06 +00:00
// Show or hide the separator, depending on whether we added any
// showable popup addresses to the menu.
var blockedPopupsSeparator =
document . getElementById ( "blockedPopupsSeparator" ) ;
if ( foundUsablePopupURI )
blockedPopupsSeparator . removeAttribute ( "hidden" ) ;
else
blockedPopupsSeparator . setAttribute ( "hidden" , true ) ;
2005-06-14 10:15:58 +00:00
2004-11-30 08:23:02 +00:00
var blockedPopupDontShowMessage = document . getElementById ( "blockedPopupDontShowMessage" ) ;
var showMessage = gPrefService . getBoolPref ( "privacy.popups.showBrowserMessage" ) ;
blockedPopupDontShowMessage . setAttribute ( "checked" , ! showMessage ) ;
if ( aEvent . target . localName == "popup" )
blockedPopupDontShowMessage . setAttribute ( "label" , bundle _browser . getString ( "popupWarningDontShowFromMessage" ) ) ;
else
blockedPopupDontShowMessage . setAttribute ( "label" , bundle _browser . getString ( "popupWarningDontShowFromStatusbar" ) ) ;
} ,
2005-06-14 10:15:58 +00:00
2004-11-30 08:23:02 +00:00
showBlockedPopup : function ( aEvent )
2004-01-17 22:41:38 +00:00
{
2005-02-28 23:09:24 +00:00
var requestingWindow = aEvent . target . getAttribute ( "requestingWindowURI" ) ;
2005-06-14 10:15:58 +00:00
var requestingWindowURI =
2005-02-28 23:09:24 +00:00
Components . classes [ "@mozilla.org/network/io-service;1" ]
. getService ( Components . interfaces . nsIIOService )
. newURI ( requestingWindow , null , null ) ;
2004-11-30 08:23:02 +00:00
var popupWindowURI = aEvent . target . getAttribute ( "popupWindowURI" ) ;
var features = aEvent . target . getAttribute ( "popupWindowFeatures" ) ;
2006-01-31 20:27:20 +00:00
# ifndef MOZILLA _1 _8 _BRANCH
# bug 314700
2005-12-28 00:39:10 +00:00
var name = aEvent . target . getAttribute ( "popupWindowName" ) ;
2006-01-31 20:27:20 +00:00
# endif
2005-06-14 10:15:58 +00:00
2005-08-12 00:34:19 +00:00
var shell = findChildShell ( null , gBrowser . selectedBrowser . docShell ,
requestingWindowURI ) ;
2004-11-30 08:23:02 +00:00
if ( shell ) {
var ifr = shell . QueryInterface ( Components . interfaces . nsIInterfaceRequestor ) ;
var dwi = ifr . getInterface ( Components . interfaces . nsIDOMWindowInternal ) ;
2006-01-31 20:27:20 +00:00
# ifdef MOZILLA _1 _8 _BRANCH
# bug 314700
dwi . open ( popupWindowURI , "" , features ) ;
# else
2005-12-28 00:39:10 +00:00
dwi . open ( popupWindowURI , name , features ) ;
2006-01-31 20:27:20 +00:00
# endif
2004-11-30 08:23:02 +00:00
}
} ,
2005-06-14 10:15:58 +00:00
2004-11-30 08:23:02 +00:00
editPopupSettings : function ( )
{
var host = "" ;
try {
var uri = gBrowser . selectedBrowser . webNavigation . currentURI ;
host = uri . host ;
}
2005-06-14 10:15:58 +00:00
catch ( e ) { }
2004-11-30 08:23:02 +00:00
2005-02-25 09:07:58 +00:00
var bundlePreferences = document . getElementById ( "bundle_preferences" ) ;
2005-06-14 10:15:58 +00:00
var params = { blockVisible : false ,
sessionVisible : false ,
allowVisible : true ,
prefilledHost : host ,
2005-02-25 09:07:58 +00:00
permissionType : "popup" ,
windowTitle : bundlePreferences . getString ( "popuppermissionstitle" ) ,
introText : bundlePreferences . getString ( "popuppermissionstext" ) } ;
2004-11-30 08:23:02 +00:00
var wm = Components . classes [ "@mozilla.org/appshell/window-mediator;1" ]
. getService ( Components . interfaces . nsIWindowMediator ) ;
2005-02-25 09:07:58 +00:00
var existingWindow = wm . getMostRecentWindow ( "Browser:Permissions" ) ;
2004-11-30 08:23:02 +00:00
if ( existingWindow ) {
2005-02-25 09:07:58 +00:00
existingWindow . initWithParams ( params ) ;
2004-11-30 08:23:02 +00:00
existingWindow . focus ( ) ;
}
2005-02-25 09:07:58 +00:00
else
window . openDialog ( "chrome://browser/content/preferences/permissions.xul" ,
"_blank" , "resizable,dialog=no,centerscreen" , params ) ;
2004-11-30 08:23:02 +00:00
} ,
2005-06-14 10:15:58 +00:00
2004-11-30 08:23:02 +00:00
dontShowMessage : function ( )
{
var showMessage = gPrefService . getBoolPref ( "privacy.popups.showBrowserMessage" ) ;
var firstTime = gPrefService . getBoolPref ( "privacy.popups.firstTime" ) ;
2005-06-14 10:15:58 +00:00
// If the info message is showing at the top of the window, and the user has never
2004-11-30 08:23:02 +00:00
// hidden the message before, show an info box telling the user where the info
2005-06-14 10:15:58 +00:00
// will be displayed.
2004-11-30 08:23:02 +00:00
if ( showMessage && firstTime )
this . _displayPageReportFirstTime ( ) ;
gPrefService . setBoolPref ( "privacy.popups.showBrowserMessage" , ! showMessage ) ;
2006-04-19 20:50:25 +00:00
gBrowser . getNotificationBox ( ) . removeCurrentNotification ( ) ;
2004-11-30 08:23:02 +00:00
} ,
2002-10-08 19:08:57 +00:00
2004-11-30 08:23:02 +00:00
_displayPageReportFirstTime : function ( )
{
window . openDialog ( "chrome://browser/content/pageReportFirstTime.xul" , "_blank" ,
"dependent" ) ;
2004-01-17 22:41:38 +00:00
}
} ;
2004-11-30 08:23:02 +00:00
const gXPInstallObserver = {
2005-08-25 16:40:42 +00:00
_findChildShell : function ( aDocShell , aSoughtShell )
{
if ( aDocShell == aSoughtShell )
return aDocShell ;
var node = aDocShell . QueryInterface ( Components . interfaces . nsIDocShellTreeNode ) ;
for ( var i = 0 ; i < node . childCount ; ++ i ) {
var docShell = node . getChildAt ( i ) ;
docShell = this . _findChildShell ( docShell , aSoughtShell ) ;
if ( docShell == aSoughtShell )
return docShell ;
}
return null ;
} ,
2005-06-14 10:15:58 +00:00
_getBrowser : function ( aDocShell )
2004-11-30 08:23:02 +00:00
{
var tabbrowser = getBrowser ( ) ;
for ( var i = 0 ; i < tabbrowser . browsers . length ; ++ i ) {
var browser = tabbrowser . getBrowserAtIndex ( i ) ;
2005-08-25 16:40:42 +00:00
if ( this . _findChildShell ( browser . docShell , aDocShell ) )
2004-11-30 08:23:02 +00:00
return browser ;
}
return null ;
} ,
2004-02-21 07:02:53 +00:00
2004-11-30 08:23:02 +00:00
observe : function ( aSubject , aTopic , aData )
{
var brandBundle = document . getElementById ( "bundle_brand" ) ;
var browserBundle = document . getElementById ( "bundle_browser" ) ;
2005-12-27 18:39:18 +00:00
var browser , webNav , wm ;
2004-11-30 08:23:02 +00:00
switch ( aTopic ) {
case "xpinstall-install-blocked" :
var shell = aSubject . QueryInterface ( Components . interfaces . nsIDocShell ) ;
2005-04-03 15:41:20 +00:00
browser = this . _getBrowser ( shell ) ;
2004-11-30 08:23:02 +00:00
if ( browser ) {
var host = browser . docShell . QueryInterface ( Components . interfaces . nsIWebNavigation ) . currentURI . host ;
var brandShortName = brandBundle . getString ( "brandShortName" ) ;
2006-04-19 20:50:25 +00:00
var notificationName , messageString , buttons ;
2004-11-30 08:23:02 +00:00
if ( ! gPrefService . getBoolPref ( "xpinstall.enabled" ) ) {
2006-04-19 20:50:25 +00:00
notificationName = "xpinstall-disabled"
2006-04-04 21:54:33 +00:00
if ( gPrefService . prefIsLocked ( "xpinstall.enabled" ) ) {
messageString = browserBundle . getString ( "xpinstallDisabledMessageLocked" ) ;
2006-04-19 20:50:25 +00:00
buttons = [ ] ;
2006-04-04 21:54:33 +00:00
}
else {
2006-04-19 20:50:25 +00:00
messageString = browserBundle . getFormattedString ( "xpinstallDisabledMessage" ,
[ brandShortName , host ] ) ;
buttons = [ {
label : browserBundle . getString ( "xpinstallDisabledButton" ) ,
accessKey : browserBundle . getString ( "xpinstallDisabledButton.accesskey" ) ,
popup : null ,
callback : function editPrefs ( ) {
gPrefService . setBoolPref ( "xpinstall.enabled" , true ) ;
return false ;
}
} ] ;
2006-04-04 21:54:33 +00:00
}
2004-11-30 08:23:02 +00:00
}
2005-06-14 10:15:58 +00:00
else {
2006-04-19 20:50:25 +00:00
// XXXben - use regular software install warnings for now until we can
// properly differentiate themes. It's likely in fact that themes won't
// be blocked so this code path will only be reached for extensions.
notificationName = "xpinstall"
2006-05-16 08:15:48 +00:00
messageString = browserBundle . getFormattedString ( "xpinstallPromptWarning" ,
2006-04-19 20:50:25 +00:00
[ brandShortName , host ] ) ;
buttons = [ {
2006-05-16 08:15:48 +00:00
label : browserBundle . getString ( "xpinstallPromptWarningButton" ) ,
accessKey : browserBundle . getString ( "xpinstallPromptWarningButton.accesskey" ) ,
2006-04-19 20:50:25 +00:00
popup : null ,
callback : function ( ) { return xpinstallEditPermissions ( browser . docShell ) ; }
} ] ;
2004-11-30 08:23:02 +00:00
}
2005-06-14 10:15:58 +00:00
2006-04-19 20:50:25 +00:00
var notificationBox = gBrowser . getNotificationBox ( browser ) ;
if ( ! notificationBox . getNotificationWithValue ( notificationName ) ) {
const priority = notificationBox . PRIORITY _WARNING _MEDIUM ;
const iconURL = "chrome://mozapps/skin/xpinstall/xpinstallItemGeneric.png" ;
notificationBox . appendNotification ( messageString , notificationName ,
iconURL , priority , buttons ) ;
}
2004-11-30 08:23:02 +00:00
}
break ;
}
2004-02-21 07:02:53 +00:00
}
} ;
2006-04-19 20:50:25 +00:00
function xpinstallEditPermissions ( aDocShell )
{
var browser = gXPInstallObserver . _getBrowser ( aDocShell ) ;
if ( browser ) {
var bundlePreferences = document . getElementById ( "bundle_preferences" ) ;
var webNav = aDocShell . QueryInterface ( Components . interfaces . nsIWebNavigation ) ;
var params = { blockVisible : false ,
sessionVisible : false ,
allowVisible : true ,
prefilledHost : webNav . currentURI . host ,
permissionType : "install" ,
windowTitle : bundlePreferences . getString ( "installpermissionstitle" ) ,
introText : bundlePreferences . getString ( "installpermissionstext" ) } ;
wm = Components . classes [ "@mozilla.org/appshell/window-mediator;1" ]
. getService ( Components . interfaces . nsIWindowMediator ) ;
var existingWindow = wm . getMostRecentWindow ( "Browser:Permissions" ) ;
if ( existingWindow ) {
existingWindow . initWithParams ( params ) ;
existingWindow . focus ( ) ;
}
else
window . openDialog ( "chrome://browser/content/preferences/permissions.xul" ,
"_blank" , "resizable,dialog=no,centerscreen" , params ) ;
return false ;
}
return true ;
}
2005-04-19 15:32:38 +00:00
function BrowserStartup ( )
2002-08-04 02:53:09 +00:00
{
2002-11-16 17:14:12 +00:00
gBrowser = document . getElementById ( "content" ) ;
2004-10-11 13:32:32 +00:00
window . tryToClose = WindowIsClosing ;
2002-11-08 04:50:05 +00:00
var uriToLoad = null ;
// Check for window.arguments[0]. If present, use that for uriToLoad.
2005-12-28 06:18:58 +00:00
if ( "arguments" in window && window . arguments [ 0 ] )
2002-11-08 04:50:05 +00:00
uriToLoad = window . arguments [ 0 ] ;
2005-06-14 10:15:58 +00:00
2002-11-08 04:50:05 +00:00
gIsLoadingBlank = uriToLoad == "about:blank" ;
2002-09-13 03:15:57 +00:00
2006-06-17 21:42:12 +00:00
prepareForStartup ( ) ;
2002-08-04 02:53:09 +00:00
2002-10-13 22:22:38 +00:00
# ifdef ENABLE _PAGE _CYCLER
appCore . startPageCycler ( ) ;
# else
2005-12-28 06:18:58 +00:00
# only load url passed in when we ' re not page cycling
2002-11-08 04:50:05 +00:00
if ( uriToLoad && ! gIsLoadingBlank ) {
2005-12-28 06:18:58 +00:00
if ( window . arguments . length >= 3 )
2006-04-03 23:17:51 +00:00
loadURI ( uriToLoad , window . arguments [ 2 ] , window . arguments [ 3 ] || null ,
window . arguments [ 4 ] || false ) ;
2002-11-16 17:14:12 +00:00
else
loadOneOrMoreURIs ( uriToLoad ) ;
2002-10-13 22:22:38 +00:00
}
2002-10-13 20:04:05 +00:00
# endif
2003-01-29 07:42:59 +00:00
var sidebarSplitter ;
2005-11-05 21:53:48 +00:00
if ( window . opener && ! window . opener . closed ) {
if ( window . opener . gFindBar && window . opener . gFindBar . mFindMode == FIND _NORMAL ) {
2004-11-30 08:23:02 +00:00
var openerFindBar = window . opener . document . getElementById ( "FindToolbar" ) ;
if ( openerFindBar && ! openerFindBar . hidden )
2005-11-01 17:34:45 +00:00
gFindBar . openFindBar ( ) ;
2004-11-30 08:23:02 +00:00
}
2005-06-14 10:15:58 +00:00
2002-09-28 22:55:58 +00:00
var openerSidebarBox = window . opener . document . getElementById ( "sidebar-box" ) ;
2003-10-25 20:16:48 +00:00
// The opener can be the hidden window too, if we're coming from the state
2005-06-14 10:15:58 +00:00
// where no windows are open, and the hidden window has no sidebar box.
2003-10-24 07:41:43 +00:00
if ( openerSidebarBox && ! openerSidebarBox . hidden ) {
2002-11-08 04:56:15 +00:00
var sidebarBox = document . getElementById ( "sidebar-box" ) ;
2002-09-28 22:55:58 +00:00
var sidebarTitle = document . getElementById ( "sidebar-title" ) ;
sidebarTitle . setAttribute ( "value" , window . opener . document . getElementById ( "sidebar-title" ) . getAttribute ( "value" ) ) ;
sidebarBox . setAttribute ( "width" , openerSidebarBox . boxObject . width ) ;
2002-09-30 01:58:19 +00:00
var sidebarCmd = openerSidebarBox . getAttribute ( "sidebarcommand" ) ;
sidebarBox . setAttribute ( "sidebarcommand" , sidebarCmd ) ;
2002-11-05 00:29:14 +00:00
sidebarBox . setAttribute ( "src" , window . opener . document . getElementById ( "sidebar" ) . getAttribute ( "src" ) ) ;
2002-11-06 19:27:16 +00:00
gMustLoadSidebar = true ;
sidebarBox . hidden = false ;
2003-01-29 07:42:59 +00:00
sidebarSplitter = document . getElementById ( "sidebar-splitter" ) ;
2002-11-06 19:27:16 +00:00
sidebarSplitter . hidden = false ;
2002-11-08 04:50:05 +00:00
document . getElementById ( sidebarCmd ) . setAttribute ( "checked" , "true" ) ;
2002-11-06 19:27:16 +00:00
}
2002-11-05 00:29:14 +00:00
}
2002-11-07 02:25:18 +00:00
else {
2002-11-08 04:56:15 +00:00
var box = document . getElementById ( "sidebar-box" ) ;
2005-06-14 10:15:58 +00:00
if ( box . hasAttribute ( "sidebarcommand" ) ) {
2005-08-02 18:34:13 +00:00
var commandID = box . getAttribute ( "sidebarcommand" ) ;
if ( commandID ) {
var command = document . getElementById ( commandID ) ;
if ( command ) {
gMustLoadSidebar = true ;
box . hidden = false ;
sidebarSplitter = document . getElementById ( "sidebar-splitter" ) ;
sidebarSplitter . hidden = false ;
command . setAttribute ( "checked" , "true" ) ;
}
else {
// Remove the |sidebarcommand| attribute, because the element it
// refers to no longer exists, so we should assume this sidebar
// panel has been uninstalled. (249883)
box . removeAttribute ( "sidebarcommand" ) ;
}
2002-11-08 04:50:05 +00:00
}
}
2002-11-07 02:25:18 +00:00
}
2004-02-15 01:49:37 +00:00
// Certain kinds of automigration rely on this notification to complete their
2005-06-14 10:15:58 +00:00
// tasks BEFORE the browser window is shown.
2004-02-15 01:49:37 +00:00
var obs = Components . classes [ "@mozilla.org/observer-service;1" ] . getService ( Components . interfaces . nsIObserverService ) ;
obs . notifyObservers ( null , "browser-window-before-show" , "" ) ;
2004-02-23 02:20:36 +00:00
// Set a sane starting width/height for all resolutions on new profiles.
if ( ! document . documentElement . hasAttribute ( "width" ) ) {
var defaultWidth = 994 , defaultHeight ;
if ( screen . availHeight <= 600 ) {
document . documentElement . setAttribute ( "sizemode" , "maximized" ) ;
defaultWidth = 610 ;
defaultHeight = 450 ;
}
else {
// Create a narrower window for large or wide-aspect displays, to suggest
2005-06-14 10:15:58 +00:00
// side-by-side page view.
2004-02-23 02:20:36 +00:00
if ( ( screen . availWidth / 2 ) >= 800 )
defaultWidth = ( screen . availWidth / 2 ) - 20 ;
defaultHeight = screen . availHeight - 10 ;
2004-09-30 03:44:34 +00:00
# ifdef MOZ _WIDGET _GTK
# define USE _HEIGHT _ADJUST
# endif
# ifdef MOZ _WIDGET _GTK2
# define USE _HEIGHT _ADJUST
# endif
# ifdef USE _HEIGHT _ADJUST
// On X, we're not currently able to account for the size of the window
// border. Use 28px as a guess (titlebar + bottom window border)
defaultHeight -= 28 ;
2005-08-11 06:16:12 +00:00
# endif
# ifdef XP _MACOSX
// account for the Mac OS X title bar
defaultHeight -= 22 ;
2004-09-30 03:44:34 +00:00
# endif
2004-02-23 02:20:36 +00:00
}
document . documentElement . setAttribute ( "width" , defaultWidth ) ;
document . documentElement . setAttribute ( "height" , defaultHeight ) ;
}
2004-11-30 08:23:02 +00:00
2002-11-08 04:50:05 +00:00
setTimeout ( delayedStartup , 0 ) ;
2002-09-18 19:51:28 +00:00
}
2002-11-08 04:50:05 +00:00
function prepareForStartup ( )
2002-09-18 19:51:28 +00:00
{
2005-06-14 10:15:58 +00:00
gURLBar = document . getElementById ( "urlbar" ) ;
2002-11-08 04:50:05 +00:00
gNavigatorBundle = document . getElementById ( "bundle_browser" ) ;
gProgressMeterPanel = document . getElementById ( "statusbar-progresspanel" ) ;
2004-11-30 08:23:02 +00:00
gBrowser . addEventListener ( "DOMUpdatePageReport" , gPopupBlockerObserver . onUpdatePageReport , false ) ;
2005-12-29 14:15:33 +00:00
// Note: we need to listen to untrusted events, because the pluginfinder XBL
// binding can't fire trusted ones (runs with page privileges).
2006-05-17 07:21:23 +00:00
gBrowser . addEventListener ( "PluginNotFound" , gMissingPluginInstaller . newMissingPlugin , true , true ) ;
2005-06-29 17:19:28 +00:00
gBrowser . addEventListener ( "NewTab" , BrowserOpenTab , false ) ;
2004-02-17 07:09:45 +00:00
2002-11-08 04:52:37 +00:00
var webNavigation ;
try {
// Create the browser instance component.
appCore = Components . classes [ "@mozilla.org/appshell/component/browser/instance;1" ]
. createInstance ( Components . interfaces . nsIBrowserInstance ) ;
if ( ! appCore )
throw "couldn't create a browser instance" ;
webNavigation = getWebNavigation ( ) ;
if ( ! webNavigation )
throw "no XBL binding for browser" ;
} catch ( e ) {
alert ( "Error launching browser window:" + e ) ;
window . close ( ) ; // Give up.
return ;
}
2002-11-08 04:50:05 +00:00
// initialize observers and listeners
2004-11-30 08:23:02 +00:00
// and give C++ access to gBrowser
2002-11-08 04:50:05 +00:00
window . XULBrowserWindow = new nsBrowserStatusHandler ( ) ;
2004-12-07 16:08:48 +00:00
window . QueryInterface ( nsCI . nsIInterfaceRequestor )
. getInterface ( nsIWebNavigation )
. QueryInterface ( nsCI . nsIDocShellTreeItem ) . treeOwner
. QueryInterface ( nsCI . nsIInterfaceRequestor )
. getInterface ( nsCI . nsIXULWindow )
2004-08-21 14:47:51 +00:00
. XULBrowserWindow = window . XULBrowserWindow ;
2004-12-07 16:08:48 +00:00
window . QueryInterface ( nsCI . nsIDOMChromeWindow ) . browserDOMWindow =
new nsBrowserAccess ( ) ;
2004-11-30 08:23:02 +00:00
2002-11-08 04:50:05 +00:00
// set default character set if provided
if ( "arguments" in window && window . arguments . length > 1 && window . arguments [ 1 ] ) {
if ( window . arguments [ 1 ] . indexOf ( "charset=" ) != - 1 ) {
var arrayArgComponents = window . arguments [ 1 ] . split ( "=" ) ;
if ( arrayArgComponents ) {
//we should "inherit" the charset menu setting in a new window
getMarkupDocumentViewer ( ) . defaultCharacterSet = arrayArgComponents [ 1 ] ;
}
}
}
2002-11-08 04:51:05 +00:00
// Initialize browser instance..
appCore . setWebShellWindow ( window ) ;
2005-02-23 01:34:53 +00:00
// Manually hook up session and global history for the first browser
// so that we don't have to load global history before bringing up a
// window.
2002-11-08 04:50:05 +00:00
// Wire up session and global history before any possible
// progress notifications for back/forward button updating
2002-11-08 04:58:40 +00:00
webNavigation . sessionHistory = Components . classes [ "@mozilla.org/browser/shistory;1" ]
. createInstance ( Components . interfaces . nsISHistory ) ;
2005-02-23 01:34:53 +00:00
var os = Components . classes [ "@mozilla.org/observer-service;1" ] . getService ( Components . interfaces . nsIObserverService ) ;
os . addObserver ( gBrowser . browsers [ 0 ] , "browser:purge-session-history" , false ) ;
// remove the disablehistory attribute so the browser cleans up, as
// though it had done this work itself
gBrowser . browsers [ 0 ] . removeAttribute ( "disablehistory" ) ;
2002-11-08 04:50:05 +00:00
2004-02-11 02:10:04 +00:00
// enable global history
gBrowser . docShell . QueryInterface ( Components . interfaces . nsIDocShellHistory ) . useGlobalHistory = true ;
2002-11-08 04:50:05 +00:00
// hook up UI through progress listener
gBrowser . addProgressListener ( window . XULBrowserWindow , Components . interfaces . nsIWebProgress . NOTIFY _ALL ) ;
2006-02-28 04:15:56 +00:00
// Initialize the feedhandler
FeedHandler . init ( ) ;
2006-05-06 02:37:51 +00:00
// Initialize the searchbar
BrowserSearch . init ( ) ;
2002-11-08 04:50:05 +00:00
}
function delayedStartup ( )
{
2004-02-21 07:02:53 +00:00
var os = Components . classes [ "@mozilla.org/observer-service;1" ] . getService ( Components . interfaces . nsIObserverService ) ;
os . addObserver ( gSessionHistoryObserver , "browser:purge-session-history" , false ) ;
2004-11-30 08:23:02 +00:00
os . addObserver ( gXPInstallObserver , "xpinstall-install-blocked" , false ) ;
2004-02-21 07:02:53 +00:00
2005-08-27 17:19:08 +00:00
if ( ! gPrefService )
gPrefService = Components . classes [ "@mozilla.org/preferences-service;1" ]
. getService ( Components . interfaces . nsIPrefBranch ) ;
2004-11-30 08:23:02 +00:00
BrowserOffline . init ( ) ;
2005-08-10 20:21:44 +00:00
2004-11-30 08:23:02 +00:00
if ( gURLBar && document . documentElement . getAttribute ( "chromehidden" ) . indexOf ( "toolbar" ) != - 1 ) {
2005-06-14 10:15:58 +00:00
gURLBar . setAttribute ( "readonly" , "true" ) ;
2004-09-06 23:23:54 +00:00
gURLBar . setAttribute ( "enablehistory" , "false" ) ;
}
2004-11-30 08:23:02 +00:00
2004-02-20 00:56:59 +00:00
if ( gURLBar )
gURLBar . addEventListener ( "dragdrop" , URLBarOnDrop , true ) ;
2005-07-25 22:09:39 +00:00
gBrowser . addEventListener ( "pageshow" , function ( evt ) { setTimeout ( pageShowEventHandlers , 0 , evt ) ; } , true ) ;
2002-11-02 00:28:30 +00:00
2003-10-25 19:31:07 +00:00
window . addEventListener ( "keypress" , ctrlNumberTabSelection , false ) ;
2002-10-18 22:43:30 +00:00
2002-09-28 22:55:58 +00:00
if ( gMustLoadSidebar ) {
var sidebar = document . getElementById ( "sidebar" ) ;
2002-11-05 00:29:14 +00:00
var sidebarBox = document . getElementById ( "sidebar-box" ) ;
sidebar . setAttribute ( "src" , sidebarBox . getAttribute ( "src" ) ) ;
2002-09-28 22:55:58 +00:00
}
2005-06-14 10:15:58 +00:00
2005-11-01 17:34:45 +00:00
gFindBar . initFindBar ( ) ;
2005-06-14 10:15:58 +00:00
2006-03-09 02:08:45 +00:00
# ifndef MOZ _PLACES
2005-08-12 00:42:16 +00:00
// add bookmark options to context menu for tabs
addBookmarkMenuitems ( ) ;
2006-03-09 02:08:45 +00:00
initServices ( ) ;
initBMService ( ) ;
2006-02-16 19:00:25 +00:00
// now load bookmarks
2005-06-14 10:15:58 +00:00
BMSVC . readBookmarks ( ) ;
2003-02-23 21:49:19 +00:00
var bt = document . getElementById ( "bookmarks-ptf" ) ;
if ( bt ) {
2003-10-29 08:01:27 +00:00
var btf = BMSVC . getBookmarksToolbarFolder ( ) . Value ;
2003-10-08 08:17:23 +00:00
bt . ref = btf ;
document . getElementById ( "bookmarks-chevron" ) . ref = btf ;
2003-02-23 21:49:19 +00:00
bt . database . AddObserver ( BookmarksToolbarRDFObserver ) ;
}
window . addEventListener ( "resize" , BookmarksToolbar . resizeFunc , false ) ;
2005-09-18 00:10:39 +00:00
document . getElementById ( "PersonalToolbar" )
. controllers . appendController ( BookmarksMenuController ) ;
2006-02-16 19:00:25 +00:00
# else
2006-03-17 18:12:49 +00:00
var toolbar = document . getElementById ( "bookmarksBarContent" ) ;
toolbar . _init ( ) ;
var menu = document . getElementById ( "bookmarksMenuPopup" ) ;
menu . _init ( ) ;
2006-04-10 19:26:01 +00:00
PlacesMenuDNDController . init ( ) ;
2006-03-09 02:08:45 +00:00
window . controllers . appendController ( PlacesController ) ;
2005-12-15 20:24:15 +00:00
# endif
2002-09-18 19:51:28 +00:00
2005-06-14 10:15:58 +00:00
// called when we go into full screen, even if it is
2002-10-13 06:24:00 +00:00
// initiated by a web page script
2006-05-17 07:21:23 +00:00
window . addEventListener ( "fullscreen" , onFullScreen , true ) ;
2002-10-13 06:24:00 +00:00
2002-11-08 04:50:05 +00:00
var element ;
2002-11-16 17:14:12 +00:00
if ( gIsLoadingBlank && gURLBar && ! gURLBar . hidden && ! gURLBar . parentNode . parentNode . collapsed )
element = gURLBar ;
else
2005-01-28 16:06:56 +00:00
element = content ;
2002-11-08 04:50:05 +00:00
2002-11-16 17:14:12 +00:00
// This is a redo of the fix for jag bug 91884
2002-08-04 02:53:09 +00:00
var ww = Components . classes [ "@mozilla.org/embedcomp/window-watcher;1" ]
. getService ( Components . interfaces . nsIWindowWatcher ) ;
if ( window == ww . activeWindow ) {
element . focus ( ) ;
} else {
// set the element in command dispatcher so focus will restore properly
// when the window does become active
2003-06-12 23:09:59 +00:00
if ( element instanceof Components . interfaces . nsIDOMWindow ) {
2002-08-04 02:53:09 +00:00
document . commandDispatcher . focusedWindow = element ;
2003-06-12 23:09:59 +00:00
document . commandDispatcher . focusedElement = null ;
} else if ( element instanceof Components . interfaces . nsIDOMElement ) {
document . commandDispatcher . focusedWindow = element . ownerDocument . defaultView ;
document . commandDispatcher . focusedElement = element ;
}
2002-08-04 02:53:09 +00:00
}
2002-11-16 17:14:12 +00:00
2005-04-20 22:01:34 +00:00
SetPageProxyState ( "invalid" ) ;
2002-11-16 17:14:12 +00:00
var toolbox = document . getElementById ( "navigator-toolbox" ) ;
toolbox . customizeDone = BrowserToolboxCustomizeDone ;
2005-02-25 09:07:58 +00:00
// Set up Sanitize Item
2005-02-26 19:22:38 +00:00
gSanitizeListener = new SanitizeListener ( ) ;
2005-02-25 09:07:58 +00:00
2005-02-26 18:32:19 +00:00
var pbi = gPrefService . QueryInterface ( Components . interfaces . nsIPrefBranchInternal ) ;
2005-02-14 19:26:50 +00:00
2003-02-01 09:13:33 +00:00
// Enable/Disable Form Fill
2003-12-31 22:02:03 +00:00
gFormFillPrefListener = new FormFillPrefListener ( ) ;
2003-02-01 09:13:33 +00:00
pbi . addObserver ( gFormFillPrefListener . domain , gFormFillPrefListener , false ) ;
2004-07-29 08:08:11 +00:00
gFormFillPrefListener . toggleFormFill ( ) ;
2003-02-01 09:13:33 +00:00
2004-05-05 23:24:45 +00:00
// Enable/Disable URL Bar Auto Fill
gURLBarAutoFillPrefListener = new URLBarAutoFillPrefListener ( ) ;
pbi . addObserver ( gURLBarAutoFillPrefListener . domain , gURLBarAutoFillPrefListener , false ) ;
2006-01-11 20:24:20 +00:00
// Enable/Disable auto-hide tabbar
2005-02-14 19:26:50 +00:00
gAutoHideTabbarPrefListener = new AutoHideTabbarPrefListener ( ) ;
pbi . addObserver ( gAutoHideTabbarPrefListener . domain , gAutoHideTabbarPrefListener , false ) ;
2003-12-16 00:37:01 +00:00
pbi . addObserver ( gHomeButton . prefDomain , gHomeButton , false ) ;
gHomeButton . updateTooltip ( ) ;
2005-06-14 10:15:58 +00:00
2004-06-01 14:55:10 +00:00
gClickSelectsAll = gPrefService . getBoolPref ( "browser.urlbar.clickSelectsAll" ) ;
2006-01-11 20:24:20 +00:00
if ( gURLBar )
gURLBar . clickSelectsAll = gClickSelectsAll ;
2004-06-01 14:55:10 +00:00
2004-07-15 22:51:19 +00:00
# ifdef HAVE _SHELL _SERVICE
2005-12-04 21:02:38 +00:00
// Perform default browser checking (after window opens).
var shell = getShellService ( ) ;
if ( shell ) {
var shouldCheck = shell . shouldCheckDefaultBrowser ;
if ( shouldCheck && ! shell . isDefaultBrowser ( true ) ) {
var brandBundle = document . getElementById ( "bundle_brand" ) ;
var shellBundle = document . getElementById ( "bundle_shell" ) ;
var brandShortName = brandBundle . getString ( "brandShortName" ) ;
var promptTitle = shellBundle . getString ( "setDefaultBrowserTitle" ) ;
var promptMessage = shellBundle . getFormattedString ( "setDefaultBrowserMessage" ,
[ brandShortName ] ) ;
var checkboxLabel = shellBundle . getFormattedString ( "setDefaultBrowserDontAsk" ,
[ brandShortName ] ) ;
const IPS = Components . interfaces . nsIPromptService ;
var ps = Components . classes [ "@mozilla.org/embedcomp/prompt-service;1" ]
. getService ( IPS ) ;
var checkEveryTime = { value : shouldCheck } ;
var rv = ps . confirmEx ( window , promptTitle , promptMessage ,
( IPS . BUTTON _TITLE _YES * IPS . BUTTON _POS _0 ) +
( IPS . BUTTON _TITLE _NO * IPS . BUTTON _POS _1 ) ,
null , null , null , checkboxLabel , checkEveryTime ) ;
if ( rv == 0 )
shell . setDefaultBrowser ( true , false ) ;
shell . shouldCheckDefaultBrowser = checkEveryTime . value ;
}
2004-02-15 01:49:37 +00:00
}
2004-03-08 14:27:43 +00:00
# endif
2004-07-12 08:57:18 +00:00
2004-09-06 23:23:54 +00:00
// BiDi UI
2005-01-26 01:40:30 +00:00
gBidiUI = isBidiEnabled ( ) ;
if ( gBidiUI ) {
2004-09-06 23:23:54 +00:00
document . getElementById ( "documentDirection-separator" ) . hidden = false ;
document . getElementById ( "documentDirection-swap" ) . hidden = false ;
document . getElementById ( "textfieldDirection-separator" ) . hidden = false ;
document . getElementById ( "textfieldDirection-swap" ) . hidden = false ;
}
2006-04-20 22:35:06 +00:00
# ifdef XP _MACOSX
// Setup click-and-hold gestures access to the session history
// menus if global click-and-hold isn't turned on
if ( ! getBoolPref ( "ui.click_hold_context_menus" , false ) )
SetClickAndHoldHandlers ( ) ;
# endif
2006-05-10 02:22:32 +00:00
// Initialize the microsummary service by retrieving it, prompting its factory
// to create its singleton, whose constructor initializes the service.
Cc [ "@mozilla.org/microsummary/service;1" ] . getService ( Ci . nsIMicrosummaryService ) ;
2006-06-18 00:42:08 +00:00
// initialize the session-restore service
var ssEnabled = true ;
var prefBranch = Cc [ "@mozilla.org/preferences-service;1" ] .
getService ( Ci . nsIPrefBranch ) ;
try {
ssEnabled = prefBranch . getBoolPref ( "browser.sessionstore.enabled" ) ;
} catch ( ex ) { }
if ( ssEnabled ) {
var wType = window . document . documentElement . getAttribute ( "windowtype" ) ;
if ( wType == "navigator:browser" ) {
try {
var ss = Cc [ "@mozilla.org/browser/sessionstore;1" ] .
getService ( Ci . nsISessionStore ) ;
ss . init ( window ) ;
} catch ( ex ) {
dump ( "nsSessionStore could not be initialized: " + ex + "\n" ) ;
}
}
}
2006-06-20 07:30:00 +00:00
// browser-specific tab augmentation
AugmentTabs . init ( ) ;
2006-07-06 00:57:36 +00:00
// set up history menu
HistoryMenu . init ( ) ;
2002-08-04 02:53:09 +00:00
}
2005-04-19 15:32:38 +00:00
function BrowserShutdown ( )
2002-08-04 02:53:09 +00:00
{
2004-04-07 17:37:55 +00:00
var os = Components . classes [ "@mozilla.org/observer-service;1" ]
. getService ( Components . interfaces . nsIObserverService ) ;
os . removeObserver ( gSessionHistoryObserver , "browser:purge-session-history" ) ;
2004-11-30 08:23:02 +00:00
os . removeObserver ( gXPInstallObserver , "xpinstall-install-blocked" ) ;
2004-04-07 17:37:55 +00:00
2002-08-04 02:53:09 +00:00
try {
2002-09-18 20:00:30 +00:00
gBrowser . removeProgressListener ( window . XULBrowserWindow ) ;
2002-08-04 02:53:09 +00:00
} catch ( ex ) {
}
2006-02-16 19:00:25 +00:00
# ifndef MOZ _PLACES
2005-09-18 00:10:39 +00:00
try {
document . getElementById ( "PersonalToolbar" )
. controllers . removeController ( BookmarksMenuController ) ;
} catch ( ex ) {
}
2004-01-22 01:46:48 +00:00
var bt = document . getElementById ( "bookmarks-ptf" ) ;
if ( bt ) {
2004-02-25 00:27:13 +00:00
try {
bt . database . RemoveObserver ( BookmarksToolbarRDFObserver ) ;
} catch ( ex ) {
}
2004-01-22 01:46:48 +00:00
}
2006-02-16 19:00:25 +00:00
# endif
2004-01-22 01:46:48 +00:00
2004-02-25 00:27:13 +00:00
try {
2005-02-26 18:32:19 +00:00
var pbi = gPrefService . QueryInterface ( Components . interfaces . nsIPrefBranchInternal ) ;
2004-02-25 00:27:13 +00:00
pbi . removeObserver ( gFormFillPrefListener . domain , gFormFillPrefListener ) ;
2004-05-05 23:24:45 +00:00
pbi . removeObserver ( gURLBarAutoFillPrefListener . domain , gURLBarAutoFillPrefListener ) ;
2005-02-14 19:26:50 +00:00
pbi . removeObserver ( gAutoHideTabbarPrefListener . domain , gAutoHideTabbarPrefListener ) ;
2004-02-25 00:27:13 +00:00
pbi . removeObserver ( gHomeButton . prefDomain , gHomeButton ) ;
} catch ( ex ) {
}
2005-06-14 10:15:58 +00:00
2005-02-26 19:22:38 +00:00
if ( gSanitizeListener )
gSanitizeListener . shutdown ( ) ;
2004-01-22 01:46:48 +00:00
2003-12-02 00:29:22 +00:00
BrowserOffline . uninit ( ) ;
2005-08-26 18:22:08 +00:00
2005-11-01 17:34:45 +00:00
gFindBar . uninitFindBar ( ) ;
2004-02-25 00:27:13 +00:00
2002-11-05 00:29:14 +00:00
var windowManager = Components . classes [ '@mozilla.org/appshell/window-mediator;1' ] . getService ( ) ;
var windowManagerInterface = windowManager . QueryInterface ( Components . interfaces . nsIWindowMediator ) ;
var enumerator = windowManagerInterface . getEnumerator ( null ) ;
enumerator . getNext ( ) ;
if ( ! enumerator . hasMoreElements ( ) ) {
document . persist ( "sidebar-box" , "sidebarcommand" ) ;
document . persist ( "sidebar-box" , "width" ) ;
document . persist ( "sidebar-box" , "src" ) ;
document . persist ( "sidebar-title" , "value" ) ;
}
2002-08-04 02:53:09 +00:00
window . XULBrowserWindow . destroy ( ) ;
window . XULBrowserWindow = null ;
2004-08-21 14:47:51 +00:00
window . QueryInterface ( Components . interfaces . nsIInterfaceRequestor )
. getInterface ( Components . interfaces . nsIWebNavigation )
. QueryInterface ( Components . interfaces . nsIDocShellTreeItem ) . treeOwner
. QueryInterface ( Components . interfaces . nsIInterfaceRequestor )
. getInterface ( Components . interfaces . nsIXULWindow )
. XULBrowserWindow = null ;
2004-12-07 16:08:48 +00:00
window . QueryInterface ( nsCI . nsIDOMChromeWindow ) . browserDOMWindow = null ;
2002-08-04 02:53:09 +00:00
// Close the app core.
if ( appCore )
appCore . close ( ) ;
}
2005-01-24 23:40:03 +00:00
# ifdef XP _MACOSX
2005-04-19 15:32:38 +00:00
// nonBrowserWindowStartup() and nonBrowserWindowDelayedStartup() are used for
// non-browser windows in macBrowserOverlay
2005-01-24 23:40:03 +00:00
function nonBrowserWindowStartup ( )
{
// Disable inappropriate commands / submenus
2005-04-19 15:32:38 +00:00
var disabledItems = [ 'cmd_newNavigatorTab' , 'Browser:SavePage' , 'Browser:SendLink' ,
2005-01-24 23:40:03 +00:00
'cmd_pageSetup' , 'cmd_print' , 'cmd_find' , 'cmd_findAgain' , 'viewToolbarsMenu' ,
2005-02-27 17:59:38 +00:00
'cmd_toggleTaskbar' , 'viewSidebarMenuMenu' , 'Browser:Reload' , 'Browser:ReloadSkipCache' ,
'viewTextZoomMenu' , 'pageStyleMenu' , 'charsetMenu' , 'View:PageSource' , 'View:FullScreen' ,
2005-06-09 00:18:02 +00:00
'viewHistorySidebar' , 'Browser:AddBookmarkAs' , 'View:PageInfo' , 'Tasks:InspectPage' ] ;
2005-01-24 23:40:03 +00:00
var element ;
for ( var id in disabledItems )
{
element = document . getElementById ( disabledItems [ id ] ) ;
if ( element )
element . setAttribute ( "disabled" , "true" ) ;
}
2005-04-19 15:32:38 +00:00
// If no windows are active (i.e. we're the hidden window), disable the close, minimize
2005-01-24 23:40:03 +00:00
// and zoom menu commands as well
if ( window . location . href == "chrome://browser/content/hiddenWindow.xul" )
{
2005-04-19 15:32:38 +00:00
var hiddenWindowDisabledItems = [ 'cmd_close' , 'minimizeWindow' , 'zoomWindow' ] ;
for ( var id in hiddenWindowDisabledItems )
{
element = document . getElementById ( hiddenWindowDisabledItems [ id ] ) ;
if ( element )
element . setAttribute ( "disabled" , "true" ) ;
}
2005-01-24 23:40:03 +00:00
// also hide the window-list separator
element = document . getElementById ( "sep-window-list" ) ;
element . setAttribute ( "hidden" , "true" ) ;
}
gNavigatorBundle = document . getElementById ( "bundle_browser" ) ;
setTimeout ( nonBrowserWindowDelayedStartup , 0 ) ;
}
function nonBrowserWindowDelayedStartup ( )
{
// loads the services
2005-12-16 08:32:28 +00:00
# ifndef MOZ _PLACES
2006-02-16 19:00:25 +00:00
initServices ( ) ;
2005-01-24 23:40:03 +00:00
initBMService ( ) ;
2006-04-13 23:07:06 +00:00
# else
var menu = document . getElementById ( "bookmarksMenuPopup" ) ;
menu . _init ( ) ;
window . controllers . appendController ( PlacesController ) ;
2005-12-16 08:32:28 +00:00
# endif
2005-01-24 23:40:03 +00:00
// init global pref service
gPrefService = Components . classes [ "@mozilla.org/preferences-service;1" ]
. getService ( Components . interfaces . nsIPrefBranch ) ;
2005-03-02 16:26:41 +00:00
// Set up Sanitize Item
gSanitizeListener = new SanitizeListener ( ) ;
2005-01-24 23:40:03 +00:00
}
# endif
2005-06-14 10:15:58 +00:00
2003-12-31 22:02:03 +00:00
function FormFillPrefListener ( )
{
gBrowser . attachFormFill ( ) ;
}
FormFillPrefListener . prototype =
2003-02-01 09:13:33 +00:00
{
domain : "browser.formfill.enable" ,
observe : function ( aSubject , aTopic , aPrefName )
{
if ( aTopic != "nsPref:changed" || aPrefName != this . domain )
return ;
2005-06-14 10:15:58 +00:00
2003-02-01 09:13:33 +00:00
this . toggleFormFill ( ) ;
} ,
2005-06-14 10:15:58 +00:00
2003-02-01 09:13:33 +00:00
toggleFormFill : function ( )
{
try {
gFormFillEnabled = gPrefService . getBoolPref ( this . domain ) ;
}
catch ( e ) {
}
2004-07-29 08:08:11 +00:00
var formController = Components . classes [ "@mozilla.org/satchel/form-fill-controller;1" ] . getService ( Components . interfaces . nsIAutoCompleteInput ) ;
formController . disableAutoComplete = ! gFormFillEnabled ;
2003-02-01 09:13:33 +00:00
}
}
2005-06-14 10:15:58 +00:00
2004-05-05 23:24:45 +00:00
function URLBarAutoFillPrefListener ( )
{
this . toggleAutoFillInURLBar ( ) ;
}
URLBarAutoFillPrefListener . prototype =
{
domain : "browser.urlbar.autoFill" ,
observe : function ( aSubject , aTopic , aPrefName )
{
if ( aTopic != "nsPref:changed" || aPrefName != this . domain )
return ;
2005-06-14 10:15:58 +00:00
2004-05-05 23:24:45 +00:00
this . toggleAutoFillInURLBar ( ) ;
} ,
2005-06-14 10:15:58 +00:00
2004-05-05 23:24:45 +00:00
toggleAutoFillInURLBar : function ( )
{
2004-11-30 08:23:02 +00:00
if ( ! gURLBar )
return ;
2004-05-05 23:24:45 +00:00
var prefValue = false ;
try {
prefValue = gPrefService . getBoolPref ( this . domain ) ;
}
catch ( e ) {
}
if ( prefValue )
gURLBar . setAttribute ( "completedefaultindex" , "true" ) ;
else
gURLBar . removeAttribute ( "completedefaultindex" ) ;
}
}
2005-02-14 19:26:50 +00:00
function AutoHideTabbarPrefListener ( )
{
this . toggleAutoHideTabbar ( ) ;
}
AutoHideTabbarPrefListener . prototype =
{
domain : "browser.tabs.autoHide" ,
observe : function ( aSubject , aTopic , aPrefName )
{
if ( aTopic != "nsPref:changed" || aPrefName != this . domain )
return ;
2005-06-14 10:15:58 +00:00
2005-02-14 19:26:50 +00:00
this . toggleAutoHideTabbar ( ) ;
} ,
2005-06-14 10:15:58 +00:00
2005-02-14 19:26:50 +00:00
toggleAutoHideTabbar : function ( )
{
2005-07-07 15:52:50 +00:00
if ( gBrowser . tabContainer . childNodes . length == 1 &&
window . toolbar . visible ) {
var aVisible = false ;
try {
aVisible = ! gPrefService . getBoolPref ( this . domain ) ;
}
catch ( e ) {
}
2005-02-14 19:26:50 +00:00
gBrowser . setStripVisibilityTo ( aVisible ) ;
gPrefService . setBoolPref ( "browser.tabs.forceHide" , false ) ;
}
}
}
2005-02-25 09:07:58 +00:00
function SanitizeListener ( )
{
var pbi = gPrefService . QueryInterface ( Components . interfaces . nsIPrefBranchInternal ) ;
pbi . addObserver ( this . promptDomain , this , false ) ;
2005-08-23 16:38:28 +00:00
this . _defaultLabel = document . getElementById ( "sanitizeItem" )
. getAttribute ( "label" ) ;
this . _updateSanitizeItem ( ) ;
if ( gPrefService . prefHasUserValue ( this . didSanitizeDomain ) ) {
gPrefService . clearUserPref ( this . didSanitizeDomain ) ;
// We need to persist this preference change, since we want to
2005-11-27 02:25:30 +00:00
// check it at next app start even if the browser exits abruptly
gPrefService . savePrefFile ( null ) ;
2005-08-23 16:38:28 +00:00
}
2005-02-25 09:07:58 +00:00
}
SanitizeListener . prototype =
{
promptDomain : "privacy.sanitize.promptOnSanitize" ,
didSanitizeDomain : "privacy.sanitize.didShutdownSanitize" ,
2005-06-14 10:15:58 +00:00
2005-02-25 09:07:58 +00:00
observe : function ( aSubject , aTopic , aPrefName )
{
2005-08-23 16:38:28 +00:00
this . _updateSanitizeItem ( ) ;
2005-02-25 09:07:58 +00:00
} ,
2005-06-14 10:15:58 +00:00
2005-02-26 19:22:38 +00:00
shutdown : function ( )
{
var pbi = gPrefService . QueryInterface ( Components . interfaces . nsIPrefBranchInternal ) ;
pbi . removeObserver ( this . promptDomain , this ) ;
} ,
2005-06-14 10:15:58 +00:00
2005-08-23 16:38:28 +00:00
_updateSanitizeItem : function ( )
2005-02-25 09:07:58 +00:00
{
2005-08-23 16:38:28 +00:00
var label = gPrefService . getBoolPref ( this . promptDomain ) ?
gNavigatorBundle . getString ( "sanitizeWithPromptLabel" ) :
this . _defaultLabel ;
document . getElementById ( "sanitizeItem" ) . setAttribute ( "label" , label ) ;
2005-04-03 15:41:20 +00:00
}
2005-02-25 09:07:58 +00:00
}
2002-10-25 18:13:29 +00:00
function ctrlNumberTabSelection ( event )
2005-06-14 10:15:58 +00:00
{
if ( event . altKey && event . keyCode == KeyEvent . DOM _VK _RETURN ) {
2004-11-30 08:23:02 +00:00
// XXXblake Proper fix is to just check whether focus is in the urlbar. However, focus with the autocomplete widget is all
// 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
// is on a link.
2005-06-30 02:47:04 +00:00
if ( ! ( document . commandDispatcher . focusedElement instanceof HTMLAnchorElement ) ) {
2004-11-30 08:23:02 +00:00
// Don't let winxp beep on ALT+ENTER, since the URL bar uses it.
event . preventDefault ( ) ;
return ;
}
}
2002-10-20 03:52:52 +00:00
2003-08-05 09:31:32 +00:00
# ifdef XP _MACOSX
if ( ! event . metaKey )
2005-01-16 18:25:41 +00:00
# else
# ifdef XP _UNIX
2004-10-06 22:25:07 +00:00
if ( ! event . altKey )
2003-08-05 09:31:32 +00:00
# else
2002-10-25 18:13:29 +00:00
if ( ! event . ctrlKey )
2005-01-16 18:25:41 +00:00
# endif
2003-08-05 09:31:32 +00:00
# endif
2002-10-29 00:11:41 +00:00
return ;
2002-10-25 18:13:29 +00:00
2006-01-05 10:00:23 +00:00
// \d in a RegExp will find any Unicode character with the "decimal digit"
// property (Nd)
var regExp = /\d/ ;
if ( ! regExp . test ( String . fromCharCode ( event . charCode ) ) )
return ;
// Some Unicode decimal digits are in the range U+xxx0 - U+xxx9 and some are
// in the range U+xxx6 - U+xxxF. Find the digit 1 corresponding to our
// character.
var digit1 = ( event . charCode & 0xFFF0 ) | 1 ;
2006-02-22 22:54:08 +00:00
if ( ! regExp . test ( String . fromCharCode ( digit1 ) ) )
2006-01-05 10:00:23 +00:00
digit1 += 6 ;
var index = event . charCode - digit1 ;
if ( index < 0 )
2002-10-29 00:11:41 +00:00
return ;
2002-10-18 22:43:30 +00:00
2006-06-06 16:28:09 +00:00
// [Ctrl]+[9] always selects the last tab
if ( index == 8 )
index = gBrowser . tabContainer . childNodes . length - 1 ;
else if ( index >= gBrowser . tabContainer . childNodes . length )
2002-10-29 00:11:41 +00:00
return ;
2002-10-18 22:43:30 +00:00
var oldTab = gBrowser . selectedTab ;
2004-02-19 21:52:31 +00:00
var newTab = gBrowser . tabContainer . childNodes [ index ] ;
2002-10-18 22:43:30 +00:00
if ( newTab != oldTab ) {
oldTab . selected = false ;
gBrowser . selectedTab = newTab ;
}
event . preventDefault ( ) ;
event . stopPropagation ( ) ;
}
2002-08-04 02:53:09 +00:00
function gotoHistoryIndex ( aEvent )
{
var index = aEvent . target . getAttribute ( "index" ) ;
if ( ! index )
return false ;
2004-06-23 22:54:12 +00:00
var where = whereToOpenLink ( aEvent ) ;
if ( where == "current" ) {
// Normal click. Go there in the current tab and update session history.
try {
getWebNavigation ( ) . gotoIndex ( index ) ;
}
catch ( ex ) {
return false ;
}
return true ;
2002-08-04 02:53:09 +00:00
}
2004-06-23 22:54:12 +00:00
else {
// Modified click. Go there in a new tab/window.
// This code doesn't copy history or work well with framed pages.
2005-06-14 10:15:58 +00:00
2004-06-23 22:54:12 +00:00
var sessionHistory = getWebNavigation ( ) . sessionHistory ;
var entry = sessionHistory . getEntryAtIndex ( index , false ) ;
var url = entry . URI . spec ;
openUILinkIn ( url , where ) ;
return true ;
2002-08-04 02:53:09 +00:00
}
2004-06-23 22:54:12 +00:00
}
function BrowserForward ( aEvent , aIgnoreAlt )
{
var where = whereToOpenLink ( aEvent , false , aIgnoreAlt ) ;
2002-08-04 02:53:09 +00:00
2004-06-23 22:54:12 +00:00
if ( where == "current" ) {
try {
getWebNavigation ( ) . goForward ( ) ;
}
catch ( ex ) {
}
}
else {
var sessionHistory = getWebNavigation ( ) . sessionHistory ;
var currentIndex = sessionHistory . index ;
var entry = sessionHistory . getEntryAtIndex ( currentIndex + 1 , false ) ;
var url = entry . URI . spec ;
openUILinkIn ( url , where ) ;
}
2002-08-04 02:53:09 +00:00
}
2004-06-23 22:54:12 +00:00
function BrowserBack ( aEvent , aIgnoreAlt )
2002-08-04 02:53:09 +00:00
{
2004-06-23 22:54:12 +00:00
var where = whereToOpenLink ( aEvent , false , aIgnoreAlt ) ;
if ( where == "current" ) {
try {
getWebNavigation ( ) . goBack ( ) ;
}
catch ( ex ) {
}
2002-08-04 02:53:09 +00:00
}
2004-06-23 22:54:12 +00:00
else {
var sessionHistory = getWebNavigation ( ) . sessionHistory ;
var currentIndex = sessionHistory . index ;
var entry = sessionHistory . getEntryAtIndex ( currentIndex - 1 , false ) ;
var url = entry . URI . spec ;
openUILinkIn ( url , where ) ;
2002-08-04 02:53:09 +00:00
}
}
2003-05-31 18:43:50 +00:00
function BrowserHandleBackspace ( )
{
2005-10-20 15:16:27 +00:00
switch ( gPrefService . getIntPref ( "browser.backspace_action" ) ) {
case 0 :
BrowserBack ( ) ;
break ;
case 1 :
goDoCommand ( "cmd_scrollPageUp" ) ;
break ;
}
}
function BrowserHandleShiftBackspace ( )
{
switch ( gPrefService . getIntPref ( "browser.backspace_action" ) ) {
case 0 :
BrowserForward ( ) ;
break ;
case 1 :
goDoCommand ( "cmd_scrollPageDown" ) ;
break ;
}
2003-05-31 18:43:50 +00:00
}
2002-08-04 02:53:09 +00:00
function BrowserBackMenu ( event )
{
return FillHistoryMenu ( event . target , "back" ) ;
}
function BrowserForwardMenu ( event )
{
return FillHistoryMenu ( event . target , "forward" ) ;
}
function BrowserStop ( )
{
try {
const stopFlags = nsIWebNavigation . STOP _ALL ;
getWebNavigation ( ) . stop ( stopFlags ) ;
}
catch ( ex ) {
}
}
function BrowserReload ( )
{
const reloadFlags = nsIWebNavigation . LOAD _FLAGS _NONE ;
return BrowserReloadWithFlags ( reloadFlags ) ;
}
function BrowserReloadSkipCache ( )
{
// Bypass proxy and cache.
const reloadFlags = nsIWebNavigation . LOAD _FLAGS _BYPASS _PROXY | nsIWebNavigation . LOAD _FLAGS _BYPASS _CACHE ;
return BrowserReloadWithFlags ( reloadFlags ) ;
}
function BrowserHome ( )
{
2003-12-16 00:37:01 +00:00
var homePage = gHomeButton . getHomePage ( ) ;
2002-11-16 17:14:12 +00:00
loadOneOrMoreURIs ( homePage ) ;
}
2004-07-16 16:32:41 +00:00
function BrowserHomeClick ( aEvent )
2002-11-16 17:14:12 +00:00
{
2004-07-16 16:32:41 +00:00
if ( aEvent . button == 2 ) // right-click: do nothing
return ;
var homePage = gHomeButton . getHomePage ( ) ;
var where = whereToOpenLink ( aEvent ) ;
var urls ;
// openUILinkIn in utilityOverlay.js doesn't handle loading multiple pages
switch ( where ) {
case "save" :
urls = homePage . split ( "|" ) ;
saveURL ( urls [ 0 ] , null , null , true ) ; // only save the first page
break ;
case "current" :
loadOneOrMoreURIs ( homePage ) ;
break ;
case "tabshifted" :
case "tab" :
urls = homePage . split ( "|" ) ;
2006-01-20 23:04:26 +00:00
var loadInBackground = getBoolPref ( "browser.tabs.loadBookmarksInBackground" , false ) ;
gBrowser . loadTabs ( urls , loadInBackground ) ;
2004-07-16 16:32:41 +00:00
break ;
case "window" :
OpenBrowserWindow ( ) ;
break ;
2002-11-16 17:14:12 +00:00
}
2004-07-16 16:32:41 +00:00
}
function loadOneOrMoreURIs ( aURIString )
{
2005-01-24 23:40:03 +00:00
# ifdef XP _MACOSX
// we're not a browser window, pass the URI string to a new browser window
if ( window . location . href != getBrowserURL ( ) )
{
newWindow = openDialog ( getBrowserURL ( ) , "_blank" , "all,dialog=no" , aURIString ) ;
return ;
}
# endif
2006-01-20 23:04:26 +00:00
// This function throws for certain malformed URIs, so use exception handling
// so that we don't disrupt startup
try {
gBrowser . loadTabs ( aURIString . split ( "|" ) , false , true ) ;
}
catch ( e ) {
2005-01-20 23:04:06 +00:00
}
2002-08-04 02:53:09 +00:00
}
2006-03-01 21:36:53 +00:00
# ifndef MOZ _PLACES
2002-10-06 22:54:24 +00:00
function constructGoMenuItem ( goMenu , beforeItem , url , title )
2002-10-06 21:11:50 +00:00
{
2002-10-06 22:54:24 +00:00
var menuitem = document . createElementNS ( kXULNS , "menuitem" ) ;
2003-08-13 03:21:37 +00:00
menuitem . setAttribute ( "statustext" , url ) ;
2002-10-06 22:54:24 +00:00
menuitem . setAttribute ( "label" , title ) ;
goMenu . insertBefore ( menuitem , beforeItem ) ;
return menuitem ;
}
2006-07-09 19:43:35 +00:00
function onGoMenuHidden ( aEvent )
2002-10-06 22:54:24 +00:00
{
2006-07-09 19:43:35 +00:00
if ( aEvent . target == aEvent . currentTarget )
setTimeout ( destroyGoMenuItems , 0 , document . getElementById ( 'goPopup' ) ) ;
2002-10-06 22:54:24 +00:00
}
function destroyGoMenuItems ( goMenu ) {
var startSeparator = document . getElementById ( "startHistorySeparator" ) ;
var endSeparator = document . getElementById ( "endHistorySeparator" ) ;
endSeparator . hidden = true ;
// Destroy the items.
var destroy = false ;
for ( var i = 0 ; i < goMenu . childNodes . length ; i ++ ) {
var item = goMenu . childNodes [ i ] ;
if ( item == endSeparator )
break ;
if ( destroy ) {
i -- ;
goMenu . removeChild ( item ) ;
}
if ( item == startSeparator )
destroy = true ;
}
}
2006-07-09 19:43:35 +00:00
function updateGoMenu ( aEvent , goMenu )
2002-10-06 22:54:24 +00:00
{
2006-07-09 19:43:35 +00:00
if ( aEvent . target != aEvent . currentTarget )
return ;
2002-10-07 01:58:28 +00:00
// In case the timer didn't fire.
destroyGoMenuItems ( goMenu ) ;
2002-10-06 22:54:24 +00:00
var history = document . getElementById ( "hiddenHistoryTree" ) ;
2005-06-14 10:15:58 +00:00
2002-10-08 23:14:45 +00:00
if ( history . hidden ) {
2002-10-06 22:54:24 +00:00
history . hidden = false ;
2004-02-11 02:10:04 +00:00
var globalHistory = Components . classes [ "@mozilla.org/browser/global-history;2" ]
. getService ( Components . interfaces . nsIRDFDataSource ) ;
history . database . AddDataSource ( globalHistory ) ;
2002-10-08 23:14:45 +00:00
}
2002-10-06 22:54:24 +00:00
if ( ! history . ref )
history . ref = "NC:HistoryRoot" ;
2005-02-11 17:12:56 +00:00
2005-02-15 04:57:17 +00:00
var count = history . view . rowCount ;
2002-10-06 22:54:24 +00:00
if ( count > 10 )
count = 10 ;
if ( count == 0 )
return ;
const NC _NS = "http://home.netscape.com/NC-rdf#" ;
2002-10-06 21:11:50 +00:00
2002-10-06 22:54:24 +00:00
if ( ! gRDF )
gRDF = Components . classes [ "@mozilla.org/rdf/rdf-service;1" ]
. getService ( Components . interfaces . nsIRDFService ) ;
var builder = history . builder . QueryInterface ( Components . interfaces . nsIXULTreeBuilder ) ;
2005-06-14 10:15:58 +00:00
2002-10-06 22:54:24 +00:00
var beforeItem = document . getElementById ( "endHistorySeparator" ) ;
2005-06-14 10:15:58 +00:00
2002-10-06 22:54:24 +00:00
var nameResource = gRDF . GetResource ( NC _NS + "Name" ) ;
2002-10-11 18:59:47 +00:00
var endSep = beforeItem ;
var showSep = false ;
2002-10-06 22:54:24 +00:00
for ( var i = count - 1 ; i >= 0 ; i -- ) {
var res = builder . getResourceAtIndex ( i ) ;
var url = res . Value ;
var titleRes = history . database . GetTarget ( res , nameResource , true ) ;
2002-10-11 18:56:05 +00:00
if ( ! titleRes )
continue ;
2002-10-11 18:59:47 +00:00
showSep = true ;
2002-10-06 22:54:24 +00:00
var titleLiteral = titleRes . QueryInterface ( Components . interfaces . nsIRDFLiteral ) ;
beforeItem = constructGoMenuItem ( goMenu , beforeItem , url , titleLiteral . Value ) ;
}
2002-10-11 18:59:47 +00:00
if ( showSep )
endSep . hidden = false ;
2002-10-06 21:11:50 +00:00
}
2006-03-09 02:08:45 +00:00
2005-08-12 00:42:16 +00:00
function addBookmarkAs ( aBrowser , aBookmarkAllTabs , aIsWebPanel )
2002-08-04 02:53:09 +00:00
{
const browsers = aBrowser . browsers ;
2005-08-29 22:09:37 +00:00
// we only disable the menu item on onpopupshowing; if we get
// here via keyboard shortcut, we need to pretend like
// nothing happened if we have no tabs
if ( ( ! browsers || browsers . length == 1 ) && aBookmarkAllTabs )
return ;
2003-08-03 08:25:19 +00:00
if ( browsers && browsers . length > 1 )
2005-08-12 00:42:16 +00:00
addBookmarkForTabBrowser ( aBrowser , aBookmarkAllTabs ) ;
2002-08-04 02:53:09 +00:00
else
2003-08-03 08:25:19 +00:00
addBookmarkForBrowser ( aBrowser . webNavigation , aIsWebPanel ) ;
2003-04-21 05:47:02 +00:00
}
2005-08-12 00:42:16 +00:00
function addBookmarkForTabBrowser ( aTabBrowser , aBookmarkAllTabs , aSelect )
2003-04-21 05:47:02 +00:00
{
var tabsInfo = [ ] ;
var currentTabInfo = { name : "" , url : "" , charset : null } ;
const activeBrowser = aTabBrowser . selectedBrowser ;
const browsers = aTabBrowser . browsers ;
for ( var i = 0 ; i < browsers . length ; ++ i ) {
var webNav = browsers [ i ] . webNavigation ;
var url = webNav . currentURI . spec ;
var name = "" ;
2005-07-06 19:28:46 +00:00
var charSet , description ;
2003-04-21 05:47:02 +00:00
try {
var doc = webNav . document ;
name = doc . title || url ;
charSet = doc . characterSet ;
2005-02-17 00:17:12 +00:00
description = BookmarksUtils . getDescriptionFromDocument ( doc ) ;
2003-04-21 05:47:02 +00:00
} catch ( e ) {
name = url ;
}
2005-08-12 00:42:16 +00:00
tabsInfo [ i ] = { name : name , url : url , charset : charSet , description : description } ;
2003-04-21 05:47:02 +00:00
if ( browsers [ i ] == activeBrowser )
currentTabInfo = tabsInfo [ i ] ;
}
2005-02-17 00:17:12 +00:00
var dialogArgs = currentTabInfo ;
2005-08-12 00:42:16 +00:00
if ( aBookmarkAllTabs ) {
dialogArgs = { name : gNavigatorBundle . getString ( "bookmarkAllTabsDefault" ) } ;
dialogArgs . bBookmarkAllTabs = true ;
}
2005-02-17 00:17:12 +00:00
dialogArgs . objGroup = tabsInfo ;
2003-04-21 05:47:02 +00:00
openDialog ( "chrome://browser/content/bookmarks/addBookmark2.xul" , "" ,
2005-04-21 09:29:59 +00:00
BROWSER _ADD _BM _FEATURES , dialogArgs ) ;
2003-04-21 05:47:02 +00:00
}
2003-08-03 08:25:19 +00:00
function addBookmarkForBrowser ( aDocShell , aIsWebPanel )
2003-04-21 05:47:02 +00:00
{
// Bug 52536: We obtain the URL and title from the nsIWebNavigation
// associated with a <browser/> rather than from a DOMWindow.
// This is because when a full page plugin is loaded, there is
// no DOMWindow (?) but information about the loaded document
2005-06-14 10:15:58 +00:00
// may still be obtained from the webNavigation.
2003-04-21 05:47:02 +00:00
var url = aDocShell . currentURI . spec ;
var title , charSet = null ;
2005-07-06 19:28:46 +00:00
var description ;
2003-04-21 05:47:02 +00:00
try {
title = aDocShell . document . title || url ;
charSet = aDocShell . document . characterSet ;
2005-02-17 00:17:12 +00:00
description = BookmarksUtils . getDescriptionFromDocument ( aDocShell . document ) ;
2003-04-21 05:47:02 +00:00
}
catch ( e ) {
title = url ;
}
2005-02-17 00:17:12 +00:00
BookmarksUtils . addBookmark ( url , title , charSet , aIsWebPanel , description ) ;
2002-08-04 02:53:09 +00:00
}
2006-03-09 02:08:45 +00:00
# endif
2002-08-04 02:53:09 +00:00
2002-09-20 03:52:36 +00:00
function openLocation ( )
2002-08-04 02:53:09 +00:00
{
2005-03-23 21:55:41 +00:00
if ( gURLBar && ! gURLBar . parentNode . parentNode . collapsed &&
! ( window . getComputedStyle ( gURLBar . parentNode , null ) . display == "none" ) ) {
2002-09-20 03:52:36 +00:00
gURLBar . focus ( ) ;
gURLBar . select ( ) ;
}
2003-12-02 22:27:25 +00:00
# ifdef XP _MACOSX
2005-06-09 00:18:02 +00:00
else if ( window . location . href != getBrowserURL ( ) ) {
var win = getTopWin ( ) ;
if ( win ) {
// If there's an open browser window, it should handle this command
win . focus ( )
win . openLocation ( ) ;
}
else {
// If there are no open browser windows, open a new one
2005-06-10 22:49:20 +00:00
win = window . openDialog ( "chrome://browser/content/" , "_blank" ,
"chrome,all,dialog=no" , "about:blank" ) ;
2005-06-09 00:18:02 +00:00
win . addEventListener ( "load" , openLocationCallback , false ) ;
2003-12-02 22:27:25 +00:00
}
2002-09-20 03:52:36 +00:00
}
2005-06-09 00:18:02 +00:00
# endif
else
openDialog ( "chrome://browser/content/openLocation.xul" , "_blank" ,
"chrome,modal,titlebar" , window ) ;
}
function openLocationCallback ( )
{
// make sure the DOM is ready
setTimeout ( function ( ) { this . openLocation ( ) ; } , 0 ) ;
2002-08-04 02:53:09 +00:00
}
function BrowserOpenTab ( )
{
2006-04-03 23:17:51 +00:00
gBrowser . loadOneTab ( "about:blank" , null , null , null , false , false ) ;
2003-10-29 08:01:27 +00:00
if ( gURLBar )
2004-07-07 03:04:09 +00:00
setTimeout ( function ( ) { gURLBar . focus ( ) ; } , 0 ) ;
2002-08-04 02:53:09 +00:00
}
/ * C a l l e d f r o m t h e o p e n L o c a t i o n d i a l o g . T h i s a l l o w s t h a t d i a l o g t o i n s t r u c t
its opener to open a new window and then step completely out of the way .
Anything less byzantine is causing horrible crashes , rather believably ,
though oddly only on Linux . * /
2005-07-15 16:46:37 +00:00
function delayedOpenWindow ( chrome , flags , href , postData )
2002-08-04 02:53:09 +00:00
{
2004-07-07 03:04:09 +00:00
// The other way to use setTimeout,
// setTimeout(openDialog, 10, chrome, "_blank", flags, url),
// doesn't work here. The extra "magic" extra argument setTimeout adds to
// the callback function would confuse prepareForStartup() by making
// window.arguments[1] be an integer instead of null.
2005-07-15 16:46:37 +00:00
setTimeout ( function ( ) { openDialog ( chrome , "_blank" , flags , href , null , null , postData ) ; } , 10 ) ;
2002-08-04 02:53:09 +00:00
}
/ * R e q u i r e d b e c a u s e t h e t a b n e e d s t i m e t o s e t u p i t s c o n t e n t v i e w e r s a n d g e t t h e l o a d o f
the URI kicked off before becoming the active content area . * /
2006-04-03 23:17:51 +00:00
function delayedOpenTab ( aUrl , aReferrer , aCharset , aPostData , aAllowThirdPartyFixup )
2002-08-04 02:53:09 +00:00
{
2006-04-03 23:17:51 +00:00
gBrowser . loadOneTab ( aUrl , aReferrer , aCharset , aPostData , false , aAllowThirdPartyFixup ) ;
2002-08-04 02:53:09 +00:00
}
function BrowserOpenFileWindow ( )
{
// Get filepicker component.
try {
const nsIFilePicker = Components . interfaces . nsIFilePicker ;
var fp = Components . classes [ "@mozilla.org/filepicker;1" ] . createInstance ( nsIFilePicker ) ;
fp . init ( window , gNavigatorBundle . getString ( "openFile" ) , nsIFilePicker . modeOpen ) ;
fp . appendFilters ( nsIFilePicker . filterAll | nsIFilePicker . filterText | nsIFilePicker . filterImages |
nsIFilePicker . filterXML | nsIFilePicker . filterHTML ) ;
if ( fp . show ( ) == nsIFilePicker . returnOK )
openTopWin ( fp . fileURL . spec ) ;
} catch ( ex ) {
}
}
function BrowserCloseTabOrWindow ( )
{
2005-04-19 15:32:38 +00:00
# ifdef XP _MACOSX
// If we're not a browser window, just close the window
if ( window . location . href != getBrowserURL ( ) ) {
closeWindow ( true ) ;
return ;
}
# endif
2006-06-17 21:51:09 +00:00
if ( gBrowser . localName == "tabbrowser" && ( gBrowser . tabContainer . childNodes . length > 1 ||
! gPrefService . getBoolPref ( "browser.tabs.autoHide" ) && window . toolbar . visible ) ) {
2002-08-04 02:53:09 +00:00
// Just close up a tab.
2002-11-16 17:14:12 +00:00
gBrowser . removeCurrentTab ( ) ;
2002-08-04 02:53:09 +00:00
return ;
}
BrowserCloseWindow ( ) ;
}
2004-10-11 13:32:32 +00:00
function BrowserTryToCloseWindow ( )
{
//give tryToClose a chance to veto if it is defined
if ( typeof ( window . tryToClose ) != "function" || window . tryToClose ( ) )
BrowserCloseWindow ( ) ;
}
2005-06-14 10:15:58 +00:00
function BrowserCloseWindow ( )
2002-08-04 02:53:09 +00:00
{
2005-04-19 15:32:38 +00:00
// This code replicates stuff in BrowserShutdown(). It is here because
2002-08-04 02:53:09 +00:00
// window.screenX and window.screenY have real values. We need
// to fix this eventually but by replicating the code here, we
// provide a means of saving position (it just requires that the
// user close the window via File->Close (vs. close box).
2005-06-14 10:15:58 +00:00
2002-08-04 02:53:09 +00:00
// Get the current window position/size.
var x = window . screenX ;
var y = window . screenY ;
var h = window . outerHeight ;
var w = window . outerWidth ;
// Store these into the window attributes (for persistence).
var win = document . getElementById ( "main-window" ) ;
win . setAttribute ( "x" , x ) ;
win . setAttribute ( "y" , y ) ;
win . setAttribute ( "height" , h ) ;
win . setAttribute ( "width" , w ) ;
2003-12-01 05:40:07 +00:00
closeWindow ( true ) ;
2002-08-04 02:53:09 +00:00
}
2006-04-03 23:17:51 +00:00
function loadURI ( uri , referrer , postData , allowThirdPartyFixup )
2002-08-04 02:53:09 +00:00
{
try {
2004-04-20 09:45:12 +00:00
if ( postData === undefined )
postData = null ;
2006-04-03 23:17:51 +00:00
var flags = nsIWebNavigation . LOAD _FLAGS _NONE ;
if ( allowThirdPartyFixup ) {
flags = nsIWebNavigation . LOAD _FLAGS _ALLOW _THIRD _PARTY _FIXUP ;
}
getWebNavigation ( ) . loadURI ( uri , flags , referrer , postData , null ) ;
2002-08-04 02:53:09 +00:00
} catch ( e ) {
}
}
2006-06-26 17:40:49 +00:00
function BrowserLoadURL ( aTriggeringEvent , aPostData ) {
2002-08-04 02:53:09 +00:00
var url = gURLBar . value ;
2006-06-26 17:40:49 +00:00
if ( aTriggeringEvent instanceof MouseEvent ) {
2006-07-05 18:25:10 +00:00
if ( aTriggeringEvent . button == 2 )
return ; // Do nothing for right clicks
2006-06-26 17:40:49 +00:00
// We have a mouse event (from the go button), so use the standard
// UI link behaviors
openUILink ( url , aTriggeringEvent , false , false ,
true /* allow third party fixup */ , aPostData ) ;
return ;
}
if ( aTriggeringEvent && aTriggeringEvent . altKey ) {
2005-06-14 09:25:21 +00:00
handleURLBarRevert ( ) ;
2005-01-28 16:06:56 +00:00
content . focus ( ) ;
2006-04-03 23:17:51 +00:00
gBrowser . loadOneTab ( url , null , null , aPostData , false ,
true /* allow third party fixup */ ) ;
2005-06-16 04:16:27 +00:00
aTriggeringEvent . preventDefault ( ) ;
aTriggeringEvent . stopPropagation ( ) ;
2002-08-04 02:53:09 +00:00
}
2006-06-26 17:40:49 +00:00
else
2006-04-03 23:17:51 +00:00
loadURI ( url , null , aPostData , true /* allow third party fixup */ ) ;
2006-06-26 17:40:49 +00:00
2005-06-16 04:16:27 +00:00
content . focus ( ) ;
2002-08-04 02:53:09 +00:00
}
2004-04-20 09:45:12 +00:00
function getShortcutOrURI ( aURL , aPostDataRef )
2002-08-04 02:53:09 +00:00
{
// rjc: added support for URL shortcuts (3/30/1999)
try {
2006-02-16 00:42:46 +00:00
var shortcutURL = null ;
# ifdef MOZ _PLACES
var bookmarkService = Components . classes [ "@mozilla.org/browser/nav-bookmarks-service;1" ]
. getService ( nsCI . nsINavBookmarksService ) ;
var shortcutURI = bookmarkService . getURIForKeyword ( aURL ) ;
if ( shortcutURI )
shortcutURL = shortcutURI . spec ;
# else
shortcutURL = BMSVC . resolveKeyword ( aURL , aPostDataRef ) ;
# endif
2002-08-04 02:53:09 +00:00
if ( ! shortcutURL ) {
// rjc: add support for string substitution with shortcuts (4/4/2000)
// (see bug # 29871 for details)
2004-04-20 09:45:12 +00:00
var aOffset = aURL . indexOf ( " " ) ;
2002-08-04 02:53:09 +00:00
if ( aOffset > 0 ) {
2004-04-20 09:45:12 +00:00
var cmd = aURL . substr ( 0 , aOffset ) ;
var text = aURL . substr ( aOffset + 1 ) ;
2006-02-16 00:42:46 +00:00
# ifdef MOZ _PLACES
shortcutURI = bookmarkService . getURIForKeyword ( cmd ) ;
if ( shortcutURI )
shortcutURL = shortcutURI . spec ;
# else
2004-04-20 09:45:12 +00:00
shortcutURL = BMSVC . resolveKeyword ( cmd , aPostDataRef ) ;
2006-02-16 00:42:46 +00:00
# endif
2002-08-04 02:53:09 +00:00
if ( shortcutURL && text ) {
2005-08-09 04:53:19 +00:00
var encodedText = null ;
var charset = "" ;
const re = /^(.*)\&mozcharset=([a-zA-Z][_\-a-zA-Z0-9]+)\s*$/ ;
var matches = shortcutURL . match ( re ) ;
if ( matches ) {
shortcutURL = matches [ 1 ] ;
charset = matches [ 2 ] ;
}
2006-02-16 00:42:46 +00:00
# ifndef MOZ _PLACES
// FIXME: Bug 327328, we don't have last charset in places yet.
2005-08-09 04:53:19 +00:00
else if ( /%s/ . test ( shortcutURL ) ||
( aPostDataRef && /%s/ . test ( aPostDataRef . value ) ) ) {
try {
charset = BMSVC . getLastCharset ( shortcutURL ) ;
} catch ( ex ) {
}
}
2006-02-16 00:42:46 +00:00
# endif
2005-08-09 04:53:19 +00:00
if ( charset )
encodedText = escape ( convertFromUnicode ( charset , text ) ) ;
else // default case: charset=UTF-8
encodedText = encodeURIComponent ( text ) ;
2004-04-20 09:45:12 +00:00
if ( aPostDataRef && aPostDataRef . value ) {
// XXXben - currently we only support "application/x-www-form-urlencoded"
// enctypes.
aPostDataRef . value = unescape ( aPostDataRef . value ) ;
2005-08-09 04:53:19 +00:00
if ( aPostDataRef . value . match ( /%[sS]/ ) ) {
aPostDataRef . value = getPostDataStream ( aPostDataRef . value ,
text , encodedText ,
2004-04-20 09:45:12 +00:00
"application/x-www-form-urlencoded" ) ;
2005-08-09 04:53:19 +00:00
}
2004-04-20 09:45:12 +00:00
else {
shortcutURL = null ;
aPostDataRef . value = null ;
}
}
2005-08-09 04:53:19 +00:00
else {
if ( /%[sS]/ . test ( shortcutURL ) )
shortcutURL = shortcutURL . replace ( /%s/g , encodedText )
. replace ( /%S/g , text ) ;
else
shortcutURL = null ;
}
2002-08-04 02:53:09 +00:00
}
}
}
if ( shortcutURL )
2004-04-20 09:45:12 +00:00
aURL = shortcutURL ;
2002-08-04 02:53:09 +00:00
} catch ( ex ) {
}
2004-04-20 09:45:12 +00:00
return aURL ;
}
# if 0
// XXXben - this is only useful if we ever support text/plain encoded forms in
2005-06-14 10:15:58 +00:00
// smart keywords.
2004-04-20 09:45:12 +00:00
function normalizePostData ( aStringData )
{
var parts = aStringData . split ( "&" ) ;
var result = "" ;
for ( var i = 0 ; i < parts . length ; ++ i ) {
var part = unescape ( parts [ i ] ) ;
2004-11-30 08:23:02 +00:00
if ( part )
2004-04-20 09:45:12 +00:00
result += part + "\r\n" ;
}
return result ;
}
# endif
2005-08-09 04:53:19 +00:00
function getPostDataStream ( aStringData , aKeyword , aEncKeyword , aType )
2004-04-20 09:45:12 +00:00
{
var dataStream = Components . classes [ "@mozilla.org/io/string-input-stream;1" ]
2006-01-31 15:25:12 +00:00
. createInstance ( Components . interfaces . nsIStringInputStream ) ;
2005-08-09 04:53:19 +00:00
aStringData = aStringData . replace ( /%s/g , aEncKeyword ) . replace ( /%S/g , aKeyword ) ;
2006-03-14 21:10:06 +00:00
# ifdef MOZILLA _1 _8 _BRANCH
# bug 318193
dataStream . setData ( aStringData , aStringData . length ) ;
# else
2006-01-02 03:34:17 +00:00
dataStream . data = aStringData ;
2006-03-14 21:10:06 +00:00
# endif
2004-04-20 09:45:12 +00:00
var mimeStream = Components . classes [ "@mozilla.org/network/mime-input-stream;1" ]
. createInstance ( Components . interfaces . nsIMIMEInputStream ) ;
mimeStream . addHeader ( "Content-Type" , aType ) ;
mimeStream . addContentLength = true ;
mimeStream . setData ( dataStream ) ;
return mimeStream . QueryInterface ( Components . interfaces . nsIInputStream ) ;
2002-08-04 02:53:09 +00:00
}
2004-04-20 09:45:12 +00:00
2002-08-04 02:53:09 +00:00
function readFromClipboard ( )
{
var url ;
try {
// Get clipboard.
var clipboard = Components . classes [ "@mozilla.org/widget/clipboard;1" ]
. getService ( Components . interfaces . nsIClipboard ) ;
// Create tranferable that will transfer the text.
var trans = Components . classes [ "@mozilla.org/widget/transferable;1" ]
. createInstance ( Components . interfaces . nsITransferable ) ;
trans . addDataFlavor ( "text/unicode" ) ;
2004-06-23 22:54:12 +00:00
// If available, use selection clipboard, otherwise global one
if ( clipboard . supportsSelectionClipboard ( ) )
clipboard . getData ( trans , clipboard . kSelectionClipboard ) ;
else
clipboard . getData ( trans , clipboard . kGlobalClipboard ) ;
2002-08-04 02:53:09 +00:00
var data = { } ;
var dataLen = { } ;
trans . getTransferData ( "text/unicode" , data , dataLen ) ;
if ( data ) {
2002-11-04 23:12:08 +00:00
data = data . value . QueryInterface ( Components . interfaces . nsISupportsString ) ;
2002-08-04 02:53:09 +00:00
url = data . data . substring ( 0 , dataLen . value / 2 ) ;
}
} catch ( ex ) {
}
return url ;
}
function BrowserViewSourceOfDocument ( aDocument )
{
var pageCookie ;
var webNav ;
// Get the document charset
2005-11-22 05:36:48 +00:00
var docCharset = "charset=" + aDocument . characterSet ;
2002-08-04 02:53:09 +00:00
// Get the nsIWebNavigation associated with the document
try {
var win ;
var ifRequestor ;
// Get the DOMWindow for the requested document. If the DOMWindow
2005-01-28 16:06:56 +00:00
// cannot be found, then just use the content window...
2002-08-04 02:53:09 +00:00
//
// XXX: This is a bit of a hack...
win = aDocument . defaultView ;
if ( win == window ) {
2005-01-28 16:06:56 +00:00
win = content ;
2002-08-04 02:53:09 +00:00
}
ifRequestor = win . QueryInterface ( Components . interfaces . nsIInterfaceRequestor ) ;
2002-11-16 17:14:12 +00:00
webNav = ifRequestor . getInterface ( nsIWebNavigation ) ;
2002-08-04 02:53:09 +00:00
} catch ( err ) {
// If nsIWebNavigation cannot be found, just get the one for the whole
// window...
webNav = getWebNavigation ( ) ;
}
//
// Get the 'PageDescriptor' for the current document. This allows the
// view-source to access the cached copy of the content rather than
// refetching it from the network...
//
try {
var PageLoader = webNav . QueryInterface ( Components . interfaces . nsIWebPageDescriptor ) ;
pageCookie = PageLoader . currentDescriptor ;
} catch ( err ) {
// If no page descriptor is available, just use the view-source URL...
}
2005-11-22 05:36:48 +00:00
ViewSourceOfURL ( webNav . currentURI . spec , pageCookie , aDocument ) ;
2002-08-04 02:53:09 +00:00
}
2005-11-22 05:36:48 +00:00
function ViewSourceOfURL ( aURL , aPageDescriptor , aDocument )
2002-08-04 02:53:09 +00:00
{
2005-11-22 05:36:48 +00:00
if ( getBoolPref ( "view_source.editor.external" , false ) ) {
gViewSourceUtils . openInExternalEditor ( aURL , aPageDescriptor , aDocument ) ;
}
else {
gViewSourceUtils . openInInternalViewer ( aURL , aPageDescriptor , aDocument ) ;
}
2002-08-04 02:53:09 +00:00
}
2005-09-21 01:12:29 +00:00
// doc - document to use for source, or null for this window's document
// initialTab - name of the initial tab to display, or null for the first tab
function BrowserPageInfo ( doc , initialTab )
2002-08-04 02:53:09 +00:00
{
2005-09-21 01:12:29 +00:00
var args = { doc : doc , initialTab : initialTab } ;
2005-06-14 10:15:58 +00:00
toOpenDialogByTypeAndUrl ( "Browser:page-info" ,
doc ? doc . location : window . content . document . location ,
"chrome://browser/content/pageInfo.xul" ,
2005-04-26 16:55:59 +00:00
"chrome,dialog=no" ,
2005-09-21 01:12:29 +00:00
args ) ;
2002-08-04 02:53:09 +00:00
}
2002-10-13 05:23:24 +00:00
# ifdef DEBUG
2002-08-04 02:53:09 +00:00
// Initialize the LeakDetector class.
function LeakDetector ( verbose )
{
this . verbose = verbose ;
}
const NS _LEAKDETECTOR _CONTRACTID = "@mozilla.org/xpcom/leakdetector;1" ;
if ( NS _LEAKDETECTOR _CONTRACTID in Components . classes ) {
try {
LeakDetector . prototype = Components . classes [ NS _LEAKDETECTOR _CONTRACTID ]
. createInstance ( Components . interfaces . nsILeakDetector ) ;
} catch ( err ) {
LeakDetector . prototype = Object . prototype ;
}
} else {
LeakDetector . prototype = Object . prototype ;
}
var leakDetector = new LeakDetector ( false ) ;
// Dumps current set of memory leaks.
function dumpMemoryLeaks ( )
{
leakDetector . dumpLeaks ( ) ;
}
// Traces all objects reachable from the chrome document.
function traceChrome ( )
{
leakDetector . traceObject ( document , leakDetector . verbose ) ;
}
// Traces all objects reachable from the content document.
function traceDocument ( )
{
// keep the chrome document out of the dump.
leakDetector . markObject ( document , true ) ;
2005-01-28 16:06:56 +00:00
leakDetector . traceObject ( content , leakDetector . verbose ) ;
2002-08-04 02:53:09 +00:00
leakDetector . markObject ( document , false ) ;
}
// Controls whether or not we do verbose tracing.
function traceVerbose ( verbose )
{
leakDetector . verbose = ( verbose == "true" ) ;
}
2002-10-13 05:23:24 +00:00
# endif
2002-08-04 02:53:09 +00:00
function checkForDirectoryListing ( )
{
2005-01-28 16:06:56 +00:00
if ( "HTTPIndex" in content &&
content . HTTPIndex instanceof Components . interfaces . nsIHTTPIndex ) {
2005-05-20 17:41:10 +00:00
content . wrappedJSObject . defaultCharacterset =
getMarkupDocumentViewer ( ) . defaultCharacterSet ;
2002-08-04 02:53:09 +00:00
}
}
// If "ESC" is pressed in the url bar, we replace the urlbar's value with the url of the page
// and highlight it, unless it is about:blank, where we reset it to "".
function handleURLBarRevert ( )
{
var url = getWebNavigation ( ) . currentURI . spec ;
var throbberElement = document . getElementById ( "navigator-throbber" ) ;
2002-09-28 06:25:03 +00:00
var isScrolling = gURLBar . popupOpen ;
2005-06-14 10:15:58 +00:00
2002-08-04 02:53:09 +00:00
// don't revert to last valid url unless page is NOT loading
// and user is NOT key-scrolling through autocomplete list
2002-08-09 07:48:19 +00:00
if ( ( ! throbberElement || ! throbberElement . hasAttribute ( "busy" ) ) && ! isScrolling ) {
2005-06-14 10:15:58 +00:00
if ( url != "about:blank" ) {
2002-08-04 02:53:09 +00:00
gURLBar . value = url ;
gURLBar . select ( ) ;
2005-04-20 22:01:34 +00:00
SetPageProxyState ( "valid" ) ;
2002-08-04 02:53:09 +00:00
} else { //if about:blank, urlbar becomes ""
gURLBar . value = "" ;
}
}
2005-06-14 10:15:58 +00:00
2003-12-05 05:55:54 +00:00
gBrowser . userTypedValue = null ;
2002-08-04 02:53:09 +00:00
// tell widget to revert to last typed text only if the user
// was scrolling when they hit escape
2005-06-14 10:15:58 +00:00
return ! isScrolling ;
2002-08-04 02:53:09 +00:00
}
2006-06-26 17:40:49 +00:00
function handleURLBarCommand ( aTriggeringEvent ) {
2004-04-20 09:45:12 +00:00
var postData = { } ;
canonizeUrl ( aTriggeringEvent , postData ) ;
2002-11-08 01:18:39 +00:00
2005-06-14 10:15:58 +00:00
try {
2005-07-05 23:08:30 +00:00
addToUrlbarHistory ( gURLBar . value ) ;
2002-08-04 02:53:09 +00:00
} catch ( ex ) {
// Things may go wrong when adding url to session history,
// but don't let that interfere with the loading of the url.
}
2005-06-14 10:15:58 +00:00
BrowserLoadURL ( aTriggeringEvent , postData . value ) ;
2002-08-04 02:53:09 +00:00
}
2006-06-26 17:40:49 +00:00
function canonizeUrl ( aTriggeringEvent , aPostDataRef ) {
2005-12-27 23:13:50 +00:00
if ( ! gURLBar || ! gURLBar . value )
2002-11-08 01:18:39 +00:00
return ;
2005-06-14 10:15:58 +00:00
2002-11-08 01:24:37 +00:00
var url = gURLBar . value ;
2003-07-19 09:35:13 +00:00
2006-06-26 17:40:49 +00:00
// Only add the suffix when the URL bar value isn't already "URL-like".
// Since this function is called from handleURLBarCommand, which receives
// both mouse (from the go button) and keyboard events, we also make sure not
// to do the fixup unless we get a keyboard event, to match user expectations.
if ( ! /^(www|http)|\/\s*$/i . test ( url ) &&
( aTriggeringEvent instanceof KeyEvent ) ) {
2005-02-06 19:53:10 +00:00
# ifdef XP _MACOSX
2006-06-26 17:40:49 +00:00
var accel = aTriggeringEvent . metaKey ;
2005-02-06 19:53:10 +00:00
# else
2006-06-26 17:40:49 +00:00
var accel = aTriggeringEvent . ctrlKey ;
2005-02-06 19:53:10 +00:00
# endif
2006-06-26 17:40:49 +00:00
var shift = aTriggeringEvent . shiftKey ;
var suffix = "" ;
switch ( true ) {
case ( accel && shift ) :
suffix = ".org/" ;
break ;
case ( shift ) :
suffix = ".net/" ;
break ;
case ( accel ) :
try {
suffix = gPrefService . getCharPref ( "browser.fixup.alternate.suffix" ) ;
if ( suffix . charAt ( suffix . length - 1 ) != "/" )
suffix += "/" ;
} catch ( e ) {
suffix = ".com/" ;
}
break ;
2004-12-01 16:42:28 +00:00
}
2004-05-30 15:51:02 +00:00
2006-06-26 17:40:49 +00:00
if ( suffix ) {
2004-05-30 15:51:02 +00:00
// trim leading/trailing spaces (bug 233205)
2006-06-26 17:40:49 +00:00
url = url . replace ( /^\s+/ , "" ) . replace ( /\s+$/ , "" ) ;
2006-06-16 00:44:06 +00:00
// Tack www. and suffix on. If user has appended directories, insert
// suffix before them (bug 279035). Be careful not to get two slashes.
var firstSlash = url . indexOf ( "/" ) ;
if ( firstSlash >= 0 )
url = "http://www." + url . substring ( 0 , firstSlash ) + suffix +
url . substring ( firstSlash + 1 , url . length ) ;
else
url = "http://www." + url + suffix ;
2004-05-30 15:51:02 +00:00
}
2004-03-05 10:53:16 +00:00
}
2002-11-08 01:24:37 +00:00
2004-04-20 09:45:12 +00:00
gURLBar . value = getShortcutOrURI ( url , aPostDataRef ) ;
2002-11-08 01:18:39 +00:00
}
2002-08-04 02:53:09 +00:00
function UpdatePageProxyState ( )
{
2002-09-29 01:23:02 +00:00
if ( gURLBar && gURLBar . value != gLastValidURLStr )
2005-04-20 22:01:34 +00:00
SetPageProxyState ( "invalid" ) ;
2002-08-04 02:53:09 +00:00
}
2005-04-20 22:01:34 +00:00
function SetPageProxyState ( aState )
2002-08-04 02:53:09 +00:00
{
2002-08-07 07:48:17 +00:00
if ( ! gURLBar )
return ;
2002-09-29 01:23:02 +00:00
2002-08-04 02:53:09 +00:00
if ( ! gProxyButton )
gProxyButton = document . getElementById ( "page-proxy-button" ) ;
if ( ! gProxyFavIcon )
gProxyFavIcon = document . getElementById ( "page-proxy-favicon" ) ;
if ( ! gProxyDeck )
gProxyDeck = document . getElementById ( "page-proxy-deck" ) ;
gProxyButton . setAttribute ( "pageproxystate" , aState ) ;
2004-07-29 23:49:31 +00:00
// the page proxy state is set to valid via OnLocationChange, which
2005-06-14 08:04:09 +00:00
// gets called when we switch tabs.
2002-08-04 02:53:09 +00:00
if ( aState == "valid" ) {
gLastValidURLStr = gURLBar . value ;
gURLBar . addEventListener ( "input" , UpdatePageProxyState , false ) ;
2004-07-29 23:49:31 +00:00
2005-06-14 08:04:09 +00:00
PageProxySetIcon ( gBrowser . mCurrentBrowser . mIconURL ) ;
2002-08-04 02:53:09 +00:00
} else if ( aState == "invalid" ) {
gURLBar . removeEventListener ( "input" , UpdatePageProxyState , false ) ;
2004-11-30 08:23:02 +00:00
PageProxyClearIcon ( ) ;
}
}
function PageProxySetIcon ( aURL )
{
if ( ! gProxyFavIcon )
return ;
2005-06-14 08:04:09 +00:00
if ( ! aURL )
PageProxyClearIcon ( ) ;
else if ( gProxyFavIcon . getAttribute ( "src" ) != aURL )
2004-11-30 08:23:02 +00:00
gProxyFavIcon . setAttribute ( "src" , aURL ) ;
else if ( gProxyDeck . selectedIndex != 1 )
gProxyDeck . selectedIndex = 1 ;
}
function PageProxyClearIcon ( )
{
if ( gProxyDeck . selectedIndex != 0 )
2002-08-04 02:53:09 +00:00
gProxyDeck . selectedIndex = 0 ;
2004-11-30 08:23:02 +00:00
if ( gProxyFavIcon . hasAttribute ( "src" ) )
2004-07-29 23:49:31 +00:00
gProxyFavIcon . removeAttribute ( "src" ) ;
2002-08-04 02:53:09 +00:00
}
function PageProxyDragGesture ( aEvent )
{
if ( gProxyButton . getAttribute ( "pageproxystate" ) == "valid" ) {
nsDragAndDrop . startDrag ( aEvent , proxyIconDNDObserver ) ;
return true ;
}
return false ;
}
2005-07-30 19:48:58 +00:00
function PageProxyClickHandler ( aEvent )
{
switch ( aEvent . button ) {
case 0 :
gURLBar . select ( ) ;
break ;
case 1 :
if ( gPrefService . getBoolPref ( "middlemouse.paste" ) )
middleMousePaste ( aEvent ) ;
break ;
}
return true ;
}
2004-02-17 07:09:45 +00:00
function URLBarOnDrop ( evt )
{
nsDragAndDrop . drop ( evt , urlbarObserver ) ;
}
var urlbarObserver = {
onDrop : function ( aEvent , aXferData , aDragSession )
{
var url = transferUtils . retrieveURLFromData ( aXferData . data , aXferData . flavour . contentType ) ;
2005-06-14 10:15:58 +00:00
// The URL bar automatically handles inputs with newline characters,
2004-02-17 07:09:45 +00:00
// so we can get away with treating text/x-moz-url flavours as text/unicode.
2005-03-17 17:40:55 +00:00
if ( url ) {
getBrowser ( ) . dragDropSecurityCheck ( aEvent , aDragSession , url ) ;
2005-08-25 05:17:33 +00:00
try {
gURLBar . value = url ;
var uri = makeURI ( gURLBar . value ) ;
const secMan = Components . classes [ "@mozilla.org/scriptsecuritymanager;1" ]
. getService ( Components . interfaces . nsIScriptSecurityManager ) ;
const nsIScriptSecMan = Components . interfaces . nsIScriptSecurityManager ;
secMan . checkLoadURI ( gBrowser . currentURI , uri , nsIScriptSecMan . DISALLOW _SCRIPT _OR _DATA ) ;
handleURLBarCommand ( ) ;
} catch ( ex ) { }
2004-02-17 07:09:45 +00:00
}
} ,
getSupportedFlavours : function ( )
{
var flavourSet = new FlavourSet ( ) ;
// Plain text drops are often misidentified as "text/x-moz-url", so favor plain text.
flavourSet . appendFlavour ( "text/unicode" ) ;
flavourSet . appendFlavour ( "text/x-moz-url" ) ;
2005-06-14 10:15:58 +00:00
flavourSet . appendFlavour ( "application/x-moz-file" , "nsIFile" ) ;
2004-02-17 07:09:45 +00:00
return flavourSet ;
2004-02-20 00:56:59 +00:00
}
}
2002-08-04 02:53:09 +00:00
function updateToolbarStates ( toolbarMenuElt )
{
if ( ! gHaveUpdatedToolbarState ) {
var mainWindow = document . getElementById ( "main-window" ) ;
if ( mainWindow . hasAttribute ( "chromehidden" ) ) {
gHaveUpdatedToolbarState = true ;
var i ;
for ( i = 0 ; i < toolbarMenuElt . childNodes . length ; ++ i )
document . getElementById ( toolbarMenuElt . childNodes [ i ] . getAttribute ( "observes" ) ) . removeAttribute ( "checked" ) ;
var toolbars = document . getElementsByTagName ( "toolbar" ) ;
2005-06-14 10:15:58 +00:00
2002-10-20 08:03:51 +00:00
// Start i at 1, since we skip the menubar.
for ( i = 1 ; i < toolbars . length ; ++ i ) {
2002-08-04 02:53:09 +00:00
if ( toolbars [ i ] . getAttribute ( "class" ) . indexOf ( "chromeclass" ) != - 1 )
2003-12-05 05:55:54 +00:00
toolbars [ i ] . setAttribute ( "collapsed" , "true" ) ;
2002-08-04 02:53:09 +00:00
}
var statusbars = document . getElementsByTagName ( "statusbar" ) ;
2002-10-20 08:03:51 +00:00
for ( i = 1 ; i < statusbars . length ; ++ i ) {
2002-08-04 02:53:09 +00:00
if ( statusbars [ i ] . getAttribute ( "class" ) . indexOf ( "chromeclass" ) != - 1 )
2003-12-05 05:55:54 +00:00
statusbars [ i ] . setAttribute ( "collapsed" , "true" ) ;
2002-08-04 02:53:09 +00:00
}
mainWindow . removeAttribute ( "chromehidden" ) ;
}
}
}
2004-02-15 01:49:37 +00:00
function BrowserImport ( )
{
2004-03-03 21:26:48 +00:00
# ifdef XP _MACOSX
2005-09-28 04:20:07 +00:00
var wm = Components . classes [ "@mozilla.org/appshell/window-mediator;1" ]
. getService ( Components . interfaces . nsIWindowMediator ) ;
var win = wm . getMostRecentWindow ( "Browser:MigrationWizard" ) ;
if ( win )
win . focus ( ) ;
else {
window . openDialog ( "chrome://browser/content/migration/migration.xul" ,
"migration" , "centerscreen,chrome,resizable=no" ) ;
}
2004-03-03 21:26:48 +00:00
# else
2005-09-28 04:20:07 +00:00
window . openDialog ( "chrome://browser/content/migration/migration.xul" ,
"migration" , "modal,centerscreen,chrome,resizable=no" ) ;
2004-03-03 21:26:48 +00:00
# endif
2004-02-15 01:49:37 +00:00
}
2002-08-04 02:53:09 +00:00
function BrowserFullScreen ( )
{
window . fullScreen = ! window . fullScreen ;
}
function onFullScreen ( )
{
FullScreen . toggle ( ) ;
}
function getWebNavigation ( )
{
try {
2002-11-16 17:14:12 +00:00
return gBrowser . webNavigation ;
2002-08-04 02:53:09 +00:00
} catch ( e ) {
return null ;
}
}
function BrowserReloadWithFlags ( reloadFlags )
{
2005-06-14 10:15:58 +00:00
/ * F i r s t , w e ' l l t r y t o u s e t h e s e s s i o n h i s t o r y o b j e c t t o r e l o a d s o
* that framesets are handled properly . If we ' re in a special
* window ( such as view - source ) that has no session history , fall
2002-08-04 02:53:09 +00:00
* back on using the web navigation ' s reload method .
* /
var webNav = getWebNavigation ( ) ;
try {
var sh = webNav . sessionHistory ;
if ( sh )
2002-11-16 17:14:12 +00:00
webNav = sh . QueryInterface ( nsIWebNavigation ) ;
2002-08-04 02:53:09 +00:00
} catch ( e ) {
}
try {
webNav . reload ( reloadFlags ) ;
} catch ( e ) {
}
}
function toggleAffectedChrome ( aHide )
{
// chrome to toggle includes:
// (*) menubar
// (*) navigation bar
2002-10-19 20:05:43 +00:00
// (*) bookmarks toolbar
2005-04-23 16:37:20 +00:00
// (*) browser messages
2002-10-19 20:05:43 +00:00
// (*) sidebar
2004-11-30 08:23:02 +00:00
// (*) find bar
2004-10-01 23:46:17 +00:00
// (*) statusbar
2002-08-04 02:53:09 +00:00
var navToolbox = document . getElementById ( "navigator-toolbox" ) ;
navToolbox . hidden = aHide ;
if ( aHide )
{
2003-10-29 08:01:27 +00:00
gChromeState = { } ;
2002-10-19 20:05:43 +00:00
var sidebar = document . getElementById ( "sidebar-box" ) ;
gChromeState . sidebarOpen = ! sidebar . hidden ;
2004-11-30 08:23:02 +00:00
gSidebarCommand = sidebar . getAttribute ( "sidebarcommand" ) ;
2005-04-23 16:37:20 +00:00
2006-04-19 20:50:25 +00:00
var notificationBox = gBrowser . getNotificationBox ( ) ;
gChromeState . notificationsOpen = ! notificationBox . notificationsHidden ;
notificationBox . notificationsHidden = aHide ;
2005-04-23 16:37:20 +00:00
var statusbar = document . getElementById ( "status-bar" ) ;
gChromeState . statusbarOpen = ! statusbar . hidden ;
statusbar . hidden = aHide ;
2005-06-14 10:15:58 +00:00
2004-11-30 08:23:02 +00:00
var findBar = document . getElementById ( "FindToolbar" ) ;
gChromeState . findOpen = ! findBar . hidden ;
2005-11-01 17:34:45 +00:00
gFindBar . closeFindBar ( ) ;
2002-08-04 02:53:09 +00:00
}
2004-11-30 08:23:02 +00:00
else {
2006-04-19 20:50:25 +00:00
if ( gChromeState . notificationsOpen ) {
gBrowser . getNotificationBox ( ) . notificationsHidden = aHide ;
2005-04-23 16:37:20 +00:00
}
if ( gChromeState . statusbarOpen ) {
var statusbar = document . getElementById ( "status-bar" ) ;
statusbar . hidden = aHide ;
}
2004-11-30 08:23:02 +00:00
if ( gChromeState . findOpen )
2005-11-01 17:34:45 +00:00
gFindBar . openFindBar ( ) ;
2004-11-30 08:23:02 +00:00
}
2005-06-14 10:15:58 +00:00
2003-10-29 08:01:27 +00:00
if ( gChromeState . sidebarOpen )
2004-11-30 08:23:02 +00:00
toggleSidebar ( gSidebarCommand ) ;
2002-08-04 02:53:09 +00:00
}
2003-10-29 08:01:27 +00:00
function onEnterPrintPreview ( )
2002-08-04 02:53:09 +00:00
{
toggleAffectedChrome ( true ) ;
}
2003-10-29 08:01:27 +00:00
function onExitPrintPreview ( )
{
2002-08-04 02:53:09 +00:00
// restore chrome to original state
toggleAffectedChrome ( false ) ;
}
function getMarkupDocumentViewer ( )
{
2002-11-16 17:14:12 +00:00
return gBrowser . markupDocumentViewer ;
2002-08-04 02:53:09 +00:00
}
/ * *
* Content area tooltip .
* XXX - this must move into XBL binding / equiv ! Do not want to pollute
2002-09-18 20:00:30 +00:00
* browser . js with functionality that can be encapsulated into
2002-08-04 02:53:09 +00:00
* browser widget . TEMPORARY !
*
* NOTE : Any changes to this routine need to be mirrored in ChromeListener : : FindTitleText ( )
* ( located in mozilla / embedding / browser / webBrowser / nsDocShellTreeOwner . cpp )
* which performs the same function , but for embedded clients that
* don ' t use a XUL / JS layer . It is important that the logic of
* these two routines be kept more or less in sync .
* ( pinkerton )
* * /
function FillInHTMLTooltip ( tipElement )
{
var retVal = false ;
if ( tipElement . namespaceURI == "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" )
return retVal ;
const XLinkNS = "http://www.w3.org/1999/xlink" ;
var titleText = null ;
var XLinkTitleText = null ;
2005-06-14 10:15:58 +00:00
2002-08-04 02:53:09 +00:00
while ( ! titleText && ! XLinkTitleText && tipElement ) {
if ( tipElement . nodeType == Node . ELEMENT _NODE ) {
titleText = tipElement . getAttribute ( "title" ) ;
XLinkTitleText = tipElement . getAttributeNS ( XLinkNS , "title" ) ;
}
tipElement = tipElement . parentNode ;
}
var texts = [ titleText , XLinkTitleText ] ;
var tipNode = document . getElementById ( "aHTMLTooltip" ) ;
for ( var i = 0 ; i < texts . length ; ++ i ) {
var t = texts [ i ] ;
if ( t && t . search ( /\S/ ) >= 0 ) {
2006-04-19 19:07:41 +00:00
// XXX - Short-term fix to bug 67127: collapse whitespace here
tipNode . setAttribute ( "label" , t . replace ( /\s+/g , " " ) ) ;
2002-08-04 02:53:09 +00:00
retVal = true ;
}
}
return retVal ;
}
var proxyIconDNDObserver = {
onDragStart : function ( aEvent , aXferData , aDragAction )
{
2002-10-13 22:50:26 +00:00
var value = gURLBar . value ;
2002-08-04 02:53:09 +00:00
// XXX - do we want to allow the user to set a blank page to their homepage?
// if so then we want to modify this a little to set about:blank as
// the homepage in the event of an empty urlbar.
2002-10-13 22:50:26 +00:00
if ( ! value ) return ;
2002-08-04 02:53:09 +00:00
2005-01-28 16:06:56 +00:00
var urlString = value + "\n" + window . content . document . title ;
2002-10-13 22:50:26 +00:00
var htmlString = "<a href=\"" + value + "\">" + value + "</a>" ;
2002-08-04 02:53:09 +00:00
aXferData . data = new TransferData ( ) ;
aXferData . data . addDataForFlavour ( "text/x-moz-url" , urlString ) ;
2002-10-13 22:50:26 +00:00
aXferData . data . addDataForFlavour ( "text/unicode" , value ) ;
2002-08-04 02:53:09 +00:00
aXferData . data . addDataForFlavour ( "text/html" , htmlString ) ;
2004-11-30 08:23:02 +00:00
// we're copying the URL from the proxy icon, not moving
// we specify all of them though, because d&d sucks and OS's
// get confused if they don't get the one they want
aDragAction . action =
Components . interfaces . nsIDragService . DRAGDROP _ACTION _COPY |
Components . interfaces . nsIDragService . DRAGDROP _ACTION _MOVE |
Components . interfaces . nsIDragService . DRAGDROP _ACTION _LINK ;
2002-08-04 02:53:09 +00:00
}
}
var homeButtonObserver = {
onDrop : function ( aEvent , aXferData , aDragSession )
{
var url = transferUtils . retrieveURLFromData ( aXferData . data , aXferData . flavour . contentType ) ;
setTimeout ( openHomeDialog , 0 , url ) ;
} ,
onDragOver : function ( aEvent , aFlavour , aDragSession )
{
var statusTextFld = document . getElementById ( "statusbar-display" ) ;
statusTextFld . label = gNavigatorBundle . getString ( "droponhomebutton" ) ;
aDragSession . dragAction = Components . interfaces . nsIDragService . DRAGDROP _ACTION _LINK ;
} ,
onDragExit : function ( aEvent , aDragSession )
{
var statusTextFld = document . getElementById ( "statusbar-display" ) ;
statusTextFld . label = "" ;
} ,
getSupportedFlavours : function ( )
{
var flavourSet = new FlavourSet ( ) ;
flavourSet . appendFlavour ( "application/x-moz-file" , "nsIFile" ) ;
flavourSet . appendFlavour ( "text/x-moz-url" ) ;
flavourSet . appendFlavour ( "text/unicode" ) ;
return flavourSet ;
}
}
function openHomeDialog ( aURL )
{
var promptService = Components . classes [ "@mozilla.org/embedcomp/prompt-service;1" ] . getService ( Components . interfaces . nsIPromptService ) ;
var promptTitle = gNavigatorBundle . getString ( "droponhometitle" ) ;
var promptMsg = gNavigatorBundle . getString ( "droponhomemsg" ) ;
2002-10-29 19:55:04 +00:00
var pressedVal = promptService . confirmEx ( window , promptTitle , promptMsg ,
2003-08-06 14:54:47 +00:00
( promptService . BUTTON _TITLE _YES * promptService . BUTTON _POS _0 ) +
( promptService . BUTTON _TITLE _NO * promptService . BUTTON _POS _1 ) ,
null , null , null , null , { value : 0 } ) ;
2002-08-04 02:53:09 +00:00
if ( pressedVal == 0 ) {
2002-10-29 19:55:04 +00:00
try {
var str = Components . classes [ "@mozilla.org/supports-string;1" ]
. createInstance ( Components . interfaces . nsISupportsString ) ;
str . data = aURL ;
gPrefService . setComplexValue ( "browser.startup.homepage" ,
2002-11-16 17:14:12 +00:00
Components . interfaces . nsISupportsString , str ) ;
var homeButton = document . getElementById ( "home-button" ) ;
homeButton . setAttribute ( "tooltiptext" , aURL ) ;
2002-10-29 19:55:04 +00:00
} catch ( ex ) {
dump ( "Failed to set the home page.\n" + ex + "\n" ) ;
}
2002-08-04 02:53:09 +00:00
}
}
2004-08-26 14:05:15 +00:00
var bookmarksButtonObserver = {
onDrop : function ( aEvent , aXferData , aDragSession )
{
var split = aXferData . data . split ( "\n" ) ;
var url = split [ 0 ] ;
if ( url != aXferData . data ) { //do nothing if it's not a valid URL
2005-02-17 00:17:12 +00:00
var dialogArgs = {
name : split [ 1 ] ,
url : url
}
2006-02-16 19:00:25 +00:00
# ifndef MOZ _PLACES
2004-08-26 14:05:15 +00:00
openDialog ( "chrome://browser/content/bookmarks/addBookmark2.xul" , "" ,
2005-04-21 09:29:59 +00:00
BROWSER _ADD _BM _FEATURES , dialogArgs ) ;
2006-02-16 19:00:25 +00:00
# else
dump ( "*** IMPLEMENT ME" ) ;
# endif
2004-08-26 14:05:15 +00:00
}
} ,
onDragOver : function ( aEvent , aFlavour , aDragSession )
{
var statusTextFld = document . getElementById ( "statusbar-display" ) ;
statusTextFld . label = gNavigatorBundle . getString ( "droponbookmarksbutton" ) ;
aDragSession . dragAction = Components . interfaces . nsIDragService . DRAGDROP _ACTION _LINK ;
} ,
onDragExit : function ( aEvent , aDragSession )
{
var statusTextFld = document . getElementById ( "statusbar-display" ) ;
statusTextFld . label = "" ;
} ,
getSupportedFlavours : function ( )
{
var flavourSet = new FlavourSet ( ) ;
flavourSet . appendFlavour ( "application/x-moz-file" , "nsIFile" ) ;
flavourSet . appendFlavour ( "text/x-moz-url" ) ;
flavourSet . appendFlavour ( "text/unicode" ) ;
return flavourSet ;
}
}
2005-06-07 19:43:43 +00:00
var newTabButtonObserver = {
onDragOver : function ( aEvent , aFlavour , aDragSession )
{
var statusTextFld = document . getElementById ( "statusbar-display" ) ;
statusTextFld . label = gNavigatorBundle . getString ( "droponnewtabbutton" ) ;
aEvent . target . setAttribute ( "dragover" , "true" ) ;
return true ;
} ,
onDragExit : function ( aEvent , aDragSession )
{
var statusTextFld = document . getElementById ( "statusbar-display" ) ;
statusTextFld . label = "" ;
aEvent . target . removeAttribute ( "dragover" ) ;
} ,
onDrop : function ( aEvent , aXferData , aDragSession )
{
var xferData = aXferData . data . split ( "\n" ) ;
2005-12-01 00:45:23 +00:00
var draggedText = xferData [ 0 ] || xferData [ 1 ] ;
var postData = { } ;
var url = getShortcutOrURI ( draggedText , postData ) ;
2005-09-29 01:47:43 +00:00
if ( url ) {
getBrowser ( ) . dragDropSecurityCheck ( aEvent , aDragSession , url ) ;
2006-04-03 23:17:51 +00:00
// allow third-party services to fixup this URL
openNewTabWith ( url , null , postData . value , aEvent , true ) ;
2005-09-29 01:47:43 +00:00
}
2005-06-07 19:43:43 +00:00
} ,
getSupportedFlavours : function ( )
{
var flavourSet = new FlavourSet ( ) ;
flavourSet . appendFlavour ( "text/unicode" ) ;
flavourSet . appendFlavour ( "text/x-moz-url" ) ;
flavourSet . appendFlavour ( "application/x-moz-file" , "nsIFile" ) ;
return flavourSet ;
}
}
var newWindowButtonObserver = {
onDragOver : function ( aEvent , aFlavour , aDragSession )
{
var statusTextFld = document . getElementById ( "statusbar-display" ) ;
statusTextFld . label = gNavigatorBundle . getString ( "droponnewwindowbutton" ) ;
aEvent . target . setAttribute ( "dragover" , "true" ) ;
return true ;
} ,
onDragExit : function ( aEvent , aDragSession )
{
var statusTextFld = document . getElementById ( "statusbar-display" ) ;
statusTextFld . label = "" ;
aEvent . target . removeAttribute ( "dragover" ) ;
} ,
onDrop : function ( aEvent , aXferData , aDragSession )
{
var xferData = aXferData . data . split ( "\n" ) ;
2005-12-01 00:45:23 +00:00
var draggedText = xferData [ 0 ] || xferData [ 1 ] ;
var postData = { } ;
var url = getShortcutOrURI ( draggedText , postData ) ;
2005-09-29 01:47:43 +00:00
if ( url ) {
getBrowser ( ) . dragDropSecurityCheck ( aEvent , aDragSession , url ) ;
2006-04-03 23:17:51 +00:00
// allow third-party services to fixup this URL
openNewWindowWith ( url , null , postData . value , true ) ;
2005-09-29 01:47:43 +00:00
}
2005-06-07 19:43:43 +00:00
} ,
getSupportedFlavours : function ( )
{
var flavourSet = new FlavourSet ( ) ;
flavourSet . appendFlavour ( "text/unicode" ) ;
flavourSet . appendFlavour ( "text/x-moz-url" ) ;
flavourSet . appendFlavour ( "application/x-moz-file" , "nsIFile" ) ;
return flavourSet ;
}
}
2002-08-04 02:53:09 +00:00
var goButtonObserver = {
onDragOver : function ( aEvent , aFlavour , aDragSession )
{
2004-08-15 13:15:35 +00:00
var statusTextFld = document . getElementById ( "statusbar-display" ) ;
statusTextFld . label = gNavigatorBundle . getString ( "dropongobutton" ) ;
2002-08-04 02:53:09 +00:00
aEvent . target . setAttribute ( "dragover" , "true" ) ;
return true ;
} ,
onDragExit : function ( aEvent , aDragSession )
{
2004-08-15 13:15:35 +00:00
var statusTextFld = document . getElementById ( "statusbar-display" ) ;
statusTextFld . label = "" ;
2002-08-04 02:53:09 +00:00
aEvent . target . removeAttribute ( "dragover" ) ;
} ,
onDrop : function ( aEvent , aXferData , aDragSession )
{
var xferData = aXferData . data . split ( "\n" ) ;
2005-12-01 00:45:23 +00:00
var draggedText = xferData [ 0 ] || xferData [ 1 ] ;
var postData = { } ;
var url = getShortcutOrURI ( draggedText , postData ) ;
2005-08-25 05:17:33 +00:00
try {
2005-10-11 21:20:41 +00:00
getBrowser ( ) . dragDropSecurityCheck ( aEvent , aDragSession , url ) ;
2005-08-25 05:17:33 +00:00
var uri = makeURI ( url ) ;
const secMan = Components . classes [ "@mozilla.org/scriptsecuritymanager;1" ]
. getService ( Components . interfaces . nsIScriptSecurityManager ) ;
const nsIScriptSecMan = Components . interfaces . nsIScriptSecurityManager ;
secMan . checkLoadURI ( gBrowser . currentURI , uri , nsIScriptSecMan . DISALLOW _SCRIPT _OR _DATA ) ;
2006-04-03 23:17:51 +00:00
loadURI ( uri . spec , null , postData . value , true ) ;
2005-08-25 05:17:33 +00:00
} catch ( ex ) { }
2002-08-04 02:53:09 +00:00
} ,
getSupportedFlavours : function ( )
{
var flavourSet = new FlavourSet ( ) ;
flavourSet . appendFlavour ( "text/unicode" ) ;
2005-06-07 19:43:43 +00:00
flavourSet . appendFlavour ( "text/x-moz-url" ) ;
flavourSet . appendFlavour ( "application/x-moz-file" , "nsIFile" ) ;
2002-08-04 02:53:09 +00:00
return flavourSet ;
}
}
2003-12-01 06:33:00 +00:00
var DownloadsButtonDNDObserver = {
/////////////////////////////////////////////////////////////////////////////
// nsDragAndDrop
onDragOver : function ( aEvent , aFlavour , aDragSession )
{
2004-08-15 13:15:35 +00:00
var statusTextFld = document . getElementById ( "statusbar-display" ) ;
statusTextFld . label = gNavigatorBundle . getString ( "dropondownloadsbutton" ) ;
2005-06-14 10:15:58 +00:00
aDragSession . canDrop = ( aFlavour . contentType == "text/x-moz-url" ||
2003-12-01 06:33:00 +00:00
aFlavour . contentType == "text/unicode" ) ;
} ,
2004-08-15 13:15:35 +00:00
onDragExit : function ( aEvent , aDragSession )
{
var statusTextFld = document . getElementById ( "statusbar-display" ) ;
statusTextFld . label = "" ;
} ,
2003-12-01 06:33:00 +00:00
onDrop : function ( aEvent , aXferData , aDragSession )
{
var split = aXferData . data . split ( "\n" ) ;
var url = split [ 0 ] ;
if ( url != aXferData . data ) { //do nothing, not a valid URL
2005-03-17 17:40:55 +00:00
getBrowser ( ) . dragDropSecurityCheck ( aEvent , aDragSession , url ) ;
2003-12-01 06:33:00 +00:00
var name = split [ 1 ] ;
saveURL ( url , name , null , true , true ) ;
}
} ,
getSupportedFlavours : function ( )
{
var flavourSet = new FlavourSet ( ) ;
flavourSet . appendFlavour ( "text/x-moz-url" ) ;
flavourSet . appendFlavour ( "text/unicode" ) ;
return flavourSet ;
}
}
2006-03-17 07:16:00 +00:00
const BrowserSearch = {
2006-05-06 02:37:51 +00:00
/ * *
* Initialize the BrowserSearch
* /
init : function ( ) {
gBrowser . addEventListener ( "DOMLinkAdded" ,
function ( event ) { BrowserSearch . onLinkAdded ( event ) ; } ,
false ) ;
} ,
/ * *
* A new < link > tag has been discovered - check to see if it advertises
* a OpenSearch engine .
* /
onLinkAdded : function ( event ) {
// XXX this event listener can/should probably be combined with the onLinkAdded
// listener in tabbrowser.xml. See comments in FeedHandler.onLinkAdded().
const target = event . target ;
var erel = target . rel ;
var etype = target . type ;
var etitle = target . title ;
var ehref = target . href ;
const searchRelRegex = /(^|\s)search($|\s)/i ;
2006-06-20 21:53:09 +00:00
const searchHrefRegex = /^(https?|ftp):\/\//i ;
2006-05-06 02:37:51 +00:00
if ( ! etype )
return ;
2006-06-12 22:01:52 +00:00
2006-05-06 02:37:51 +00:00
if ( etype == "application/opensearchdescription+xml" &&
2006-05-29 19:00:56 +00:00
searchRelRegex . test ( erel ) && searchHrefRegex . test ( ehref ) )
2006-05-06 02:37:51 +00:00
{
const targetDoc = target . ownerDocument ;
// Set the attribute of the (first) search button.
var searchButton = document . getAnonymousElementByAttribute ( this . getSearchBar ( ) ,
2006-05-18 22:46:50 +00:00
"anonid" , "search-go-button" ) ;
2006-05-06 02:37:51 +00:00
if ( searchButton ) {
var browser = gBrowser . getBrowserForDocument ( targetDoc ) ;
// Append the URI and an appropriate title to the browser data.
var iconURL = null ;
if ( gBrowser . shouldLoadFavIcon ( browser . currentURI ) )
iconURL = browser . currentURI . prePath + "/favicon.ico" ;
var usableTitle = target . title || browser . contentTitle || target . href ;
2006-06-24 00:58:42 +00:00
var hidden = false ;
if ( target . title ) {
// If this engine (identified by title) is already in the list, add it
// to the list of hidden engines rather than to the main list.
// XXX This will need to be changed when engines are identified by URL;
// see bug 335102.
var searchService =
Components . classes [ "@mozilla.org/browser/search-service;1" ]
. getService ( Components . interfaces . nsIBrowserSearchService ) ;
if ( searchService . getEngineByName ( target . title ) )
hidden = true ;
}
var engines = [ ] ;
if ( hidden ) {
if ( browser . hiddenEngines )
engines = browser . hiddenEngines ;
}
else {
if ( browser . engines )
engines = browser . engines ;
}
2006-05-06 02:37:51 +00:00
engines . push ( { uri : target . href ,
title : usableTitle ,
icon : iconURL } ) ;
2006-06-24 00:58:42 +00:00
if ( hidden ) {
browser . hiddenEngines = engines ;
}
else {
browser . engines = engines ;
if ( browser == gBrowser || browser == gBrowser . mCurrentBrowser )
this . updateSearchButton ( ) ;
}
2006-05-06 02:37:51 +00:00
}
}
} ,
/ * *
* Update the browser UI to show whether or not additional engines are
* available when a page is loaded or the user switches tabs to a page that
* has search engines .
* /
updateSearchButton : function ( ) {
var searchButton = document . getAnonymousElementByAttribute ( this . getSearchBar ( ) ,
2006-05-18 22:46:50 +00:00
"anonid" , "search-go-button" ) ;
2006-05-06 02:37:51 +00:00
if ( ! searchButton )
return ;
var engines = gBrowser . mCurrentBrowser . engines ;
if ( ! engines || engines . length == 0 ) {
if ( searchButton . hasAttribute ( "addengines" ) )
searchButton . removeAttribute ( "addengines" ) ;
}
else {
searchButton . setAttribute ( "addengines" , "true" ) ;
}
} ,
2006-03-17 07:16:00 +00:00
/ * *
* Gives focus to the search bar , if it is present on the toolbar , or loads
* the default engine ' s search form otherwise . For Mac , opens a new window
* or focuses an existing window , if necessary .
* /
webSearch : function BrowserSearch _webSearch ( ) {
2005-06-09 00:18:02 +00:00
# ifdef XP _MACOSX
2006-03-17 07:16:00 +00:00
if ( window . location . href != getBrowserURL ( ) ) {
var win = getTopWin ( ) ;
if ( win ) {
// If there's an open browser window, it should handle this command
win . focus ( )
win . BrowserSearch . webSearch ( ) ;
} else {
// If there are no open browser windows, open a new one
win = window . openDialog ( "chrome://browser/content/" , "_blank" ,
"chrome,all,dialog=no" , "about:blank" ) ;
2006-03-17 08:52:55 +00:00
win . addEventListener ( "load" , BrowserSearch . webSearch , false ) ;
2006-03-17 07:16:00 +00:00
}
return ;
2005-06-09 00:18:02 +00:00
}
# endif
2006-03-17 07:16:00 +00:00
var searchBar = this . getSearchBar ( ) ;
if ( searchBar ) {
searchBar . select ( ) ;
searchBar . focus ( ) ;
2002-09-20 21:56:57 +00:00
} else {
2006-03-17 07:16:00 +00:00
var ss = Cc [ "@mozilla.org/browser/search-service;1" ] .
getService ( Ci . nsIBrowserSearchService ) ;
var searchForm = ss . defaultEngine . searchForm ;
2006-04-03 23:17:51 +00:00
loadURI ( searchForm , null , null , false ) ;
2002-09-20 21:56:57 +00:00
}
2006-03-17 07:16:00 +00:00
} ,
/ * *
* Loads a search results page , given a set of search terms . Uses the current
* engine if the search bar is visible , or the default engine otherwise .
*
* @ param searchText
* The search terms to use for the search .
*
* @ param useNewTab
* Boolean indicating whether or not the search should load in a new
* tab .
* /
loadSearch : function BrowserSearch _search ( searchText , useNewTab ) {
var ss = Cc [ "@mozilla.org/browser/search-service;1" ] .
getService ( Ci . nsIBrowserSearchService ) ;
var engine ;
2006-04-28 02:18:58 +00:00
// If the search bar is visible, use the current engine, otherwise, fall
// back to the default engine.
2006-03-17 07:16:00 +00:00
if ( this . getSearchBar ( ) )
engine = ss . currentEngine ;
else
engine = ss . defaultEngine ;
2006-06-16 19:31:40 +00:00
var submission = engine . getSubmission ( searchText , null ) ; // HTML response
// getSubmission can return null if the engine doesn't have a URL
// with a text/html response type. This is unlikely (since
// SearchService._addEngineToStore() should fail for such an engine),
// but let's be on the safe side.
if ( ! submission )
return ;
2006-03-17 07:16:00 +00:00
if ( useNewTab ) {
getBrowser ( ) . loadOneTab ( submission . uri . spec , null , null ,
2006-04-20 23:24:04 +00:00
submission . postData , null , false ) ;
2006-03-17 07:16:00 +00:00
} else
2006-04-03 23:17:51 +00:00
loadURI ( submission . uri . spec , null , submission . postData , false ) ;
2006-03-17 07:16:00 +00:00
} ,
2006-05-06 02:37:51 +00:00
2006-03-17 07:16:00 +00:00
/ * *
* Returns the search bar element if it is present in the toolbar and not
* hidden , null otherwise .
* /
getSearchBar : function BrowserSearch _getSearchBar ( ) {
var searchBar = document . getElementById ( "searchbar" ) ;
if ( searchBar && ! searchBar . parentNode . parentNode . collapsed &&
2006-04-28 02:18:58 +00:00
window . getComputedStyle ( searchBar . parentNode , null ) . display != "none" )
2006-03-17 07:16:00 +00:00
return searchBar ;
return null ;
2006-04-28 02:18:58 +00:00
} ,
loadAddEngines : function BrowserSearch _loadAddEngines ( ) {
var newWindowPref = gPrefService . getIntPref ( "browser.link.open_newwindow" ) ;
var where = newWindowPref == 3 ? "tab" : "window" ;
var regionBundle = document . getElementById ( "bundle_browser_region" ) ;
var searchEnginesURL = regionBundle . getString ( "searchEnginesURL" ) ;
openUILinkIn ( searchEnginesURL , where ) ;
2002-09-20 21:56:57 +00:00
}
}
2006-03-01 21:36:53 +00:00
function FillHistoryMenu ( aParent , aMenu , aInsertBefore )
2002-08-04 02:53:09 +00:00
{
// Remove old entries if any
deleteHistoryItems ( aParent ) ;
2006-04-13 23:07:06 +00:00
var webNav = getWebNavigation ( ) ;
if ( ! webNav ) {
// This is always the case for non-browser windows (and the hidden window)
// on OS X
return true ;
}
var sessionHistory = webNav . sessionHistory ;
2002-08-04 02:53:09 +00:00
var count = sessionHistory . count ;
var index = sessionHistory . index ;
var end ;
var j ;
var entry ;
switch ( aMenu )
{
case "back" :
end = ( index > MAX _HISTORY _MENU _ITEMS ) ? index - MAX _HISTORY _MENU _ITEMS : 0 ;
if ( ( index - 1 ) < end ) return false ;
for ( j = index - 1 ; j >= end ; j -- )
{
entry = sessionHistory . getEntryAtIndex ( j , false ) ;
if ( entry )
createMenuItem ( aParent , j , entry . title ) ;
}
break ;
case "forward" :
2005-07-07 19:30:09 +00:00
end = ( ( count - index ) > MAX _HISTORY _MENU _ITEMS ) ? index + MAX _HISTORY _MENU _ITEMS : count - 1 ;
if ( ( index + 1 ) > end ) return false ;
2005-04-26 16:37:28 +00:00
for ( j = index + 1 ; j <= end ; j ++ )
2002-08-04 02:53:09 +00:00
{
entry = sessionHistory . getEntryAtIndex ( j , false ) ;
if ( entry )
createMenuItem ( aParent , j , entry . title ) ;
}
break ;
2006-03-01 21:36:53 +00:00
case "history" :
aInsertBefore . hidden = ( count == 0 ) ;
2002-08-04 02:53:09 +00:00
end = count > MAX _HISTORY _MENU _ITEMS ? count - MAX _HISTORY _MENU _ITEMS : 0 ;
for ( j = count - 1 ; j >= end ; j -- )
{
entry = sessionHistory . getEntryAtIndex ( j , false ) ;
if ( entry )
2006-03-01 21:36:53 +00:00
createRadioMenuItem ( aParent ,
j ,
entry . title ,
entry . URI ? entry . URI . spec : null ,
j == index ,
aInsertBefore ) ;
2002-08-04 02:53:09 +00:00
}
break ;
}
return true ;
}
2005-07-05 23:08:30 +00:00
function addToUrlbarHistory ( aUrlToAdd )
2002-08-04 02:53:09 +00:00
{
2005-07-05 23:08:30 +00:00
if ( ! aUrlToAdd )
2002-08-04 02:53:09 +00:00
return ;
2005-07-05 23:08:30 +00:00
if ( aUrlToAdd . search ( /[\x00-\x1F]/ ) != - 1 ) // don't store bad URLs
2002-08-04 02:53:09 +00:00
return ;
if ( ! gGlobalHistory )
2004-02-11 02:10:04 +00:00
gGlobalHistory = Components . classes [ "@mozilla.org/browser/global-history;2" ]
2002-08-04 02:53:09 +00:00
. getService ( Components . interfaces . nsIBrowserHistory ) ;
2005-06-14 10:15:58 +00:00
2002-08-04 02:53:09 +00:00
if ( ! gURIFixup )
gURIFixup = Components . classes [ "@mozilla.org/docshell/urifixup;1" ]
. getService ( Components . interfaces . nsIURIFixup ) ;
2002-11-16 17:14:12 +00:00
try {
2005-07-05 23:08:30 +00:00
if ( aUrlToAdd . indexOf ( " " ) == - 1 ) {
var fixedUpURI = gURIFixup . createFixupURI ( aUrlToAdd , 0 ) ;
2004-08-09 21:17:12 +00:00
gGlobalHistory . markPageAsTyped ( fixedUpURI ) ;
2002-11-16 17:14:12 +00:00
}
}
catch ( ex ) {
}
2002-08-04 02:53:09 +00:00
}
function createMenuItem ( aParent , aIndex , aLabel )
{
var menuitem = document . createElement ( "menuitem" ) ;
menuitem . setAttribute ( "label" , aLabel ) ;
menuitem . setAttribute ( "index" , aIndex ) ;
aParent . appendChild ( menuitem ) ;
}
2006-03-01 21:36:53 +00:00
function createRadioMenuItem ( aParent , aIndex , aLabel , aStatusText , aChecked , aInsertBefore )
2002-08-04 02:53:09 +00:00
{
var menuitem = document . createElement ( "menuitem" ) ;
menuitem . setAttribute ( "type" , "radio" ) ;
menuitem . setAttribute ( "label" , aLabel ) ;
menuitem . setAttribute ( "index" , aIndex ) ;
2006-03-01 21:36:53 +00:00
menuitem . setAttribute ( "statustext" , aStatusText ) ;
2002-08-04 02:53:09 +00:00
if ( aChecked == true )
menuitem . setAttribute ( "checked" , "true" ) ;
2006-03-01 21:36:53 +00:00
if ( aInsertBefore )
aParent . insertBefore ( menuitem , aInsertBefore ) ;
else
aParent . appendChild ( menuitem ) ;
2002-08-04 02:53:09 +00:00
}
function deleteHistoryItems ( aParent )
2002-11-16 17:14:12 +00:00
{
var children = aParent . childNodes ;
2005-01-14 22:57:48 +00:00
for ( var i = children . length - 1 ; i >= 0 ; -- i )
2002-11-16 17:14:12 +00:00
{
var index = children [ i ] . getAttribute ( "index" ) ;
if ( index )
aParent . removeChild ( children [ i ] ) ;
}
}
2002-08-04 02:53:09 +00:00
function toJavaScriptConsole ( )
{
2003-03-01 08:07:13 +00:00
toOpenWindowByType ( "global:console" , "chrome://global/content/console.xul" ) ;
2002-08-04 02:53:09 +00:00
}
2003-12-01 06:33:00 +00:00
function toOpenWindowByType ( inType , uri , features )
2002-08-04 02:53:09 +00:00
{
var windowManager = Components . classes [ '@mozilla.org/appshell/window-mediator;1' ] . getService ( ) ;
2002-10-13 23:48:03 +00:00
var windowManagerInterface = windowManager . QueryInterface ( Components . interfaces . nsIWindowMediator ) ;
2002-11-16 17:14:12 +00:00
var topWindow = windowManagerInterface . getMostRecentWindow ( inType ) ;
2005-06-14 10:15:58 +00:00
2003-12-01 06:33:00 +00:00
if ( topWindow )
2002-08-04 02:53:09 +00:00
topWindow . focus ( ) ;
2003-12-01 06:33:00 +00:00
else if ( features )
window . open ( uri , "_blank" , features ) ;
2002-08-04 02:53:09 +00:00
else
window . open ( uri , "_blank" , "chrome,extrachrome,menubar,resizable,scrollbars,status,toolbar" ) ;
}
2005-04-26 16:55:59 +00:00
function toOpenDialogByTypeAndUrl ( inType , relatedUrl , windowUri , features , extraArgument )
{
var windowManager = Components . classes [ '@mozilla.org/appshell/window-mediator;1' ] . getService ( ) ;
var windowManagerInterface = windowManager . QueryInterface ( Components . interfaces . nsIWindowMediator ) ;
var windows = windowManagerInterface . getEnumerator ( inType ) ;
2005-06-14 10:15:58 +00:00
// Check for windows matching the url
2005-04-26 16:55:59 +00:00
while ( windows . hasMoreElements ( ) ) {
var currentWindow = windows . getNext ( ) ;
2006-01-06 21:08:48 +00:00
if ( currentWindow . document . documentElement . getAttribute ( "relatedUrl" ) == relatedUrl ) {
2005-04-26 16:55:59 +00:00
currentWindow . focus ( ) ;
return ;
}
}
// We didn't find a matching window, so open a new one.
if ( features )
window . openDialog ( windowUri , "_blank" , features , extraArgument ) ;
else
window . openDialog ( windowUri , "_blank" , "chrome,extrachrome,menubar,resizable,scrollbars,status,toolbar" , extraArgument ) ;
}
2002-08-04 02:53:09 +00:00
function OpenBrowserWindow ( )
{
var charsetArg = new String ( ) ;
2005-01-17 18:50:18 +00:00
var handler = Components . classes [ "@mozilla.org/browser/clh;1" ]
. getService ( Components . interfaces . nsIBrowserHandler ) ;
2005-04-05 03:17:13 +00:00
var defaultArgs = handler . defaultArgs ;
2006-01-06 21:08:48 +00:00
var wintype = document . documentElement . getAttribute ( 'windowtype' ) ;
2002-08-04 02:53:09 +00:00
// if and only if the current window is a browser window and it has a document with a character
// set, then extract the current charset menu setting from the current document and use it to
// initialize the new browser window...
2005-06-09 00:18:02 +00:00
var win ;
2005-01-28 16:06:56 +00:00
if ( window && ( wintype == "navigator:browser" ) && window . content && window . content . document )
2002-08-04 02:53:09 +00:00
{
2005-01-28 16:06:56 +00:00
var DocCharset = window . content . document . characterSet ;
2002-08-04 02:53:09 +00:00
charsetArg = "charset=" + DocCharset ;
//we should "inherit" the charset menu setting in a new window
2005-06-09 00:18:02 +00:00
win = window . openDialog ( "chrome://browser/content/" , "_blank" , "chrome,all,dialog=no" , defaultArgs , charsetArg ) ;
2002-08-04 02:53:09 +00:00
}
else // forget about the charset information.
{
2005-06-09 00:18:02 +00:00
win = window . openDialog ( "chrome://browser/content/" , "_blank" , "chrome,all,dialog=no" , defaultArgs ) ;
2002-08-04 02:53:09 +00:00
}
2005-06-09 00:18:02 +00:00
return win ;
2002-08-04 02:53:09 +00:00
}
2002-08-05 09:18:01 +00:00
function BrowserCustomizeToolbar ( )
{
2002-10-20 08:03:51 +00:00
// Disable the toolbar context menu items
2002-09-28 15:11:50 +00:00
var menubar = document . getElementById ( "main-menubar" ) ;
for ( var i = 0 ; i < menubar . childNodes . length ; ++ i )
menubar . childNodes [ i ] . setAttribute ( "disabled" , true ) ;
2005-06-14 10:15:58 +00:00
2002-09-27 04:06:56 +00:00
var cmd = document . getElementById ( "cmd_CustomizeToolbars" ) ;
cmd . setAttribute ( "disabled" , "true" ) ;
2005-06-14 10:15:58 +00:00
2002-09-28 15:11:50 +00:00
window . openDialog ( "chrome://global/content/customizeToolbar.xul" , "CustomizeToolbar" ,
2002-09-29 01:23:02 +00:00
"chrome,all,dependent" , document . getElementById ( "navigator-toolbox" ) ) ;
2002-09-27 04:06:56 +00:00
}
2002-09-29 01:23:02 +00:00
function BrowserToolboxCustomizeDone ( aToolboxChanged )
2002-09-27 04:06:56 +00:00
{
2002-09-29 01:23:02 +00:00
// Update global UI elements that may have been added or removed
if ( aToolboxChanged ) {
gURLBar = document . getElementById ( "urlbar" ) ;
2006-01-11 20:24:20 +00:00
if ( gURLBar )
gURLBar . clickSelectsAll = gClickSelectsAll ;
2002-09-29 01:23:02 +00:00
gProxyButton = document . getElementById ( "page-proxy-button" ) ;
gProxyFavIcon = document . getElementById ( "page-proxy-favicon" ) ;
gProxyDeck = document . getElementById ( "page-proxy-deck" ) ;
2003-12-16 00:37:01 +00:00
gHomeButton . updateTooltip ( ) ;
2002-09-29 01:23:02 +00:00
window . XULBrowserWindow . init ( ) ;
}
// Update the urlbar
var url = getWebNavigation ( ) . currentURI . spec ;
if ( gURLBar ) {
gURLBar . value = url ;
2005-04-20 22:01:34 +00:00
SetPageProxyState ( "valid" ) ;
2006-03-09 02:08:45 +00:00
XULBrowserWindow . asyncUpdateUI ( ) ;
2002-09-29 01:23:02 +00:00
}
// Re-enable parts of the UI we disabled during the dialog
2002-09-28 15:11:50 +00:00
var menubar = document . getElementById ( "main-menubar" ) ;
for ( var i = 0 ; i < menubar . childNodes . length ; ++ i )
menubar . childNodes [ i ] . setAttribute ( "disabled" , false ) ;
2002-09-27 04:06:56 +00:00
var cmd = document . getElementById ( "cmd_CustomizeToolbars" ) ;
cmd . removeAttribute ( "disabled" ) ;
2005-09-26 17:26:34 +00:00
// XXXmano bug 287105: wallpaper to bug 309953,
// the reload button isn't in sync with the reload command.
var reloadButton = document . getElementById ( "reload-button" ) ;
if ( reloadButton ) {
reloadButton . disabled =
document . getElementById ( "Browser:Reload" ) . getAttribute ( "disabled" ) == "true" ;
}
2006-05-30 14:10:32 +00:00
# ifdef XP _MACOSX
// make sure to re-enable click-and-hold
if ( ! getBoolPref ( "ui.click_hold_context_menus" , false ) )
SetClickAndHoldHandlers ( ) ;
# endif
2006-02-16 19:00:25 +00:00
# ifndef MOZ _PLACES
2004-07-30 06:25:41 +00:00
// fix up the personal toolbar folder
var bt = document . getElementById ( "bookmarks-ptf" ) ;
if ( bt ) {
var btf = BMSVC . getBookmarksToolbarFolder ( ) . Value ;
var btchevron = document . getElementById ( "bookmarks-chevron" ) ;
bt . ref = btf ;
btchevron . ref = btf ;
// no uniqueness is guaranteed, so we have to remove first
try {
bt . database . RemoveObserver ( BookmarksToolbarRDFObserver ) ;
} catch ( ex ) {
// ignore
}
bt . database . AddObserver ( BookmarksToolbarRDFObserver ) ;
bt . builder . rebuild ( ) ;
btchevron . builder . rebuild ( ) ;
// fake a resize; this function takes care of flowing bookmarks
// from the bar to the overflow item
BookmarksToolbar . resizeFunc ( null ) ;
}
2006-03-09 19:39:29 +00:00
# else
var bookmarksBar = document . getElementById ( "bookmarksBarContent" ) ;
2006-04-04 00:12:32 +00:00
bookmarksBar . _init ( ) ;
2006-02-16 19:00:25 +00:00
# endif
2004-07-30 06:25:41 +00:00
2002-09-29 01:23:02 +00:00
// XXX Shouldn't have to do this, but I do
2002-09-28 15:11:50 +00:00
window . focus ( ) ;
2002-08-05 09:18:01 +00:00
}
2002-08-08 01:55:38 +00:00
2005-06-14 10:15:58 +00:00
var FullScreen =
2002-08-08 01:55:38 +00:00
{
toggle : function ( )
{
// show/hide all menubars, toolbars, and statusbars (except the full screen toolbar)
this . showXULChrome ( "toolbar" , window . fullScreen ) ;
this . showXULChrome ( "statusbar" , window . fullScreen ) ;
2005-08-20 21:38:36 +00:00
document . getElementById ( "fullScreenItem" ) . setAttribute ( "checked" , ! window . fullScreen ) ;
2002-08-08 01:55:38 +00:00
} ,
2005-06-14 10:15:58 +00:00
2002-08-08 01:55:38 +00:00
showXULChrome : function ( aTag , aShow )
{
var XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" ;
var els = document . getElementsByTagNameNS ( XULNS , aTag ) ;
2005-06-14 10:15:58 +00:00
2005-04-03 15:41:20 +00:00
var i , savedMode , savedIconSize ;
2002-08-08 01:55:38 +00:00
for ( i = 0 ; i < els . length ; ++ i ) {
// XXX don't interfere with previously collapsed toolbars
if ( els [ i ] . getAttribute ( "fullscreentoolbar" ) == "true" ) {
2002-09-20 03:52:36 +00:00
if ( ! aShow ) {
2004-07-30 06:25:41 +00:00
var toolbarMode = els [ i ] . getAttribute ( "mode" ) ;
var iconSize = els [ i ] . getAttribute ( "iconsize" ) ;
var contextMenu = els [ i ] . getAttribute ( "context" ) ;
if ( toolbarMode != "text" ) {
els [ i ] . setAttribute ( "saved-mode" , toolbarMode ) ;
els [ i ] . setAttribute ( "saved-iconsize" , iconSize ) ;
2003-07-05 03:36:24 +00:00
els [ i ] . setAttribute ( "mode" , "icons" ) ;
els [ i ] . setAttribute ( "iconsize" , "small" ) ;
}
2004-07-30 06:25:41 +00:00
// XXX See bug 202978: we disable the context menu
// to prevent customization while in fullscreen, which
// causes menu breakage.
els [ i ] . setAttribute ( "saved-context" , contextMenu ) ;
els [ i ] . removeAttribute ( "context" ) ;
2002-09-20 03:52:36 +00:00
}
else {
2004-07-30 06:25:41 +00:00
if ( els [ i ] . hasAttribute ( "saved-mode" ) ) {
2005-04-03 15:41:20 +00:00
savedMode = els [ i ] . getAttribute ( "saved-mode" ) ;
2004-07-30 06:25:41 +00:00
els [ i ] . setAttribute ( "mode" , savedMode ) ;
els [ i ] . removeAttribute ( "saved-mode" ) ;
}
if ( els [ i ] . hasAttribute ( "saved-iconsize" ) ) {
2005-04-03 15:41:20 +00:00
savedIconSize = els [ i ] . getAttribute ( "saved-iconsize" ) ;
2004-07-30 06:25:41 +00:00
els [ i ] . setAttribute ( "iconsize" , savedIconSize ) ;
els [ i ] . removeAttribute ( "saved-iconsize" ) ;
}
// XXX see above.
if ( els [ i ] . hasAttribute ( "saved-context" ) ) {
var savedContext = els [ i ] . getAttribute ( "saved-context" ) ;
els [ i ] . setAttribute ( "context" , savedContext ) ;
els [ i ] . removeAttribute ( "saved-context" ) ;
}
2002-09-20 03:52:36 +00:00
}
2002-08-08 01:55:38 +00:00
} else {
// use moz-collapsed so it doesn't persist hidden/collapsed,
// so that new windows don't have missing toolbars
if ( aShow )
els [ i ] . removeAttribute ( "moz-collapsed" ) ;
else
els [ i ] . setAttribute ( "moz-collapsed" , "true" ) ;
}
}
2004-11-30 08:23:02 +00:00
# ifndef XP _MACOSX
2002-08-08 01:55:38 +00:00
var controls = document . getElementsByAttribute ( "fullscreencontrol" , "true" ) ;
for ( i = 0 ; i < controls . length ; ++ i )
controls [ i ] . hidden = aShow ;
2004-11-30 08:23:02 +00:00
# endif
2004-07-30 06:25:41 +00:00
// XXXvladimir this was a fix for bug 174174, but I don't think it's necessary
// any more?
2003-07-05 03:36:24 +00:00
var toolbox = document . getElementById ( "navigator-toolbox" ) ;
2004-07-30 06:25:41 +00:00
if ( ! aShow ) {
var toolboxMode = toolbox . getAttribute ( "mode" ) ;
var toolboxIconSize = toolbox . getAttribute ( "iconsize" ) ;
if ( toolboxMode != "text" ) {
toolbox . setAttribute ( "saved-mode" , toolboxMode ) ;
toolbox . setAttribute ( "saved-iconsize" , toolboxIconSize ) ;
toolbox . setAttribute ( "mode" , "icons" ) ;
toolbox . setAttribute ( "iconsize" , "small" ) ;
}
else {
if ( toolbox . hasAttribute ( "saved-mode" ) ) {
2005-04-03 15:41:20 +00:00
savedMode = toolbox . getAttribute ( "saved-mode" ) ;
2004-07-30 06:25:41 +00:00
toolbox . setAttribute ( "mode" , savedMode ) ;
toolbox . removeAttribute ( "saved-mode" ) ;
}
if ( toolbox . hasAttribute ( "saved-iconsize" ) ) {
2005-04-03 15:41:20 +00:00
savedIconSize = toolbox . getAttribute ( "saved-iconsize" ) ;
2004-07-30 06:25:41 +00:00
toolbox . setAttribute ( "iconsize" , savedIconSize ) ;
toolbox . removeAttribute ( "saved-iconsize" ) ;
}
}
2003-07-05 03:36:24 +00:00
}
2002-10-18 10:05:47 +00:00
}
2002-08-08 01:55:38 +00:00
} ;
2002-08-09 01:41:39 +00:00
function nsBrowserStatusHandler ( )
{
this . init ( ) ;
}
nsBrowserStatusHandler . prototype =
{
// Stored Status, Link and Loading values
status : "" ,
defaultStatus : "" ,
jsStatus : "" ,
jsDefaultStatus : "" ,
overLink : "" ,
startTime : 0 ,
2002-10-13 02:22:40 +00:00
statusText : "" ,
2004-11-30 08:23:02 +00:00
lastURI : null ,
2002-08-09 01:41:39 +00:00
statusTimeoutInEffect : false ,
QueryInterface : function ( aIID )
{
if ( aIID . equals ( Components . interfaces . nsIWebProgressListener ) ||
aIID . equals ( Components . interfaces . nsISupportsWeakReference ) ||
aIID . equals ( Components . interfaces . nsIXULBrowserWindow ) ||
aIID . equals ( Components . interfaces . nsISupports ) )
return this ;
throw Components . results . NS _NOINTERFACE ;
} ,
init : function ( )
{
2005-02-27 17:59:38 +00:00
this . throbberElement = document . getElementById ( "navigator-throbber" ) ;
this . statusMeter = document . getElementById ( "statusbar-icon" ) ;
this . stopCommand = document . getElementById ( "Browser:Stop" ) ;
this . reloadCommand = document . getElementById ( "Browser:Reload" ) ;
this . reloadSkipCacheCommand = document . getElementById ( "Browser:ReloadSkipCache" ) ;
this . statusTextField = document . getElementById ( "statusbar-display" ) ;
this . securityButton = document . getElementById ( "security-button" ) ;
this . urlBar = document . getElementById ( "urlbar" ) ;
2005-09-18 21:31:34 +00:00
this . isImage = document . getElementById ( "isImage" ) ;
2002-08-09 01:41:39 +00:00
// Initialize the security button's state and tooltip text
2005-05-19 22:52:26 +00:00
var securityUI = getBrowser ( ) . securityUI ;
this . onSecurityChange ( null , null , securityUI . state ) ;
2002-08-09 01:41:39 +00:00
} ,
destroy : function ( )
{
// XXXjag to avoid leaks :-/, see bug 60729
2005-02-27 17:59:38 +00:00
this . throbberElement = null ;
this . statusMeter = null ;
this . stopCommand = null ;
this . reloadCommand = null ;
this . reloadSkipCacheCommand = null ;
this . statusTextField = null ;
this . securityButton = null ;
this . urlBar = null ;
this . statusText = null ;
this . lastURI = null ;
2002-08-09 01:41:39 +00:00
} ,
setJSStatus : function ( status )
{
this . jsStatus = status ;
this . updateStatusField ( ) ;
} ,
setJSDefaultStatus : function ( status )
{
this . jsDefaultStatus = status ;
this . updateStatusField ( ) ;
} ,
setDefaultStatus : function ( status )
{
this . defaultStatus = status ;
this . updateStatusField ( ) ;
} ,
setOverLink : function ( link , b )
{
this . overLink = link ;
this . updateStatusField ( ) ;
} ,
updateStatusField : function ( )
{
var text = this . overLink || this . status || this . jsStatus || this . jsDefaultStatus || this . defaultStatus ;
// check the current value so we don't trigger an attribute change
// and cause needless (slow!) UI updates
2002-10-13 02:22:40 +00:00
if ( this . statusText != text ) {
2002-08-09 01:41:39 +00:00
this . statusTextField . label = text ;
2002-10-13 02:22:40 +00:00
this . statusText = text ;
}
2002-08-09 01:41:39 +00:00
} ,
2005-09-18 21:31:34 +00:00
mimeTypeIsTextBased : function ( contentType )
{
return /^text\/|\+xml$/ . test ( contentType ) ||
contentType == "application/x-javascript" ||
contentType == "application/xml" ||
contentType == "mozilla.application/cached-xul" ;
} ,
2002-08-09 01:41:39 +00:00
2005-06-14 10:15:58 +00:00
onLinkIconAvailable : function ( aBrowser )
2003-12-05 05:55:54 +00:00
{
2004-07-29 23:49:31 +00:00
if ( gProxyFavIcon &&
gBrowser . mCurrentBrowser == aBrowser &&
2004-11-30 08:23:02 +00:00
gBrowser . userTypedValue === null )
{
2006-03-03 19:11:10 +00:00
// update the favicon in the URL bar
2005-06-14 08:04:09 +00:00
PageProxySetIcon ( aBrowser . mIconURL ) ;
2006-06-26 00:37:27 +00:00
}
2006-03-03 19:11:10 +00:00
# ifdef MOZ _PLACES
2006-06-26 00:37:27 +00:00
// Save this favicon in the favicon service
if ( aBrowser . mIconURL ) {
var faviconService = Components . classes [ "@mozilla.org/browser/favicon-service;1" ]
. getService ( Components . interfaces . nsIFaviconService ) ;
var uri = Components . classes [ "@mozilla.org/network/io-service;1" ]
. getService ( Components . interfaces . nsIIOService ) . newURI ( aBrowser . mIconURL , null , null ) ;
faviconService . setAndLoadFaviconForPage ( aBrowser . currentURI , uri , false ) ;
2002-08-09 01:41:39 +00:00
}
2006-06-26 00:37:27 +00:00
# endif
2002-08-09 01:41:39 +00:00
} ,
onProgressChange : function ( aWebProgress , aRequest ,
aCurSelfProgress , aMaxSelfProgress ,
aCurTotalProgress , aMaxTotalProgress )
{
if ( aMaxTotalProgress > 0 ) {
// This is highly optimized. Don't touch this code unless
// you are intimately familiar with the cost of setting
// attrs on XUL elements. -- hyatt
var percentage = ( aCurTotalProgress * 100 ) / aMaxTotalProgress ;
this . statusMeter . value = percentage ;
2005-06-14 10:15:58 +00:00
}
2002-08-09 01:41:39 +00:00
} ,
onStateChange : function ( aWebProgress , aRequest , aStateFlags , aStatus )
2005-06-14 10:15:58 +00:00
{
2002-08-09 01:41:39 +00:00
const nsIWebProgressListener = Components . interfaces . nsIWebProgressListener ;
const nsIChannel = Components . interfaces . nsIChannel ;
if ( aStateFlags & nsIWebProgressListener . STATE _START ) {
2002-09-20 02:54:41 +00:00
// This (thanks to the filter) is a network start or the first
// stray request (the first request outside of the document load),
// initialize the throbber and his friends.
2004-11-30 08:23:02 +00:00
2002-08-09 01:41:39 +00:00
// Call start document load listeners (only if this is a network load)
if ( aStateFlags & nsIWebProgressListener . STATE _IS _NETWORK &&
aRequest && aWebProgress . DOMWindow == content )
this . startDocumentLoad ( aRequest ) ;
2005-06-14 10:15:58 +00:00
if ( this . throbberElement ) {
2002-09-20 02:54:41 +00:00
// Turn the throbber on.
this . throbberElement . setAttribute ( "busy" , "true" ) ;
}
2002-08-09 01:41:39 +00:00
2002-10-09 07:37:55 +00:00
// Turn the status meter on.
2002-10-09 09:22:09 +00:00
this . statusMeter . value = 0 ; // be sure to clear the progress bar
2002-10-09 09:15:21 +00:00
if ( gProgressCollapseTimer ) {
2002-10-09 09:27:19 +00:00
window . clearTimeout ( gProgressCollapseTimer ) ;
2002-10-09 09:15:21 +00:00
gProgressCollapseTimer = null ;
}
else
this . statusMeter . parentNode . collapsed = false ;
2002-10-09 07:37:55 +00:00
2002-08-09 01:41:39 +00:00
// XXX: This needs to be based on window activity...
2002-08-10 00:55:06 +00:00
this . stopCommand . removeAttribute ( "disabled" ) ;
2002-08-09 01:41:39 +00:00
}
else if ( aStateFlags & nsIWebProgressListener . STATE _STOP ) {
if ( aStateFlags & nsIWebProgressListener . STATE _IS _NETWORK ) {
2005-06-14 08:04:09 +00:00
if ( aWebProgress . DOMWindow == content ) {
if ( aRequest )
2002-08-09 01:41:39 +00:00
this . endDocumentLoad ( aRequest , aStatus ) ;
2005-06-14 08:04:09 +00:00
var browser = gBrowser . mCurrentBrowser ;
if ( ! gBrowser . mTabbedMode && ! browser . mIconURL )
gBrowser . useDefaultIcon ( gBrowser . mCurrentTab ) ;
2006-02-16 19:00:25 +00:00
# ifndef MOZ _PLACES
2005-06-14 08:04:09 +00:00
if ( browser . mIconURL )
BookmarksUtils . loadFavIcon ( browser . currentURI . spec , browser . mIconURL ) ;
2006-02-16 19:00:25 +00:00
# endif
2002-08-09 01:41:39 +00:00
}
}
2002-09-20 02:54:41 +00:00
// This (thanks to the filter) is a network stop or the last
// request stop outside of loading the document, stop throbbers
// and progress bars and such
if ( aRequest ) {
var msg = "" ;
2006-03-23 03:31:18 +00:00
// Get the URI either from a channel or a pseudo-object
if ( aRequest instanceof nsIChannel || "URI" in aRequest ) {
var location = aRequest . URI ;
2004-11-30 08:23:02 +00:00
// For keyword URIs clear the user typed value since they will be changed into real URIs
if ( location . scheme == "keyword" && aWebProgress . DOMWindow == content )
getBrowser ( ) . userTypedValue = null ;
if ( location . spec != "about:blank" ) {
2003-12-05 05:55:54 +00:00
const kErrorBindingAborted = 0x804B0002 ;
const kErrorNetTimeout = 0x804B000E ;
2002-08-09 01:41:39 +00:00
switch ( aStatus ) {
case kErrorBindingAborted :
msg = gNavigatorBundle . getString ( "nv_stopped" ) ;
break ;
case kErrorNetTimeout :
msg = gNavigatorBundle . getString ( "nv_timeout" ) ;
break ;
}
}
}
// If msg is false then we did not have an error (channel may have
// been null, in the case of a stray image load).
2006-03-28 17:25:11 +00:00
if ( ! msg && ( ! location || location . spec != "about:blank" ) ) {
2002-08-09 01:41:39 +00:00
msg = gNavigatorBundle . getString ( "nv_done" ) ;
}
this . status = "" ;
this . setDefaultStatus ( msg ) ;
2005-09-18 21:31:34 +00:00
// Disable menu entries for images, enable otherwise
if ( content . document && this . mimeTypeIsTextBased ( content . document . contentType ) )
this . isImage . removeAttribute ( 'disabled' ) ;
else
this . isImage . setAttribute ( 'disabled' , 'true' ) ;
2002-08-09 01:41:39 +00:00
}
// Turn the progress meter and throbber off.
2004-07-07 03:04:09 +00:00
gProgressCollapseTimer = window . setTimeout (
2005-06-14 10:15:58 +00:00
function ( ) {
gProgressMeterPanel . collapsed = true ;
2004-07-07 03:04:09 +00:00
gProgressCollapseTimer = null ;
} , 100 ) ;
2002-10-09 07:37:55 +00:00
2002-08-09 07:48:19 +00:00
if ( this . throbberElement )
this . throbberElement . removeAttribute ( "busy" ) ;
2002-08-09 01:41:39 +00:00
this . stopCommand . setAttribute ( "disabled" , "true" ) ;
}
} ,
onLocationChange : function ( aWebProgress , aRequest , aLocation )
{
2006-06-21 03:10:01 +00:00
if ( document . tooltipNode ) {
// Optimise for the common case
if ( aWebProgress . DOMWindow == content ) {
document . getElementById ( "aHTMLTooltip" ) . hidePopup ( ) ;
document . tooltipNode = null ;
}
else {
for ( var tooltipWindow =
document . tooltipNode . target . ownerDocument . defaultView ;
tooltipWindow != tooltipWindow . parent ;
tooltipWindow = tooltipWindow . parent ) {
if ( tooltipWindow == aWebProgress . DOMWindow ) {
document . getElementById ( "aHTMLTooltip" ) . hidePopup ( ) ;
document . tooltipNode = null ;
break ;
}
}
}
}
2004-11-30 08:23:02 +00:00
// This code here does not compare uris exactly when determining
// whether or not the message should be hidden since the message
// may be prematurely hidden when an install is invoked by a click
// on a link that looks like this:
//
// <a href="#" onclick="return install();">Install Foo</a>
//
// - which fires a onLocationChange message to uri + '#'...
var selectedBrowser = getBrowser ( ) . selectedBrowser ;
if ( selectedBrowser . lastURI ) {
var oldSpec = selectedBrowser . lastURI . spec ;
var oldIndexOfHash = oldSpec . indexOf ( "#" ) ;
if ( oldIndexOfHash != - 1 )
oldSpec = oldSpec . substr ( 0 , oldIndexOfHash ) ;
var newSpec = aLocation . spec ;
var newIndexOfHash = newSpec . indexOf ( "#" ) ;
if ( newIndexOfHash != - 1 )
newSpec = newSpec . substr ( 0 , newSpec . indexOf ( "#" ) ) ;
if ( newSpec != oldSpec ) {
2006-04-19 20:50:25 +00:00
gBrowser . getNotificationBox ( selectedBrowser ) . removeAllNotifications ( true ) ;
2004-11-30 08:23:02 +00:00
}
}
selectedBrowser . lastURI = aLocation ;
2005-09-18 21:31:34 +00:00
// Disable menu entries for images, enable otherwise
if ( content . document && this . mimeTypeIsTextBased ( content . document . contentType ) )
this . isImage . removeAttribute ( 'disabled' ) ;
else
this . isImage . setAttribute ( 'disabled' , 'true' ) ;
2002-08-09 01:41:39 +00:00
this . setOverLink ( "" , null ) ;
2005-06-14 10:15:58 +00:00
2002-08-09 01:41:39 +00:00
// We should probably not do this if the value has changed since the user
// searched
// Update urlbar only if a new page was loaded on the primary content area
// Do not update urlbar if there was a subframe navigation
2003-12-05 05:55:54 +00:00
var browser = getBrowser ( ) . selectedBrowser ;
2004-11-30 08:23:02 +00:00
var findField = document . getElementById ( "find-field" ) ;
2005-04-20 22:04:03 +00:00
if ( aWebProgress . DOMWindow == content ) {
2005-06-14 10:15:58 +00:00
2005-04-20 22:04:03 +00:00
var location = aLocation . spec ;
if ( location == "about:blank" || location == "" ) { //second condition is for new tabs, otherwise
location = "" ; //reload function is enabled until tab is refreshed
this . reloadCommand . setAttribute ( "disabled" , "true" ) ;
this . reloadSkipCacheCommand . setAttribute ( "disabled" , "true" ) ;
} else {
this . reloadCommand . removeAttribute ( "disabled" ) ;
this . reloadSkipCacheCommand . removeAttribute ( "disabled" ) ;
}
2004-07-24 00:24:30 +00:00
// The document loaded correctly, clear the value if we should
2005-11-12 01:51:36 +00:00
if ( browser . userTypedClear > 0 && aRequest )
2004-07-24 00:24:30 +00:00
browser . userTypedValue = null ;
2005-09-20 20:07:56 +00:00
if ( ! gBrowser . mTabbedMode && aWebProgress . isLoadingDocument )
2005-06-14 08:04:09 +00:00
gBrowser . setIcon ( gBrowser . mCurrentTab , null ) ;
2004-11-30 08:23:02 +00:00
if ( findField )
2005-06-14 10:15:58 +00:00
setTimeout ( function ( ) { findField . value = browser . findString ; } , 0 , findField , browser ) ;
2004-07-29 23:49:31 +00:00
2002-09-20 03:52:36 +00:00
//XXXBlake don't we have to reinit this.urlBar, etc.
// when the toolbar changes?
2004-11-30 08:23:02 +00:00
if ( gURLBar ) {
var userTypedValue = browser . userTypedValue ;
if ( ! userTypedValue ) {
// If the url has "wyciwyg://" as the protocol, strip it off.
// Nobody wants to see it on the urlbar for dynamically generated
2005-06-14 10:15:58 +00:00
// pages.
2004-11-30 08:23:02 +00:00
if ( ! gURIFixup )
gURIFixup = Components . classes [ "@mozilla.org/docshell/urifixup;1" ]
. getService ( Components . interfaces . nsIURIFixup ) ;
if ( location && gURIFixup )
try {
var locationURI = gURIFixup . createExposableURI ( aLocation ) ;
location = locationURI . spec ;
} catch ( exception ) { }
if ( getBrowser ( ) . forceSyncURLBarUpdate ) {
gURLBar . value = "" ; // hack for bug 249322
gURLBar . value = location ;
2005-04-20 22:01:34 +00:00
SetPageProxyState ( "valid" ) ;
2004-11-30 08:23:02 +00:00
} else {
2005-06-14 10:15:58 +00:00
setTimeout ( function ( loc ) {
2004-11-30 08:23:02 +00:00
gURLBar . value = "" ; // hack for bug 249322
2005-06-14 10:15:58 +00:00
gURLBar . value = loc ;
2005-04-20 22:01:34 +00:00
SetPageProxyState ( "valid" ) ;
2006-05-11 07:34:40 +00:00
} , 0 , location ) ;
2004-11-30 08:23:02 +00:00
}
// Setting the urlBar value in some cases causes userTypedValue to
// become set because of oninput, so reset it to its old value.
browser . userTypedValue = userTypedValue ;
2004-11-03 17:06:21 +00:00
} else {
2004-11-30 08:23:02 +00:00
gURLBar . value = userTypedValue ;
2005-04-20 22:01:34 +00:00
SetPageProxyState ( "invalid" ) ;
2004-11-03 17:06:21 +00:00
}
2002-08-09 01:41:39 +00:00
}
}
UpdateBackForwardButtons ( ) ;
2005-11-01 17:34:45 +00:00
if ( findField && gFindBar . mFindMode != FIND _NORMAL ) {
2004-11-30 08:23:02 +00:00
// Close the Find toolbar if we're in old-style TAF mode
2005-11-01 17:34:45 +00:00
gFindBar . closeFindBar ( ) ;
2004-11-30 08:23:02 +00:00
}
2005-06-14 10:15:58 +00:00
2004-11-30 08:23:02 +00:00
//fix bug 253793 - turn off highlight when page changes
if ( document . getElementById ( "highlight" ) . checked )
document . getElementById ( "highlight" ) . removeAttribute ( "checked" ) ;
2005-06-14 10:15:58 +00:00
2006-03-09 02:08:45 +00:00
var self = this ;
setTimeout ( function ( ) { self . asyncUpdateUI ( ) ; } , 0 ) ;
} ,
asyncUpdateUI : function ( ) {
FeedHandler . updateFeeds ( ) ;
2006-05-06 02:37:51 +00:00
BrowserSearch . updateSearchButton ( ) ;
2004-11-30 08:23:02 +00:00
# ifdef ALTSS _ICON
2006-03-09 02:08:45 +00:00
updatePageStyles ( ) ;
# endif
# ifdef MOZ _PLACES
PlacesCommandHook . updateTagButton ( ) ;
2004-11-30 08:23:02 +00:00
# endif
2002-08-09 01:41:39 +00:00
} ,
onStatusChange : function ( aWebProgress , aRequest , aStatus , aMessage )
{
this . status = aMessage ;
this . updateStatusField ( ) ;
} ,
onSecurityChange : function ( aWebProgress , aRequest , aState )
{
const wpl = Components . interfaces . nsIWebProgressListener ;
2004-11-30 08:23:02 +00:00
this . securityButton . removeAttribute ( "label" ) ;
2002-08-09 01:41:39 +00:00
switch ( aState ) {
case wpl . STATE _IS _SECURE | wpl . STATE _SECURE _HIGH :
2004-07-09 06:32:33 +00:00
this . securityButton . setAttribute ( "level" , "high" ) ;
2004-11-30 08:23:02 +00:00
if ( this . urlBar )
this . urlBar . setAttribute ( "level" , "high" ) ;
try {
this . securityButton . setAttribute ( "label" ,
gBrowser . contentWindow . location . host ) ;
} catch ( exception ) { }
2002-08-09 01:41:39 +00:00
break ;
case wpl . STATE _IS _SECURE | wpl . STATE _SECURE _LOW :
2004-07-09 06:32:33 +00:00
this . securityButton . setAttribute ( "level" , "low" ) ;
2004-11-30 08:23:02 +00:00
if ( this . urlBar )
this . urlBar . setAttribute ( "level" , "low" ) ;
try {
2005-06-14 10:15:58 +00:00
this . securityButton . setAttribute ( "label" ,
2004-11-30 08:23:02 +00:00
gBrowser . contentWindow . location . host ) ;
2005-06-14 10:15:58 +00:00
} catch ( exception ) { }
2002-08-09 01:41:39 +00:00
break ;
case wpl . STATE _IS _BROKEN :
2004-07-09 06:32:33 +00:00
this . securityButton . setAttribute ( "level" , "broken" ) ;
2004-11-30 08:23:02 +00:00
if ( this . urlBar )
this . urlBar . setAttribute ( "level" , "broken" ) ;
2002-08-09 01:41:39 +00:00
break ;
case wpl . STATE _IS _INSECURE :
default :
2004-07-09 06:32:33 +00:00
this . securityButton . removeAttribute ( "level" ) ;
2004-11-30 08:23:02 +00:00
if ( this . urlBar )
this . urlBar . removeAttribute ( "level" ) ;
2002-08-09 01:41:39 +00:00
break ;
}
2002-11-16 17:14:12 +00:00
var securityUI = gBrowser . securityUI ;
2005-05-20 02:09:09 +00:00
this . securityButton . setAttribute ( "tooltiptext" , securityUI . tooltipText ) ;
2005-09-13 22:50:54 +00:00
var lockIcon = document . getElementById ( "lock-icon" ) ;
if ( lockIcon )
lockIcon . setAttribute ( "tooltiptext" , securityUI . tooltipText ) ;
2002-08-09 01:41:39 +00:00
} ,
2006-03-23 03:31:18 +00:00
// simulate all change notifications after switching tabs
onUpdateCurrentBrowser : function ( aStateFlags , aStatus , aMessage , aTotalProgress )
{
var nsIWebProgressListener = Components . interfaces . nsIWebProgressListener ;
var loadingDone = aStateFlags & nsIWebProgressListener . STATE _STOP ;
// use a pseudo-object instead of a (potentially non-existing) channel for getting
// a correct error message - and make sure that the UI is always either in
// loading (STATE_START) or done (STATE_STOP) mode
this . onStateChange (
gBrowser . webProgress ,
{ URI : gBrowser . currentURI } ,
loadingDone ? nsIWebProgressListener . STATE _STOP : nsIWebProgressListener . STATE _START ,
aStatus
) ;
// status message and progress value are undefined if we're done with loading
if ( loadingDone )
return ;
this . onStatusChange ( gBrowser . webProgress , null , 0 , aMessage ) ;
this . onProgressChange ( gBrowser . webProgress , 0 , 0 , aTotalProgress , 1 ) ;
} ,
2002-08-09 01:41:39 +00:00
startDocumentLoad : function ( aRequest )
{
2004-07-24 00:32:47 +00:00
// It's okay to clear what the user typed when we start
2005-08-28 18:49:03 +00:00
// loading a document. If the user types, this counter gets
// set to zero, if the document load ends without an
// onLocationChange, this counter gets decremented
// (so we keep it while switching tabs after failed loads)
getBrowser ( ) . userTypedClear ++ ;
2002-08-09 01:41:39 +00:00
2005-08-12 00:34:19 +00:00
// clear out feed data
gBrowser . mCurrentBrowser . feeds = null ;
2005-06-14 10:15:58 +00:00
2006-05-06 02:37:51 +00:00
// clear out search-engine data
gBrowser . mCurrentBrowser . engines = null ;
2002-08-09 01:41:39 +00:00
const nsIChannel = Components . interfaces . nsIChannel ;
var urlStr = aRequest . QueryInterface ( nsIChannel ) . URI . spec ;
var observerService = Components . classes [ "@mozilla.org/observer-service;1" ]
. getService ( Components . interfaces . nsIObserverService ) ;
try {
2005-01-28 16:06:56 +00:00
observerService . notifyObservers ( content , "StartDocumentLoad" , urlStr ) ;
2002-08-09 01:41:39 +00:00
} catch ( e ) {
}
} ,
endDocumentLoad : function ( aRequest , aStatus )
{
2005-08-28 18:49:03 +00:00
// The document is done loading, we no longer want the
// value cleared.
if ( getBrowser ( ) . userTypedClear > 0 )
getBrowser ( ) . userTypedClear -- ;
2004-07-24 00:32:47 +00:00
2002-08-09 01:41:39 +00:00
const nsIChannel = Components . interfaces . nsIChannel ;
var urlStr = aRequest . QueryInterface ( nsIChannel ) . originalURI . spec ;
var observerService = Components . classes [ "@mozilla.org/observer-service;1" ]
. getService ( Components . interfaces . nsIObserverService ) ;
var notification = Components . isSuccessCode ( aStatus ) ? "EndDocumentLoad" : "FailDocumentLoad" ;
try {
2005-01-28 16:06:56 +00:00
observerService . notifyObservers ( content , notification , urlStr ) ;
2002-08-09 01:41:39 +00:00
} catch ( e ) {
}
2004-11-30 08:23:02 +00:00
setTimeout ( function ( ) { if ( document . getElementById ( "highlight" ) . checked ) toggleHighlight ( true ) ; } , 0 ) ;
}
}
function nsBrowserAccess ( )
{
}
nsBrowserAccess . prototype =
{
QueryInterface : function ( aIID )
{
if ( aIID . equals ( nsCI . nsIBrowserDOMWindow ) ||
aIID . equals ( nsCI . nsISupports ) )
return this ;
throw Components . results . NS _NOINTERFACE ;
} ,
openURI : function ( aURI , aOpener , aWhere , aContext )
{
var newWindow = null ;
var referrer = null ;
2005-07-07 09:45:47 +00:00
var isExternal = ( aContext == nsCI . nsIBrowserDOMWindow . OPEN _EXTERNAL ) ;
if ( isExternal && aURI && aURI . schemeIs ( "chrome" ) ) {
dump ( "use -chrome command-line option to load external chrome urls\n" ) ;
return null ;
}
var loadflags = isExternal ?
nsCI . nsIWebNavigation . LOAD _FLAGS _FROM _EXTERNAL :
nsCI . nsIWebNavigation . LOAD _FLAGS _NONE ;
2005-04-03 15:41:20 +00:00
var location ;
2004-11-30 08:23:02 +00:00
if ( aWhere == nsCI . nsIBrowserDOMWindow . OPEN _DEFAULTWINDOW ) {
switch ( aContext ) {
case nsCI . nsIBrowserDOMWindow . OPEN _EXTERNAL :
aWhere = gPrefService . getIntPref ( "browser.link.open_external" ) ;
break ;
default : // OPEN_NEW or an illegal value
aWhere = gPrefService . getIntPref ( "browser.link.open_newwindow" ) ;
}
}
var url = aURI ? aURI . spec : "about:blank" ;
switch ( aWhere ) {
case nsCI . nsIBrowserDOMWindow . OPEN _NEWWINDOW :
newWindow = openDialog ( getBrowserURL ( ) , "_blank" , "all,dialog=no" , url ) ;
break ;
case nsCI . nsIBrowserDOMWindow . OPEN _NEWTAB :
2006-01-20 23:04:26 +00:00
var loadInBackground = gPrefService . getBoolPref ( "browser.tabs.loadDivertedInBackground" ) ;
2006-04-03 23:17:51 +00:00
var newTab = gBrowser . loadOneTab ( "about:blank" , null , null , null , loadInBackground , false ) ;
2004-11-30 08:23:02 +00:00
newWindow = gBrowser . getBrowserForTab ( newTab ) . docShell
. QueryInterface ( nsCI . nsIInterfaceRequestor )
. getInterface ( nsCI . nsIDOMWindow ) ;
try {
if ( aOpener ) {
2005-05-20 17:41:10 +00:00
location = aOpener . location ;
2005-06-14 10:15:58 +00:00
referrer =
2005-02-28 23:09:24 +00:00
Components . classes [ "@mozilla.org/network/io-service;1" ]
. getService ( Components . interfaces . nsIIOService )
. newURI ( location , null , null ) ;
2004-11-30 08:23:02 +00:00
}
newWindow . QueryInterface ( nsCI . nsIInterfaceRequestor )
. getInterface ( nsCI . nsIWebNavigation )
2005-07-07 09:45:47 +00:00
. loadURI ( url , loadflags , referrer , null , null ) ;
2004-11-30 08:23:02 +00:00
} catch ( e ) {
}
break ;
default : // OPEN_CURRENTWINDOW or an illegal value
try {
if ( aOpener ) {
2005-05-20 17:41:10 +00:00
newWindow = aOpener . top ;
location = aOpener . location ;
2005-06-14 10:15:58 +00:00
referrer =
2005-02-28 23:09:24 +00:00
Components . classes [ "@mozilla.org/network/io-service;1" ]
. getService ( Components . interfaces . nsIIOService )
. newURI ( location , null , null ) ;
2004-11-30 08:23:02 +00:00
newWindow . QueryInterface ( nsCI . nsIInterfaceRequestor )
. getInterface ( nsIWebNavigation )
2005-07-07 09:45:47 +00:00
. loadURI ( url , loadflags , referrer , null , null ) ;
2004-11-30 08:23:02 +00:00
} else {
newWindow = gBrowser . selectedBrowser . docShell
. QueryInterface ( nsCI . nsIInterfaceRequestor )
. getInterface ( nsCI . nsIDOMWindow ) ;
2005-07-07 09:45:47 +00:00
getWebNavigation ( ) . loadURI ( url , loadflags , null , null , null ) ;
2004-11-30 08:23:02 +00:00
}
2005-03-10 18:29:20 +00:00
if ( ! gPrefService . getBoolPref ( "browser.tabs.loadDivertedInBackground" ) )
content . focus ( ) ;
2004-11-30 08:23:02 +00:00
} catch ( e ) {
}
}
return newWindow ;
2004-12-07 16:08:48 +00:00
} ,
isTabContentWindow : function ( aWindow )
{
var browsers = gBrowser . browsers ;
for ( var ctr = 0 ; ctr < browsers . length ; ctr ++ )
if ( browsers . item ( ctr ) . contentWindow == aWindow )
return true ;
return false ;
2002-08-09 01:41:39 +00:00
}
}
2002-09-27 04:06:56 +00:00
function onViewToolbarsPopupShowing ( aEvent )
{
var popup = aEvent . target ;
2002-10-18 10:05:47 +00:00
var i ;
2002-09-27 04:06:56 +00:00
// Empty the menu
2002-10-18 10:05:47 +00:00
for ( i = popup . childNodes . length - 1 ; i >= 0 ; -- i ) {
2002-09-27 04:06:56 +00:00
var deadItem = popup . childNodes [ i ] ;
if ( deadItem . hasAttribute ( "toolbarindex" ) )
popup . removeChild ( deadItem ) ;
}
2005-06-14 10:15:58 +00:00
2002-09-27 04:06:56 +00:00
var firstMenuItem = popup . firstChild ;
2005-06-14 10:15:58 +00:00
2002-09-27 04:06:56 +00:00
var toolbox = document . getElementById ( "navigator-toolbox" ) ;
2002-10-18 10:05:47 +00:00
for ( i = 0 ; i < toolbox . childNodes . length ; ++ i ) {
2002-09-27 04:06:56 +00:00
var toolbar = toolbox . childNodes [ i ] ;
var toolbarName = toolbar . getAttribute ( "toolbarname" ) ;
2002-10-20 08:03:51 +00:00
var type = toolbar . getAttribute ( "type" ) ;
if ( toolbarName && type != "menubar" ) {
2002-09-27 04:06:56 +00:00
var menuItem = document . createElement ( "menuitem" ) ;
menuItem . setAttribute ( "toolbarindex" , i ) ;
menuItem . setAttribute ( "type" , "checkbox" ) ;
menuItem . setAttribute ( "label" , toolbarName ) ;
menuItem . setAttribute ( "accesskey" , toolbar . getAttribute ( "accesskey" ) ) ;
menuItem . setAttribute ( "checked" , toolbar . getAttribute ( "collapsed" ) != "true" ) ;
2005-06-14 10:15:58 +00:00
popup . insertBefore ( menuItem , firstMenuItem ) ;
2002-09-27 04:06:56 +00:00
menuItem . addEventListener ( "command" , onViewToolbarCommand , false ) ;
}
toolbar = toolbar . nextSibling ;
}
}
function onViewToolbarCommand ( aEvent )
{
var toolbox = document . getElementById ( "navigator-toolbox" ) ;
var index = aEvent . originalTarget . getAttribute ( "toolbarindex" ) ;
var toolbar = toolbox . childNodes [ index ] ;
2003-08-10 04:28:02 +00:00
2002-09-27 04:06:56 +00:00
toolbar . collapsed = aEvent . originalTarget . getAttribute ( "checked" ) != "true" ;
document . persist ( toolbar . id , "collapsed" ) ;
}
2004-05-23 10:25:30 +00:00
function displaySecurityInfo ( )
2002-08-09 01:41:39 +00:00
{
2005-09-21 01:12:29 +00:00
BrowserPageInfo ( null , "securityTab" ) ;
2002-08-09 01:41:39 +00:00
}
2003-08-03 01:58:52 +00:00
// |forceOpen| is a bool that indicates that the sidebar should be forced open. In other words
// the toggle won't be allowed to close the sidebar.
function toggleSidebar ( aCommandID , forceOpen ) {
2003-10-29 08:01:27 +00:00
2002-09-28 22:55:58 +00:00
var sidebarBox = document . getElementById ( "sidebar-box" ) ;
2002-09-30 04:03:00 +00:00
if ( ! aCommandID )
aCommandID = sidebarBox . getAttribute ( "sidebarcommand" ) ;
var elt = document . getElementById ( aCommandID ) ;
2002-09-28 01:49:18 +00:00
var sidebar = document . getElementById ( "sidebar" ) ;
2002-09-28 22:55:58 +00:00
var sidebarTitle = document . getElementById ( "sidebar-title" ) ;
2002-09-28 01:49:18 +00:00
var sidebarSplitter = document . getElementById ( "sidebar-splitter" ) ;
2004-11-30 08:23:02 +00:00
if ( ! forceOpen && elt . getAttribute ( "checked" ) == "true" ) {
elt . removeAttribute ( "checked" ) ;
sidebarBox . setAttribute ( "sidebarcommand" , "" ) ;
sidebarTitle . setAttribute ( "value" , "" ) ;
sidebarBox . hidden = true ;
sidebarSplitter . hidden = true ;
2005-01-28 16:06:56 +00:00
content . focus ( ) ;
2002-09-28 01:49:18 +00:00
return ;
}
2005-06-14 10:15:58 +00:00
2002-09-30 01:58:19 +00:00
var elts = document . getElementsByAttribute ( "group" , "sidebar" ) ;
for ( var i = 0 ; i < elts . length ; ++ i )
elts [ i ] . removeAttribute ( "checked" ) ;
elt . setAttribute ( "checked" , "true" ) ; ;
2002-09-28 01:49:18 +00:00
2002-09-28 22:55:58 +00:00
if ( sidebarBox . hidden ) {
sidebarBox . hidden = false ;
sidebarSplitter . hidden = false ;
2002-09-28 01:49:18 +00:00
}
2005-06-14 10:15:58 +00:00
2002-09-30 01:58:19 +00:00
var url = elt . getAttribute ( "sidebarurl" ) ;
var title = elt . getAttribute ( "sidebartitle" ) ;
2002-09-28 22:55:58 +00:00
if ( ! title )
2002-09-30 01:58:19 +00:00
title = elt . getAttribute ( "label" ) ;
2002-09-28 01:49:18 +00:00
sidebar . setAttribute ( "src" , url ) ;
2002-11-05 00:29:14 +00:00
sidebarBox . setAttribute ( "src" , url ) ;
2002-09-30 01:58:19 +00:00
sidebarBox . setAttribute ( "sidebarcommand" , elt . id ) ;
2002-09-28 22:55:58 +00:00
sidebarTitle . setAttribute ( "value" , title ) ;
2004-05-23 20:56:38 +00:00
if ( aCommandID != "viewWebPanelsSidebar" ) { // no searchbox there
// if the sidebar we want is already constructed, focus the searchbox
if ( ( aCommandID == "viewBookmarksSidebar" && sidebar . contentDocument . getElementById ( "bookmarksPanel" ) )
|| ( aCommandID == "viewHistorySidebar" && sidebar . contentDocument . getElementById ( "history-panel" ) ) )
sidebar . contentDocument . getElementById ( "search-box" ) . focus ( ) ;
// otherwiese, attach an onload handler
else
sidebar . addEventListener ( "load" , asyncFocusSearchBox , true ) ;
}
2002-09-28 01:49:18 +00:00
}
2004-05-23 20:56:38 +00:00
function asyncFocusSearchBox ( event )
{
var sidebar = document . getElementById ( "sidebar" ) ;
var searchBox = sidebar . contentDocument . getElementById ( "search-box" ) ;
2005-01-03 00:52:33 +00:00
if ( searchBox )
searchBox . focus ( ) ;
2004-05-23 20:56:38 +00:00
sidebar . removeEventListener ( "load" , asyncFocusSearchBox , true ) ;
}
2003-12-16 00:37:01 +00:00
var gHomeButton = {
prefDomain : "browser.startup.homepage" ,
observe : function ( aSubject , aTopic , aPrefName )
{
if ( aTopic != "nsPref:changed" || aPrefName != this . prefDomain )
return ;
2005-06-14 10:15:58 +00:00
2003-12-16 00:37:01 +00:00
this . updateTooltip ( ) ;
} ,
2005-06-14 10:15:58 +00:00
2003-12-16 00:37:01 +00:00
updateTooltip : function ( )
{
var homeButton = document . getElementById ( "home-button" ) ;
if ( homeButton ) {
var homePage = this . getHomePage ( ) ;
homePage = homePage . replace ( /\|/g , ', ' ) ;
homeButton . setAttribute ( "tooltiptext" , homePage ) ;
}
} ,
2005-06-14 10:15:58 +00:00
2003-12-16 00:37:01 +00:00
getHomePage : function ( )
{
var url ;
try {
url = gPrefService . getComplexValue ( this . prefDomain ,
Components . interfaces . nsIPrefLocalizedString ) . data ;
} catch ( e ) {
}
// use this if we can't find the pref
if ( ! url ) {
2006-06-30 18:09:14 +00:00
var SBS = Cc [ "@mozilla.org/intl/stringbundle;1" ] . getService ( Ci . nsIStringBundleService ) ;
var configBundle = SBS . getBundle ( "resource:/browserconfig.properties" ) ;
url = configBundle . getString ( this . prefDomain ) ;
2003-12-16 00:37:01 +00:00
}
return url ;
2002-09-29 01:23:02 +00:00
}
2003-12-16 00:37:01 +00:00
} ;
2002-09-29 20:30:20 +00:00
2002-10-13 06:52:56 +00:00
function nsContextMenu ( xulMenu ) {
2005-06-14 09:44:51 +00:00
this . target = null ;
this . menu = null ;
this . onTextInput = false ;
this . onKeywordField = false ;
this . onImage = false ;
2005-07-28 13:47:59 +00:00
this . onLoadedImage = false ;
2005-06-14 09:44:51 +00:00
this . onLink = false ;
this . onMailtoLink = false ;
this . onSaveableLink = false ;
this . onMetaDataItem = false ;
this . onMathML = false ;
this . link = false ;
2005-08-12 06:55:54 +00:00
this . linkURL = "" ;
this . linkURI = null ;
this . linkProtocol = null ;
2005-06-14 09:44:51 +00:00
this . inFrame = false ;
this . hasBGImage = false ;
this . isTextSelected = false ;
this . isContentSelected = false ;
this . inDirList = false ;
this . shouldDisplay = true ;
2006-06-21 00:44:20 +00:00
this . isDesignMode = false ;
2002-10-13 06:52:56 +00:00
// Initialize new menu.
this . initMenu ( xulMenu ) ;
}
// Prototype for nsContextMenu "class."
nsContextMenu . prototype = {
// onDestroy is a no-op at this point.
onDestroy : function ( ) {
} ,
// Initialize context menu.
initMenu : function ( popup ) {
// Save menu.
this . menu = popup ;
// Get contextual info.
2006-06-02 19:52:30 +00:00
this . setTarget ( document . popupNode , document . popupRangeParent ,
document . popupRangeOffset ) ;
2005-06-14 10:15:58 +00:00
2002-10-13 06:52:56 +00:00
this . isTextSelected = this . isTextSelection ( ) ;
2005-06-14 09:44:51 +00:00
this . isContentSelected = this . isContentSelection ( ) ;
2002-10-13 06:52:56 +00:00
// Initialize (disable/remove) menu items.
this . initItems ( ) ;
} ,
initItems : function ( ) {
this . initOpenItems ( ) ;
this . initNavigationItems ( ) ;
this . initViewItems ( ) ;
this . initMiscItems ( ) ;
2005-12-05 18:18:11 +00:00
this . initSpellingItems ( ) ;
2002-10-13 06:52:56 +00:00
this . initSaveItems ( ) ;
this . initClipboardItems ( ) ;
this . initMetadataItems ( ) ;
} ,
initOpenItems : function ( ) {
this . showItem ( "context-openlink" , this . onSaveableLink || ( this . inDirList && this . onLink ) ) ;
this . showItem ( "context-openlinkintab" , this . onSaveableLink || ( this . inDirList && this . onLink ) ) ;
this . showItem ( "context-sep-open" , this . onSaveableLink || ( this . inDirList && this . onLink ) ) ;
} ,
initNavigationItems : function ( ) {
// Back determined by canGoBack broadcaster.
this . setItemAttrFromNode ( "context-back" , "disabled" , "canGoBack" ) ;
// Forward determined by canGoForward broadcaster.
this . setItemAttrFromNode ( "context-forward" , "disabled" , "canGoForward" ) ;
2005-06-14 10:15:58 +00:00
2005-06-14 09:44:51 +00:00
this . showItem ( "context-back" , ! ( this . isContentSelected || this . onLink || this . onImage || this . onTextInput ) ) ;
this . showItem ( "context-forward" , ! ( this . isContentSelected || this . onLink || this . onImage || this . onTextInput ) ) ;
2002-10-13 06:52:56 +00:00
2005-06-14 09:44:51 +00:00
this . showItem ( "context-reload" , ! ( this . isContentSelected || this . onLink || this . onImage || this . onTextInput ) ) ;
2005-06-14 10:15:58 +00:00
2005-06-14 09:44:51 +00:00
this . showItem ( "context-stop" , ! ( this . isContentSelected || this . onLink || this . onImage || this . onTextInput ) ) ;
this . showItem ( "context-sep-stop" , ! ( this . isContentSelected || this . onLink || this . onTextInput || this . onImage ) ) ;
2002-10-13 06:52:56 +00:00
// XXX: Stop is determined in navigator.js; the canStop broadcaster is broken
//this.setItemAttrFromNode( "context-stop", "disabled", "canStop" );
} ,
initSaveItems : function ( ) {
2005-06-14 09:44:51 +00:00
this . showItem ( "context-savepage" , ! ( this . inDirList || this . isContentSelected || this . onTextInput || this . onLink || this . onImage ) ) ;
this . showItem ( "context-sendpage" , ! ( this . inDirList || this . isContentSelected || this . onTextInput || this . onLink || this . onImage ) ) ;
2002-10-13 06:52:56 +00:00
2005-08-12 06:55:54 +00:00
// Save+Send link depends on whether we're in a link.
2002-10-13 06:52:56 +00:00
this . showItem ( "context-savelink" , this . onSaveableLink ) ;
2005-08-12 06:55:54 +00:00
this . showItem ( "context-sendlink" , this . onSaveableLink ) ;
2002-10-13 06:52:56 +00:00
2005-08-12 06:55:54 +00:00
// Save+Send image depends on whether we're on an image.
2005-07-28 13:47:59 +00:00
this . showItem ( "context-saveimage" , this . onLoadedImage ) ;
2002-10-13 06:52:56 +00:00
this . showItem ( "context-sendimage" , this . onImage ) ;
} ,
initViewItems : function ( ) {
// View source is always OK, unless in directory listing.
2005-06-14 09:44:51 +00:00
this . showItem ( "context-viewpartialsource-selection" , this . isContentSelected ) ;
this . showItem ( "context-viewpartialsource-mathml" , this . onMathML && ! this . isContentSelected ) ;
this . showItem ( "context-viewsource" , ! ( this . inDirList || this . onImage || this . isContentSelected || this . onLink || this . onTextInput ) ) ;
this . showItem ( "context-viewinfo" , ! ( this . inDirList || this . onImage || this . isContentSelected || this . onLink || this . onTextInput ) ) ;
2002-10-13 06:52:56 +00:00
2005-06-14 09:44:51 +00:00
this . showItem ( "context-sep-properties" , ! ( this . inDirList || this . isContentSelected || this . onTextInput ) ) ;
2005-06-23 02:25:06 +00:00
// Set as Desktop background depends on whether an image was clicked on,
// and only works if we have a shell service.
var haveSetDesktopBackground = false ;
2004-07-15 22:51:19 +00:00
# ifdef HAVE _SHELL _SERVICE
2005-06-23 02:25:06 +00:00
// Only enable Set as Desktop Background if we can get the shell service.
2004-07-15 22:51:19 +00:00
var shell = getShellService ( ) ;
if ( shell )
2005-06-23 02:25:06 +00:00
haveSetDesktopBackground = true ;
2004-07-15 22:51:19 +00:00
# endif
2005-07-28 13:47:59 +00:00
this . showItem ( "context-setDesktopBackground" , haveSetDesktopBackground && this . onLoadedImage ) ;
2002-10-13 06:52:56 +00:00
2005-08-12 06:55:54 +00:00
if ( haveSetDesktopBackground && this . onLoadedImage )
this . setItemAttr ( "context-setDesktopBackground" , "disabled" , this . disableSetDesktopBackground ( ) ) ;
2002-10-13 06:52:56 +00:00
// View Image depends on whether an image was clicked on.
2006-06-28 17:32:48 +00:00
this . showItem ( "context-viewimage" , this . onImage && ( ! this . onStandaloneImage || this . inFrame ) ) ;
2002-10-13 06:52:56 +00:00
// View background image depends on whether there is one.
2005-06-14 10:15:58 +00:00
this . showItem ( "context-viewbgimage" , ! ( this . inDirList || this . onImage || this . isContentSelected || this . onLink || this . onTextInput ) ) ;
this . showItem ( "context-sep-viewbgimage" , ! ( this . inDirList || this . onImage || this . isContentSelected || this . onLink || this . onTextInput ) ) ;
2002-10-13 06:52:56 +00:00
this . setItemAttr ( "context-viewbgimage" , "disabled" , this . hasBGImage ? null : "true" ) ;
} ,
initMiscItems : function ( ) {
// Use "Bookmark This Link" if on a link.
2005-06-14 09:44:51 +00:00
this . showItem ( "context-bookmarkpage" , ! ( this . isContentSelected || this . onTextInput || this . onLink || this . onImage ) ) ;
2002-10-13 06:52:56 +00:00
this . showItem ( "context-bookmarklink" , this . onLink && ! this . onMailtoLink ) ;
this . showItem ( "context-searchselect" , this . isTextSelected ) ;
2004-04-10 05:04:20 +00:00
this . showItem ( "context-keywordfield" , this . onTextInput && this . onKeywordField ) ;
2002-10-13 06:52:56 +00:00
this . showItem ( "frame" , this . inFrame ) ;
this . showItem ( "frame-sep" , this . inFrame ) ;
2004-11-30 08:23:02 +00:00
// BiDi UI
2005-01-26 01:40:30 +00:00
this . showItem ( "context-sep-bidi" , gBidiUI ) ;
this . showItem ( "context-bidi-text-direction-toggle" , this . onTextInput && gBidiUI ) ;
this . showItem ( "context-bidi-page-direction-toggle" , ! this . onTextInput && gBidiUI ) ;
2004-11-30 08:23:02 +00:00
2002-10-13 06:52:56 +00:00
if ( this . onImage ) {
var blockImage = document . getElementById ( "context-blockimage" ) ;
2003-07-28 14:52:41 +00:00
2005-02-28 23:09:24 +00:00
var uri = this . target . QueryInterface ( Components . interfaces . nsIImageLoadingContent ) . currentURI ;
2003-07-28 14:52:41 +00:00
2005-06-14 10:15:58 +00:00
var hostLabel ;
// this throws if the image URI doesn't have a host (eg, data: image URIs)
2005-07-23 02:59:56 +00:00
// see bug 293758 for details
2005-06-14 10:15:58 +00:00
try {
hostLabel = uri . host ;
} catch ( ex ) { }
if ( hostLabel ) {
var shortenedUriHost = hostLabel . replace ( /^www\./i , "" ) ;
if ( shortenedUriHost . length > 15 )
shortenedUriHost = shortenedUriHost . substr ( 0 , 15 ) + "..." ;
blockImage . label = gNavigatorBundle . getFormattedString ( "blockImages" , [ shortenedUriHost ] ) ;
if ( this . isImageBlocked ( ) )
blockImage . setAttribute ( "checked" , "true" ) ;
else
blockImage . removeAttribute ( "checked" ) ;
2002-10-13 06:52:56 +00:00
}
}
2005-06-14 10:15:58 +00:00
// Only show the block image item if the image can be blocked
this . showItem ( "context-blockimage" , this . onImage && hostLabel ) ;
2002-10-13 06:52:56 +00:00
} ,
2005-12-05 18:18:11 +00:00
initSpellingItems : function ( ) {
var canSpell = InlineSpellCheckerUI . canSpellCheck ;
var onMisspelling = InlineSpellCheckerUI . overMisspelling ;
this . showItem ( "spell-check-enabled" , canSpell ) ;
this . showItem ( "spell-separator" , canSpell ) ;
if ( canSpell )
document . getElementById ( "spell-check-enabled" ) . setAttribute ( "checked" ,
InlineSpellCheckerUI . enabled ) ;
this . showItem ( "spell-add-to-dictionary" , onMisspelling ) ;
// suggestion list
this . showItem ( "spell-suggestions-separator" , onMisspelling ) ;
if ( onMisspelling ) {
var menu = document . getElementById ( "contentAreaContextMenu" ) ;
var suggestionsSeparator = document . getElementById ( "spell-suggestions-separator" ) ;
var numsug = InlineSpellCheckerUI . addSuggestionsToMenu ( menu , suggestionsSeparator , 5 ) ;
this . showItem ( "spell-no-suggestions" , numsug == 0 ) ;
} else {
this . showItem ( "spell-no-suggestions" , false ) ;
}
// dictionary list
this . showItem ( "spell-dictionaries" , InlineSpellCheckerUI . enabled ) ;
if ( canSpell ) {
var dictMenu = document . getElementById ( "spell-dictionaries-menu" ) ;
var dictSep = document . getElementById ( "spell-language-separator" ) ;
InlineSpellCheckerUI . addDictionaryListToMenu ( dictMenu , dictSep ) ;
}
} ,
2002-10-13 06:52:56 +00:00
initClipboardItems : function ( ) {
// Copy depends on whether there is selected text.
// Enabling this context menu item is now done through the global
// command updating system
// this.setItemAttr( "context-copy", "disabled", !this.isTextSelected() );
goUpdateGlobalEditMenuItems ( ) ;
2003-03-04 06:42:17 +00:00
this . showItem ( "context-undo" , this . onTextInput ) ;
this . showItem ( "context-sep-undo" , this . onTextInput ) ;
this . showItem ( "context-cut" , this . onTextInput ) ;
2005-06-14 09:44:51 +00:00
this . showItem ( "context-copy" , this . isContentSelected || this . onTextInput ) ;
2003-03-04 06:42:17 +00:00
this . showItem ( "context-paste" , this . onTextInput ) ;
this . showItem ( "context-delete" , this . onTextInput ) ;
this . showItem ( "context-sep-paste" , this . onTextInput ) ;
2006-06-21 00:44:20 +00:00
this . showItem ( "context-selectall" , ! ( this . onLink || this . onImage ) || this . isDesignMode ) ;
2005-06-14 09:44:51 +00:00
this . showItem ( "context-sep-selectall" , this . isContentSelected ) ;
2002-10-13 06:52:56 +00:00
// XXX dr
// ------
// nsDocumentViewer.cpp has code to determine whether we're
// on a link or an image. we really ought to be using that...
// Copy email link depends on whether we're on an email link.
this . showItem ( "context-copyemail" , this . onMailtoLink ) ;
// Copy link location depends on whether we're on a link.
this . showItem ( "context-copylink" , this . onLink ) ;
this . showItem ( "context-sep-copylink" , this . onLink && this . onImage ) ;
2005-04-21 20:53:03 +00:00
# ifdef CONTEXT _COPY _IMAGE _CONTENTS
2004-02-17 04:11:54 +00:00
// Copy image contents depends on whether we're on an image.
this . showItem ( "context-copyimage-contents" , this . onImage ) ;
# endif
2002-10-13 06:52:56 +00:00
// Copy image location depends on whether we're on an image.
this . showItem ( "context-copyimage" , this . onImage ) ;
this . showItem ( "context-sep-copyimage" , this . onImage ) ;
} ,
initMetadataItems : function ( ) {
// Show if user clicked on something which has metadata.
this . showItem ( "context-metadata" , this . onMetaDataItem ) ;
} ,
// Set various context menu attributes based on the state of the world.
2006-06-02 19:52:30 +00:00
setTarget : function ( node , rangeParent , rangeOffset ) {
2002-10-13 06:52:56 +00:00
const xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" ;
if ( node . namespaceURI == xulNS ) {
this . shouldDisplay = false ;
return ;
}
2005-08-12 06:55:54 +00:00
2002-10-13 06:52:56 +00:00
// Initialize contextual info.
2005-08-12 06:55:54 +00:00
this . onImage = false ;
this . onLoadedImage = false ;
2005-06-14 09:34:49 +00:00
this . onStandaloneImage = false ;
2005-08-12 06:55:54 +00:00
this . onMetaDataItem = false ;
this . onTextInput = false ;
this . onKeywordField = false ;
this . imageURL = "" ;
this . onLink = false ;
this . linkURL = "" ;
this . linkURI = null ;
this . linkProtocol = "" ;
this . onMathML = false ;
this . inFrame = false ;
this . hasBGImage = false ;
this . bgImageURL = "" ;
2006-04-26 23:37:45 +00:00
// Clear any old spellchecking items from the menu, this used to
// be in the menu hiding code but wasn't getting called in all
// situations. Here, we can ensure it gets cleaned up any time the
// menu is shown. Note: must be before uninit because that clears the
// internal vars
InlineSpellCheckerUI . clearSuggestionsFromMenu ( ) ;
InlineSpellCheckerUI . clearDictionaryListFromMenu ( ) ;
2005-12-05 18:18:11 +00:00
InlineSpellCheckerUI . uninit ( ) ;
2002-10-13 06:52:56 +00:00
// Remember the node that was clicked.
this . target = node ;
2005-08-12 06:55:54 +00:00
// Remember the URL of the document containing the node
// for referrer header and for security checks.
this . docURL = node . ownerDocument . location . href ;
2002-10-13 06:52:56 +00:00
2005-08-12 06:55:54 +00:00
// First, do checks for nodes that never have children.
2002-10-13 06:52:56 +00:00
if ( this . target . nodeType == Node . ELEMENT _NODE ) {
2005-08-12 06:55:54 +00:00
// See if the user clicked on an image.
2005-07-28 13:47:59 +00:00
if ( this . target instanceof Components . interfaces . nsIImageLoadingContent && this . target . currentURI ) {
2002-10-13 06:52:56 +00:00
this . onImage = true ;
2005-08-12 06:55:54 +00:00
this . onMetaDataItem = true ;
2005-07-28 13:47:59 +00:00
var request = this . target . getRequest ( Components . interfaces . nsIImageLoadingContent . CURRENT _REQUEST ) ;
if ( request && ( request . imageStatus & request . STATUS _SIZE _AVAILABLE ) )
this . onLoadedImage = true ;
2005-04-20 21:57:01 +00:00
this . imageURL = this . target . currentURI . spec ;
2005-06-14 09:34:49 +00:00
if ( this . target . ownerDocument instanceof ImageDocument )
this . onStandaloneImage = true ;
2005-07-28 13:47:59 +00:00
} else if ( this . target instanceof HTMLInputElement ) {
2005-04-20 21:57:01 +00:00
this . onTextInput = this . isTargetATextBox ( this . target ) ;
2005-12-05 18:18:11 +00:00
// allow spellchecking UI on all writable text boxes except passwords
if ( this . onTextInput && ! this . target . readOnly && this . target . type != "password" ) {
2006-06-21 00:44:20 +00:00
InlineSpellCheckerUI . init ( this . target . QueryInterface ( Components . interfaces . nsIDOMNSEditableElement ) . editor ) ;
2006-06-02 19:52:30 +00:00
InlineSpellCheckerUI . initFromEvent ( rangeParent , rangeOffset ) ;
2005-12-05 18:18:11 +00:00
}
2005-04-20 21:57:01 +00:00
this . onKeywordField = this . isTargetAKeywordField ( this . target ) ;
2005-06-30 02:47:04 +00:00
} else if ( this . target instanceof HTMLTextAreaElement ) {
2002-10-13 06:52:56 +00:00
this . onTextInput = true ;
2005-12-05 18:18:11 +00:00
if ( ! this . target . readOnly ) {
2006-06-21 00:44:20 +00:00
InlineSpellCheckerUI . init ( this . target . QueryInterface ( Components . interfaces . nsIDOMNSEditableElement ) . editor ) ;
2006-06-02 19:52:30 +00:00
InlineSpellCheckerUI . initFromEvent ( rangeParent , rangeOffset ) ;
2005-12-05 18:18:11 +00:00
}
2005-06-30 02:47:04 +00:00
} else if ( this . target instanceof HTMLHtmlElement ) {
2002-10-13 06:52:56 +00:00
// pages with multiple <body>s are lame. we'll teach them a lesson.
var bodyElt = this . target . ownerDocument . getElementsByTagName ( "body" ) [ 0 ] ;
if ( bodyElt ) {
var computedURL = this . getComputedURL ( bodyElt , "background-image" ) ;
if ( computedURL ) {
this . hasBGImage = true ;
2002-10-13 23:52:36 +00:00
this . bgImageURL = makeURLAbsolute ( bodyElt . baseURI ,
computedURL ) ;
2002-10-13 06:52:56 +00:00
}
}
2005-01-28 16:06:56 +00:00
} else if ( "HTTPIndex" in content &&
content . HTTPIndex instanceof Components . interfaces . nsIHTTPIndex ) {
2002-10-13 06:52:56 +00:00
this . inDirList = true ;
// Bubble outward till we get to an element with URL attribute
// (which should be the href).
var root = this . target ;
while ( root && ! this . link ) {
if ( root . tagName == "tree" ) {
// Hit root of tree; must have clicked in empty space;
// thus, no link.
break ;
}
if ( root . getAttribute ( "URL" ) ) {
// Build pseudo link object so link-related functions work.
this . onLink = true ;
this . link = { href : root . getAttribute ( "URL" ) ,
getAttribute : function ( attr ) {
if ( attr == "title" ) {
return root . firstChild . firstChild . getAttribute ( "label" ) ;
} else {
return "" ;
}
}
} ;
// If element is a directory, then you can't save it.
if ( root . getAttribute ( "container" ) == "true" ) {
this . onSaveableLink = false ;
} else {
this . onSaveableLink = true ;
}
} else {
root = root . parentNode ;
}
}
}
}
2005-08-12 06:55:54 +00:00
// Second, bubble out, looking for items of interest that can have childen.
// Always pick the innermost link, background image, etc.
2004-12-02 21:20:28 +00:00
const XMLNS = "http://www.w3.org/XML/1998/namespace" ;
2002-10-13 06:52:56 +00:00
var elem = this . target ;
while ( elem ) {
if ( elem . nodeType == Node . ELEMENT _NODE ) {
2005-08-12 06:55:54 +00:00
2002-10-13 06:52:56 +00:00
// Link?
2005-06-14 10:15:58 +00:00
if ( ! this . onLink &&
2005-08-12 06:55:54 +00:00
( ( elem instanceof HTMLAnchorElement && elem . href ) ||
elem instanceof HTMLAreaElement ||
elem instanceof HTMLLinkElement ||
elem . getAttributeNS ( "http://www.w3.org/1999/xlink" , "type" ) == "simple" ) ) {
// Target is a link or a descendant of a link.
2002-10-13 06:52:56 +00:00
this . onLink = true ;
this . onMetaDataItem = true ;
2006-01-04 19:11:14 +00:00
// xxxmpc: this is kind of a hack to work around a Gecko bug (see bug 266932)
// we're going to walk up the DOM looking for a parent link node,
// this shouldn't be necessary, but we're matching the existing behaviour for left click
var realLink = elem ;
var parent = elem . parentNode ;
while ( parent ) {
try {
if ( ( parent instanceof HTMLAnchorElement && elem . href ) ||
parent instanceof HTMLAreaElement ||
parent instanceof HTMLLinkElement ||
parent . getAttributeNS ( "http://www.w3.org/1999/xlink" , "type" ) == "simple" )
realLink = parent ;
} catch ( e ) { }
parent = parent . parentNode ;
}
2005-08-12 06:55:54 +00:00
2002-10-13 06:52:56 +00:00
// Remember corresponding element.
2006-01-04 19:11:14 +00:00
this . link = realLink ;
2005-08-12 06:55:54 +00:00
this . linkURL = this . getLinkURL ( ) ;
this . linkURI = this . getLinkURI ( ) ;
this . linkProtocol = this . getLinkProtocol ( ) ;
this . onMailtoLink = ( this . linkProtocol == "mailto" ) ;
2002-10-13 06:52:56 +00:00
this . onSaveableLink = this . isLinkSaveable ( this . link ) ;
}
2005-06-14 10:15:58 +00:00
2002-10-13 06:52:56 +00:00
// Metadata item?
if ( ! this . onMetaDataItem ) {
2005-08-12 06:55:54 +00:00
// We display metadata on anything which fits
// the below test, as well as for links and images
// (which set this.onMetaDataItem to true elsewhere)
2005-06-30 02:47:04 +00:00
if ( ( elem instanceof HTMLQuoteElement && elem . cite ) ||
( elem instanceof HTMLTableElement && elem . summary ) ||
( elem instanceof HTMLModElement &&
( elem . cite || elem . dateTime ) ) ||
( elem instanceof HTMLElement &&
( elem . title || elem . lang ) ) ||
2004-12-02 21:20:28 +00:00
elem . getAttributeNS ( XMLNS , "lang" ) ) {
2002-10-13 06:52:56 +00:00
this . onMetaDataItem = true ;
}
}
2005-06-14 10:15:58 +00:00
// Background image? Don't bother if we've already found a
2002-10-13 06:52:56 +00:00
// background image further down the hierarchy. Otherwise,
// we look for the computed background-image style.
if ( ! this . hasBGImage ) {
var bgImgUrl = this . getComputedURL ( elem , "background-image" ) ;
if ( bgImgUrl ) {
this . hasBGImage = true ;
2002-10-13 23:52:36 +00:00
this . bgImageURL = makeURLAbsolute ( elem . baseURI ,
bgImgUrl ) ;
2002-10-13 06:52:56 +00:00
}
}
}
2005-06-14 10:15:58 +00:00
elem = elem . parentNode ;
2002-10-13 06:52:56 +00:00
}
2005-08-12 06:55:54 +00:00
// See if the user clicked on MathML
const NS _MathML = "http://www.w3.org/1998/Math/MathML" ;
if ( ( this . target . nodeType == Node . TEXT _NODE &&
this . target . parentNode . namespaceURI == NS _MathML )
|| ( this . target . namespaceURI == NS _MathML ) )
this . onMathML = true ;
// See if the user clicked in a frame.
if ( this . target . ownerDocument != window . content . document ) {
this . inFrame = true ;
}
2006-06-21 00:44:20 +00:00
// if the document is editable, show context menu like in text inputs
var win = this . target . ownerDocument . defaultView ;
if ( win ) {
var editingSession = win . QueryInterface ( Components . interfaces . nsIInterfaceRequestor )
. getInterface ( Components . interfaces . nsIWebNavigation )
. QueryInterface ( Components . interfaces . nsIInterfaceRequestor )
. getInterface ( Components . interfaces . nsIEditingSession ) ;
if ( editingSession . windowIsEditable ( win ) ) {
this . onTextInput = true ;
this . onKeywordField = false ;
this . onImage = false ;
this . onLoadedImage = false ;
this . onMetaDataItem = false ;
this . onMathML = false ;
this . inFrame = false ;
this . hasBGImage = false ;
this . isDesignMode = true ;
InlineSpellCheckerUI . init ( editingSession . getEditorForWindow ( win ) ) ;
var canSpell = InlineSpellCheckerUI . canSpellCheck ;
InlineSpellCheckerUI . initFromEvent ( rangeParent , rangeOffset ) ;
this . showItem ( "spell-check-enabled" , canSpell ) ;
this . showItem ( "spell-separator" , canSpell ) ;
}
}
2002-10-13 06:52:56 +00:00
} ,
// Returns the computed style attribute for the given element.
getComputedStyle : function ( elem , prop ) {
return elem . ownerDocument . defaultView . getComputedStyle ( elem , '' ) . getPropertyValue ( prop ) ;
} ,
// Returns a "url"-type computed style attribute value, with the url() stripped.
getComputedURL : function ( elem , prop ) {
var url = elem . ownerDocument . defaultView . getComputedStyle ( elem , '' ) . getPropertyCSSValue ( prop ) ;
return ( url . primitiveType == CSSPrimitiveValue . CSS _URI ) ? url . getStringValue ( ) : null ;
} ,
2005-08-12 06:55:54 +00:00
// Returns true if clicked-on link targets a resource that can be saved.
2002-10-13 06:52:56 +00:00
isLinkSaveable : function ( link ) {
// We don't do the Right Thing for news/snews yet, so turn them off
// until we do.
2005-08-12 06:55:54 +00:00
return this . linkProtocol && ! (
this . linkProtocol == "mailto" ||
this . linkProtocol == "javascript" ||
this . linkProtocol == "news" ||
this . linkProtocol == "snews" ) ;
2002-10-13 06:52:56 +00:00
} ,
2005-08-12 06:55:54 +00:00
2002-10-13 06:52:56 +00:00
// Open linked-to URL in a new window.
openLink : function ( ) {
2006-04-03 23:17:51 +00:00
openNewWindowWith ( this . linkURL , this . docURL , null , false ) ;
2002-10-13 06:52:56 +00:00
} ,
// Open linked-to URL in a new tab.
openLinkInTab : function ( ) {
2006-04-03 23:17:51 +00:00
openNewTabWith ( this . linkURL , this . docURL , null , null , false ) ;
2002-10-13 06:52:56 +00:00
} ,
// Open frame in a new tab.
openFrameInTab : function ( ) {
2006-04-03 23:17:51 +00:00
openNewTabWith ( this . target . ownerDocument . location . href , null , null , null , false ) ;
2002-10-13 06:52:56 +00:00
} ,
// Reload clicked-in frame.
reloadFrame : function ( ) {
this . target . ownerDocument . location . reload ( ) ;
} ,
// Open clicked-in frame in its own window.
openFrame : function ( ) {
2006-04-03 23:17:51 +00:00
openNewWindowWith ( this . target . ownerDocument . location . href , null , null , false ) ;
2002-10-13 06:52:56 +00:00
} ,
2005-08-12 06:55:54 +00:00
// Open clicked-in frame in the same window.
2002-10-13 06:52:56 +00:00
showOnlyThisFrame : function ( ) {
2006-05-03 00:43:11 +00:00
try {
const secMan = Components . classes [ "@mozilla.org/scriptsecuritymanager;1" ]
. getService ( Components . interfaces . nsIScriptSecurityManager ) ;
const nsIScriptSecMan = Components . interfaces . nsIScriptSecurityManager ;
secMan . checkLoadURI ( gBrowser . currentURI , makeURI ( this . target . ownerDocument . location . href ) ,
nsIScriptSecMan . DISALLOW _SCRIPT ) ;
window . loadURI ( this . target . ownerDocument . location . href , null , null , false ) ;
} catch ( e ) { }
2002-10-13 06:52:56 +00:00
} ,
// View Partial Source
viewPartialSource : function ( context ) {
var focusedWindow = document . commandDispatcher . focusedWindow ;
if ( focusedWindow == window )
2005-01-28 16:06:56 +00:00
focusedWindow = content ;
2002-10-13 06:52:56 +00:00
var docCharset = null ;
if ( focusedWindow )
docCharset = "charset=" + focusedWindow . document . characterSet ;
// "View Selection Source" and others such as "View MathML Source"
// are mutually exclusive, with the precedence given to the selection
// when there is one
var reference = null ;
if ( context == "selection" )
2005-05-20 17:41:10 +00:00
reference = focusedWindow . getSelection ( ) ;
2002-10-13 06:52:56 +00:00
else if ( context == "mathml" )
reference = this . target ;
else
throw "not reached" ;
var docUrl = null ; // unused (and play nice for fragments generated via XSLT too)
2003-03-01 08:07:13 +00:00
window . openDialog ( "chrome://global/content/viewPartialSource.xul" ,
2002-10-13 06:52:56 +00:00
"_blank" , "scrollbars,resizable,chrome,dialog=no" ,
docUrl , docCharset , reference , context ) ;
} ,
// Open new "view source" window with the frame's URL.
viewFrameSource : function ( ) {
BrowserViewSourceOfDocument ( this . target . ownerDocument ) ;
} ,
viewInfo : function ( ) {
BrowserPageInfo ( ) ;
} ,
viewFrameInfo : function ( ) {
BrowserPageInfo ( this . target . ownerDocument ) ;
} ,
// Change current window to the URL of the image.
2004-06-23 22:54:12 +00:00
viewImage : function ( e ) {
2005-08-12 06:55:54 +00:00
urlSecurityCheck ( this . imageURL , this . docURL ) ;
2006-05-03 00:26:44 +00:00
try {
if ( this . docURL != gBrowser . currentURI ) {
const secMan = Components . classes [ "@mozilla.org/scriptsecuritymanager;1" ]
. getService ( Components . interfaces . nsIScriptSecurityManager ) ;
const nsIScriptSecMan = Components . interfaces . nsIScriptSecurityManager ;
secMan . checkLoadURI ( gBrowser . currentURI , makeURI ( this . imageURL ) ,
nsIScriptSecMan . DISALLOW _SCRIPT ) ;
}
openUILink ( this . imageURL , e ) ;
} catch ( e ) { }
2002-10-13 06:52:56 +00:00
} ,
// Change current window to the URL of the background image.
2004-06-23 22:54:12 +00:00
viewBGImage : function ( e ) {
2005-08-12 06:55:54 +00:00
urlSecurityCheck ( this . bgImageURL , this . docURL ) ;
2006-05-03 00:26:44 +00:00
try {
if ( this . docURL != gBrowser . currentURI ) {
const secMan = Components . classes [ "@mozilla.org/scriptsecuritymanager;1" ]
. getService ( Components . interfaces . nsIScriptSecurityManager ) ;
const nsIScriptSecMan = Components . interfaces . nsIScriptSecurityManager ;
secMan . checkLoadURI ( gBrowser . currentURI , makeURI ( this . bgImageURL ) ,
nsIScriptSecMan . DISALLOW _SCRIPT ) ;
}
openUILink ( this . bgImageURL , e ) ;
} catch ( e ) { }
2002-10-13 06:52:56 +00:00
} ,
2005-08-12 06:55:54 +00:00
disableSetDesktopBackground : function ( ) {
// Disable the Set as Desktop Background menu item if we're still trying
// to load the image or the load failed.
2005-08-22 03:18:45 +00:00
2005-08-12 06:55:54 +00:00
const nsIImageLoadingContent = Components . interfaces . nsIImageLoadingContent ;
2005-08-22 03:18:45 +00:00
if ( ! ( this . target instanceof nsIImageLoadingContent ) )
return true ;
2005-08-12 06:55:54 +00:00
if ( ( "complete" in this . target ) && ! this . target . complete )
return true ;
2005-08-22 03:18:45 +00:00
if ( this . target . currentURI . schemeIs ( "javascript" ) )
2005-08-12 06:55:54 +00:00
return true ;
2005-08-22 03:18:45 +00:00
var request = this . target . QueryInterface ( nsIImageLoadingContent )
. getRequest ( nsIImageLoadingContent . CURRENT _REQUEST ) ;
if ( ! request )
return true ;
2005-08-12 06:55:54 +00:00
return false ;
} ,
2005-06-23 02:25:06 +00:00
setDesktopBackground : function ( ) {
2005-08-12 06:55:54 +00:00
// Paranoia: check disableSetDesktopBackground again, in case the
// image changed since the context menu was initiated.
if ( this . disableSetDesktopBackground ( ) )
return ;
2005-08-22 03:18:45 +00:00
urlSecurityCheck ( this . target . currentURI . spec , this . docURL ) ;
2005-08-12 06:55:54 +00:00
2004-02-10 04:05:34 +00:00
// Confirm since it's annoying if you hit this accidentally.
2005-06-23 02:25:06 +00:00
const kDesktopBackgroundURL =
"chrome://browser/content/setDesktopBackground.xul" ;
# ifdef XP _MACOSX
2005-08-12 06:55:54 +00:00
// On Mac, the Set Desktop Background window is not modal.
// Don't open more than one Set Desktop Background window.
2005-06-23 02:25:06 +00:00
var wm = Components . classes [ "@mozilla.org/appshell/window-mediator;1" ]
. getService ( Components . interfaces . nsIWindowMediator ) ;
var dbWin = wm . getMostRecentWindow ( "Shell:SetDesktopBackground" ) ;
if ( dbWin ) {
dbWin . gSetBackground . init ( this . target ) ;
dbWin . focus ( ) ;
}
else {
openDialog ( kDesktopBackgroundURL , "" ,
"centerscreen,chrome,dialog=no,dependent,resizable=no" ,
this . target ) ;
}
# else
2005-08-12 06:55:54 +00:00
// On non-Mac platforms, the Set Wallpaper dialog is modal.
2005-06-23 02:25:06 +00:00
openDialog ( kDesktopBackgroundURL , "" ,
2004-02-16 04:10:37 +00:00
"centerscreen,chrome,dialog,modal,dependent" ,
this . target ) ;
2005-06-23 02:25:06 +00:00
# endif
2005-06-14 10:15:58 +00:00
} ,
2002-10-13 06:52:56 +00:00
// Save URL of clicked-on frame.
saveFrame : function ( ) {
saveDocument ( this . target . ownerDocument ) ;
} ,
// Save URL of clicked-on link.
saveLink : function ( ) {
2005-08-13 17:36:09 +00:00
urlSecurityCheck ( this . linkURL , this . docURL ) ;
2005-12-21 18:28:46 +00:00
saveURL ( this . linkURL , this . linkText ( ) , null , true , false ,
makeURI ( this . docURL , this . target . ownerDocument . characterSet ) ) ;
2002-10-13 06:52:56 +00:00
} ,
2003-08-08 21:23:34 +00:00
sendLink : function ( ) {
2005-08-12 06:55:54 +00:00
MailIntegration . sendMessage ( this . linkURL , "" ) ; // we don't know the title of the link so pass in an empty string
2003-08-08 21:23:34 +00:00
} ,
2002-10-13 06:52:56 +00:00
// Save URL of clicked-on image.
saveImage : function ( ) {
2005-08-12 06:55:54 +00:00
urlSecurityCheck ( this . imageURL , this . docURL ) ;
2005-06-28 14:41:11 +00:00
saveImageURL ( this . imageURL , null , "SaveImageTitle" , false ,
2005-08-12 06:55:54 +00:00
false , makeURI ( this . docURL ) ) ;
2002-10-13 06:52:56 +00:00
} ,
2003-08-08 21:23:34 +00:00
sendImage : function ( ) {
2004-03-07 04:42:17 +00:00
MailIntegration . sendMessage ( this . imageURL , "" ) ;
2003-08-08 21:23:34 +00:00
} ,
2002-10-13 06:52:56 +00:00
toggleImageBlocking : function ( aBlock ) {
2003-03-25 19:05:08 +00:00
var nsIPermissionManager = Components . interfaces . nsIPermissionManager ;
2002-10-13 06:52:56 +00:00
var permissionmanager =
Components . classes [ "@mozilla.org/permissionmanager;1" ]
2005-02-28 23:09:24 +00:00
. getService ( nsIPermissionManager ) ;
var uri = this . target . QueryInterface ( Components . interfaces . nsIImageLoadingContent ) . currentURI ;
2003-07-09 00:23:42 +00:00
permissionmanager . add ( uri , "image" ,
2003-03-25 19:05:08 +00:00
aBlock ? nsIPermissionManager . DENY _ACTION : nsIPermissionManager . ALLOW _ACTION ) ;
2002-10-13 06:52:56 +00:00
} ,
isImageBlocked : function ( ) {
2003-03-25 19:05:08 +00:00
var nsIPermissionManager = Components . interfaces . nsIPermissionManager ;
var permissionmanager =
Components . classes [ "@mozilla.org/permissionmanager;1" ]
. getService ( Components . interfaces . nsIPermissionManager ) ;
2005-02-28 23:09:24 +00:00
var uri = this . target . QueryInterface ( Components . interfaces . nsIImageLoadingContent ) . currentURI ;
2003-08-13 06:04:25 +00:00
return permissionmanager . testPermission ( uri , "image" ) == nsIPermissionManager . DENY _ACTION ;
2002-10-13 06:52:56 +00:00
} ,
// Generate email address and put it on clipboard.
copyEmail : function ( ) {
// Copy the comma-separated list of email addresses only.
// There are other ways of embedding email addresses in a mailto:
// link, but such complex parsing is beyond us.
2005-08-12 06:55:54 +00:00
var url = this . linkURL ;
2002-10-13 06:52:56 +00:00
var qmark = url . indexOf ( "?" ) ;
var addresses ;
2005-06-14 10:15:58 +00:00
2002-10-13 06:52:56 +00:00
if ( qmark > 7 ) { // 7 == length of "mailto:"
addresses = url . substring ( 7 , qmark ) ;
} else {
addresses = url . substr ( 7 ) ;
}
2004-06-01 14:40:34 +00:00
// Let's try to unescape it using a character set
// in case the address is not ASCII.
try {
2005-05-20 17:41:10 +00:00
var characterSet = this . target . ownerDocument . characterSet ;
2004-06-01 14:40:34 +00:00
const textToSubURI = Components . classes [ "@mozilla.org/intl/texttosuburi;1" ]
. getService ( Components . interfaces . nsITextToSubURI ) ;
2005-01-09 17:34:37 +00:00
addresses = textToSubURI . unEscapeURIForUI ( characterSet , addresses ) ;
2004-06-01 14:40:34 +00:00
}
catch ( ex ) {
// Do nothing.
}
2002-10-13 06:52:56 +00:00
var clipboard = this . getService ( "@mozilla.org/widget/clipboardhelper;1" ,
Components . interfaces . nsIClipboardHelper ) ;
clipboard . copyString ( addresses ) ;
2005-06-14 10:15:58 +00:00
} ,
2002-10-13 06:52:56 +00:00
addBookmark : function ( ) {
var docshell = document . getElementById ( "content" ) . webNavigation ;
2006-02-16 19:00:25 +00:00
# ifndef MOZ _PLACES
2002-10-13 06:52:56 +00:00
BookmarksUtils . addBookmark ( docshell . currentURI . spec ,
docshell . document . title ,
2005-02-17 00:17:12 +00:00
docshell . document . charset ,
BookmarksUtils . getDescriptionFromDocument ( docshell . document ) ) ;
2006-02-16 19:00:25 +00:00
# else
dump ( "*** IMPLEMENT ME\n" ) ;
# endif
2002-10-13 06:52:56 +00:00
} ,
addBookmarkForFrame : function ( ) {
2006-02-16 19:00:25 +00:00
# ifndef MOZ _PLACES
2002-10-13 06:52:56 +00:00
var doc = this . target . ownerDocument ;
var uri = doc . location . href ;
var title = doc . title ;
2005-02-17 00:17:12 +00:00
var description = BookmarksUtils . getDescriptionFromDocument ( doc ) ;
2002-10-13 06:52:56 +00:00
if ( ! title )
title = uri ;
2005-02-17 00:17:12 +00:00
BookmarksUtils . addBookmark ( uri , title , doc . charset , description ) ;
2006-02-16 19:00:25 +00:00
# else
dump ( "*** IMPLEMENT ME\n" ) ;
# endif
2002-10-13 06:52:56 +00:00
} ,
// Open Metadata window for node
showMetadata : function ( ) {
2003-10-17 18:00:38 +00:00
window . openDialog ( "chrome://browser/content/metaData.xul" ,
2002-10-13 06:52:56 +00:00
"_blank" ,
"scrollbars,resizable,chrome,dialog=no" ,
this . target ) ;
} ,
///////////////
// Utilities //
///////////////
// Create instance of component given contractId and iid (as string).
createInstance : function ( contractId , iidName ) {
var iid = Components . interfaces [ iidName ] ;
return Components . classes [ contractId ] . createInstance ( iid ) ;
} ,
// Get service given contractId and iid (as string).
getService : function ( contractId , iidName ) {
var iid = Components . interfaces [ iidName ] ;
return Components . classes [ contractId ] . getService ( iid ) ;
} ,
// Show/hide one item (specified via name or the item element itself).
showItem : function ( itemOrId , show ) {
var item = itemOrId . constructor == String ? document . getElementById ( itemOrId ) : itemOrId ;
2005-06-14 10:15:58 +00:00
if ( item )
2002-10-13 06:52:56 +00:00
item . hidden = ! show ;
} ,
// Set given attribute of specified context-menu item. If the
// value is null, then it removes the attribute (which works
// nicely for the disabled attribute).
setItemAttr : function ( id , attr , val ) {
var elem = document . getElementById ( id ) ;
if ( elem ) {
if ( val == null ) {
// null indicates attr should be removed.
elem . removeAttribute ( attr ) ;
} else {
// Set attr=val.
elem . setAttribute ( attr , val ) ;
}
}
} ,
// Set context menu attribute according to like attribute of another node
// (such as a broadcaster).
setItemAttrFromNode : function ( item _id , attr , other _id ) {
var elem = document . getElementById ( other _id ) ;
if ( elem && elem . getAttribute ( attr ) == "true" ) {
this . setItemAttr ( item _id , attr , "true" ) ;
} else {
this . setItemAttr ( item _id , attr , null ) ;
}
} ,
// Temporary workaround for DOM api not yet implemented by XUL nodes.
cloneNode : function ( item ) {
// Create another element like the one we're cloning.
var node = document . createElement ( item . tagName ) ;
// Copy attributes from argument item to the new one.
var attrs = item . attributes ;
for ( var i = 0 ; i < attrs . length ; i ++ ) {
var attr = attrs . item ( i ) ;
node . setAttribute ( attr . nodeName , attr . nodeValue ) ;
}
// Voila!
return node ;
} ,
2005-08-12 06:55:54 +00:00
// Generate fully qualified URL for clicked-on link.
getLinkURL : function ( ) {
var href = this . link . href ;
if ( href ) {
return href ;
2002-10-13 06:52:56 +00:00
}
2005-08-12 06:55:54 +00:00
var href = this . link . getAttributeNS ( "http://www.w3.org/1999/xlink" ,
2004-10-18 18:59:30 +00:00
"href" ) ;
2005-08-12 06:55:54 +00:00
2002-10-13 06:52:56 +00:00
if ( ! href || ! href . match ( /\S/ ) ) {
throw "Empty href" ; // Without this we try to save as the current doc, for example, HTML case also throws if empty
}
2005-08-12 06:55:54 +00:00
href = makeURLAbsolute ( this . link . baseURI , href ) ;
2002-10-13 06:52:56 +00:00
return href ;
} ,
2005-08-12 06:55:54 +00:00
getLinkURI : function ( ) {
var ioService = Components . classes [ "@mozilla.org/network/io-service;1" ] . getService ( Components . interfaces . nsIIOService ) ;
try {
return ioService . newURI ( this . linkURL , null , null ) ;
} catch ( ex ) {
// e.g. empty URL string
return null ;
}
} ,
getLinkProtocol : function ( ) {
if ( this . linkURI ) {
return this . linkURI . scheme ; // can be |undefined|
} else {
return null ;
}
} ,
2002-10-13 06:52:56 +00:00
// Get text of link.
linkText : function ( ) {
var text = gatherTextUnder ( this . link ) ;
if ( ! text || ! text . match ( /\S/ ) ) {
text = this . link . getAttribute ( "title" ) ;
if ( ! text || ! text . match ( /\S/ ) ) {
text = this . link . getAttribute ( "alt" ) ;
if ( ! text || ! text . match ( /\S/ ) ) {
2005-08-12 06:55:54 +00:00
text = this . linkURL ;
2002-10-13 06:52:56 +00:00
}
}
}
return text ;
} ,
2006-03-17 07:16:00 +00:00
// Get selected text. Only display the first 15 chars.
2002-10-13 06:52:56 +00:00
isTextSelection : function ( ) {
2006-03-17 07:16:00 +00:00
// Get 16 characters, so that we can trim the selection if it's greater
// than 15 chars
var selectedText = getBrowserSelection ( 16 ) ;
if ( ! selectedText )
return false ;
if ( selectedText . length > 15 )
selectedText = selectedText . substr ( 0 , 15 ) + "..." ;
// Use the current engine if the search bar is visible, the default
// engine otherwise.
var engineName = "" ;
var ss = Cc [ "@mozilla.org/browser/search-service;1" ] .
getService ( Ci . nsIBrowserSearchService ) ;
if ( BrowserSearch . getSearchBar ( ) )
engineName = ss . currentEngine . name ;
else
engineName = ss . defaultEngine . name ;
// format "Search <engine> for <selection>" string to show in menu
var menuLabel = gNavigatorBundle . getFormattedString ( "contextMenuSearchText" ,
[ engineName ,
selectedText ] ) ;
this . setItemAttr ( "context-searchselect" , "label" , menuLabel ) ;
return true ;
2002-10-13 06:52:56 +00:00
} ,
2005-06-14 10:15:58 +00:00
2005-06-14 09:44:51 +00:00
// Returns true if anything is selected.
isContentSelection : function ( ) {
2005-08-24 22:15:53 +00:00
return ! document . commandDispatcher . focusedWindow . getSelection ( ) . isCollapsed ;
2005-06-14 09:44:51 +00:00
} ,
2002-10-13 06:52:56 +00:00
toString : function ( ) {
return "contextMenu.target = " + this . target + "\n" +
"contextMenu.onImage = " + this . onImage + "\n" +
"contextMenu.onLink = " + this . onLink + "\n" +
"contextMenu.link = " + this . link + "\n" +
"contextMenu.inFrame = " + this . inFrame + "\n" +
"contextMenu.hasBGImage = " + this . hasBGImage + "\n" ;
} ,
2006-03-17 07:16:00 +00:00
2002-10-13 06:52:56 +00:00
isTargetATextBox : function ( node )
{
2005-06-30 02:47:04 +00:00
if ( node instanceof HTMLInputElement )
return ( node . type == "text" || node . type == "password" )
2002-10-13 06:52:56 +00:00
2005-06-30 02:47:04 +00:00
return ( node instanceof HTMLTextAreaElement ) ;
2002-10-13 06:52:56 +00:00
} ,
2004-04-10 05:04:20 +00:00
isTargetAKeywordField : function ( node )
{
var form = node . form ;
if ( ! form )
return false ;
var method = form . method . toUpperCase ( ) ;
2005-06-14 10:15:58 +00:00
2004-04-20 09:45:12 +00:00
// These are the following types of forms we can create keywords for:
//
// method encoding type can create keyword
// GET * YES
// * YES
// POST YES
// POST application/x-www-form-urlencoded YES
// POST text/plain NO (a little tricky to do)
// POST multipart/form-data NO
2004-11-30 08:23:02 +00:00
// POST everything else YES
2005-06-14 10:15:58 +00:00
return ( method == "GET" || method == "" ) ||
2004-11-30 08:23:02 +00:00
( form . enctype != "text/plain" ) && ( form . enctype != "multipart/form-data" ) ;
2004-04-10 05:04:20 +00:00
} ,
2005-06-14 10:15:58 +00:00
// Determines whether or not the separator with the specified ID should be
2002-10-13 06:52:56 +00:00
// shown or not by determining if there are any non-hidden items between it
2005-06-14 10:15:58 +00:00
// and the previous separator.
2002-10-13 06:52:56 +00:00
shouldShowSeparator : function ( aSeparatorID )
{
var separator = document . getElementById ( aSeparatorID ) ;
if ( separator ) {
var sibling = separator . previousSibling ;
while ( sibling && sibling . localName != "menuseparator" ) {
if ( sibling . getAttribute ( "hidden" ) != "true" )
return true ;
sibling = sibling . previousSibling ;
}
}
2005-06-14 10:15:58 +00:00
return false ;
2006-05-04 20:36:16 +00:00
} ,
addDictionaries : function ( )
{
var ps = Components . classes [ "@mozilla.org/embedcomp/prompt-service;1" ]
. getService ( Components . interfaces . nsIPromptService ) ;
// FIXME bug 335605: hook this up so that it takes you to the download
// web page
var rv = ps . alert ( window , "Add Dictionaries" ,
"This command hasn't been hooked up yet. Instead, go to Thunderbird's download page:\n\nhttp://www.mozilla.org/products/thunderbird/dictionaries.html\n\nThese plugins will work in Firefox as well." ) ;
2002-10-13 06:52:56 +00:00
}
}
2002-10-13 16:35:19 +00:00
2006-03-17 07:16:00 +00:00
/ * *
* Gets the selected text in the active browser . Leading and trailing
* whitespace is removed , and consecutive whitespace is replaced by a single
* space . A maximum of 150 characters will be returned , regardless of the value
* of aCharLen .
*
* @ param aCharLen
* The maximum number of characters to return .
* /
function getBrowserSelection ( aCharLen ) {
// selections of more than 150 characters aren't useful
const kMaxSelectionLen = 150 ;
const charLen = Math . min ( aCharLen || kMaxSelectionLen , kMaxSelectionLen ) ;
var focusedWindow = document . commandDispatcher . focusedWindow ;
var selection = focusedWindow . getSelection ( ) . toString ( ) ;
if ( selection ) {
if ( selection . length > charLen ) {
// only use the first charLen important chars. see bug 221361
var pattern = new RegExp ( "^(?:\\s*.){0," + charLen + "}" ) ;
pattern . test ( selection ) ;
selection = RegExp . lastMatch ;
}
selection = selection . replace ( /^\s+/ , "" )
. replace ( /\s+$/ , "" )
. replace ( /\s+/g , " " ) ;
if ( selection . length > charLen )
selection = selection . substr ( 0 , charLen ) ;
}
return selection ;
}
2003-08-03 01:58:52 +00:00
var gWebPanelURI ;
2003-08-04 03:40:27 +00:00
function openWebPanel ( aTitle , aURI )
2003-08-03 01:58:52 +00:00
{
// Ensure that the web panels sidebar is open.
toggleSidebar ( 'viewWebPanelsSidebar' , true ) ;
2005-06-14 10:15:58 +00:00
2003-08-04 03:40:27 +00:00
// Set the title of the panel.
document . getElementById ( "sidebar-title" ) . value = aTitle ;
2005-06-14 10:15:58 +00:00
2003-08-03 01:58:52 +00:00
// Tell the Web Panels sidebar to load the bookmark.
var sidebar = document . getElementById ( "sidebar" ) ;
2005-01-09 01:41:03 +00:00
if ( sidebar . docShell && sidebar . contentDocument && sidebar . contentDocument . getElementById ( 'web-panels-browser' ) ) {
2003-08-03 01:58:52 +00:00
sidebar . contentWindow . loadWebPanel ( aURI ) ;
if ( gWebPanelURI ) {
gWebPanelURI = "" ;
sidebar . removeEventListener ( "load" , asyncOpenWebPanel , true ) ;
}
}
else {
// The panel is still being constructed. Attach an onload handler.
if ( ! gWebPanelURI )
sidebar . addEventListener ( "load" , asyncOpenWebPanel , true ) ;
gWebPanelURI = aURI ;
}
}
function asyncOpenWebPanel ( event )
{
var sidebar = document . getElementById ( "sidebar" ) ;
2003-08-04 03:40:27 +00:00
if ( gWebPanelURI && sidebar . contentDocument && sidebar . contentDocument . getElementById ( 'web-panels-browser' ) )
2003-08-03 01:58:52 +00:00
sidebar . contentWindow . loadWebPanel ( gWebPanelURI ) ;
gWebPanelURI = "" ;
sidebar . removeEventListener ( "load" , asyncOpenWebPanel , true ) ;
}
2002-10-13 16:35:19 +00:00
/ *
* - [ Dependencies ] -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
* utilityOverlay . js :
* - gatherTextUnder
* /
2002-10-13 23:52:36 +00:00
// Called whenever the user clicks in the content area,
// except when left-clicking on links (special case)
// should always return true for click to go through
2005-06-14 10:15:58 +00:00
function contentAreaClick ( event , fieldNormalClicks )
2002-10-13 23:52:36 +00:00
{
2004-10-22 07:32:08 +00:00
if ( ! event . isTrusted ) {
return true ;
}
2002-10-13 23:52:36 +00:00
var target = event . target ;
var linkNode ;
2005-06-30 02:47:04 +00:00
if ( target instanceof HTMLAnchorElement ||
target instanceof HTMLAreaElement ||
target instanceof HTMLLinkElement ) {
if ( target . hasAttribute ( "href" ) )
linkNode = target ;
2006-01-04 19:11:14 +00:00
// xxxmpc: this is kind of a hack to work around a Gecko bug (see bug 266932)
// we're going to walk up the DOM looking for a parent link node,
// this shouldn't be necessary, but we're matching the existing behaviour for left click
var parent = target . parentNode ;
while ( parent ) {
if ( parent instanceof HTMLAnchorElement ||
parent instanceof HTMLAreaElement ||
parent instanceof HTMLLinkElement ) {
if ( parent . hasAttribute ( "href" ) )
linkNode = parent ;
}
parent = parent . parentNode ;
}
2002-10-13 23:52:36 +00:00
}
2005-06-30 02:47:04 +00:00
else {
2005-07-07 09:22:37 +00:00
linkNode = event . originalTarget ;
2005-07-06 17:42:07 +00:00
while ( linkNode && ! ( linkNode instanceof HTMLAnchorElement ) )
linkNode = linkNode . parentNode ;
2005-06-30 02:47:04 +00:00
// <a> cannot be nested. So if we find an anchor without an
// href, there is no useful <a> around the target
if ( linkNode && ! linkNode . hasAttribute ( "href" ) )
linkNode = null ;
2002-10-13 23:52:36 +00:00
}
2005-04-03 15:41:20 +00:00
var wrapper = null ;
2002-10-13 23:52:36 +00:00
if ( linkNode ) {
2005-05-20 17:41:10 +00:00
wrapper = linkNode ;
2003-08-09 06:47:32 +00:00
if ( event . button == 0 && ! event . ctrlKey && ! event . shiftKey &&
! event . altKey && ! event . metaKey ) {
// A Web panel's links should target the main content area. Do this
// if no modifier keys are down and if there's no target or the target equals
// _main (the IE convention) or _content (the Mozilla convention).
2005-08-10 20:21:44 +00:00
// XXX Now that markLinkVisited is gone, we may not need to field _main and
// _content here.
2005-03-16 02:37:21 +00:00
target = wrapper . getAttribute ( "target" ) ;
2005-05-20 17:41:10 +00:00
var docWrapper = wrapper . ownerDocument ;
var locWrapper = docWrapper . location ;
2005-06-14 10:15:58 +00:00
if ( fieldNormalClicks &&
( ! target || target == "_content" || target == "_main" ) )
2003-08-09 06:47:32 +00:00
// IE uses _main, SeaMonkey uses _content, we support both
{
2005-06-14 10:15:58 +00:00
if ( ! wrapper . href )
2005-03-16 02:37:21 +00:00
return true ;
2005-06-14 10:15:58 +00:00
if ( wrapper . getAttribute ( "onclick" ) )
2005-03-16 02:37:21 +00:00
return true ;
// javascript links should be executed in the current browser
if ( wrapper . href . substr ( 0 , 11 ) === "javascript:" )
return true ;
2005-06-24 02:00:14 +00:00
// data links should be executed in the current browser
if ( wrapper . href . substr ( 0 , 5 ) === "data:" )
return true ;
2005-03-16 02:37:21 +00:00
if ( ! webPanelSecurityCheck ( locWrapper . href , wrapper . href ) )
return false ;
2004-04-20 09:45:12 +00:00
var postData = { } ;
2004-10-18 18:59:30 +00:00
var url = getShortcutOrURI ( wrapper . href , postData ) ;
2003-08-09 06:47:32 +00:00
if ( ! url )
2003-08-09 09:07:46 +00:00
return true ;
2006-04-03 23:17:51 +00:00
loadURI ( url , null , postData . value , false ) ;
2003-08-09 06:47:32 +00:00
event . preventDefault ( ) ;
return false ;
}
else if ( linkNode . getAttribute ( "rel" ) == "sidebar" ) {
// This is the Opera convention for a special link that - when clicked - allows
// you to add a sidebar panel. We support the Opera convention here. The link's
// title attribute contains the title that should be used for the sidebar panel.
2005-02-17 00:17:12 +00:00
var dialogArgs = {
name : wrapper . getAttribute ( "title" ) ,
url : wrapper . href ,
bWebPanel : true
}
2006-02-16 19:00:25 +00:00
# ifndef MOZ _PLACES
2003-08-09 06:47:32 +00:00
openDialog ( "chrome://browser/content/bookmarks/addBookmark2.xul" , "" ,
2005-04-21 09:29:59 +00:00
BROWSER _ADD _BM _FEATURES , dialogArgs ) ;
2003-08-09 06:47:32 +00:00
event . preventDefault ( ) ;
2006-02-16 19:00:25 +00:00
# else
dump ( "*** IMPLEMENT ME" ) ;
# endif
2003-08-02 07:48:07 +00:00
return false ;
2003-08-09 06:47:32 +00:00
}
else if ( target == "_search" ) {
// Used in WinIE as a way of transiently loading pages in a sidebar. We
// mimic that WinIE functionality here and also load the page transiently.
2005-04-20 18:49:09 +00:00
// javascript links targeting the sidebar shouldn't be allowed
// we copied this from IE, and IE blocks this completely
if ( wrapper . href . substr ( 0 , 11 ) === "javascript:" )
return false ;
// data: URIs are just as dangerous
if ( wrapper . href . substr ( 0 , 5 ) === "data:" )
return false ;
if ( ! webPanelSecurityCheck ( locWrapper . href , wrapper . href ) )
return false ;
2004-10-18 18:59:30 +00:00
openWebPanel ( gNavigatorBundle . getString ( "webPanels" ) , wrapper . href ) ;
2003-08-09 06:47:32 +00:00
event . preventDefault ( ) ;
return false ;
}
2003-08-02 07:48:07 +00:00
}
2004-10-18 18:59:30 +00:00
else {
handleLinkClick ( event , wrapper . href , linkNode ) ;
}
2002-10-13 23:52:36 +00:00
return true ;
} else {
// Try simple XLink
2006-01-31 20:11:16 +00:00
var href , realHref , baseURI ;
2002-10-13 23:52:36 +00:00
linkNode = target ;
while ( linkNode ) {
if ( linkNode . nodeType == Node . ELEMENT _NODE ) {
2005-05-20 17:41:10 +00:00
wrapper = linkNode ;
2004-10-18 18:59:30 +00:00
2006-01-04 19:11:14 +00:00
realHref = wrapper . getAttributeNS ( "http://www.w3.org/1999/xlink" , "href" ) ;
2006-01-31 20:11:16 +00:00
if ( realHref ) {
2006-01-04 19:11:14 +00:00
href = realHref ;
2006-01-31 20:11:16 +00:00
baseURI = wrapper . baseURI
}
2002-10-13 23:52:36 +00:00
}
linkNode = linkNode . parentNode ;
}
2004-11-30 08:23:02 +00:00
if ( href ) {
2004-10-18 18:59:30 +00:00
href = makeURLAbsolute ( baseURI , href ) ;
2002-10-13 23:52:36 +00:00
handleLinkClick ( event , href , null ) ;
return true ;
}
}
2002-10-19 19:38:57 +00:00
if ( event . button == 1 &&
2005-07-06 17:42:07 +00:00
! event . getPreventDefault ( ) &&
2006-06-02 19:52:30 +00:00
gPrefService . getBoolPref ( "middlemouse.contentLoadURL" ) &&
! gPrefService . getBoolPref ( "general.autoScroll" ) ) {
2004-06-23 22:54:12 +00:00
middleMousePaste ( event ) ;
2002-10-13 23:52:36 +00:00
}
return true ;
}
function handleLinkClick ( event , href , linkNode )
{
2005-08-12 06:55:54 +00:00
var docURL = event . target . ownerDocument . location . href ;
2005-06-14 10:15:58 +00:00
switch ( event . button ) {
2003-08-05 09:31:32 +00:00
case 0 :
# ifdef XP _MACOSX
2004-06-23 22:54:12 +00:00
if ( event . metaKey ) { // Cmd
2003-08-05 09:31:32 +00:00
# else
2002-10-21 03:51:49 +00:00
if ( event . ctrlKey ) {
2003-08-05 09:31:32 +00:00
# endif
2006-04-03 23:17:51 +00:00
openNewTabWith ( href , docURL , null , event , false ) ;
2006-03-25 22:03:49 +00:00
event . stopPropagation ( ) ;
2002-10-21 03:51:49 +00:00
return true ;
2005-06-14 10:15:58 +00:00
}
2002-10-21 03:51:49 +00:00
// if left button clicked
2006-04-28 06:08:22 +00:00
# ifdef MOZ _FEEDS
if ( event . shiftKey && event . altKey ) {
var feedService =
Cc [ "@mozilla.org/browser/feeds/result-service;1" ] .
getService ( Ci . nsIFeedResultService ) ;
feedService . forcePreviewPage = true ;
loadURI ( href , null , null , false ) ;
return false ;
}
# endif
2002-10-19 19:38:57 +00:00
if ( event . shiftKey ) {
2006-04-03 23:17:51 +00:00
openNewWindowWith ( href , docURL , null , false ) ;
2006-03-25 22:03:49 +00:00
event . stopPropagation ( ) ;
2002-10-19 19:38:57 +00:00
return true ;
}
2005-06-14 10:15:58 +00:00
2002-10-19 19:38:57 +00:00
if ( event . altKey ) {
2005-12-21 18:28:46 +00:00
saveURL ( href , linkNode ? gatherTextUnder ( linkNode ) : "" , null , true ,
true , makeURI ( docURL , event . target . ownerDocument . characterSet ) ) ;
2002-10-13 16:35:19 +00:00
return true ;
}
2005-06-14 10:15:58 +00:00
2002-10-13 23:52:36 +00:00
return false ;
case 1 : // if middle button clicked
2002-10-19 19:38:57 +00:00
var tab ;
try {
tab = gPrefService . getBoolPref ( "browser.tabs.opentabfor.middleclick" )
}
catch ( ex ) {
tab = true ;
}
if ( tab )
2006-04-03 23:17:51 +00:00
openNewTabWith ( href , docURL , null , event , false ) ;
2002-10-19 19:38:57 +00:00
else
2006-04-03 23:17:51 +00:00
openNewWindowWith ( href , docURL , null , false ) ;
2006-03-25 22:03:49 +00:00
event . stopPropagation ( ) ;
2002-10-19 19:38:57 +00:00
return true ;
2002-10-13 16:35:19 +00:00
}
2002-10-13 23:52:36 +00:00
return false ;
}
2002-10-13 16:35:19 +00:00
2002-11-16 17:14:12 +00:00
function middleMousePaste ( event )
2002-10-13 23:52:36 +00:00
{
var url = readFromClipboard ( ) ;
if ( ! url )
2004-06-23 22:54:12 +00:00
return ;
2004-04-20 09:45:12 +00:00
var postData = { } ;
url = getShortcutOrURI ( url , postData ) ;
2002-10-13 23:52:36 +00:00
if ( ! url )
2004-06-23 22:54:12 +00:00
return ;
2004-03-17 01:51:49 +00:00
2005-07-05 23:08:30 +00:00
try {
addToUrlbarHistory ( url ) ;
} catch ( ex ) {
// Things may go wrong when adding url to session history,
// but don't let that interfere with the loading of the url.
}
2004-06-23 22:54:12 +00:00
openUILink ( url ,
event ,
true /* ignore the fact this is a middle click */ ) ;
2002-10-13 16:35:19 +00:00
2006-03-25 22:03:49 +00:00
event . stopPropagation ( ) ;
2002-10-13 23:52:36 +00:00
}
2002-10-13 16:35:19 +00:00
2005-06-14 10:15:58 +00:00
function makeURLAbsolute ( base , url )
2002-10-13 23:52:36 +00:00
{
// Construct nsIURL.
var ioService = Components . classes [ "@mozilla.org/network/io-service;1" ]
. getService ( Components . interfaces . nsIIOService ) ;
var baseURI = ioService . newURI ( base , null , null ) ;
2002-10-13 16:35:19 +00:00
2002-10-13 23:52:36 +00:00
return ioService . newURI ( baseURI . resolve ( url ) , null , null ) . spec ;
}
2002-10-13 16:35:19 +00:00
2002-12-07 20:44:19 +00:00
/ *
* Note that most of this routine has been moved into C ++ in order to
* be available for all < browser > tags as well as gecko embedding . See
* mozilla / content / base / src / nsContentAreaDragDrop . cpp .
*
* Do not add any new fuctionality here other than what is needed for
* a standalone product .
* /
var contentAreaDNDObserver = {
onDrop : function ( aEvent , aXferData , aDragSession )
{
var url = transferUtils . retrieveURLFromData ( aXferData . data , aXferData . flavour . contentType ) ;
2004-08-26 07:47:38 +00:00
// valid urls don't contain spaces ' '; if we have a space it
// isn't a valid url, or if it's a javascript: or data: url,
// bail out
if ( ! url || ! url . length || url . indexOf ( " " , 0 ) != - 1 ||
/^\s*(javascript|data):/ . test ( url ) )
2002-12-07 20:44:19 +00:00
return ;
2005-03-17 17:40:55 +00:00
getBrowser ( ) . dragDropSecurityCheck ( aEvent , aDragSession , url ) ;
2005-03-16 00:40:21 +00:00
2006-01-06 21:08:48 +00:00
switch ( document . documentElement . getAttribute ( 'windowtype' ) ) {
2002-12-07 20:44:19 +00:00
case "navigator:browser" :
2004-04-20 09:45:12 +00:00
var postData = { } ;
var uri = getShortcutOrURI ( url , postData ) ;
2006-04-03 23:17:51 +00:00
loadURI ( uri , null , postData . value , false ) ;
2002-12-07 20:44:19 +00:00
break ;
case "navigator:view-source" :
viewSource ( url ) ;
break ;
}
2005-06-14 10:15:58 +00:00
2002-12-07 20:44:19 +00:00
// keep the event from being handled by the dragDrop listeners
2005-06-14 10:15:58 +00:00
// built-in to gecko if they happen to be above us.
2002-12-07 20:44:19 +00:00
aEvent . preventDefault ( ) ;
} ,
getSupportedFlavours : function ( )
{
var flavourSet = new FlavourSet ( ) ;
flavourSet . appendFlavour ( "text/x-moz-url" ) ;
flavourSet . appendFlavour ( "text/unicode" ) ;
flavourSet . appendFlavour ( "application/x-moz-file" , "nsIFile" ) ;
return flavourSet ;
}
2005-06-14 10:15:58 +00:00
2002-12-07 20:44:19 +00:00
} ;
// For extensions
function getBrowser ( )
2002-10-13 16:39:47 +00:00
{
2002-12-07 20:44:19 +00:00
if ( ! gBrowser )
gBrowser = document . getElementById ( "content" ) ;
return gBrowser ;
}
function MultiplexHandler ( event )
{ try {
2002-10-13 16:39:47 +00:00
var node = event . target ;
var name = node . getAttribute ( 'name' ) ;
if ( name == 'detectorGroup' ) {
2002-12-07 20:44:19 +00:00
SetForcedDetector ( true ) ;
SelectDetector ( event , false ) ;
2002-10-13 16:39:47 +00:00
} else if ( name == 'charsetGroup' ) {
var charset = node . getAttribute ( 'id' ) ;
charset = charset . substring ( 'charset.' . length , charset . length )
SetForcedCharset ( charset ) ;
SetDefaultCharacterSet ( charset ) ;
} else if ( name == 'charsetCustomize' ) {
//do nothing - please remove this else statement, once the charset prefs moves to the pref window
} else {
SetForcedCharset ( node . getAttribute ( 'id' ) ) ;
SetDefaultCharacterSet ( node . getAttribute ( 'id' ) ) ;
}
2002-12-07 20:44:19 +00:00
} catch ( ex ) { alert ( ex ) ; }
2002-10-13 16:39:47 +00:00
}
function SetDefaultCharacterSet ( charset )
{
BrowserSetDefaultCharacterSet ( charset ) ;
}
function SelectDetector ( event , doReload )
{
var uri = event . target . getAttribute ( "id" ) ;
var prefvalue = uri . substring ( 'chardet.' . length , uri . length ) ;
if ( "off" == prefvalue ) { // "off" is special value to turn off the detectors
prefvalue = "" ;
}
try {
2002-12-07 20:44:19 +00:00
var pref = Components . classes [ "@mozilla.org/preferences-service;1" ]
. getService ( Components . interfaces . nsIPrefBranch ) ;
var str = Components . classes [ "@mozilla.org/supports-string;1" ]
. createInstance ( Components . interfaces . nsISupportsString ) ;
2002-10-13 16:39:47 +00:00
str . data = prefvalue ;
2002-12-07 20:44:19 +00:00
pref . setComplexValue ( "intl.charset.detector" ,
2002-10-13 17:23:14 +00:00
Components . interfaces . nsISupportsString , str ) ;
2005-01-28 16:06:56 +00:00
if ( doReload ) window . content . location . reload ( ) ;
2002-10-13 16:39:47 +00:00
}
catch ( ex ) {
2002-12-07 20:44:19 +00:00
dump ( "Failed to set the intl.charset.detector preference.\n" ) ;
2002-10-13 16:39:47 +00:00
}
}
2002-12-07 20:44:19 +00:00
function SetForcedDetector ( doReload )
{
BrowserSetForcedDetector ( doReload ) ;
2002-10-13 16:39:47 +00:00
}
function SetForcedCharset ( charset )
{
BrowserSetForcedCharacterSet ( charset ) ;
}
2002-12-07 20:44:19 +00:00
function BrowserSetDefaultCharacterSet ( aCharset )
{
// no longer needed; set when setting Force; see bug 79608
}
function BrowserSetForcedCharacterSet ( aCharset )
{
var docCharset = getBrowser ( ) . docShell . QueryInterface (
Components . interfaces . nsIDocCharset ) ;
docCharset . charset = aCharset ;
BrowserReloadWithFlags ( nsIWebNavigation . LOAD _FLAGS _CHARSET _CHANGE ) ;
}
function BrowserSetForcedDetector ( doReload )
{
getBrowser ( ) . documentCharsetInfo . forcedDetector = true ;
if ( doReload )
BrowserReloadWithFlags ( nsIWebNavigation . LOAD _FLAGS _CHARSET _CHANGE ) ;
}
2002-10-13 16:39:47 +00:00
function UpdateCurrentCharset ( )
{
var menuitem = null ;
// exctract the charset from DOM
var wnd = document . commandDispatcher . focusedWindow ;
2005-01-28 16:06:56 +00:00
if ( ( window == wnd ) || ( wnd == null ) ) wnd = window . content ;
2002-10-13 16:39:47 +00:00
menuitem = document . getElementById ( 'charset.' + wnd . document . characterSet ) ;
if ( menuitem ) {
// uncheck previously checked item to workaround Mac checkmark problem
// bug 98625
if ( gPrevCharset ) {
var pref _item = document . getElementById ( 'charset.' + gPrevCharset ) ;
if ( pref _item )
pref _item . setAttribute ( 'checked' , 'false' ) ;
}
menuitem . setAttribute ( 'checked' , 'true' ) ;
}
}
function UpdateCharsetDetector ( )
{
var prefvalue ;
try {
2002-12-07 20:44:19 +00:00
var pref = Components . classes [ "@mozilla.org/preferences-service;1" ]
. getService ( Components . interfaces . nsIPrefBranch ) ;
prefvalue = pref . getComplexValue ( "intl.charset.detector" ,
2002-10-13 16:39:47 +00:00
Components . interfaces . nsIPrefLocalizedString ) . data ;
}
catch ( ex ) {
prefvalue = "" ;
}
if ( prefvalue == "" ) prefvalue = "off" ;
dump ( "intl.charset.detector = " + prefvalue + "\n" ) ;
prefvalue = 'chardet.' + prefvalue ;
var menuitem = document . getElementById ( prefvalue ) ;
if ( menuitem ) {
menuitem . setAttribute ( 'checked' , 'true' ) ;
}
}
function UpdateMenus ( event )
{
// use setTimeout workaround to delay checkmark the menu
// when onmenucomplete is ready then use it instead of oncreate
// see bug 78290 for the detail
UpdateCurrentCharset ( ) ;
2004-07-07 03:04:09 +00:00
setTimeout ( UpdateCurrentCharset , 0 ) ;
2002-10-13 16:39:47 +00:00
UpdateCharsetDetector ( ) ;
2004-07-07 03:04:09 +00:00
setTimeout ( UpdateCharsetDetector , 0 ) ;
2002-10-13 16:39:47 +00:00
}
function CreateMenu ( node )
{
var observerService = Components . classes [ "@mozilla.org/observer-service;1" ] . getService ( Components . interfaces . nsIObserverService ) ;
observerService . notifyObservers ( null , "charsetmenu-selected" , node ) ;
}
function charsetLoadListener ( event )
{
2005-01-28 16:06:56 +00:00
var charset = window . content . document . characterSet ;
2002-10-13 16:39:47 +00:00
if ( charset . length > 0 && ( charset != gLastBrowserCharset ) ) {
if ( ! gCharsetMenu )
2002-12-07 20:44:19 +00:00
gCharsetMenu = Components . classes [ '@mozilla.org/rdf/datasource;1?name=charset-menu' ] . getService ( ) . QueryInterface ( Components . interfaces . nsICurrentCharsetListener ) ;
2002-10-13 16:39:47 +00:00
gCharsetMenu . SetCurrentCharset ( charset ) ;
gPrevCharset = gLastBrowserCharset ;
gLastBrowserCharset = charset ;
}
}
2003-08-05 10:16:09 +00:00
2004-11-30 08:23:02 +00:00
/* Begin Page Style Functions */
2003-08-10 08:04:58 +00:00
function getStyleSheetArray ( frame )
{
var styleSheets = frame . document . styleSheets ;
var styleSheetsArray = new Array ( styleSheets . length ) ;
for ( var i = 0 ; i < styleSheets . length ; i ++ ) {
styleSheetsArray [ i ] = styleSheets [ i ] ;
}
return styleSheetsArray ;
}
function getAllStyleSheets ( frameset )
{
var styleSheetsArray = getStyleSheetArray ( frameset ) ;
for ( var i = 0 ; i < frameset . frames . length ; i ++ ) {
var frameSheets = getAllStyleSheets ( frameset . frames [ i ] ) ;
styleSheetsArray = styleSheetsArray . concat ( frameSheets ) ;
}
return styleSheetsArray ;
}
function stylesheetFillPopup ( menuPopup )
{
2004-11-30 08:23:02 +00:00
var noStyle = menuPopup . firstChild ;
var persistentOnly = noStyle . nextSibling ;
var sep = persistentOnly . nextSibling ;
2003-08-10 08:04:58 +00:00
while ( sep . nextSibling )
menuPopup . removeChild ( sep . nextSibling ) ;
2005-01-28 16:06:56 +00:00
var styleSheets = getAllStyleSheets ( window . content ) ;
2003-08-10 08:04:58 +00:00
var currentStyleSheets = [ ] ;
2004-11-30 08:23:02 +00:00
var styleDisabled = getMarkupDocumentViewer ( ) . authorStyleDisabled ;
2003-08-10 08:04:58 +00:00
var haveAltSheets = false ;
2004-11-30 08:23:02 +00:00
var altStyleSelected = false ;
2005-06-14 10:15:58 +00:00
2003-08-10 08:04:58 +00:00
for ( var i = 0 ; i < styleSheets . length ; ++ i ) {
var currentStyleSheet = styleSheets [ i ] ;
2005-06-14 10:15:58 +00:00
2003-08-10 08:04:58 +00:00
// Skip any stylesheets that don't match the screen media type.
var media = currentStyleSheet . media . mediaText . toLowerCase ( ) ;
if ( media && ( media . indexOf ( "screen" ) == - 1 ) && ( media . indexOf ( "all" ) == - 1 ) )
continue ;
2005-06-14 10:15:58 +00:00
2003-08-10 08:04:58 +00:00
if ( currentStyleSheet . title ) {
if ( ! currentStyleSheet . disabled )
2004-11-30 08:23:02 +00:00
altStyleSelected = true ;
2003-08-10 08:04:58 +00:00
haveAltSheets = true ;
2005-06-14 10:15:58 +00:00
2003-08-10 08:04:58 +00:00
var lastWithSameTitle = null ;
if ( currentStyleSheet . title in currentStyleSheets )
lastWithSameTitle = currentStyleSheets [ currentStyleSheet . title ] ;
if ( ! lastWithSameTitle ) {
var menuItem = document . createElement ( "menuitem" ) ;
menuItem . setAttribute ( "type" , "radio" ) ;
menuItem . setAttribute ( "label" , currentStyleSheet . title ) ;
menuItem . setAttribute ( "data" , currentStyleSheet . title ) ;
2004-11-30 08:23:02 +00:00
menuItem . setAttribute ( "checked" , ! currentStyleSheet . disabled && ! styleDisabled ) ;
2003-08-10 08:04:58 +00:00
menuPopup . appendChild ( menuItem ) ;
currentStyleSheets [ currentStyleSheet . title ] = menuItem ;
} else {
if ( currentStyleSheet . disabled )
lastWithSameTitle . removeAttribute ( "checked" ) ;
}
}
}
2005-06-14 10:15:58 +00:00
2004-11-30 08:23:02 +00:00
noStyle . setAttribute ( "checked" , styleDisabled ) ;
persistentOnly . setAttribute ( "checked" , ! altStyleSelected && ! styleDisabled ) ;
2006-03-13 03:18:52 +00:00
persistentOnly . hidden = ( window . content . document . preferredStylesheetSet ) ? haveAltSheets : false ;
2004-11-30 08:23:02 +00:00
sep . hidden = ( noStyle . hidden && persistentOnly . hidden ) || ! haveAltSheets ;
return true ;
2003-08-10 08:04:58 +00:00
}
function stylesheetInFrame ( frame , title ) {
var docStyleSheets = frame . document . styleSheets ;
for ( var i = 0 ; i < docStyleSheets . length ; ++ i ) {
if ( docStyleSheets [ i ] . title == title )
return true ;
}
return false ;
}
function stylesheetSwitchFrame ( frame , title ) {
var docStyleSheets = frame . document . styleSheets ;
for ( var i = 0 ; i < docStyleSheets . length ; ++ i ) {
var docStyleSheet = docStyleSheets [ i ] ;
if ( title == "_nostyle" )
docStyleSheet . disabled = true ;
else if ( docStyleSheet . title )
docStyleSheet . disabled = ( docStyleSheet . title != title ) ;
else if ( docStyleSheet . disabled )
docStyleSheet . disabled = false ;
}
}
function stylesheetSwitchAll ( frameset , title ) {
if ( ! title || title == "_nostyle" || stylesheetInFrame ( frameset , title ) ) {
stylesheetSwitchFrame ( frameset , title ) ;
}
for ( var i = 0 ; i < frameset . frames . length ; i ++ ) {
stylesheetSwitchAll ( frameset . frames [ i ] , title ) ;
}
}
2004-11-30 08:23:02 +00:00
function setStyleDisabled ( disabled ) {
getMarkupDocumentViewer ( ) . authorStyleDisabled = disabled ;
}
# ifdef ALTSS _ICON
2005-11-12 01:51:36 +00:00
function updatePageStyles ( evt ) {
2004-11-30 08:23:02 +00:00
if ( ! gPageStyleButton )
gPageStyleButton = document . getElementById ( "page-theme-button" ) ;
2003-08-10 08:04:58 +00:00
2004-11-30 08:23:02 +00:00
var hasAltSS = false ;
2005-01-28 16:06:56 +00:00
var stylesheets = window . content . document . styleSheets ;
var preferredSheet = window . content . document . preferredStylesheetSet ;
2003-08-10 08:04:58 +00:00
for ( var i = 0 ; i < stylesheets . length ; ++ i ) {
var currentStyleSheet = stylesheets [ i ] ;
2005-06-14 10:15:58 +00:00
2004-11-30 08:23:02 +00:00
if ( currentStyleSheet . title && currentStyleSheet . title != preferredSheet ) {
2003-08-10 08:04:58 +00:00
// Skip any stylesheets that don't match the screen media type.
var media = currentStyleSheet . media . mediaText . toLowerCase ( ) ;
if ( media && ( media . indexOf ( "screen" ) == - 1 ) && ( media . indexOf ( "all" ) == - 1 ) )
continue ;
2004-11-30 08:23:02 +00:00
hasAltSS = true ;
2003-08-10 08:04:58 +00:00
break ;
}
}
2004-11-30 08:23:02 +00:00
if ( hasAltSS ) {
gPageStyleButton . setAttribute ( "themes" , "true" ) ;
// FIXME: Do a first-time explanation of page styles here perhaps?
2003-08-10 08:13:47 +00:00
// Avoid for now since Firebird's default home page has an alt sheet.
2003-08-10 08:04:58 +00:00
}
else
2004-11-30 08:23:02 +00:00
gPageStyleButton . removeAttribute ( "themes" ) ;
2003-08-10 08:04:58 +00:00
}
2004-11-30 08:23:02 +00:00
# endif
/* End of the Page Style functions */
2003-08-10 08:04:58 +00:00
2003-12-02 00:29:22 +00:00
var BrowserOffline = {
/////////////////////////////////////////////////////////////////////////////
// BrowserOffline Public Methods
init : function ( )
{
2006-04-04 21:26:17 +00:00
if ( ! this . _uiElement )
this . _uiElement = document . getElementById ( "goOfflineMenuitem" ) ;
2003-12-02 00:29:22 +00:00
var os = Components . classes [ "@mozilla.org/observer-service;1" ] . getService ( Components . interfaces . nsIObserverService ) ;
os . addObserver ( this , "network:offline-status-changed" , false ) ;
2006-04-04 21:26:17 +00:00
var ioService = Components . classes [ "@mozilla.org/network/io-service;1" ] .
getService ( Components . interfaces . nsIIOService2 ) ;
2003-12-02 00:29:22 +00:00
2006-04-04 21:26:17 +00:00
// if ioService is managing the offline status, then ioservice.offline
// is already set correctly. We will continue to allow the ioService
// to manage its offline state until the user uses the "Work Offline" UI.
if ( ! ioService . manageOfflineStatus ) {
// set the initial state
var isOffline = false ;
try {
isOffline = gPrefService . getBoolPref ( "browser.offline" ) ;
}
catch ( e ) { }
ioService . offline = isOffline ;
2003-12-02 00:29:22 +00:00
}
2006-04-04 21:26:17 +00:00
this . _updateOfflineUI ( ioService . offline ) ;
2003-12-02 00:29:22 +00:00
} ,
2005-06-14 10:15:58 +00:00
2003-12-02 00:29:22 +00:00
uninit : function ( )
{
2004-02-25 00:27:13 +00:00
try {
var os = Components . classes [ "@mozilla.org/observer-service;1" ] . getService ( Components . interfaces . nsIObserverService ) ;
os . removeObserver ( this , "network:offline-status-changed" ) ;
} catch ( ex ) {
}
2003-12-02 00:29:22 +00:00
} ,
toggleOfflineStatus : function ( )
{
2006-04-04 21:26:17 +00:00
var ioService = Components . classes [ "@mozilla.org/network/io-service;1" ] .
getService ( Components . interfaces . nsIIOService2 ) ;
// Stop automatic management of the offline status
try {
ioService . manageOfflineStatus = false ;
} catch ( ex ) {
}
2003-12-02 00:59:33 +00:00
if ( ! this . _canGoOffline ( ) ) {
this . _updateOfflineUI ( false ) ;
2003-12-02 00:29:22 +00:00
return ;
2003-12-02 00:59:33 +00:00
}
2003-12-02 00:29:22 +00:00
ioService . offline = ! ioService . offline ;
2005-06-14 10:15:58 +00:00
2006-04-04 21:26:17 +00:00
// Save the current state for later use as the initial state
// (if there is no netLinkService)
2003-12-02 00:29:22 +00:00
gPrefService . setBoolPref ( "browser.offline" , ioService . offline ) ;
} ,
2005-06-14 10:15:58 +00:00
2003-12-02 00:29:22 +00:00
/////////////////////////////////////////////////////////////////////////////
// nsIObserver
2005-06-14 10:15:58 +00:00
observe : function ( aSubject , aTopic , aState )
2003-12-02 00:29:22 +00:00
{
if ( aTopic != "network:offline-status-changed" )
return ;
2005-06-14 10:15:58 +00:00
2003-12-02 00:29:22 +00:00
this . _updateOfflineUI ( aState == "offline" ) ;
} ,
/////////////////////////////////////////////////////////////////////////////
// BrowserOffline Implementation Methods
_canGoOffline : function ( )
{
var os = Components . classes [ "@mozilla.org/observer-service;1" ] . getService ( Components . interfaces . nsIObserverService ) ;
if ( os ) {
try {
var cancelGoOffline = Components . classes [ "@mozilla.org/supports-PRBool;1" ] . createInstance ( Components . interfaces . nsISupportsPRBool ) ;
os . notifyObservers ( cancelGoOffline , "offline-requested" , null ) ;
2005-06-14 10:15:58 +00:00
// Something aborted the quit process.
2003-12-02 00:29:22 +00:00
if ( cancelGoOffline . data )
return false ;
}
catch ( ex ) {
}
}
return true ;
} ,
_uiElement : null ,
_updateOfflineUI : function ( aOffline )
{
var offlineLocked = gPrefService . prefIsLocked ( "network.online" ) ;
2005-06-14 10:15:58 +00:00
if ( offlineLocked )
2003-12-02 00:29:22 +00:00
this . _uiElement . setAttribute ( "disabled" , "true" ) ;
2005-06-14 10:15:58 +00:00
2003-12-02 00:29:22 +00:00
this . _uiElement . setAttribute ( "checked" , aOffline ) ;
}
} ;
2004-02-19 21:52:31 +00:00
function WindowIsClosing ( )
{
var browser = getBrowser ( ) ;
var cn = browser . tabContainer . childNodes ;
var numtabs = cn . length ;
2004-11-30 08:23:02 +00:00
var reallyClose = browser . warnAboutClosingTabs ( true ) ;
2004-02-19 21:52:31 +00:00
for ( var i = 0 ; reallyClose && i < numtabs ; ++ i ) {
var ds = browser . getBrowserForTab ( cn [ i ] ) . docShell ;
if ( ds . contentViewer && ! ds . contentViewer . permitUnload ( ) )
reallyClose = false ;
}
if ( reallyClose )
return closeWindow ( false ) ;
return reallyClose ;
}
2004-03-07 04:42:17 +00:00
var MailIntegration = {
2006-01-16 22:52:03 +00:00
sendLinkForContent : function ( ) {
2005-05-20 17:41:10 +00:00
this . sendMessage ( window . content . location . href ,
2005-06-14 10:15:58 +00:00
window . content . document . title ) ;
2004-03-07 04:42:17 +00:00
} ,
2006-01-16 22:52:03 +00:00
sendMessage : function ( aBody , aSubject ) {
2004-03-07 04:42:17 +00:00
// generate a mailto url based on the url and the url's title
2006-01-16 22:52:03 +00:00
var mailtoUrl = "mailto:" ;
if ( aBody ) {
mailtoUrl += "?body=" + encodeURIComponent ( aBody ) ;
mailtoUrl += "&subject=" + encodeURIComponent ( aSubject ) ;
}
2004-03-07 04:42:17 +00:00
2006-01-16 22:52:03 +00:00
var ioService = Components . classes [ "@mozilla.org/network/io-service;1" ]
. getService ( Components . interfaces . nsIIOService ) ;
2004-03-07 04:42:17 +00:00
var uri = ioService . newURI ( mailtoUrl , null , null ) ;
2006-01-16 22:52:03 +00:00
// now pass this uri to the operating system
2005-06-14 10:15:58 +00:00
this . _launchExternalUrl ( uri ) ;
2004-03-07 04:42:17 +00:00
} ,
2006-01-16 22:52:03 +00:00
// a generic method which can be used to pass arbitrary urls to the operating
// system.
2004-03-07 04:42:17 +00:00
// aURL --> a nsIURI which represents the url to launch
2006-01-16 22:52:03 +00:00
_launchExternalUrl : function ( aURL ) {
var extProtocolSvc =
Components . classes [ "@mozilla.org/uriloader/external-protocol-service;1" ]
. getService ( Components . interfaces . nsIExternalProtocolService ) ;
2004-03-07 04:42:17 +00:00
if ( extProtocolSvc )
extProtocolSvc . loadUrl ( aURL ) ;
}
2004-03-08 14:27:43 +00:00
} ;
2004-04-10 05:04:20 +00:00
2006-04-27 03:05:10 +00:00
function BrowserOpenAddonsMgr ( )
2004-04-10 05:04:20 +00:00
{
const EMTYPE = "Extension:Manager" ;
var wm = Components . classes [ "@mozilla.org/appshell/window-mediator;1" ]
. getService ( Components . interfaces . nsIWindowMediator ) ;
2006-04-27 03:05:10 +00:00
var theEM = wm . getMostRecentWindow ( EMTYPE ) ;
if ( theEM ) {
theEM . focus ( ) ;
return ;
2004-04-10 05:04:20 +00:00
}
2006-04-27 03:05:10 +00:00
const EMURL = "chrome://mozapps/content/extensions/extensions.xul" ;
const EMFEATURES = "chrome,menubar,extra-chrome,toolbar,dialog=no,resizable" ;
window . openDialog ( EMURL , "" , EMFEATURES ) ;
2004-04-10 05:04:20 +00:00
}
2005-09-28 22:42:44 +00:00
function escapeNameValuePair ( aName , aValue , aIsFormUrlEncoded )
{
if ( aIsFormUrlEncoded )
return escape ( aName + "=" + aValue ) ;
else
return escape ( aName ) + "=" + escape ( aValue ) ;
}
2004-04-10 05:04:20 +00:00
function AddKeywordForSearchField ( )
{
var node = document . popupNode ;
2005-09-28 22:42:44 +00:00
var docURI = makeURI ( node . ownerDocument . URL ,
node . ownerDocument . characterSet ) ;
var formURI = makeURI ( node . form . getAttribute ( "action" ) ,
node . ownerDocument . characterSet ,
docURI ) ;
var spec = formURI . spec ;
var isURLEncoded =
( node . form . method . toUpperCase ( ) == "POST"
&& ( node . form . enctype == "application/x-www-form-urlencoded" ||
node . form . enctype == "" ) ) ;
var el , type ;
var formData = [ ] ;
for ( var i = 0 ; i < node . form . elements . length ; i ++ ) {
el = node . form . elements [ i ] ;
if ( ! el . type ) // happens with fieldsets
continue ;
if ( el == node ) {
formData . push ( ( isURLEncoded ) ? escapeNameValuePair ( el . name , "%s" , true ) :
// Don't escape "%s", just append
escapeNameValuePair ( el . name , "" , false ) + "%s" ) ;
continue ;
2004-04-20 09:45:12 +00:00
}
2005-06-14 10:15:58 +00:00
2005-09-28 22:42:44 +00:00
type = el . type . toLowerCase ( ) ;
if ( ( type == "text" || type == "hidden" || type == "textarea" ) ||
( ( type == "checkbox" || type == "radio" ) && el . checked ) ) {
formData . push ( escapeNameValuePair ( el . name , el . value , isURLEncoded ) ) ;
} else if ( el instanceof HTMLSelectElement && el . selectedIndex >= 0 ) {
for ( var j = 0 ; j < el . options . length ; j ++ ) {
if ( el . options [ j ] . selected )
formData . push ( escapeNameValuePair ( el . name , el . options [ j ] . value ,
isURLEncoded ) ) ;
}
2004-04-20 09:45:12 +00:00
}
2004-04-10 05:04:20 +00:00
}
2005-09-28 22:42:44 +00:00
var postData ;
if ( isURLEncoded )
postData = formData . join ( "&" ) ;
else
spec += "?" + formData . join ( "&" ) ;
2006-02-16 19:00:25 +00:00
# ifndef MOZ _PLACES
2005-02-17 00:17:12 +00:00
var dialogArgs = {
name : "" ,
url : spec ,
charset : node . ownerDocument . characterSet ,
bWebPanel : false ,
keyword : "" ,
bNeedKeyword : true ,
postData : postData ,
description : BookmarksUtils . getDescriptionFromDocument ( node . ownerDocument )
}
2005-02-19 06:16:18 +00:00
openDialog ( "chrome://browser/content/bookmarks/addBookmark2.xul" , "" ,
2005-04-21 09:29:59 +00:00
BROWSER _ADD _BM _FEATURES , dialogArgs ) ;
2006-02-16 19:00:25 +00:00
# else
dump ( "*** IMPLEMENT ME\n" ) ;
# endif
2004-04-10 05:04:20 +00:00
}
2005-08-08 15:52:59 +00:00
function SwitchDocumentDirection ( aWindow ) {
aWindow . document . dir = ( aWindow . document . dir == "ltr" ? "rtl" : "ltr" ) ;
2004-11-30 08:23:02 +00:00
for ( var run = 0 ; run < aWindow . frames . length ; run ++ )
2005-08-08 15:52:59 +00:00
SwitchDocumentDirection ( aWindow . frames [ run ] ) ;
2004-11-30 08:23:02 +00:00
}
function missingPluginInstaller ( ) {
}
2005-08-22 23:44:55 +00:00
function getPluginInfo ( pluginElement )
{
2004-11-30 08:23:02 +00:00
var tagMimetype ;
var pluginsPage ;
2005-08-22 23:44:55 +00:00
if ( pluginElement instanceof HTMLAppletElement ) {
2004-11-30 08:23:02 +00:00
tagMimetype = "application/x-java-vm" ;
} else {
2005-08-22 23:44:55 +00:00
if ( pluginElement instanceof HTMLObjectElement ) {
pluginsPage = pluginElement . getAttribute ( "codebase" ) ;
} else {
pluginsPage = pluginElement . getAttribute ( "pluginspage" ) ;
}
2005-11-19 02:29:00 +00:00
// only attempt if a pluginsPage is defined.
if ( pluginsPage ) {
var doc = pluginElement . ownerDocument ;
var docShell = findChildShell ( doc , gBrowser . selectedBrowser . docShell , null ) ;
try {
pluginsPage = makeURI ( pluginsPage , doc . characterSet , docShell . currentURI ) . spec ;
} catch ( ex ) {
pluginsPage = "" ;
}
2005-09-16 23:10:06 +00:00
}
2005-08-22 23:44:55 +00:00
2005-09-21 19:14:30 +00:00
tagMimetype = pluginElement . QueryInterface ( Components . interfaces . nsIObjectLoadingContent )
. actualType ;
2005-08-22 23:44:55 +00:00
if ( tagMimetype == "" ) {
tagMimetype = pluginElement . type ;
}
2004-11-30 08:23:02 +00:00
}
2005-08-22 23:44:55 +00:00
return { mimetype : tagMimetype , pluginsPage : pluginsPage } ;
}
missingPluginInstaller . prototype . installSinglePlugin = function ( aEvent ) {
var tabbrowser = getBrowser ( ) ;
var missingPluginsArray = new Object ;
var pluginInfo = getPluginInfo ( aEvent . target ) ;
missingPluginsArray [ pluginInfo . mimetype ] = pluginInfo ;
2004-11-30 08:23:02 +00:00
if ( missingPluginsArray ) {
window . openDialog ( "chrome://mozapps/content/plugins/pluginInstallerWizard.xul" ,
2006-04-19 20:50:25 +00:00
"PFSWindow" , "modal,chrome,resizable=yes" ,
{ plugins : missingPluginsArray , tab : tabbrowser . mCurrentTab } ) ;
2005-06-14 10:15:58 +00:00
}
2004-11-30 08:23:02 +00:00
aEvent . preventDefault ( ) ;
}
missingPluginInstaller . prototype . newMissingPlugin = function ( aEvent ) {
2005-12-29 14:15:33 +00:00
// Since we are expecting also untrusted events, make sure
// that the target is a plugin
if ( ! ( aEvent . target instanceof Components . interfaces . nsIObjectLoadingContent ) )
return ;
2004-11-30 08:23:02 +00:00
// For broken non-object plugin tags, register a click handler so
// that the user can click the plugin replacement to get the new
// plugin. Object tags can, and often do, deal with that themselves,
// so don't stomp on the page developers toes.
2005-06-30 02:47:04 +00:00
if ( ! ( aEvent . target instanceof HTMLObjectElement ) ) {
2004-11-30 08:23:02 +00:00
aEvent . target . addEventListener ( "click" ,
gMissingPluginInstaller . installSinglePlugin ,
false ) ;
}
var tabbrowser = getBrowser ( ) ;
const browsers = tabbrowser . mPanelContainer . childNodes ;
2005-08-15 15:46:51 +00:00
var window = aEvent . target . ownerDocument . defaultView ;
2004-11-30 08:23:02 +00:00
// walk up till the toplevel window
while ( window . parent != window )
window = window . parent ;
var i = 0 ;
for ( ; i < browsers . length ; i ++ ) {
if ( tabbrowser . getBrowserAtIndex ( i ) . contentWindow == window )
break ;
}
var tab = tabbrowser . mTabContainer . childNodes [ i ] ;
2005-04-20 18:31:12 +00:00
if ( ! tab . missingPlugins )
tab . missingPlugins = new Object ( ) ;
2004-11-30 08:23:02 +00:00
2005-08-22 23:44:55 +00:00
var pluginInfo = getPluginInfo ( aEvent . target ) ;
2004-11-30 08:23:02 +00:00
2005-08-22 23:44:55 +00:00
tab . missingPlugins [ pluginInfo . mimetype ] = pluginInfo ;
2004-11-30 08:23:02 +00:00
var browser = tabbrowser . getBrowserAtIndex ( i ) ;
2006-04-19 20:50:25 +00:00
var notificationBox = gBrowser . getNotificationBox ( browser ) ;
if ( ! notificationBox . getNotificationWithValue ( "missing-plugins" ) ) {
var bundle _browser = document . getElementById ( "bundle_browser" ) ;
var messageString = bundle _browser . getString ( "missingpluginsMessage.title" ) ;
var buttons = [ {
label : bundle _browser . getString ( "missingpluginsMessage.button.label" ) ,
accessKey : bundle _browser . getString ( "missingpluginsMessage.button.accesskey" ) ,
popup : null ,
callback : pluginsMissing
} ] ;
2004-11-30 08:23:02 +00:00
2006-04-19 20:50:25 +00:00
const priority = notificationBox . PRIORITY _WARNING _MEDIUM ;
const iconURL = "chrome://mozapps/skin/xpinstall/xpinstallItemGeneric.png" ;
notificationBox . appendNotification ( messageString , "missing-plugins" ,
iconURL , priority , buttons ) ;
}
2004-11-30 08:23:02 +00:00
}
2006-05-25 20:03:51 +00:00
missingPluginInstaller . prototype . closeNotification = function ( ) {
var notificationBox = gBrowser . getNotificationBox ( ) ;
var notification = notificationBox . getNotificationWithValue ( "missing-plugins" ) ;
if ( notification ) {
notificationBox . removeNotification ( notification ) ;
}
}
2006-04-19 20:50:25 +00:00
function pluginsMissing ( )
{
// get the urls of missing plugins
var tabbrowser = getBrowser ( ) ;
var missingPluginsArray = tabbrowser . mCurrentTab . missingPlugins ;
if ( missingPluginsArray ) {
window . openDialog ( "chrome://mozapps/content/plugins/pluginInstallerWizard.xul" ,
"PFSWindow" , "modal,chrome,resizable=yes" , { plugins : missingPluginsArray , tab : tabbrowser . mCurrentTab } ) ;
2004-07-29 23:49:31 +00:00
}
}
2006-04-19 20:50:25 +00:00
2004-11-30 08:23:02 +00:00
var gMissingPluginInstaller = new missingPluginInstaller ( ) ;
2005-08-12 00:34:19 +00:00
2005-08-09 04:53:19 +00:00
function convertFromUnicode ( charset , str )
{
try {
var unicodeConverter = Components
. classes [ "@mozilla.org/intl/scriptableunicodeconverter" ]
. createInstance ( Components . interfaces . nsIScriptableUnicodeConverter ) ;
unicodeConverter . charset = charset ;
str = unicodeConverter . ConvertFromUnicode ( str ) ;
return str + unicodeConverter . Finish ( ) ;
} catch ( ex ) {
return null ;
}
}
2005-08-12 00:34:19 +00:00
/ * *
* The Feed Handler object manages discovery of RSS / ATOM feeds in web pages
2005-08-26 18:22:08 +00:00
* and shows UI when they are discovered .
2005-08-12 00:34:19 +00:00
* /
var FeedHandler = {
/ * *
2005-08-26 18:22:08 +00:00
* Initialize the Feed Handler
2005-08-12 00:34:19 +00:00
* /
init : function ( ) {
gBrowser . addEventListener ( "DOMLinkAdded" ,
function ( event ) { FeedHandler . onLinkAdded ( event ) ; } ,
2006-05-17 07:21:23 +00:00
true ) ;
2005-08-12 00:34:19 +00:00
} ,
/ * *
* Called when the user clicks on the Feed icon in the location bar .
* Builds a menu of unique feeds associated with the page , and if there
* is only one , shows the feed inline in the browser window .
* @ param event
* The popupshowing event from the feed list menupopup
* @ returns true if the menu should be shown , false if there was only
* one feed and the feed should be shown inline in the browser
* window ( do not show the menupopup ) .
* /
buildFeedList : function ( event ) {
var menuPopup = event . target ;
var feeds = gBrowser . selectedBrowser . feeds ;
if ( feeds == null ) {
// XXX hack -- menu opening depends on setting of an "open"
// attribute, and the menu refuses to open if that attribute is
// set (because it thinks it's already open). onpopupshowing gets
// called after the attribute is unset, and it doesn't get unset
// if we return false. so we unset it here; otherwise, the menu
// refuses to work past this point.
menuPopup . parentNode . removeAttribute ( "open" ) ;
return false ;
}
while ( menuPopup . firstChild )
menuPopup . removeChild ( menuPopup . firstChild ) ;
// Get the list of unique feeds, and if there's only one unique entry,
// show the feed in the browser rather than displaying a menu.
2006-06-17 21:57:14 +00:00
var feeds = this . harvestFeeds ( feeds ) ;
2005-08-12 00:34:19 +00:00
if ( feeds . length == 1 ) {
2006-06-17 21:57:14 +00:00
this . subscribeToFeed ( feeds [ 0 ] . href ) ;
2005-08-12 00:34:19 +00:00
return false ;
}
// Build the menu showing the available feed choices for viewing.
for ( var i = 0 ; i < feeds . length ; ++ i ) {
var feedInfo = feeds [ i ] ;
var menuItem = document . createElement ( "menuitem" ) ;
var baseTitle = feedInfo . title || feedInfo . href ;
2006-05-03 03:56:20 +00:00
# ifdef MOZ _FEEDS
var labelStr = gNavigatorBundle . getFormattedString ( "feedShowFeedNew" , [ baseTitle ] ) ;
# else
2005-08-12 00:34:19 +00:00
var labelStr = gNavigatorBundle . getFormattedString ( "feedShowFeed" , [ baseTitle ] ) ;
2006-05-03 03:56:20 +00:00
# endif
2005-08-12 00:34:19 +00:00
menuItem . setAttribute ( "label" , labelStr ) ;
menuItem . setAttribute ( "feed" , feedInfo . href ) ;
menuItem . setAttribute ( "tooltiptext" , feedInfo . href ) ;
menuPopup . appendChild ( menuItem ) ;
}
return true ;
} ,
2005-08-26 18:22:08 +00:00
2006-06-17 21:57:14 +00:00
/ * *
* Subscribe to a given feed . Called when
* 1. Page has a single feed and user clicks feed icon in location bar
* 2. Page has a single feed and user selects Subscribe menu item
* 3. Page has multiple feeds and user selects from feed icon popup
* 4. Page has multiple feeds and user selects from Subscribe submenu
* @ param href
* The feed to subscribe to
* /
subscribeToFeed : function ( href ) {
# ifdef MOZ _PLACES
# ifdef MOZ _FEEDS
// Just load the feed in the content area to either subscribe or show the
// preview UI
loadURI ( href , null , null , false ) ;
# else
PlacesCommandHook . addLiveBookmark ( feeds [ 0 ] . href ) ;
# endif
# else
# ifdef MOZ _FEEDS
// Just load the feed in the content area to either subscribe or show the
// preview UI
loadURI ( href , null , null , false ) ;
# else
this . addLiveBookmark ( feeds [ 0 ] . href ) ;
# endif
# endif
} ,
/ * *
* Attempt to generate a list of unique feeds from the list of feeds
* supplied by the web page . It is fairly common for a site to supply
* feeds in multiple formats but with divergent | title | attributes so
* we need to make a rough pass at trying to not show a menu when there
* is in fact only one feed . If this is the case , by default select
* the ATOM feed if one is supplied , otherwise pick the first one .
* @ param feeds
* An array of Feed info JS Objects representing the list of
* feeds advertised by the web page
* @ returns An array of what should be mostly unique feeds .
* /
harvestFeeds : function ( feeds ) {
var feedHash = { } ;
for ( var i = 0 ; i < feeds . length ; ++ i ) {
var feed = feeds [ i ] ;
if ( ! ( feed . type in feedHash ) )
feedHash [ feed . type ] = [ ] ;
feedHash [ feed . type ] . push ( feed ) ;
}
var mismatch = false ;
var count = 0 ;
var defaultType = null ;
for ( var type in feedHash ) {
// The default type is whichever is listed first on the web page.
// Nothing fancy, just something that works.
if ( ! defaultType ) {
defaultType = type ;
count = feedHash [ type ] . length ;
}
if ( feedHash [ type ] . length != count ) {
mismatch = true ;
break ;
}
count = feedHash [ type ] . length ;
}
// There are more feeds of one type than another - this implies the
// content developer is supplying multiple channels, let's not do
// anything fancier than this and just return the full set.
if ( mismatch )
return feeds ;
// Look for an atom feed by default, fall back to whichever was listed
// first if there is no atom feed supplied.
const ATOMTYPE = "application/atom+xml" ;
return ATOMTYPE in feedHash ? feedHash [ ATOMTYPE ] : feedHash [ defaultType ] ;
} ,
2005-08-12 00:34:19 +00:00
/ * *
2005-08-28 03:59:45 +00:00
* Locate the shell that has a specified document loaded in it .
2005-08-26 18:22:08 +00:00
* @ param doc
2005-08-28 03:59:45 +00:00
* The document to find a shell for .
* @ returns The doc shell that contains the specified document .
2005-08-12 00:34:19 +00:00
* /
2005-08-28 03:59:45 +00:00
_getContentShell : function ( doc ) {
2005-08-26 18:22:08 +00:00
var browsers = getBrowser ( ) . browsers ;
for ( var i = 0 ; i < browsers . length ; i ++ ) {
2005-08-28 03:59:45 +00:00
var shell = findChildShell ( doc , browsers [ i ] . docShell , null ) ;
2005-08-26 18:22:08 +00:00
if ( shell )
return { shell : shell , browser : browsers [ i ] } ;
}
return null ;
2005-08-12 00:34:19 +00:00
} ,
2005-08-26 18:22:08 +00:00
2006-03-09 02:08:45 +00:00
# ifndef MOZ _PLACES
2005-08-12 00:34:19 +00:00
/ * *
2005-08-26 18:22:08 +00:00
* Adds a Live Bookmark to a feed
2005-08-12 00:34:19 +00:00
* @ param url
2005-08-26 18:22:08 +00:00
* The URL of the feed being bookmarked
* /
addLiveBookmark : function ( url ) {
var doc = gBrowser . selectedBrowser . contentDocument ;
var title = doc . title ;
var description = BookmarksUtils . getDescriptionFromDocument ( doc ) ;
BookmarksUtils . addLivemark ( doc . baseURI , url , title , description ) ;
2005-08-12 00:34:19 +00:00
} ,
2006-03-09 02:08:45 +00:00
# endif
2005-08-12 00:34:19 +00:00
/ * *
* Update the browser UI to show whether or not feeds are available when
* a page is loaded or the user switches tabs to a page that has feeds .
* /
updateFeeds : function ( ) {
2005-09-26 17:24:29 +00:00
var feedButton = document . getElementById ( "feed-button" ) ;
if ( ! feedButton )
return ;
2006-06-17 21:57:14 +00:00
if ( ! this . _feedMenuitem )
this . _feedMenuitem = document . getElementById ( "subscribeToPageMenuitem" ) ;
if ( ! this . _feedMenupopup )
this . _feedMenupopup = document . getElementById ( "subscribeToPageMenupopup" ) ;
2005-08-12 00:34:19 +00:00
var feeds = gBrowser . mCurrentBrowser . feeds ;
if ( ! feeds || feeds . length == 0 ) {
2005-09-26 17:24:29 +00:00
if ( feedButton . hasAttribute ( "feeds" ) )
feedButton . removeAttribute ( "feeds" ) ;
feedButton . setAttribute ( "tooltiptext" ,
gNavigatorBundle . getString ( "feedNoFeeds" ) ) ;
2006-06-17 21:57:14 +00:00
this . _feedMenuitem . setAttribute ( "disabled" , "true" ) ;
this . _feedMenupopup . setAttribute ( "hidden" , "true" ) ;
this . _feedMenuitem . removeAttribute ( "hidden" ) ;
2005-08-12 00:34:19 +00:00
} else {
2005-09-26 17:24:29 +00:00
feedButton . setAttribute ( "feeds" , "true" ) ;
feedButton . setAttribute ( "tooltiptext" ,
2006-05-03 03:56:20 +00:00
# ifdef MOZ _FEEDS
gNavigatorBundle . getString ( "feedHasFeedsNew" ) ) ;
# else
2005-09-26 17:24:29 +00:00
gNavigatorBundle . getString ( "feedHasFeeds" ) ) ;
2006-05-03 03:56:20 +00:00
# endif
2006-06-17 21:57:14 +00:00
// check for dupes before we pick which UI to expose
feeds = this . harvestFeeds ( feeds ) ;
if ( feeds . length > 1 ) {
this . _feedMenuitem . setAttribute ( "hidden" , "true" ) ;
this . _feedMenupopup . removeAttribute ( "hidden" ) ;
} else {
this . _feedMenuitem . removeAttribute ( "disabled" ) ;
this . _feedMenuitem . removeAttribute ( "hidden" ) ;
this . _feedMenupopup . setAttribute ( "hidden" , "true" ) ;
}
2005-08-12 00:34:19 +00:00
}
} ,
/ * *
* A new < link > tag has been discovered - check to see if it advertises
* an RSS feed .
* /
onLinkAdded : function ( event ) {
// XXX this event listener can/should probably be combined with the onLinkAdded
// listener in tabbrowser.xml, which only listens for favicons and then passes
// them to onLinkIconAvailable in the ProgressListener. We could extend the
// progress listener to have a generic onLinkAvailable and have tabbrowser pass
// along all events. It should give us the browser for the tab, as well as
// the actual event.
var erel = event . target . rel ;
var etype = event . target . type ;
var etitle = event . target . title ;
2005-08-25 18:15:10 +00:00
const alternateRelRegex = /(^|\s)alternate($|\s)/i ;
const rssTitleRegex = /(^|\s)rss($|\s)/i ;
2005-08-12 00:34:19 +00:00
2005-08-25 18:15:10 +00:00
if ( ! alternateRelRegex . test ( erel ) ||
! etype )
2005-08-12 00:34:19 +00:00
return ;
2005-08-25 18:15:10 +00:00
etype = etype . replace ( /^\s+/ , "" ) ;
etype = etype . replace ( /\s+$/ , "" ) ;
2005-09-28 19:08:16 +00:00
etype = etype . replace ( /\s*;.*/ , "" ) ;
2005-08-25 18:15:10 +00:00
etype = etype . toLowerCase ( ) ;
2005-08-12 00:34:19 +00:00
if ( etype == "application/rss+xml" ||
etype == "application/atom+xml" ||
2005-08-25 18:15:10 +00:00
( etype == "text/xml" ||
etype == "application/xml" ||
etype == "application/rdf+xml" ) &&
rssTitleRegex . test ( etitle ) )
2005-08-12 00:34:19 +00:00
{
2005-08-17 16:17:43 +00:00
const targetDoc = event . target . ownerDocument ;
2005-08-12 00:34:19 +00:00
// find which tab this is for, and set the attribute on the browser
2006-05-06 02:37:51 +00:00
var browserForLink = gBrowser . getBrowserForDocument ( targetDoc ) ;
2005-08-12 00:34:19 +00:00
if ( ! browserForLink ) {
// ??? this really shouldn't happen..
return ;
}
var feeds = [ ] ;
if ( browserForLink . feeds != null )
feeds = browserForLink . feeds ;
var wrapper = event . target ;
feeds . push ( { href : wrapper . href ,
2005-09-28 19:08:16 +00:00
type : etype ,
2005-08-12 00:34:19 +00:00
title : wrapper . title } ) ;
browserForLink . feeds = feeds ;
2005-09-26 17:24:29 +00:00
if ( browserForLink == gBrowser || browserForLink == gBrowser . mCurrentBrowser ) {
var feedButton = document . getElementById ( "feed-button" ) ;
2005-10-03 03:25:44 +00:00
if ( feedButton ) {
2005-09-26 17:24:29 +00:00
feedButton . setAttribute ( "feeds" , "true" ) ;
2005-10-03 03:25:44 +00:00
feedButton . setAttribute ( "tooltiptext" ,
2006-05-03 03:56:20 +00:00
# ifdef MOZ _FEEDS
gNavigatorBundle . getString ( "feedHasFeedsNew" ) ) ;
# else
2005-10-03 03:25:44 +00:00
gNavigatorBundle . getString ( "feedHasFeeds" ) ) ;
2006-05-03 03:56:20 +00:00
# endif
2005-10-03 03:25:44 +00:00
}
2005-09-26 17:24:29 +00:00
}
2005-08-12 00:34:19 +00:00
}
2005-08-15 22:45:23 +00:00
}
2005-08-12 00:34:19 +00:00
} ;
2006-02-24 21:41:34 +00:00
# ifdef MOZ _PLACES
2006-04-10 19:26:01 +00:00
/ * *
* This is a generic command controller for browser commands . Features can
* register commands with this controller and the events that should trigger
* updates to their state . Each command object must implement this interface :
*
* readonly attribute boolean enabled ; // true if the command is enabled
* void execute ( ) ; // performs the command
* /
2006-03-09 02:08:45 +00:00
var BrowserController = {
EVENT _TABCHANGE : "tabchange" ,
2006-04-10 19:26:01 +00:00
/ * *
* A hash of command - name - > command - objects
* /
2006-03-09 02:08:45 +00:00
commands : { } ,
2006-04-10 19:26:01 +00:00
/ * *
* A hash of event - name - > array - of - command - names
* /
2006-03-09 02:08:45 +00:00
events : { } ,
2006-04-10 19:26:01 +00:00
/ * *
* See nsIController . idl
* /
2006-03-09 02:08:45 +00:00
supportsCommand : function BC _supportsCommand ( command ) {
//LOG("BrowserController.supportsCommand: " + command);
return command in this . commands ;
2006-02-24 21:41:34 +00:00
} ,
2006-04-10 19:26:01 +00:00
/ * *
* See nsIController . idl
* /
2006-03-09 02:08:45 +00:00
isCommandEnabled : function BC _isCommandEnabled ( command ) {
//LOG("BrowserController.isCommandEnabled: " + command);
2006-03-14 01:56:09 +00:00
NS _ASSERT ( this . supportsCommand ( command ) ,
2006-03-09 02:08:45 +00:00
"Controller does not support: " + command ) ;
return this . commands [ command ] . enabled ;
2006-02-24 21:41:34 +00:00
} ,
2006-03-09 02:08:45 +00:00
2006-04-10 19:26:01 +00:00
/ * *
* See nsIController . idl
* /
2006-03-09 02:08:45 +00:00
doCommand : function BC _doCommand ( command ) {
//LOG("BrowserController.doCommand: " + command);
2006-03-14 01:56:09 +00:00
NS _ASSERT ( this . supportsCommand ( command ) ,
2006-03-09 02:08:45 +00:00
"Controller does not support: " + command ) ;
this . commands [ command ] . execute ( ) ;
2006-02-24 21:41:34 +00:00
} ,
2006-03-09 02:08:45 +00:00
2006-04-10 19:26:01 +00:00
/ * *
* See nsIController . idl
* /
2006-03-09 02:08:45 +00:00
onEvent : function BC _onEvent ( event ) {
if ( event in this . events ) {
var commandsForEvent = this . events [ event ] ;
for ( var i = 0 ; i < commandsForEvent . length ; ++ i )
CommandUpdater . updateCommand ( commandsForEvent [ i ] ) ;
}
}
} ;
window . controllers . appendController ( BrowserController ) ;
2006-03-04 01:12:05 +00:00
2006-04-10 19:26:01 +00:00
# include browser - places . js
2006-03-15 19:59:09 +00:00
# include . . / . . / . . / toolkit / content / debug . js
2006-02-24 21:41:34 +00:00
# endif
2006-06-20 07:30:00 +00:00
/ * *
* This object is for augmenting tabs
* /
var AugmentTabs = {
2006-06-28 20:44:35 +00:00
tabContextMenu : null ,
undoCloseTabMenu : null ,
2006-06-20 07:30:00 +00:00
/ * *
* Called in delayedStartup
* /
init : function at _init ( ) {
2006-06-28 20:44:35 +00:00
// get tab context menu
var tabbrowser = getBrowser ( ) ;
this . tabContextMenu = document . getAnonymousElementByAttribute ( tabbrowser , "anonid" , "tabContextMenu" ) ;
// listen for tab-context menu showing
this . tabContextMenu . addEventListener ( "popupshowing" , this . onTabContextMenuLoad , false ) ;
2006-06-20 07:30:00 +00:00
// add the tab context menu for undo-close-tab (bz254021)
var ssEnabled = true ;
var prefBranch = Cc [ "@mozilla.org/preferences-service;1" ] .
getService ( Ci . nsIPrefBranch ) ;
try {
ssEnabled = prefBranch . getBoolPref ( "browser.sessionstore.enabled" ) ;
} catch ( ex ) { }
if ( ssEnabled )
this . _addUndoCloseTabContextMenu ( ) ;
} ,
/ * *
* Add undo - close - tab to tab context menu
* /
_addUndoCloseTabContextMenu : function at _addUndoCloseTabContextMenu ( ) {
// get strings
var menuLabel = gNavigatorBundle . getString ( "tabContext.undoCloseTab" ) ;
var menuAccessKey = gNavigatorBundle . getString ( "tabContext.undoCloseTabAccessKey" ) ;
// create new menu item
var undoCloseTabItem = document . createElement ( "menuitem" ) ;
undoCloseTabItem . setAttribute ( "label" , menuLabel ) ;
undoCloseTabItem . setAttribute ( "accesskey" , menuAccessKey ) ;
2006-07-06 00:57:36 +00:00
undoCloseTabItem . addEventListener ( "command" , function ( ) { undoCloseTab ( 0 ) ; } , false ) ;
2006-06-20 07:30:00 +00:00
// add to tab context menu
2006-06-28 20:44:35 +00:00
var insertPos = this . tabContextMenu . lastChild . previousSibling ;
this . undoCloseTabMenu = this . tabContextMenu . insertBefore ( undoCloseTabItem , insertPos ) ;
2006-06-20 07:30:00 +00:00
} ,
2006-06-28 20:44:35 +00:00
onTabContextMenuLoad : function at _onTabContextMenuLoad ( ) {
if ( AugmentTabs . undoCloseTabMenu ) {
// only add the menu of there are tabs to restore
var ss = Cc [ "@mozilla.org/browser/sessionstore;1" ] .
getService ( Ci . nsISessionStore ) ;
AugmentTabs . undoCloseTabMenu . hidden = ! ( ss . getClosedTabCount ( window ) > 0 ) ;
}
2006-06-20 07:30:00 +00:00
}
} ;
2006-07-06 00:57:36 +00:00
/ * *
* History menu initialization
* /
# ifndef MOZ _PLACES
var HistoryMenu = { } ;
# endif
HistoryMenu . init = function PHM _init ( ) {
this . initializeUndoSubmenu ( ) ;
}
/ * *
* Initialize the "Undo Close Tabs" menu
* /
HistoryMenu . initializeUndoSubmenu = function PHM _initializeUndoSubmenu ( ) {
// get history menupopup
var histMenu = document . getElementById ( "goPopup" ) ;
histMenu . addEventListener ( "popupshowing" , function ( ) { HistoryMenu . populateUndoSubmenu ( ) ; } , false ) ;
}
/ * *
* Populate when the history menu is opened
* /
HistoryMenu . populateUndoSubmenu = function PHM _populateUndoSubmenu ( ) {
var undoPopup = document . getElementById ( "historyUndoPopup" ) ;
// remove existing menu items
while ( undoPopup . hasChildNodes ( ) )
undoPopup . removeChild ( undoPopup . firstChild ) ;
// get closed-tabs from nsSessionStore
var ss = Cc [ "@mozilla.org/browser/sessionstore;1" ] .
getService ( Ci . nsISessionStore ) ;
// no restorable tabs, so make sure menu is disabled, and return
if ( ss . getClosedTabCount ( window ) == 0 ) {
undoPopup . parentNode . setAttribute ( "disabled" , true ) ;
return ;
}
// enable menu
undoPopup . parentNode . removeAttribute ( "disabled" ) ;
// populate menu
var urls = [ ] ;
var undoItems = ss . getClosedTabData ( window ) ;
var keys = undoItems . getKeys ( { } ) ;
for ( var i = 0 ; i < keys . length ; i ++ ) {
var key = keys [ i ] ;
var tabData = undoItems . getValue ( key ) . wrappedJSObject ;
var m = undoPopup . appendChild ( document . createElement ( "menuitem" ) ) ;
m . setAttribute ( "label" , tabData . title ) ;
m . setAttribute ( "value" , key ) ;
m . addEventListener ( "command" , function ( aEvent ) {
undoCloseTab ( aEvent . originalTarget . getAttribute ( "value" ) ) ;
} , false ) ;
urls . push ( tabData . state . entries [ 0 ] . url ) ;
}
// "open in tabs"
var strings = document . getElementById ( "placeBundle" ) ;
undoPopup . appendChild ( document . createElement ( "menuseparator" ) ) ;
m = undoPopup . appendChild ( document . createElement ( "menuitem" ) ) ;
m . setAttribute ( "label" , strings . getString ( "menuOpenInTabs.label" ) ) ;
m . setAttribute ( "accesskey" , strings . getString ( "menuOpenInTabs.accesskey" ) ) ;
m . addEventListener ( "command" , function ( ) { loadOneOrMoreURIs ( urls . join ( "|" ) ) ; } , false ) ;
}
/ * *
* Re - open a closed tab .
* @ param aIndex
* The index of the tab ( via nsSessionStore . getClosedTabData )
* /
function undoCloseTab ( aIndex ) {
var ss = Cc [ "@mozilla.org/browser/sessionstore;1" ] .
getService ( Ci . nsISessionStore ) ;
ss . undoCloseTab ( window , aIndex ) ;
}