Merge lp:~osomon/oxide/backport-42-patch-for-isError into lp:oxide/1.5

Proposed by Olivier Tilloy
Status: Merged
Merged at revision: 966
Proposed branch: lp:~osomon/oxide/backport-42-patch-for-isError
Merge into: lp:oxide/1.5
Diff against target: 298 lines (+266/-0)
4 files modified
patches/bug1423531.patch (+202/-0)
patches/series (+1/-0)
qt/tests/qmltests/api/tst_WebView_loading.qml (+23/-0)
qt/tests/qmltests/api/tst_WebView_save_restore_state.qml (+40/-0)
To merge this branch: bzr merge lp:~osomon/oxide/backport-42-patch-for-isError
Reviewer Review Type Date Requested Status
Chris Coulson Approve
Review via email: mp+251749@code.launchpad.net

Commit message

Backport commit 7431bb2983db683dcc4556e1918556254c3d5589 from upstream chromium branch 42 and corresponding unit tests.

To post a comment you must log in.
Revision history for this message
Chris Coulson (chrisccoulson) wrote :

Thanks - I wasn't sure if you'd get a chance to do it today, so I've merged this in to 1.5

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'patches/bug1423531.patch'
--- patches/bug1423531.patch 1970-01-01 00:00:00 +0000
+++ patches/bug1423531.patch 2015-03-04 14:35:28 +0000
@@ -0,0 +1,202 @@
1# Description: backport commit 7431bb2983db683dcc4556e1918556254c3d5589
2# from the 42 branch to fix https://launchpad.net/bugs/1423531
3# Author: Olivier Tilloy <olivier.tilloy@canonical.com>
4
5diff --git a/chrome/browser/ui/zoom/zoom_controller_browsertest.cc b/chrome/browser/ui/zoom/zoom_controller_browsertest.cc
6--- a/chrome/browser/ui/zoom/zoom_controller_browsertest.cc
7+++ b/chrome/browser/ui/zoom/zoom_controller_browsertest.cc
8@@ -8,6 +8,7 @@
9 #include "base/process/kill.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/browser/ui/browser.h"
12+#include "chrome/browser/ui/browser_commands.h"
13 #include "chrome/browser/ui/tabs/tab_strip_model.h"
14 #include "chrome/browser/ui/webui/signin/login_ui_test_utils.h"
15 #include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h"
16@@ -140,6 +141,57 @@
17 EXPECT_FLOAT_EQ(new_zoom_level, zoom_controller->GetZoomLevel());
18 }
19
20+IN_PROC_BROWSER_TEST_F(ZoomControllerBrowserTest,
21+ ErrorPagesCanZoomAfterTabRestore) {
22+ // This url is meant to cause a network error page to be loaded.
23+ // Tests can't reach the network, so this test should continue
24+ // to work even if the domain listed is someday registered.
25+ GURL url("http://kjfhkjsdf.com");
26+
27+ TabStripModel* tab_strip = browser()->tab_strip_model();
28+ ASSERT_TRUE(tab_strip);
29+
30+ ui_test_utils::NavigateToURLWithDisposition(
31+ browser(), url, NEW_FOREGROUND_TAB,
32+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
33+ {
34+ content::WebContents* web_contents = tab_strip->GetActiveWebContents();
35+
36+ EXPECT_EQ(
37+ content::PAGE_TYPE_ERROR,
38+ web_contents->GetController().GetLastCommittedEntry()->GetPageType());
39+
40+ content::WebContentsDestroyedWatcher destroyed_watcher(web_contents);
41+ tab_strip->CloseWebContentsAt(tab_strip->active_index(),
42+ TabStripModel::CLOSE_CREATE_HISTORICAL_TAB);
43+ destroyed_watcher.Wait();
44+ }
45+ EXPECT_EQ(1, tab_strip->count());
46+
47+ content::WebContentsAddedObserver new_web_contents_observer;
48+ chrome::RestoreTab(browser());
49+ content::WebContents* web_contents =
50+ new_web_contents_observer.GetWebContents();
51+ content::WaitForLoadStop(web_contents);
52+
53+ EXPECT_EQ(2, tab_strip->count());
54+
55+ EXPECT_EQ(
56+ content::PAGE_TYPE_ERROR,
57+ web_contents->GetController().GetLastCommittedEntry()->GetPageType());
58+
59+ ZoomController* zoom_controller =
60+ ZoomController::FromWebContents(web_contents);
61+
62+ double old_zoom_level = zoom_controller->GetZoomLevel();
63+ double new_zoom_level = old_zoom_level + 0.5;
64+
65+ // The following attempt to change the zoom level for an error page should
66+ // fail.
67+ zoom_controller->SetZoomLevel(new_zoom_level);
68+ EXPECT_FLOAT_EQ(new_zoom_level, zoom_controller->GetZoomLevel());
69+}
70+
71 IN_PROC_BROWSER_TEST_F(ZoomControllerBrowserTest, Observe) {
72 content::WebContents* web_contents =
73 browser()->tab_strip_model()->GetActiveWebContents();
74diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc
75--- a/content/browser/frame_host/navigation_controller_impl.cc
76+++ b/content/browser/frame_host/navigation_controller_impl.cc
77@@ -1050,10 +1050,6 @@
78 pending_entry_->site_instance() == rfh->GetSiteInstance())) {
79 new_entry = new NavigationEntryImpl(*pending_entry_);
80
81- // Don't use the page type from the pending entry. Some interstitial page
82- // may have set the type to interstitial. Once we commit, however, the page
83- // type must always be normal.
84- new_entry->set_page_type(PAGE_TYPE_NORMAL);
85 update_virtual_url = new_entry->update_virtual_url_with_url();
86 } else {
87 new_entry = new NavigationEntryImpl;
88@@ -1074,8 +1070,12 @@
89 update_virtual_url = needs_update;
90 }
91
92- if (params.url_is_unreachable)
93- new_entry->set_page_type(PAGE_TYPE_ERROR);
94+ // Don't use the page type from the pending entry. Some interstitial page
95+ // may have set the type to interstitial. Once we commit, however, the page
96+ // type must always be normal or error.
97+ new_entry->set_page_type(params.url_is_unreachable ? PAGE_TYPE_ERROR
98+ : PAGE_TYPE_NORMAL);
99+
100 new_entry->SetURL(params.url);
101 if (update_virtual_url)
102 UpdateVirtualURLToURL(new_entry, params.url);
103@@ -1126,6 +1126,8 @@
104 NavigationEntryImpl* entry = entries_[entry_index].get();
105
106 // The URL may have changed due to redirects.
107+ entry->set_page_type(params.url_is_unreachable ? PAGE_TYPE_ERROR
108+ : PAGE_TYPE_NORMAL);
109 entry->SetURL(params.url);
110 entry->SetReferrer(params.referrer);
111 if (entry->update_virtual_url_with_url())
112@@ -1178,6 +1180,8 @@
113 existing_entry->set_unique_id(pending_entry_->GetUniqueID());
114
115 // The URL may have changed due to redirects.
116+ existing_entry->set_page_type(params.url_is_unreachable ? PAGE_TYPE_ERROR
117+ : PAGE_TYPE_NORMAL);
118 if (existing_entry->update_virtual_url_with_url())
119 UpdateVirtualURLToURL(existing_entry, params.url);
120 existing_entry->SetURL(params.url);
121@@ -1204,6 +1208,8 @@
122 // entry and it will be the same page as the new navigation (minus the
123 // reference fragments, of course). We'll update the URL of the existing
124 // entry without pruning the forward history.
125+ existing_entry->set_page_type(params.url_is_unreachable ? PAGE_TYPE_ERROR
126+ : PAGE_TYPE_NORMAL);
127 existing_entry->SetURL(params.url);
128 if (existing_entry->update_virtual_url_with_url())
129 UpdateVirtualURLToURL(existing_entry, params.url);
130diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc
131--- a/content/browser/frame_host/navigation_controller_impl_unittest.cc
132+++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc
133@@ -28,6 +28,7 @@
134 #include "content/public/browser/web_contents_observer.h"
135 #include "content/public/common/content_switches.h"
136 #include "content/public/common/page_state.h"
137+#include "content/public/common/page_type.h"
138 #include "content/public/common/url_constants.h"
139 #include "content/public/test/mock_render_process_host.h"
140 #include "content/public/test/test_notification_tracker.h"
141@@ -4456,4 +4457,61 @@
142 EXPECT_EQ(0, delegate->repost_form_warning_count());
143 }
144
145+TEST_F(NavigationControllerTest, UnreachableURLGivesErrorPage) {
146+ GURL url("http://foo");
147+ FrameHostMsg_DidCommitProvisionalLoad_Params params;
148+ params.page_id = 1;
149+ params.url = url;
150+ params.transition = ui::PAGE_TRANSITION_LINK;
151+ params.gesture = NavigationGestureUser;
152+ params.page_state = PageState::CreateFromURL(url);
153+ params.was_within_same_page = false;
154+ params.is_post = true;
155+ params.post_id = 2;
156+ params.url_is_unreachable = true;
157+ // Navigate to new page
158+ {
159+ LoadCommittedDetails details;
160+ controller_impl().RendererDidNavigate(main_test_rfh(), params, &details);
161+ EXPECT_EQ(PAGE_TYPE_ERROR,
162+ controller_impl().GetLastCommittedEntry()->GetPageType());
163+ EXPECT_EQ(NAVIGATION_TYPE_NEW_PAGE, details.type);
164+ }
165+
166+ // Navigate to existing page.
167+ {
168+ LoadCommittedDetails details;
169+ controller_impl().RendererDidNavigate(main_test_rfh(), params, &details);
170+ EXPECT_EQ(PAGE_TYPE_ERROR,
171+ controller_impl().GetLastCommittedEntry()->GetPageType());
172+ EXPECT_EQ(NAVIGATION_TYPE_EXISTING_PAGE, details.type);
173+ }
174+
175+ // Navigate to same page.
176+ // Note: The call to LoadURL() creates a pending entry in order to trigger the
177+ // same-page transition.
178+ controller_impl().LoadURL(
179+ url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
180+ params.transition = ui::PAGE_TRANSITION_TYPED;
181+ {
182+ LoadCommittedDetails details;
183+ controller_impl().RendererDidNavigate(main_test_rfh(), params, &details);
184+ EXPECT_EQ(PAGE_TYPE_ERROR,
185+ controller_impl().GetLastCommittedEntry()->GetPageType());
186+ EXPECT_EQ(NAVIGATION_TYPE_SAME_PAGE, details.type);
187+ }
188+
189+ // Navigate in page.
190+ params.url = GURL("http://foo#foo");
191+ params.transition = ui::PAGE_TRANSITION_LINK;
192+ params.was_within_same_page = true;
193+ {
194+ LoadCommittedDetails details;
195+ controller_impl().RendererDidNavigate(main_test_rfh(), params, &details);
196+ EXPECT_EQ(PAGE_TYPE_ERROR,
197+ controller_impl().GetLastCommittedEntry()->GetPageType());
198+ EXPECT_EQ(NAVIGATION_TYPE_IN_PAGE, details.type);
199+ }
200+}
201+
202 } // namespace content
0203
=== modified file 'patches/series'
--- patches/series 2015-02-06 22:41:44 +0000
+++ patches/series 2015-03-04 14:35:28 +0000
@@ -29,3 +29,4 @@
29allow-os-override-for-gpu-manager.patch29allow-os-override-for-gpu-manager.patch
30viewport-min-width.patch30viewport-min-width.patch
31dont-hide-desktop-scrollbars-without-pinch-viewport.patch31dont-hide-desktop-scrollbars-without-pinch-viewport.patch
32bug1423531.patch
3233
=== modified file 'qt/tests/qmltests/api/tst_WebView_loading.qml'
--- qt/tests/qmltests/api/tst_WebView_loading.qml 2015-01-13 12:31:34 +0000
+++ qt/tests/qmltests/api/tst_WebView_loading.qml 2015-03-04 14:35:28 +0000
@@ -162,6 +162,29 @@
162 compare(spy.count, 1,162 compare(spy.count, 1,
163 "WebView.loading should have changed twice during the load");163 "WebView.loading should have changed twice during the load");
164 compare(expectedLoadEvents.length, 0, "Some load events are missing");164 compare(expectedLoadEvents.length, 0, "Some load events are missing");
165
166 // Verify that reloading a page that triggered an error
167 // generates the same sequence of load events
168 spy.clear();
169 expectedLoadEvents = [
170 { type: LoadEvent.TypeStarted, url: url, loading: true },
171 { type: LoadEvent.TypeFailed, url: url, loading: true },
172 { type: LoadEvent.TypeCommitted, url: url, error: true, loading: true }
173 ];
174 webView.reload();
175
176 verify(webView.loading,
177 "WebView.loading should be true once we start loading");
178 compare(spy.count, 1);
179
180 spy.clear();
181 spy.wait();
182
183 verify(!webView.loading,
184 "WebView.loading should be false after we finish loading");
185 compare(spy.count, 1,
186 "WebView.loading should have changed twice during the load");
187 compare(expectedLoadEvents.length, 0, "Some load events are missing");
165 }188 }
166189
167 function test_WebView_loading5_redirection() {190 function test_WebView_loading5_redirection() {
168191
=== modified file 'qt/tests/qmltests/api/tst_WebView_save_restore_state.qml'
--- qt/tests/qmltests/api/tst_WebView_save_restore_state.qml 2014-11-20 12:37:10 +0000
+++ qt/tests/qmltests/api/tst_WebView_save_restore_state.qml 2015-03-04 14:35:28 +0000
@@ -149,4 +149,44 @@
149 "document.querySelector('#textInput').value") == "Te$t"; });149 "document.querySelector('#textInput').value") == "Te$t"; });
150 restored.destroy();150 restored.destroy();
151 }151 }
152
153 function test_WebView_save_and_restore_error_page_data() {
154 return get_restore_types();
155 }
156
157 // Test that restoring the state of a navigation that had triggered an error
158 // triggers the error again (see https://launchpad.net/bugs/1423531).
159 function test_WebView_save_and_restore_error_page(data) {
160 var url = "http://invalid/";
161 webView.url = url;
162 verify(webView.waitForLoadCommitted(),
163 "Timed out waiting for error page");
164
165 var state = webView.currentState;
166 verify(state.length > 0);
167
168 var restored = webViewComponent.createObject(
169 webView, {"restoreType": data.restoreType, "restoreState": state});
170 verify(restored !== null);
171
172 var expectedLoadEvents = [
173 { type: LoadEvent.TypeStarted, isError: false },
174 { type: LoadEvent.TypeFailed, isError: false },
175 { type: LoadEvent.TypeCommitted, isError: true }
176 ];
177 function _loadEvent(event) {
178 var expected = expectedLoadEvents[0];
179 compare(event.type, expected.type);
180 compare(event.url, url);
181 compare(event.isError, expected.isError);
182 expectedLoadEvents.shift();
183 }
184 restored.loadEvent.connect(_loadEvent);
185
186 tryCompare(restored, "url", url);
187 restored.waitFor(function() {
188 return (expectedLoadEvents.length === 0);
189 });
190 restored.destroy();
191 }
152}192}

Subscribers

People subscribed via source and target branches