Bug 513653 Fix switching to an existing tab when trying to open a content tab with the same url. Also fix correctly setting content-primary on a newly opened tab. r=asuth

This commit is contained in:
Mark Banner 2009-09-01 20:53:03 +01:00
Родитель 11ddecaaec
Коммит e5b5447aab
4 изменённых файлов: 136 добавлений и 5 удалений

Просмотреть файл

@ -88,8 +88,7 @@ var specialTabs = {
for (let selectedIndex = 0; selectedIndex < tabInfo.length; for (let selectedIndex = 0; selectedIndex < tabInfo.length;
++selectedIndex) { ++selectedIndex) {
if (tabInfo[selectedIndex].mode.name == this.name && if (tabInfo[selectedIndex].mode.name == this.name &&
tabInfo[selectedIndex].browser tabInfo[selectedIndex].browser.currentURI.spec
.getAttribute("src")
.replace(regEx, "") == contentUrl) { .replace(regEx, "") == contentUrl) {
// Ensure we go to the correct location on the page. // Ensure we go to the correct location on the page.
tabInfo[selectedIndex].browser tabInfo[selectedIndex].browser
@ -99,19 +98,27 @@ var specialTabs = {
} }
return -1; return -1;
}, },
openTab: function onTabOpened(aTab, {contentPage: aContentPage}) { openTab: function onTabOpened(aTab, aArgs) {
if (!"contentPage" in aArgs)
throw("contentPage must be specified");
// First clone the page and set up the basics. // First clone the page and set up the basics.
let clone = document.getElementById("contentTab").firstChild.cloneNode(true); let clone = document.getElementById("contentTab").firstChild.cloneNode(true);
clone.setAttribute("id", "contentTab" + this.lastBrowserId); clone.setAttribute("id", "contentTab" + this.lastBrowserId);
clone.setAttribute("collapsed", false); clone.setAttribute("collapsed", false);
clone.setAttribute("type", "content-primary");
aTab.panel.appendChild(clone); aTab.panel.appendChild(clone);
// Start setting up the browser. // Start setting up the browser.
aTab.browser = aTab.panel.getElementsByTagName("browser")[0]; aTab.browser = aTab.panel.getElementsByTagName("browser")[0];
// As we're opening this tab, showTab may not get called, so set
// the type according to if we're opening in background or not.
let background = ("background" in aArgs) && aArgs.background;
aTab.browser.setAttribute("type", background ? "content-targetable" :
"content-primary");
aTab.browser.setAttribute("id", "contentTabBrowser" + this.lastBrowserId); aTab.browser.setAttribute("id", "contentTabBrowser" + this.lastBrowserId);
// Now initialise the find bar. // Now initialise the find bar.
@ -126,7 +133,7 @@ var specialTabs = {
// Now start loading the content. // Now start loading the content.
aTab.title = this.loadingTabString; aTab.title = this.loadingTabString;
aTab.browser.loadURI(aContentPage); aTab.browser.loadURI(aArgs.contentPage);
this.lastBrowserId++; this.lastBrowserId++;
}, },

Просмотреть файл

@ -0,0 +1,8 @@
<html>
<head>
<title>What's New Content Test</title>
</head>
<body bgcolor="#FFFFFF">
<h1>What's New Content Test</h1>
</body>
</html>

Просмотреть файл

@ -0,0 +1,115 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Mozilla Messaging.
* Portions created by the Initial Developer are Copyright (C) 2009
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Mark Banner <mark@standard8.plus.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
var MODULE_NAME = 'test-content-tab';
var RELATIVE_ROOT = '../shared-modules';
var MODULE_REQUIRES = ['window-helpers'];
var controller = {};
Components.utils.import('resource://mozmill/modules/controller.js', controller)
;
var mozmill = {};
Components.utils.import('resource://mozmill/modules/mozmill.js', mozmill);
var elementslib = {};
Components.utils.import('resource://mozmill/modules/elementslib.js', elementslib);
var windowHelper;
var mainController = null;
var mc;
// RELATIVE_ROOT messes with the collector, so we have to bring the path back
// so we get the right path for the resources.
var url = collector.addHttpResource('../content-tabs/html', 'content-tabs');
var setupModule = function (module) {
windowHelper = collector.getModule('window-helpers');
mc = mainController = windowHelper.wait_for_existing_window("mail:3pane");
windowHelper.installInto(module);
windowHelper.augment_controller(mc);
};
function test_content_tab_open() {
let preCount = mc.tabmail.tabContainer.childNodes.length;
let whatsUrl = url + "whatsnew.html";
// Set the pref so that what's new opens a local url
Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch)
.setCharPref("mailnews.start_page.override_url",
whatsUrl);
mc.click(new elementslib.Elem(mc.menus.helpMenu.whatsNew));
controller.sleep(0);
// XXX When bug 508999 is fixed, remove the sleep and use the waitForEval
// instead.
// controller.waitForEval("subject.busy == false", 1000, 100, newTab);
controller.sleep(400);
if (mc.tabmail.tabContainer.childNodes.length != preCount + 1)
throw new Error("The content tab didn't open");
if (mc.tabmail.selectedTab.title != "What's New Content Test")
throw new Error("The content tab has an incorrect title");
// Check that window.content is set up correctly wrt content-primary and
// content-targetable.
if (mc.window.content.location != whatsUrl)
throw new Error("window.content is not set to the url loaded, incorrect type=\"...\"?");
}
function test_content_tab_open_same() {
let preCount = mc.tabmail.tabContainer.childNodes.length;
mc.click(new elementslib.Elem(mc.menus.helpMenu.whatsNew));
controller.sleep(0);
if (mc.tabmail.tabContainer.childNodes.length != preCount)
throw new Error("A new content tab was opened when it shouldn't have been");
// Double-check browser is still the same.
if (mc.window.content.location != whatsUrl)
throw new Error("window.content is not set to the url loaded, incorrect type=\"...\"?");
}
// XXX todo
// - Open second tab
// - test find bar
// - window.close within tab
// - zoom?

Просмотреть файл

@ -2,3 +2,4 @@ folder-display
junk-commands junk-commands
search-window search-window
content-policy content-policy
content-tabs