summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/ui/views/frame/browser_view.cc24
-rw-r--r--chrome/browser/ui/views/frame/browser_view.h9
-rw-r--r--chrome/test/data/prerender/prerender_visibility.html54
-rw-r--r--chrome/test/data/prerender/prerender_visibility_hidden.html45
-rw-r--r--chrome/test/data/prerender/prerender_visibility_shared.js24
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);
+