Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3675)

Unified Diff: chrome/browser/ui/browser_instant_controller_unittest.cc

Issue 20388003: Reload Instant NTP and Instant-process tabs on search url change (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed InstantNTPPrerendererTest Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « chrome/browser/ui/browser_instant_controller.cc ('k') | chrome/browser/ui/search/instant_extended_interactive_uitest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698