From 660f2575ba8d89201bc11099313c0e7e3b030c58 Mon Sep 17 00:00:00 2001 From: Neil Deakin Date: Thu, 24 Jul 2008 14:50:32 -0400 Subject: [PATCH] Bug 436064, support multiple documents with a tab navigation bar, r=gavin --- mobile/chrome/content/browser-ui.js | 2 +- mobile/chrome/content/browser.css | 4 + mobile/chrome/content/browser.js | 37 ++- mobile/chrome/content/browser.xul | 8 +- mobile/chrome/content/deckbrowser.xml | 392 ++++++++++++++++++++++++- mobile/chrome/locale/en-US/browser.dtd | 3 + mobile/chrome/skin/browser.css | 31 ++ 7 files changed, 459 insertions(+), 18 deletions(-) diff --git a/mobile/chrome/content/browser-ui.js b/mobile/chrome/content/browser-ui.js index 3ccdfd9ec90..dfe64a5a8d0 100644 --- a/mobile/chrome/content/browser-ui.js +++ b/mobile/chrome/content/browser-ui.js @@ -319,7 +319,6 @@ var BrowserUI = { this._edit.focus(); bookmark.hidden = true; urllist.hidden = true; - this.openDefaultHistory(); } else if (aMode == PANELMODE_BOOKMARK) { toolbar.setAttribute("mode", "view"); @@ -412,6 +411,7 @@ var BrowserUI = { // URL textbox events case "click": this._showMode(PANELMODE_EDIT); + this.openDefaultHistory(); break; case "input": if (this._edit.value) { diff --git a/mobile/chrome/content/browser.css b/mobile/chrome/content/browser.css index 1e8ddc64401..78e4f8caa14 100644 --- a/mobile/chrome/content/browser.css +++ b/mobile/chrome/content/browser.css @@ -5,3 +5,7 @@ deckbrowser { #urlbar-edit { -moz-binding: url("chrome://browser/content/urlbar.xml#autocomplete-aligned"); } + +richlistitem[type="documenttab"] { + -moz-binding: url("chrome://browser/content/deckbrowser.xml#documenttab"); +} diff --git a/mobile/chrome/content/browser.js b/mobile/chrome/content/browser.js index 086eacd080a..e4e6d564f5b 100644 --- a/mobile/chrome/content/browser.js +++ b/mobile/chrome/content/browser.js @@ -65,7 +65,8 @@ var Browser = { _content : null, _titleChanged : function(aEvent) { - if (aEvent.target != this.content.browser.contentDocument) + var browser = this.content.browser; + if (!browser || aEvent.target != browser.contentDocument) return; document.title = "Fennec - " + aEvent.target.title; @@ -94,13 +95,16 @@ var Browser = { styleSheets.loadAndRegisterSheet(styleURI, styleSheets.AGENT_SHEET); this._content = document.getElementById("content"); + this._content.progressListenerCreator = function (content, browser) { + return new ProgressController(content, browser); + }; + + this._content.newTab(true); this._content.addEventListener("DOMTitleChanged", this, true); this._content.addEventListener("overpan", this, false); this._content.addEventListener("DOMUpdatePageReport", gPopupBlockerObserver.onUpdatePageReport, false); BrowserUI.init(); - this._progressController = new ProgressController(this.content); - this._spatialNavigation = new SpatialNavigation(this.content); this.setupGeolocationPrompt(); @@ -148,7 +152,13 @@ var Browser = { }, setupGeolocationPrompt: function() { - var geolocationService = Cc["@mozilla.org/geolocation/service;1"].getService(Ci.nsIGeolocationService); + try { + var geolocationService = Cc["@mozilla.org/geolocation/service;1"].getService(Ci.nsIGeolocationService); + } + catch (ex) { + return; + } + geolocationService.prompt = function(request) { var notificationBox = Browser.getNotificationBox(); @@ -218,6 +228,8 @@ var Browser = { case "cmd_fullscreen": case "cmd_addons": case "cmd_downloads": + case "cmd_newTab": + case "cmd_closeTab": isSupported = true; break; default: @@ -237,6 +249,7 @@ var Browser = { switch (cmd) { case "cmd_menu": + this.content.tabListVisible = !this.content.tabListVisible; controls.collapsed = !controls.collapsed; break; case "cmd_fullscreen": @@ -270,6 +283,11 @@ var Browser = { case "cmd_downloads": Cc["@mozilla.org/download-manager-ui;1"].getService(Ci.nsIDownloadManagerUI).show(window); break; + case "cmd_newTab": + this.newTab(); + break; + case "cmd_closeTab": + this.content.removeTab(this.content.browser); } }, @@ -277,6 +295,10 @@ var Browser = { return document.getElementById("notifications"); }, + newTab: function() { + this.content.newTab(true); + BrowserUI._showMode(PANELMODE_EDIT); + }, findState: FINDSTATE_FIND, openFind: function(aState) { @@ -305,9 +327,9 @@ var Browser = { } }; -function ProgressController(aTabBrowser) { +function ProgressController(aTabBrowser, aBrowser) { this._tabbrowser = aTabBrowser; - this.init(aTabBrowser.browser); + this.init(aBrowser); } ProgressController.prototype = { @@ -315,7 +337,6 @@ ProgressController.prototype = { init : function(aBrowser) { this._browser = aBrowser; - this._browser.addProgressListener(this, Components.interfaces.nsIWebProgress.NOTIFY_ALL); // FIXME: until we can get proper canvas repainting hooked up, update the canvas every 300ms var tabbrowser = this._tabbrowser; @@ -341,6 +362,7 @@ ProgressController.prototype = { if (aStateFlags & Ci.nsIWebProgressListener.STATE_IS_DOCUMENT) { if (aStateFlags & Ci.nsIWebProgressListener.STATE_STOP) { aWebProgress.DOMWindow.focus(); + this._tabbrowser.updateBrowser(this._browser, true); this._tabbrowser.updateCanvasState(true); //aWebProgress.DOMWindow.scrollbars.visible = false; } @@ -388,6 +410,7 @@ ProgressController.prototype = { if (aWebProgress.DOMWindow == this._browser.contentWindow) { BrowserUI.setURI(); + this._tabbrowser.updateBrowser(this._browser, false); this._tabbrowser.updateCanvasState(); } }, diff --git a/mobile/chrome/content/browser.xul b/mobile/chrome/content/browser.xul index e665381c1a7..735b6b68899 100644 --- a/mobile/chrome/content/browser.xul +++ b/mobile/chrome/content/browser.xul @@ -74,6 +74,9 @@ + + + @@ -102,6 +105,8 @@ + + @@ -200,7 +205,8 @@ - + diff --git a/mobile/chrome/content/deckbrowser.xml b/mobile/chrome/content/deckbrowser.xml index 49162f833bd..5412e60b187 100644 --- a/mobile/chrome/content/deckbrowser.xml +++ b/mobile/chrome/content/deckbrowser.xml @@ -9,21 +9,26 @@ - + + + + + - - + + + + + this._zoomLevel = 1; @@ -38,6 +43,12 @@ // this._stack.addEventListener("dblclick", this.stackEventHandler, true); this._stack.addEventListener("DOMMouseScroll", this.stackEventHandler, true); + var self = this; + var obs = Components.classes["@mozilla.org/observer-service;1"]. + getService(Components.interfaces.nsIObserverService); + obs.addObserver(function(subject, topic, data) self.destroyEarliestBrowser(), + "memory-pressure", false); + this._dragStartTimeout = -1; @@ -65,10 +76,29 @@ - return document.getAnonymousElementByAttribute(this, "anonid", "browser"); + + + + return document.getAnonymousElementByAttribute(this, "anonid", "display-list"); + + + + + + return document.getAnonymousElementByAttribute(this, "anonid", "tab-list"); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -597,4 +919,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/chrome/locale/en-US/browser.dtd b/mobile/chrome/locale/en-US/browser.dtd index 162e43f4ca9..4bae6f6af82 100644 --- a/mobile/chrome/locale/en-US/browser.dtd +++ b/mobile/chrome/locale/en-US/browser.dtd @@ -15,6 +15,9 @@ + + + diff --git a/mobile/chrome/skin/browser.css b/mobile/chrome/skin/browser.css index 8aff5e00e6c..1da67cec298 100644 --- a/mobile/chrome/skin/browser.css +++ b/mobile/chrome/skin/browser.css @@ -246,6 +246,37 @@ toolbarbutton.browser-control-button { _moz-box-align: start; } +/* tab list */ + +.tab-list-container { + background-color: rgb(123,125,123); +} + +.tab-list { + -moz-appearance: none; + margin: 0; + padding: 4px; + background-color: rgb(123,125,123); +} + +richlistitem[type="documenttab"] { + -moz-appearance: none; + border: 1px solid transparent; + -moz-border-radius: 5px; + background: none; + padding: 4px; +} + +richlistitem[type="documenttab"][selected="true"] { + border: 1px solid white !important; +} + +.newtab-button { + -moz-appearance: none; + background-color: rgba(207,207,207,0.9); + font-size: 24pt; +} + /* autocomplete */ #popup_autocomplete {