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..52540aa2f28eaefc4774cd7455e2c321ec42f8a6 |
--- /dev/null |
+++ b/chrome/browser/ui/browser_instant_controller_unittest.cc |
@@ -0,0 +1,193 @@ |
+// 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 "base/memory/scoped_vector.h" |
+#include "chrome/browser/chrome_notification_types.h" |
+#include "chrome/browser/search/instant_service.h" |
+#include "chrome/browser/search/instant_service_observer.h" |
+#include "chrome/browser/search/instant_unittest_base.h" |
+#include "chrome/browser/search/search.h" |
+#include "chrome/browser/ui/browser_instant_controller.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&bar=search+terms", |
+ 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), |
+ contents_(contents), |
+ base_test_(base_test), |
+ url_(contents->GetURL()), |
+ num_reloads_(0) {} |
+ |
+ virtual void NavigateToPendingEntry( |
+ const GURL& url, |
+ content::NavigationController::ReloadType reload_type) OVERRIDE { |
+ // 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 (url_ == url) |
+ num_reloads_++; |
+ |
+ base_test_->NavigateAndCommit(controller, url); |
+ } |
+ |
+ int num_reloads() const { |
+ return num_reloads_; |
+ } |
+ |
+ content::WebContents* contents() { |
+ return contents_; |
+ } |
+ |
+ protected: |
+ friend class BrowserInstantControllerTest; |
+ FRIEND_TEST_ALL_PREFIXES(BrowserInstantControllerTest, |
+ DefaultSearchProviderChanged); |
+ FRIEND_TEST_ALL_PREFIXES(BrowserInstantControllerTest, |
+ GoogleBaseURLUpdated); |
+ |
+ private: |
+ content::WebContents* contents_; |
+ BrowserInstantControllerTest* base_test_; |
+ const GURL& url_; |
+ int num_reloads_; |
+}; |
+ |
+TEST_F(BrowserInstantControllerTest, DefaultSearchProviderChanged) { |
+ size_t num_tests = arraysize(kTabReloadTestCases); |
+ ScopedVector<FakeWebContentsObserver> observers; |
+ for (size_t i = 0; i < num_tests; ++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, |
+ instant_service_->IsInstantProcess( |
+ contents->GetRenderProcessHost()->GetID())) |
+ << test.description; |
+ |
+ // Setup an observer to verify reload or absence thereof. |
+ observers.push_back(new FakeWebContentsObserver(this, contents)); |
+ } |
+ |
+ SetDefaultSearchProvider("https://bar.com/"); |
+ |
+ for (size_t i = 0; i < num_tests; ++i) { |
+ FakeWebContentsObserver* observer = observers[i]; |
+ const TabReloadTestCase& test = kTabReloadTestCases[i]; |
+ content::WebContents* contents = observer->contents(); |
+ |
+ // Validate final instant state. |
+ 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; |
+ } |
+} |
+ |
+TEST_F(BrowserInstantControllerTest, GoogleBaseURLUpdated) { |
+ const size_t num_tests = arraysize(kTabReloadTestCases); |
+ ScopedVector<FakeWebContentsObserver> observers; |
+ for (size_t i = 0; i < num_tests; ++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, |
+ instant_service_->IsInstantProcess( |
+ contents->GetRenderProcessHost()->GetID())) |
+ << test.description; |
+ |
+ // Setup an observer to verify reload or absence thereof. |
+ observers.push_back(new FakeWebContentsObserver(this, contents)); |
+ } |
+ |
+ NotifyGoogleBaseURLUpdate("https://www.google.es/"); |
+ |
+ for (size_t i = 0; i < num_tests; ++i) { |
+ const TabReloadTestCase& test = kTabReloadTestCases[i]; |
+ FakeWebContentsObserver* observer = observers[i]; |
+ content::WebContents* contents = observer->contents(); |
+ |
+ // Validate final instant state. |
+ 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; |
+ } |
+} |
+ |
+TEST_F(BrowserInstantControllerTest, BrowserWindowLifecycle) { |
+ scoped_ptr<BrowserWindow> window(CreateBrowserWindow()); |
+ Browser::CreateParams params(profile(), chrome::HOST_DESKTOP_TYPE_NATIVE); |
+ params.window = window.get(); |
+ scoped_ptr<Browser> browser(new Browser(params)); |
+ InstantServiceObserver* bic; |
+ bic = browser->instant_controller(); |
+ EXPECT_TRUE(IsInstantServiceObserver(bic)) |
+ << "New BrowserInstantController should register as InstantServiceObserver"; |
+ |
+ browser.reset(NULL); |
+ window.reset(NULL); |
+ EXPECT_FALSE(IsInstantServiceObserver(bic)) |
+ << "New BrowserInstantController should register as InstantServiceObserver"; |
+} |
+ |
+} // namespace |
+ |
+} // namespace chrome |