Index: chrome/browser/ui/browser_instant_controller_unittest.cc |
diff --git a/chrome/browser/ui/browser_instant_controller_unittest.cc b/chrome/browser/ui/browser_instant_controller_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..71ccf3807a6be4b3961bd56ad52c5c86f8190b63 |
--- /dev/null |
+++ b/chrome/browser/ui/browser_instant_controller_unittest.cc |
@@ -0,0 +1,199 @@ |
+// Copyright 2013 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. |
+ |
+#include <string> |
+ |
+#include "base/basictypes.h" |
+#include "chrome/browser/chrome_notification_types.h" |
+#include "chrome/browser/search/instant_service.h" |
+#include "chrome/browser/search/instant_unittest_base.h" |
+#include "chrome/browser/search/search.h" |
+#include "chrome/browser/ui/tabs/tab_strip_model.h" |
+#include "chrome/common/pref_names.h" |
+#include "chrome/common/url_constants.h" |
+#include "content/public/browser/navigation_controller.h" |
+#include "content/public/browser/render_process_host.h" |
+#include "content/public/browser/web_contents.h" |
+#include "content/public/browser/web_contents_observer.h" |
+ |
+namespace chrome { |
+ |
+namespace { |
+ |
+class BrowserInstantControllerTest : public InstantUnitTestBase { |
+ protected: |
+ friend class FakeWebContentsObserver; |
+}; |
+ |
+const struct TabReloadTestCase { |
+ const char* description; |
+ const char* start_url; |
+ bool start_in_instant_process; |
+ bool should_reload; |
+ bool end_in_instant_process; |
+} kTabReloadTestCases[] = { |
+ {"Local Embedded NTP", chrome::kChromeSearchLocalNtpUrl, |
+ true, true, true}, |
+ {"Remote Embedded NTP", "https://www.google.com/instant?strk", |
+ true, true, false}, |
+ {"Remote Embedded SERP", "https://www.google.com/url?strk", |
+ true, true, false}, |
+ {"Other NTP", "https://bar.com/instant?strk", |
+ false, false, false} |
+}; |
+ |
+class FakeWebContentsObserver : public content::WebContentsObserver { |
+ public: |
+ FakeWebContentsObserver(BrowserInstantControllerTest* base_test, |
+ content::WebContents* contents) |
+ : WebContentsObserver(contents), |
+ base_test_(base_test), |
+ num_reloads_(0) {} |
+ |
+ virtual void NavigateToPendingEntry( |
+ const GURL& url, |
+ content::NavigationController::ReloadType reload_type) OVERRIDE { |
+ reload_type_ = reload_type; |
+ |
+ // The tab reload event doesn't work with BrowserWithTestWindowTest. |
+ // So we capture the NavigateToPendingEntry, and use the |
+ // BrowserWithTestWindowTest::NavigateAndCommit to simulate the complete |
+ // reload. Note that this will again trigger NavigateToPendingEntry, so we |
+ // remove this as observer. |
+ content::NavigationController* controller = |
+ &web_contents()->GetController(); |
+ Observe(NULL); |
+ |
+ if (web_contents()->GetURL() == url) |
+ num_reloads_++; |
+ |
+ base_test_->NavigateAndCommit(controller, url); |
+ } |
+ |
+ int num_reloads() const { |
+ return num_reloads_; |
+ } |
+ |
+ const content::NavigationController::ReloadType reload_type() { |
+ return reload_type_; |
+ } |
+ |
+ protected: |
+ friend class BrowserInstantControllerTest; |
+ FRIEND_TEST_ALL_PREFIXES(BrowserInstantControllerTest, |
+ DefaultSearchProviderChanged); |
+ FRIEND_TEST_ALL_PREFIXES(BrowserInstantControllerTest, |
+ GoogleBaseURLUpdated); |
+ |
+ private: |
+ BrowserInstantControllerTest* base_test_; |
+ int num_reloads_; |
+ content::NavigationController::ReloadType reload_type_; |
+}; |
+ |
+TEST_F(BrowserInstantControllerTest, DefaultSearchProviderChanged) { |
+ size_t numTestCases = arraysize(kTabReloadTestCases); |
+ FakeWebContentsObserver** observers = |
+ new FakeWebContentsObserver*[numTestCases]; |
+ for (size_t i = 0; i < numTestCases; ++i) { |
+ const TabReloadTestCase& test = kTabReloadTestCases[i]; |
+ AddTab(browser(), GURL(test.start_url)); |
+ content::WebContents* contents = |
+ browser()->tab_strip_model()->GetActiveWebContents(); |
+ |
+ // Validate initial instant state. |
+ EXPECT_EQ(test.start_in_instant_process, chrome::IsInstantNTP(contents)) |
samarth
2013/08/14 00:24:14
This is only passing because your "Remote Embedded
Anuj
2013/08/14 06:38:57
Done.
|
+ << test.description; |
+ EXPECT_EQ(test.start_in_instant_process, |
+ instant_service_->IsInstantProcess( |
+ contents->GetRenderProcessHost()->GetID())) |
+ << test.description; |
+ |
+ // Setup an observer to verify reload or absence thereof. |
+ observers[i] = new FakeWebContentsObserver(this, contents); |
samarth
2013/08/14 00:24:14
Just use vector<linked_ptr<FakeWebContentsObserver
Anuj
2013/08/14 06:38:57
Done.
|
+ } |
+ |
+ SetSearchProvider("https://bar.com/"); |
+ |
+ for (size_t i = 0; i < numTestCases; ++i) { |
+ FakeWebContentsObserver* observer = observers[i]; |
+ const TabReloadTestCase& test = kTabReloadTestCases[i]; |
+ content::WebContents* contents = observer->web_contents(); |
+ |
+ // Validate final instant state. |
+ EXPECT_EQ(test.end_in_instant_process, chrome::IsInstantNTP(contents)) |
samarth
2013/08/14 00:24:14
Remove this.
Anuj
2013/08/14 06:38:57
Done.
|
+ << test.description; |
+ EXPECT_EQ(test.end_in_instant_process, |
+ instant_service_->IsInstantProcess( |
+ contents->GetRenderProcessHost()->GetID())) |
+ << test.description; |
+ |
+ // Ensure only the expected tabs(contents) reloaded. |
+ EXPECT_EQ(test.should_reload ? 1 : 0, observer->num_reloads()) |
samarth
2013/08/14 00:24:14
Change num_reloads to ReloadedOnce() so this is ju
Anuj
2013/08/14 06:38:57
ReloadedOnce can technically be false with num_rel
|
+ << test.description; |
+ if (test.should_reload) { |
samarth
2013/08/14 00:24:14
This is testing more detail than necessary. Just s
Anuj
2013/08/14 06:38:57
Done.
|
+ // NO_RELOAD indicates that process reassignment may be required. |
+ EXPECT_EQ(observer->reload_type(), |
+ (test.start_in_instant_process == test.end_in_instant_process) |
+ ? content::NavigationController::RELOAD |
+ : content::NavigationController::NO_RELOAD) |
+ << test.description; |
+ } |
+ } |
+} |
+ |
+TEST_F(BrowserInstantControllerTest, GoogleBaseURLUpdated) { |
+ size_t numTestCases = arraysize(kTabReloadTestCases); |
+ FakeWebContentsObserver** observers = |
+ new FakeWebContentsObserver*[numTestCases]; |
+ for (size_t i = 0; i < numTestCases; ++i) { |
+ const TabReloadTestCase& test = kTabReloadTestCases[i]; |
+ AddTab(browser(), GURL(test.start_url)); |
+ content::WebContents* contents = |
+ browser()->tab_strip_model()->GetActiveWebContents(); |
+ |
+ // Validate initial instant state. |
+ EXPECT_EQ(test.start_in_instant_process, chrome::IsInstantNTP(contents)) |
+ << test.description; |
+ EXPECT_EQ(test.start_in_instant_process, |
+ instant_service_->IsInstantProcess( |
+ contents->GetRenderProcessHost()->GetID())) |
+ << test.description; |
+ |
+ // Setup an observer to verify reload or absence thereof. |
+ observers[i] = new FakeWebContentsObserver(this, contents); |
+ } |
+ |
+ NotifyGoogleBaseURLUpdate("https://www.google.es/"); |
+ |
+ for (size_t i = 0; i < numTestCases; ++i) { |
+ const TabReloadTestCase& test = kTabReloadTestCases[i]; |
+ FakeWebContentsObserver* observer = observers[i]; |
+ content::WebContents* contents = observer->web_contents(); |
+ |
+ // Validate final instant state. |
+ EXPECT_EQ(test.end_in_instant_process, chrome::IsInstantNTP(contents)) |
+ << test.description; |
+ EXPECT_EQ(test.end_in_instant_process, |
+ instant_service_->IsInstantProcess( |
+ contents->GetRenderProcessHost()->GetID())) |
+ << test.description; |
+ |
+ // Ensure only the expected tabs(contents) reloaded. |
+ EXPECT_EQ(test.should_reload ? 1 : 0, observer->num_reloads()) |
+ << test.description; |
+ if (test.should_reload) { |
+ // NO_RELOAD indicates that process reassignment may be required. |
+ EXPECT_EQ(observer->reload_type(), |
+ (test.start_in_instant_process == test.end_in_instant_process) |
+ ? content::NavigationController::RELOAD |
+ : content::NavigationController::NO_RELOAD) |
+ << test.description; |
+ } |
+ } |
+} |
+ |
+} // namespace |
+ |
+} // namespace chrome |