michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ michael@0: */ michael@0: michael@0: let tabs = []; michael@0: michael@0: function addTab(aURL) { michael@0: tabs.push(gBrowser.addTab(aURL, {skipAnimation: true})); michael@0: } michael@0: michael@0: function testAttrib(elem, attrib, attribValue, msg) { michael@0: is(elem.hasAttribute(attrib), attribValue, msg); michael@0: } michael@0: michael@0: function test() { michael@0: waitForExplicitFinish(); michael@0: is(gBrowser.tabs.length, 1, "one tab is open initially"); michael@0: michael@0: // Add several new tabs in sequence, hiding some, to ensure that the michael@0: // correct attributes get set michael@0: michael@0: addTab("http://mochi.test:8888/#0"); michael@0: addTab("http://mochi.test:8888/#1"); michael@0: addTab("http://mochi.test:8888/#2"); michael@0: addTab("http://mochi.test:8888/#3"); michael@0: michael@0: gBrowser.selectedTab = gBrowser.tabs[0]; michael@0: testAttrib(gBrowser.tabs[0], "first-visible-tab", true, michael@0: "First tab marked first-visible-tab!"); michael@0: testAttrib(gBrowser.tabs[4], "last-visible-tab", true, michael@0: "Fifth tab marked last-visible-tab!"); michael@0: testAttrib(gBrowser.tabs[0], "selected", true, "First tab marked selected!"); michael@0: testAttrib(gBrowser.tabs[0], "afterselected-visible", false, michael@0: "First tab not marked afterselected-visible!"); michael@0: testAttrib(gBrowser.tabs[1], "afterselected-visible", true, michael@0: "Second tab marked afterselected-visible!"); michael@0: gBrowser.hideTab(gBrowser.tabs[1]); michael@0: executeSoon(test_hideSecond); michael@0: } michael@0: michael@0: function test_hideSecond() { michael@0: testAttrib(gBrowser.tabs[2], "afterselected-visible", true, michael@0: "Third tab marked afterselected-visible!"); michael@0: gBrowser.showTab(gBrowser.tabs[1]) michael@0: executeSoon(test_showSecond); michael@0: } michael@0: michael@0: function test_showSecond() { michael@0: testAttrib(gBrowser.tabs[1], "afterselected-visible", true, michael@0: "Second tab marked afterselected-visible!"); michael@0: testAttrib(gBrowser.tabs[2], "afterselected-visible", false, michael@0: "Third tab not marked as afterselected-visible!"); michael@0: gBrowser.selectedTab = gBrowser.tabs[1]; michael@0: gBrowser.hideTab(gBrowser.tabs[0]); michael@0: executeSoon(test_hideFirst); michael@0: } michael@0: michael@0: function test_hideFirst() { michael@0: testAttrib(gBrowser.tabs[0], "first-visible-tab", false, michael@0: "Hidden first tab not marked first-visible-tab!"); michael@0: testAttrib(gBrowser.tabs[1], "first-visible-tab", true, michael@0: "Second tab marked first-visible-tab!"); michael@0: gBrowser.showTab(gBrowser.tabs[0]); michael@0: executeSoon(test_showFirst); michael@0: } michael@0: michael@0: function test_showFirst() { michael@0: testAttrib(gBrowser.tabs[0], "first-visible-tab", true, michael@0: "First tab marked first-visible-tab!"); michael@0: gBrowser.selectedTab = gBrowser.tabs[2]; michael@0: testAttrib(gBrowser.tabs[3], "afterselected-visible", true, michael@0: "Fourth tab marked afterselected-visible!"); michael@0: michael@0: gBrowser.moveTabTo(gBrowser.selectedTab, 1); michael@0: executeSoon(test_movedLower); michael@0: } michael@0: michael@0: function test_movedLower() { michael@0: testAttrib(gBrowser.tabs[2], "afterselected-visible", true, michael@0: "Third tab marked afterselected-visible!"); michael@0: test_hoverOne(); michael@0: } michael@0: michael@0: function test_hoverOne() { michael@0: EventUtils.synthesizeMouseAtCenter(gBrowser.tabs[4], { type: "mousemove" }); michael@0: testAttrib(gBrowser.tabs[3], "beforehovered", true, "Fourth tab marked beforehovered"); michael@0: EventUtils.synthesizeMouseAtCenter(gBrowser.tabs[3], { type: "mousemove" }); michael@0: testAttrib(gBrowser.tabs[2], "beforehovered", true, "Third tab marked beforehovered!"); michael@0: testAttrib(gBrowser.tabs[2], "afterhovered", false, "Third tab not marked afterhovered!"); michael@0: testAttrib(gBrowser.tabs[4], "afterhovered", true, "Fifth tab marked afterhovered!"); michael@0: testAttrib(gBrowser.tabs[4], "beforehovered", false, "Fifth tab not marked beforehovered!"); michael@0: testAttrib(gBrowser.tabs[0], "beforehovered", false, "First tab not marked beforehovered!"); michael@0: testAttrib(gBrowser.tabs[0], "afterhovered", false, "First tab not marked afterhovered!"); michael@0: testAttrib(gBrowser.tabs[1], "beforehovered", false, "Second tab not marked beforehovered!"); michael@0: testAttrib(gBrowser.tabs[1], "afterhovered", false, "Second tab not marked afterhovered!"); michael@0: testAttrib(gBrowser.tabs[3], "beforehovered", false, "Fourth tab not marked beforehovered!"); michael@0: testAttrib(gBrowser.tabs[3], "afterhovered", false, "Fourth tab not marked afterhovered!"); michael@0: gBrowser.removeTab(tabs.pop()); michael@0: executeSoon(test_hoverStatePersistence); michael@0: } michael@0: michael@0: function test_hoverStatePersistence() { michael@0: // Test that the afterhovered and beforehovered attributes are still there when michael@0: // a tab is selected and then unselected again. See bug 856107. michael@0: michael@0: function assertState() { michael@0: testAttrib(gBrowser.tabs[0], "beforehovered", true, "First tab still marked beforehovered!"); michael@0: testAttrib(gBrowser.tabs[0], "afterhovered", false, "First tab not marked afterhovered!"); michael@0: testAttrib(gBrowser.tabs[2], "afterhovered", true, "Third tab still marked afterhovered!"); michael@0: testAttrib(gBrowser.tabs[2], "beforehovered", false, "Third tab not marked afterhovered!"); michael@0: testAttrib(gBrowser.tabs[1], "beforehovered", false, "Second tab not marked beforehovered!"); michael@0: testAttrib(gBrowser.tabs[1], "afterhovered", false, "Second tab not marked afterhovered!"); michael@0: testAttrib(gBrowser.tabs[3], "beforehovered", false, "Fourth tab not marked beforehovered!"); michael@0: testAttrib(gBrowser.tabs[3], "afterhovered", false, "Fourth tab not marked afterhovered!"); michael@0: } michael@0: michael@0: gBrowser.selectedTab = gBrowser.tabs[3]; michael@0: EventUtils.synthesizeMouseAtCenter(gBrowser.tabs[1], { type: "mousemove" }); michael@0: assertState(); michael@0: gBrowser.selectedTab = gBrowser.tabs[1]; michael@0: assertState(); michael@0: gBrowser.selectedTab = gBrowser.tabs[3]; michael@0: assertState(); michael@0: executeSoon(test_pinning); michael@0: } michael@0: michael@0: function test_pinning() { michael@0: gBrowser.selectedTab = gBrowser.tabs[3]; michael@0: testAttrib(gBrowser.tabs[3], "last-visible-tab", true, michael@0: "Fourth tab marked last-visible-tab!"); michael@0: testAttrib(gBrowser.tabs[3], "selected", true, "Fourth tab marked selected!"); michael@0: testAttrib(gBrowser.tabs[3], "afterselected-visible", false, michael@0: "Fourth tab not marked afterselected-visible!"); michael@0: // Causes gBrowser.tabs to change indices michael@0: gBrowser.pinTab(gBrowser.tabs[3]); michael@0: testAttrib(gBrowser.tabs[3], "last-visible-tab", true, michael@0: "Fourth tab marked last-visible-tab!"); michael@0: testAttrib(gBrowser.tabs[1], "afterselected-visible", true, michael@0: "Second tab marked afterselected-visible!"); michael@0: testAttrib(gBrowser.tabs[0], "first-visible-tab", true, michael@0: "First tab marked first-visible-tab!"); michael@0: testAttrib(gBrowser.tabs[0], "selected", true, "First tab marked selected!"); michael@0: gBrowser.selectedTab = gBrowser.tabs[1]; michael@0: testAttrib(gBrowser.tabs[2], "afterselected-visible", true, michael@0: "Third tab marked afterselected-visible!"); michael@0: test_cleanUp(); michael@0: } michael@0: michael@0: function test_cleanUp() { michael@0: tabs.forEach(gBrowser.removeTab, gBrowser); michael@0: finish(); michael@0: }