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..107eda15e64bebe33275859cb1e2eec0eb831f7e |
--- /dev/null |
+++ b/chrome/browser/ui/browser_instant_controller_unittest.cc |
@@ -0,0 +1,181 @@ |
+// 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 <vector> |
+ |
+#include "base/basictypes.h" |
+#include "base/memory/linked_ptr.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&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), |
+ 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); |
Jered
2013/08/16 00:13:23
const size_t num_tests =
Anuj
2013/08/22 00:40:45
Done.
|
+ std::vector<linked_ptr<FakeWebContentsObserver> > observers; |
Jered
2013/08/16 00:13:23
Instead of vector<linked_ptr> use ScopedVector.
Anuj
2013/08/22 00:40:45
Done.
|
+ 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, |
+ instant_service_->IsInstantProcess( |
+ contents->GetRenderProcessHost()->GetID())) |
+ << test.description; |
+ |
+ // Setup an observer to verify reload or absence thereof. |
+ observers.push_back(make_linked_ptr( |
+ new FakeWebContentsObserver(this, contents))); |
+ } |
+ |
+ SetSearchProvider("https://bar.com/"); |
Jered
2013/08/16 00:13:23
Why are we queuing up a bunch of tabs, doing this,
Anuj
2013/08/22 00:40:45
I kind of followed process-isolation tests in sear
|
+ |
+ for (size_t i = 0; i < numTestCases; ++i) { |
+ FakeWebContentsObserver* observer = observers[i].get(); |
+ const TabReloadTestCase& test = kTabReloadTestCases[i]; |
+ content::WebContents* contents = observer->web_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) { |
+ size_t numTestCases = arraysize(kTabReloadTestCases); |
+ std::vector<linked_ptr<FakeWebContentsObserver> > observers; |
+ 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.push_back(make_linked_ptr( |
+ 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].get(); |
+ 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; |
+ } |
+} |
+ |
+} // namespace |
+ |
+} // namespace chrome |