diff options
5 files changed, 72 insertions, 84 deletions
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 73abc19..697ac3a 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc @@ -1371,7 +1371,7 @@ void BrowserView::ActiveTabChanged(TabContentsWrapper* old_contents, TabContentsWrapper* new_contents, int index, bool user_gesture) { - ProcessTabSelected(new_contents, true); + ProcessTabSelected(new_contents); } void BrowserView::TabReplacedAt(TabStripModel* tab_strip_model, @@ -1390,16 +1390,9 @@ void BrowserView::TabReplacedAt(TabStripModel* tab_strip_model, old_container->ChangeTabContents(NULL); delete old_container; preview_container_ = NULL; - - // Update the UI for what was the preview contents and is now active. Pass - // in false to ProcessTabSelected as new_contents is already parented - // correctly. - ProcessTabSelected(new_contents, false); - } else { - // Update the UI for the new contents. Pass in true to ProcessTabSelected as - // new_contents is not parented correctly. - ProcessTabSelected(new_contents, true); } + // Update the UI for the new contents. + ProcessTabSelected(new_contents); } void BrowserView::TabStripEmpty() { @@ -2497,8 +2490,15 @@ void BrowserView::UpdateAcceleratorMetrics( #endif } -void BrowserView::ProcessTabSelected(TabContentsWrapper* new_contents, - bool change_tab_contents) { +void BrowserView::ProcessTabSelected(TabContentsWrapper* new_contents) { + // If |contents_container_| already has the correct TabContents, we can save + // some work. This also prevents extra events from being reported by the + // Visibility API under Windows, as ChangeTabContents will briefly hide + // the TabContents window. + DCHECK(new_contents); + bool change_tab_contents = + contents_container_->tab_contents() != new_contents->tab_contents(); + // Update various elements that are interested in knowing the current // TabContents. diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h index 4a17613..cf95ff4 100644 --- a/chrome/browser/ui/views/frame/browser_view.h +++ b/chrome/browser/ui/views/frame/browser_view.h @@ -532,12 +532,9 @@ class BrowserView : public BrowserBubbleHost, void UpdateAcceleratorMetrics(const views::Accelerator& accelerator, int command_id); - // Invoked from ActiveTabChanged or when instant is made active. If - // |change_tab_contents| is true, |new_contents| is added to the view - // hierarchy, if |change_tab_contents| is false, it's assumed |new_contents| - // has already been added to the view hierarchy. - void ProcessTabSelected(TabContentsWrapper* new_contents, - bool change_tab_contents); + // Invoked from ActiveTabChanged or when instant is made active. + // |new_contents| must not be NULL. + void ProcessTabSelected(TabContentsWrapper* new_contents); // Exposes resize corner size to BrowserViewLayout. gfx::Size GetResizeCornerSize() const; diff --git a/chrome/test/data/prerender/prerender_visibility.html b/chrome/test/data/prerender/prerender_visibility.html index bb52498..50a6787 100644 --- a/chrome/test/data/prerender/prerender_visibility.html +++ b/chrome/test/data/prerender/prerender_visibility.html @@ -5,49 +5,33 @@ This test checks the visibility API when a prerendered page is displayed. <head> <title>Prerender Visibility</title> -<script> -// Checks visibility state while the page is still loading. -var loadingStatePassed = document.webkitHidden && - document.webkitVisibilityState == 'prerender'; - -// True if any visibility change event has occurred. -var visibilityChangeCalled = false; - -// True if the last visibility change event set the document's state to visible. -var visibilityChangePassed = false; +<script src="prerender_visibility_shared.js"></script> +<script> // Checks that no visibility change events have occurred, current visibility // state is "prerender", and visibility state while the page was loading was // also "prerender". function DidPrerenderPass() { - return !visibilityChangeCalled && - loadingStatePassed && - document.webkitHidden && - 'prerender' == document.webkitVisibilityState; + return visibilityStates.length == 1 && + hiddenValues.length == 1 && + visibilityStates[0] == 'prerender' && + hiddenValues[0] == true && + document.webkitVisibilityState == 'prerender' && + document.webkitHidden == true; } -function onVisibilityChange(event) { - // TODO(mmenke): Currently, we get 4 events when a page is shown - - // hidden -> visible -> hidden -> visible. - // Once that's fixed, add check to make sure we only have - // hidden -> visible, or just visible. - visibilityChangePassed = - !document.webkitHidden && - 'visible' == document.webkitVisibilityState; - visibilityChangeCalled = true; -} - -document.addEventListener("webkitvisibilitychange", - onVisibilityChange, - false); - -// Checks that the last visibility change resulted in a visible state, and that -// the current state is also visible. +// Checks that we've only had three visibility states: +// prerender -> hidden -> visible. +// Also checks current visibility state. function DidDisplayPass() { - return visibilityChangeCalled && - visibilityChangePassed && - !document.webkitHidden && - 'visible' == document.webkitVisibilityState; + return visibilityStates.length == 3 && + hiddenValues.length == 3 && + visibilityStates[1] == 'hidden' && + hiddenValues[1] == true && + visibilityStates[2] == 'visible' && + hiddenValues[2] == false && + document.webkitVisibilityState == 'visible' && + document.webkitHidden == false; } </script> diff --git a/chrome/test/data/prerender/prerender_visibility_hidden.html b/chrome/test/data/prerender/prerender_visibility_hidden.html index 090f998..d7b8028 100644 --- a/chrome/test/data/prerender/prerender_visibility_hidden.html +++ b/chrome/test/data/prerender/prerender_visibility_hidden.html @@ -6,47 +6,30 @@ being displayed. <head> <title>Prerender Visibility Hidden</title> -<script> -// Checks visibility state while the page is still loading. -var loadingStatePassed = document.webkitHidden && - document.webkitVisibilityState == 'prerender'; - -// True if any visibility change event has occurred. -var visibilityChangeCalled = false; - -// True if only one visibility change event has occurred, and that event was the -// transition to the 'hidden' state. -var visibilityChangePassed = false; +<script src="prerender_visibility_shared.js"></script> +<script> // Checks that no visibility change events have occurred, current visibility // state is "prerender", and visibility state while the page was loading was // also "prerender". function DidPrerenderPass() { - return !visibilityChangeCalled && - loadingStatePassed && - document.webkitHidden && - 'prerender' == document.webkitVisibilityState; + return visibilityStates.length == 1 && + hiddenValues.length == 1 && + visibilityStates[0] == 'prerender' && + hiddenValues[0] == true && + document.webkitVisibilityState == 'prerender' && + document.webkitHidden == true; } -function onVisibilityChange(event) { - visibilityChangePassed = - !visibilityChangeCalled && - document.webkitHidden && - 'hidden' == document.webkitVisibilityState; - visibilityChangeCalled = true; -} - -document.addEventListener("webkitvisibilitychange", - onVisibilityChange, - false); - // Checks one and only one visibility change even occurred, and resulted in a // hidden state, and that current state is also hidden. function DidDisplayPass() { - return visibilityChangeCalled && - visibilityChangePassed && - document.webkitHidden && - 'hidden' == document.webkitVisibilityState; + return visibilityStates.length == 2 && + hiddenValues.length == 2 && + visibilityStates[1] == 'hidden' && + hiddenValues[1] == true && + document.webkitVisibilityState == 'hidden' && + document.webkitHidden == true; } </script> diff --git a/chrome/test/data/prerender/prerender_visibility_shared.js b/chrome/test/data/prerender/prerender_visibility_shared.js new file mode 100644 index 0000000..1d82f94 --- /dev/null +++ b/chrome/test/data/prerender/prerender_visibility_shared.js @@ -0,0 +1,24 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Code shared by some of the visibility tests. Maintains a list of +// visibility states, starting with the state when this file was loaded. +// New states are added on each visibility change event. + +// Array of previously observed visibility states. +var visibilityStates = [document.webkitVisibilityState]; + +// Array of previously observed hidden values. +var hiddenValues = [document.webkitHidden]; + +// Record all visibility changes in corresponding arrays. +function onVisibilityChange(event) { + visibilityStates.push(document.webkitVisibilityState); + hiddenValues.push(document.webkitHidden); +} + +document.addEventListener("webkitvisibilitychange", + onVisibilityChange, + false); + |