+// Check the case corrections are disabled while the blank page (Loaded
+// before the corrections page) is being loaded.
+TEST_F(NetErrorHelperCoreTest, CorrectionsDisabledBeforeFetch) {
+ // Original page starts loading.
+ EnableNavigationCorrections();
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::NON_ERROR_PAGE);
+
+ // It fails, and corrections are requested.
+ std::string html;
+ core().GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
+ NetError(net::ERR_NAME_NOT_RESOLVED),
+ false, &html);
+ EXPECT_TRUE(html.empty());
+
+ // The blank page loads.
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::ERROR_PAGE);
+ // Corrections is disabled.
+ DisableNavigationCorrections();
+ core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
+ core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+ EXPECT_TRUE(is_url_being_fetched());
+ EXPECT_FALSE(last_error_page_params());
+
+ // Corrections are retrieved.
+ NavigationCorrectionsLoadSuccess(kDefaultCorrections,
+ arraysize(kDefaultCorrections));
+ EXPECT_EQ(1, error_html_update_count());
+ EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
+ EXPECT_FALSE(is_url_being_fetched());
+ ExpectDefaultNavigationCorrections();
+
+ // Corrections load.
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::ERROR_PAGE);
+ core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
+ core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+ EXPECT_EQ(1, error_html_update_count());
+ EXPECT_EQ(0, update_count());
+}
+
+// Check the case corrections is disabled while fetching the corrections for
+// a failed page load.
+TEST_F(NetErrorHelperCoreTest, CorrectionsDisabledDuringFetch) {
+ // Original page starts loading.
+ EnableNavigationCorrections();
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::NON_ERROR_PAGE);
+
+ // It fails, and corrections are requested.
+ std::string html;
+ core().GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
+ NetError(net::ERR_NAME_NOT_RESOLVED),
+ false, &html);
+ EXPECT_TRUE(html.empty());
+
+ // The blank page loads.
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::ERROR_PAGE);
+ core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
+ core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+ EXPECT_TRUE(is_url_being_fetched());
+ EXPECT_FALSE(last_error_page_params());
+
+ // Corrections are disabled.
+ DisableNavigationCorrections();
+
+ // Corrections are retrieved.
+ NavigationCorrectionsLoadSuccess(kDefaultCorrections,
+ arraysize(kDefaultCorrections));
+ EXPECT_EQ(1, error_html_update_count());
+ EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
+ EXPECT_FALSE(is_url_being_fetched());
+ ExpectDefaultNavigationCorrections();
+
+ // Corrections load.
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::ERROR_PAGE);
+ core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
+ core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+ EXPECT_EQ(1, error_html_update_count());
+ EXPECT_EQ(0, update_count());
+}
+
+// Checks corrections are is used when there are no search suggestions.
+TEST_F(NetErrorHelperCoreTest, CorrectionsWithoutSearch) {
+ const NavigationCorrection kCorrections[] = {
+ {"urlCorrection", "http://somewhere_else/", "btn", "data", false, false},
+ };
+
+ // Original page starts loading.
+ EnableNavigationCorrections();
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::NON_ERROR_PAGE);
+
+ // It fails, and corrections are requested.
+ std::string html;
+ core().GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
+ NetError(net::ERR_NAME_NOT_RESOLVED),
+ false, &html);
+ EXPECT_TRUE(html.empty());
+
+ // The blank page loads.
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::ERROR_PAGE);
+ core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
+ core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+ EXPECT_TRUE(is_url_being_fetched());
+ EXPECT_FALSE(last_error_page_params());
+
+ // Corrections are retrieved.
+ NavigationCorrectionsLoadSuccess(kCorrections, arraysize(kCorrections));
+ EXPECT_EQ(1, error_html_update_count());
+ EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
+ EXPECT_FALSE(is_url_being_fetched());
+
+ // Check params.
+ ASSERT_TRUE(last_error_page_params());
+ EXPECT_FALSE(last_error_page_params()->suggest_reload);
+ EXPECT_EQ(1u, last_error_page_params()->override_suggestions->GetSize());
+ EXPECT_FALSE(last_error_page_params()->search_url.is_valid());
+ EXPECT_EQ("", last_error_page_params()->search_terms);
+
+ // Corrections load.
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::ERROR_PAGE);
+ core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
+ core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+ EXPECT_EQ(1, error_html_update_count());
+ EXPECT_EQ(0, update_count());
+}
+
+// Checks corrections are used when there are only search suggestions.
+TEST_F(NetErrorHelperCoreTest, CorrectionsOnlySearchSuggestion) {
+ const NavigationCorrection kCorrections[] = {
+ {"webSearchQuery", kSuggestedSearchTerms, "frm", "data", false, false},
+ };
+
+ // Original page starts loading.
+ EnableNavigationCorrections();
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::NON_ERROR_PAGE);
+
+ // It fails, and corrections are requested.
+ std::string html;
+ core().GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
+ NetError(net::ERR_NAME_NOT_RESOLVED),
+ false, &html);
+ EXPECT_TRUE(html.empty());
+
+ // The blank page loads.
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::ERROR_PAGE);
+ core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
+ core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+ EXPECT_TRUE(is_url_being_fetched());
+ EXPECT_FALSE(last_error_page_params());
+
+ // Corrections are retrieved.
+ NavigationCorrectionsLoadSuccess(kCorrections, arraysize(kCorrections));
+ EXPECT_EQ(1, error_html_update_count());
+ EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
+ EXPECT_FALSE(is_url_being_fetched());
+
+ // Check params.
+ ASSERT_TRUE(last_error_page_params());
+ EXPECT_FALSE(last_error_page_params()->suggest_reload);
+ EXPECT_EQ(0u, last_error_page_params()->override_suggestions->GetSize());
+ EXPECT_EQ(GURL(kSearchUrl), last_error_page_params()->search_url);
+ EXPECT_EQ(kSuggestedSearchTerms, last_error_page_params()->search_terms);
+
+ // Corrections load.
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::ERROR_PAGE);
+ core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
+ core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+ EXPECT_EQ(1, error_html_update_count());
+ EXPECT_EQ(0, update_count());
+}
+
+// The correction service returns a non-JSON result.
+TEST_F(NetErrorHelperCoreTest, CorrectionServiceReturnsNonJsonResult) {
+ // Original page starts loading.
+ EnableNavigationCorrections();
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::NON_ERROR_PAGE);
+
+ // It fails, and corrections are requested.
+ std::string html;
+ core().GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
+ NetError(net::ERR_CONNECTION_FAILED),
+ false, &html);
+ EXPECT_TRUE(html.empty());
+
+ // The blank page loads.
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::ERROR_PAGE);
+ core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
+ core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+
+ // Corrections request fails, final error page is shown.
+ EXPECT_TRUE(is_url_being_fetched());
+ NavigationCorrectionsLoadFinished("Weird Response");
+ EXPECT_EQ(1, error_html_update_count());
+ EXPECT_EQ(last_error_html(), NetErrorString(net::ERR_CONNECTION_FAILED));
+ EXPECT_FALSE(is_url_being_fetched());
+ EXPECT_EQ(0, update_count());
+ EXPECT_FALSE(last_error_page_params());
+
+ // Error page loads.
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::ERROR_PAGE);
+ core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
+ core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+}
+
+// The correction service returns a JSON result that isn't a valid list of
+// corrections.
+TEST_F(NetErrorHelperCoreTest, CorrectionServiceReturnsInvalidJsonResult) {
+ // Original page starts loading.
+ EnableNavigationCorrections();
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::NON_ERROR_PAGE);
+
+ // It fails, and corrections are requested.
+ std::string html;
+ core().GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
+ NetError(net::ERR_CONNECTION_FAILED),
+ false, &html);
+ EXPECT_TRUE(html.empty());
+
+ // The blank page loads.
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::ERROR_PAGE);
+ core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
+ core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+
+ // Corrections request fails, final error page is shown.
+ EXPECT_TRUE(is_url_being_fetched());
+ NavigationCorrectionsLoadFinished("{\"result\": 42}");
+ EXPECT_EQ(1, error_html_update_count());
+ EXPECT_EQ(last_error_html(), NetErrorString(net::ERR_CONNECTION_FAILED));
+ EXPECT_FALSE(is_url_being_fetched());
+ EXPECT_EQ(0, update_count());
+ EXPECT_FALSE(last_error_page_params());
+
+ // Error page loads.
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::ERROR_PAGE);
+ core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
+ core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+}
+
+TEST_F(NetErrorHelperCoreTest, CorrectionClickTracking) {
+ // Go through the standard navigation correction steps.
+
+ // Original page starts loading.
+ EnableNavigationCorrections();
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::NON_ERROR_PAGE);
+
+ // It fails.
+ std::string html;
+ core().GetErrorHTML(NetErrorHelperCore::MAIN_FRAME,
+ NetError(net::ERR_NAME_NOT_RESOLVED),
+ false, &html);
+ EXPECT_TRUE(html.empty());
+ EXPECT_FALSE(is_url_being_fetched());
+ EXPECT_FALSE(last_error_page_params());
+
+ // The blank page loads.
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::ERROR_PAGE);
+ core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
+
+ // Corrections retrieval starts when the error page finishes loading.
+ EXPECT_FALSE(is_url_being_fetched());
+ EXPECT_FALSE(last_error_page_params());
+ core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+ EXPECT_TRUE(is_url_being_fetched());
+ EXPECT_FALSE(last_error_page_params());
+
+ // Corrections are retrieved.
+ NavigationCorrectionsLoadSuccess(kDefaultCorrections,
+ arraysize(kDefaultCorrections));
+ EXPECT_EQ(1, error_html_update_count());
+ EXPECT_EQ(NetErrorString(net::ERR_NAME_NOT_RESOLVED), last_error_html());
+ ExpectDefaultNavigationCorrections();
+ EXPECT_FALSE(is_url_being_fetched());
+
+ // Corrections load.
+ core().OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+ NetErrorHelperCore::ERROR_PAGE);
+ core().OnCommitLoad(NetErrorHelperCore::MAIN_FRAME);
+ core().OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+
+ EXPECT_EQ(0, tracking_request_count());
+
+ // Invalid clicks should be ignored.
+ core().TrackClick(-1);
+ core().TrackClick(arraysize(kDefaultCorrections));
+ EXPECT_EQ(0, tracking_request_count());
+
+ for (size_t i = 0; i < arraysize(kDefaultCorrections); ++i) {
+ // Skip links that do not appear in the page.
+ if (kDefaultCorrections[i].is_porn || kDefaultCorrections[i].is_soft_porn)
+ continue;
+
+ int old_tracking_request_count = tracking_request_count();
+ core().TrackClick(i);
+ EXPECT_EQ(old_tracking_request_count + 1, tracking_request_count());
+ EXPECT_EQ(GURL(kNavigationCorrectionUrl), last_tracking_url());
+
+ // Make sure all expected strings appear in output.
+ EXPECT_TRUE(last_tracking_request_body().find(
+ kDefaultCorrections[i].url_correction));
+ EXPECT_TRUE(last_tracking_request_body().find(
+ kDefaultCorrections[i].click_data));
+ EXPECT_TRUE(last_tracking_request_body().find(
+ kDefaultCorrections[i].click_type));
+ EXPECT_TRUE(last_tracking_request_body().find(
+ kNavigationCorrectionEventId));
+ EXPECT_TRUE(last_tracking_request_body().find(
+ kNavigationCorrectionFingerprint));
+ }
+
+ // Make sure duplicate tracking requests are ignored.
+ for (size_t i = 0; i < arraysize(kDefaultCorrections); ++i) {
+ // Skip links that do not appear in the page.
+ if (kDefaultCorrections[i].is_porn || kDefaultCorrections[i].is_soft_porn)
+ continue;
+
+ int old_tracking_request_count = tracking_request_count();
+ core().TrackClick(i);
+ EXPECT_EQ(old_tracking_request_count, tracking_request_count());
+ }
+
+ EXPECT_EQ(0, update_count());
+ EXPECT_EQ(1, error_html_update_count());
+}
+