OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/android/web_contents_observer_proxy.h" | 5 #include "content/browser/android/web_contents_observer_proxy.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/android/jni_android.h" | 9 #include "base/android/jni_android.h" |
10 #include "base/android/jni_string.h" | 10 #include "base/android/jni_string.h" |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
97 ScopedJavaLocalRef<jobject> obj(java_observer_); | 97 ScopedJavaLocalRef<jobject> obj(java_observer_); |
98 std::string url_string = web_contents()->GetLastCommittedURL().spec(); | 98 std::string url_string = web_contents()->GetLastCommittedURL().spec(); |
99 SetToBaseURLForDataURLIfNeeded(&url_string); | 99 SetToBaseURLForDataURLIfNeeded(&url_string); |
100 // DidStopLoading is the last event we should get. | 100 // DidStopLoading is the last event we should get. |
101 base_url_of_last_started_data_url_ = GURL::EmptyGURL(); | 101 base_url_of_last_started_data_url_ = GURL::EmptyGURL(); |
102 ScopedJavaLocalRef<jstring> jstring_url(ConvertUTF8ToJavaString( | 102 ScopedJavaLocalRef<jstring> jstring_url(ConvertUTF8ToJavaString( |
103 env, url_string)); | 103 env, url_string)); |
104 Java_WebContentsObserverProxy_didStopLoading(env, obj, jstring_url); | 104 Java_WebContentsObserverProxy_didStopLoading(env, obj, jstring_url); |
105 } | 105 } |
106 | 106 |
107 void WebContentsObserverProxy::DidFailProvisionalLoad( | |
108 RenderFrameHost* render_frame_host, | |
109 const GURL& validated_url, | |
110 int error_code, | |
111 const base::string16& error_description, | |
112 bool was_ignored_by_handler) { | |
113 DidFailLoadInternal(true, !render_frame_host->GetParent(), error_code, | |
114 error_description, validated_url, was_ignored_by_handler); | |
115 } | |
116 | |
117 void WebContentsObserverProxy::DidFailLoad( | 107 void WebContentsObserverProxy::DidFailLoad( |
118 RenderFrameHost* render_frame_host, | 108 RenderFrameHost* render_frame_host, |
119 const GURL& validated_url, | 109 const GURL& validated_url, |
120 int error_code, | 110 int error_code, |
121 const base::string16& error_description, | 111 const base::string16& error_description, |
122 bool was_ignored_by_handler) { | 112 bool was_ignored_by_handler) { |
123 DidFailLoadInternal(false, !render_frame_host->GetParent(), error_code, | 113 DidFailLoadInternal(!render_frame_host->GetParent(), error_code, |
Ted C
2017/01/31 18:57:48
let's delete DidFailLoadInternal and inline it her
shaktisahu
2017/02/03 06:56:17
Done.
| |
124 error_description, validated_url, was_ignored_by_handler); | 114 error_description, validated_url); |
125 } | |
126 | |
127 void WebContentsObserverProxy::DidNavigateMainFrame( | |
128 const LoadCommittedDetails& details, | |
129 const FrameNavigateParams& params) { | |
130 JNIEnv* env = AttachCurrentThread(); | |
131 ScopedJavaLocalRef<jobject> obj(java_observer_); | |
132 ScopedJavaLocalRef<jstring> jstring_url( | |
133 ConvertUTF8ToJavaString(env, params.url.spec())); | |
134 ScopedJavaLocalRef<jstring> jstring_base_url( | |
135 ConvertUTF8ToJavaString(env, params.base_url.spec())); | |
136 | |
137 // See http://crbug.com/251330 for why it's determined this way. | |
138 url::Replacements<char> replacements; | |
139 replacements.ClearRef(); | |
140 bool urls_same_ignoring_fragment = | |
141 params.url.ReplaceComponents(replacements) == | |
142 details.previous_url.ReplaceComponents(replacements); | |
143 | |
144 // is_fragment_navigation is indicative of the intent of this variable. | |
145 // However, there isn't sufficient information here to determine whether this | |
146 // is actually a fragment navigation, or a history API navigation to a URL | |
147 // that would also be valid for a fragment navigation. | |
148 bool is_fragment_navigation = | |
149 urls_same_ignoring_fragment && details.is_in_page; | |
150 | |
151 Java_WebContentsObserverProxy_didNavigateMainFrame( | |
152 env, obj, jstring_url, jstring_base_url, | |
153 details.is_navigation_to_different_page(), is_fragment_navigation, | |
154 details.http_status_code); | |
155 } | |
156 | |
157 void WebContentsObserverProxy::DidNavigateAnyFrame( | |
158 RenderFrameHost* render_frame_host, | |
159 const LoadCommittedDetails& details, | |
160 const FrameNavigateParams& params) { | |
161 JNIEnv* env = AttachCurrentThread(); | |
162 ScopedJavaLocalRef<jobject> obj(java_observer_); | |
163 ScopedJavaLocalRef<jstring> jstring_url( | |
164 ConvertUTF8ToJavaString(env, params.url.spec())); | |
165 ScopedJavaLocalRef<jstring> jstring_base_url( | |
166 ConvertUTF8ToJavaString(env, params.base_url.spec())); | |
167 jboolean jboolean_is_reload = ui::PageTransitionCoreTypeIs( | |
168 params.transition, ui::PAGE_TRANSITION_RELOAD); | |
169 | |
170 Java_WebContentsObserverProxy_didNavigateAnyFrame( | |
171 env, obj, jstring_url, jstring_base_url, jboolean_is_reload); | |
172 } | 115 } |
173 | 116 |
174 void WebContentsObserverProxy::DocumentAvailableInMainFrame() { | 117 void WebContentsObserverProxy::DocumentAvailableInMainFrame() { |
175 JNIEnv* env = AttachCurrentThread(); | 118 JNIEnv* env = AttachCurrentThread(); |
176 ScopedJavaLocalRef<jobject> obj(java_observer_); | 119 ScopedJavaLocalRef<jobject> obj(java_observer_); |
177 Java_WebContentsObserverProxy_documentAvailableInMainFrame(env, obj); | 120 Java_WebContentsObserverProxy_documentAvailableInMainFrame(env, obj); |
178 } | 121 } |
179 | 122 |
180 void WebContentsObserverProxy::DidStartProvisionalLoadForFrame( | |
181 RenderFrameHost* render_frame_host, | |
182 const GURL& validated_url, | |
183 bool is_error_page) { | |
184 JNIEnv* env = AttachCurrentThread(); | |
185 ScopedJavaLocalRef<jobject> obj(java_observer_); | |
186 ScopedJavaLocalRef<jstring> jstring_url( | |
187 ConvertUTF8ToJavaString(env, validated_url.spec())); | |
188 // TODO(dcheng): Does Java really need the parent frame ID? It doesn't appear | |
189 // to be used at all, and it just adds complexity here. | |
190 Java_WebContentsObserverProxy_didStartProvisionalLoadForFrame( | |
191 env, obj, render_frame_host->GetRoutingID(), | |
192 render_frame_host->GetParent() | |
193 ? render_frame_host->GetParent()->GetRoutingID() | |
194 : -1, | |
195 !render_frame_host->GetParent(), jstring_url, is_error_page); | |
196 } | |
197 | |
198 void WebContentsObserverProxy::DidCommitProvisionalLoadForFrame( | |
199 RenderFrameHost* render_frame_host, | |
200 const GURL& url, | |
201 ui::PageTransition transition_type) { | |
202 JNIEnv* env = AttachCurrentThread(); | |
203 ScopedJavaLocalRef<jobject> obj(java_observer_); | |
204 ScopedJavaLocalRef<jstring> jstring_url( | |
205 ConvertUTF8ToJavaString(env, url.spec())); | |
206 Java_WebContentsObserverProxy_didCommitProvisionalLoadForFrame( | |
207 env, obj, render_frame_host->GetRoutingID(), | |
208 !render_frame_host->GetParent(), jstring_url, transition_type); | |
209 } | |
210 | |
211 void WebContentsObserverProxy::DidStartNavigation( | 123 void WebContentsObserverProxy::DidStartNavigation( |
212 NavigationHandle* navigation_handle) { | 124 NavigationHandle* navigation_handle) { |
213 JNIEnv* env = AttachCurrentThread(); | 125 JNIEnv* env = AttachCurrentThread(); |
214 ScopedJavaLocalRef<jobject> obj(java_observer_); | 126 ScopedJavaLocalRef<jobject> obj(java_observer_); |
215 ScopedJavaLocalRef<jstring> jstring_url( | 127 ScopedJavaLocalRef<jstring> jstring_url( |
216 ConvertUTF8ToJavaString(env, navigation_handle->GetURL().spec())); | 128 ConvertUTF8ToJavaString(env, navigation_handle->GetURL().spec())); |
217 Java_WebContentsObserverProxy_didStartNavigation( | 129 Java_WebContentsObserverProxy_didStartNavigation( |
218 env, obj, jstring_url, navigation_handle->IsInMainFrame(), | 130 env, obj, jstring_url, navigation_handle->IsInMainFrame(), |
219 navigation_handle->IsErrorPage()); | 131 navigation_handle->IsErrorPage()); |
220 } | 132 } |
221 | 133 |
222 void WebContentsObserverProxy::DidFinishNavigation( | 134 void WebContentsObserverProxy::DidFinishNavigation( |
223 NavigationHandle* navigation_handle) { | 135 NavigationHandle* navigation_handle) { |
224 JNIEnv* env = AttachCurrentThread(); | 136 JNIEnv* env = AttachCurrentThread(); |
225 ScopedJavaLocalRef<jobject> obj(java_observer_); | 137 ScopedJavaLocalRef<jobject> obj(java_observer_); |
226 ScopedJavaLocalRef<jstring> jstring_url( | 138 ScopedJavaLocalRef<jstring> jstring_url( |
227 ConvertUTF8ToJavaString(env, navigation_handle->GetURL().spec())); | 139 ConvertUTF8ToJavaString(env, navigation_handle->GetURL().spec())); |
228 | 140 |
141 CR_DEFINE_STATIC_LOCAL(GURL, last_committed_url, (GURL())); | |
Ted C
2017/01/31 18:57:48
Hmm...I'd ask clamy@ or jam@ whether there is a wa
shaktisahu
2017/02/03 06:56:17
I checked with jam@ and they will be adding a gett
| |
142 | |
143 url::Replacements<char> replacements; | |
144 replacements.ClearRef(); | |
145 bool urls_same_ignoring_fragment = | |
146 navigation_handle->GetURL().ReplaceComponents(replacements) == | |
147 last_committed_url.ReplaceComponents(replacements); | |
148 | |
149 last_committed_url = navigation_handle->GetURL(); | |
150 | |
151 bool is_fragment_navigation = | |
152 urls_same_ignoring_fragment && navigation_handle->IsSamePage(); | |
shaktisahu
2017/01/31 01:57:53
This is the only param so far that didn't come fro
Ted C
2017/01/31 18:57:48
As far as I can tell, this seems to only be used i
| |
153 | |
229 Java_WebContentsObserverProxy_didFinishNavigation( | 154 Java_WebContentsObserverProxy_didFinishNavigation( |
230 env, obj, jstring_url, navigation_handle->IsInMainFrame(), | 155 env, obj, jstring_url, navigation_handle->IsInMainFrame(), |
231 navigation_handle->IsErrorPage(), navigation_handle->HasCommitted(), | 156 navigation_handle->IsErrorPage(), navigation_handle->HasCommitted(), |
232 navigation_handle->IsSamePage(), | 157 navigation_handle->IsSamePage(), is_fragment_navigation, |
233 navigation_handle->HasCommitted() ? navigation_handle->GetPageTransition() | 158 navigation_handle->HasCommitted() ? navigation_handle->GetPageTransition() |
234 : -1, | 159 : -1, |
235 navigation_handle->GetNetErrorCode()); | 160 navigation_handle->GetNetErrorCode(), |
161 navigation_handle->GetResponseHeaders() | |
162 ? navigation_handle->GetResponseHeaders()->response_code() | |
163 : 200); | |
shaktisahu
2017/01/31 01:57:53
May be we need a better default value other than 2
Ted C
2017/01/31 18:57:48
I think we likely want a unset value here much lik
shaktisahu
2017/02/03 06:56:17
The test fails only for Nexus 5 whenever the devic
Ted C
2017/02/08 05:31:15
File a bug, and put a TODO above this line with a
| |
236 } | 164 } |
237 | 165 |
238 void WebContentsObserverProxy::DidFinishLoad(RenderFrameHost* render_frame_host, | 166 void WebContentsObserverProxy::DidFinishLoad(RenderFrameHost* render_frame_host, |
239 const GURL& validated_url) { | 167 const GURL& validated_url) { |
240 JNIEnv* env = AttachCurrentThread(); | 168 JNIEnv* env = AttachCurrentThread(); |
241 ScopedJavaLocalRef<jobject> obj(java_observer_); | 169 ScopedJavaLocalRef<jobject> obj(java_observer_); |
242 | 170 |
243 std::string url_string = validated_url.spec(); | 171 std::string url_string = validated_url.spec(); |
244 SetToBaseURLForDataURLIfNeeded(&url_string); | 172 SetToBaseURLForDataURLIfNeeded(&url_string); |
245 | 173 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
278 Java_WebContentsObserverProxy_didDetachInterstitialPage(env, obj); | 206 Java_WebContentsObserverProxy_didDetachInterstitialPage(env, obj); |
279 } | 207 } |
280 | 208 |
281 void WebContentsObserverProxy::DidChangeThemeColor(SkColor color) { | 209 void WebContentsObserverProxy::DidChangeThemeColor(SkColor color) { |
282 JNIEnv* env = AttachCurrentThread(); | 210 JNIEnv* env = AttachCurrentThread(); |
283 ScopedJavaLocalRef<jobject> obj(java_observer_); | 211 ScopedJavaLocalRef<jobject> obj(java_observer_); |
284 Java_WebContentsObserverProxy_didChangeThemeColor(env, obj, color); | 212 Java_WebContentsObserverProxy_didChangeThemeColor(env, obj, color); |
285 } | 213 } |
286 | 214 |
287 void WebContentsObserverProxy::DidFailLoadInternal( | 215 void WebContentsObserverProxy::DidFailLoadInternal( |
288 bool is_provisional_load, | |
289 bool is_main_frame, | 216 bool is_main_frame, |
290 int error_code, | 217 int error_code, |
291 const base::string16& description, | 218 const base::string16& description, |
292 const GURL& url, | 219 const GURL& url) { |
293 bool was_ignored_by_handler) { | |
294 JNIEnv* env = AttachCurrentThread(); | 220 JNIEnv* env = AttachCurrentThread(); |
295 ScopedJavaLocalRef<jobject> obj(java_observer_); | 221 ScopedJavaLocalRef<jobject> obj(java_observer_); |
296 ScopedJavaLocalRef<jstring> jstring_error_description( | 222 ScopedJavaLocalRef<jstring> jstring_error_description( |
297 ConvertUTF16ToJavaString(env, description)); | 223 ConvertUTF16ToJavaString(env, description)); |
298 ScopedJavaLocalRef<jstring> jstring_url( | 224 ScopedJavaLocalRef<jstring> jstring_url( |
299 ConvertUTF8ToJavaString(env, url.spec())); | 225 ConvertUTF8ToJavaString(env, url.spec())); |
300 | 226 |
301 Java_WebContentsObserverProxy_didFailLoad( | 227 Java_WebContentsObserverProxy_didFailLoad(env, obj, is_main_frame, error_code, |
302 env, obj, is_provisional_load, is_main_frame, error_code, | 228 jstring_error_description, |
303 jstring_error_description, jstring_url, was_ignored_by_handler); | 229 jstring_url); |
304 } | 230 } |
305 | 231 |
306 void WebContentsObserverProxy::DidFirstVisuallyNonEmptyPaint() { | 232 void WebContentsObserverProxy::DidFirstVisuallyNonEmptyPaint() { |
307 JNIEnv* env = AttachCurrentThread(); | 233 JNIEnv* env = AttachCurrentThread(); |
308 ScopedJavaLocalRef<jobject> obj(java_observer_); | 234 ScopedJavaLocalRef<jobject> obj(java_observer_); |
309 Java_WebContentsObserverProxy_didFirstVisuallyNonEmptyPaint(env, obj); | 235 Java_WebContentsObserverProxy_didFirstVisuallyNonEmptyPaint(env, obj); |
310 } | 236 } |
311 | 237 |
312 void WebContentsObserverProxy::WasShown() { | 238 void WebContentsObserverProxy::WasShown() { |
313 JNIEnv* env = AttachCurrentThread(); | 239 JNIEnv* env = AttachCurrentThread(); |
(...skipping 10 matching lines...) Expand all Loading... | |
324 void WebContentsObserverProxy::TitleWasSet(NavigationEntry* entry, | 250 void WebContentsObserverProxy::TitleWasSet(NavigationEntry* entry, |
325 bool explicit_set) { | 251 bool explicit_set) { |
326 JNIEnv* env = AttachCurrentThread(); | 252 JNIEnv* env = AttachCurrentThread(); |
327 ScopedJavaLocalRef<jobject> obj(java_observer_); | 253 ScopedJavaLocalRef<jobject> obj(java_observer_); |
328 ScopedJavaLocalRef<jstring> jstring_title = ConvertUTF8ToJavaString( | 254 ScopedJavaLocalRef<jstring> jstring_title = ConvertUTF8ToJavaString( |
329 env, | 255 env, |
330 base::UTF16ToUTF8(web_contents()->GetTitle())); | 256 base::UTF16ToUTF8(web_contents()->GetTitle())); |
331 Java_WebContentsObserverProxy_titleWasSet(env, obj, jstring_title); | 257 Java_WebContentsObserverProxy_titleWasSet(env, obj, jstring_title); |
332 } | 258 } |
333 | 259 |
334 void WebContentsObserverProxy::DidStartNavigationToPendingEntry( | |
335 const GURL& url, | |
336 ReloadType reload_type) { | |
337 JNIEnv* env = AttachCurrentThread(); | |
338 ScopedJavaLocalRef<jobject> obj(java_observer_); | |
339 ScopedJavaLocalRef<jstring> jstring_url( | |
340 ConvertUTF8ToJavaString(env, url.spec())); | |
341 | |
342 Java_WebContentsObserverProxy_didStartNavigationToPendingEntry(env, obj, | |
343 jstring_url); | |
344 } | |
345 | |
346 void WebContentsObserverProxy::SetToBaseURLForDataURLIfNeeded( | 260 void WebContentsObserverProxy::SetToBaseURLForDataURLIfNeeded( |
347 std::string* url) { | 261 std::string* url) { |
348 NavigationEntry* entry = | 262 NavigationEntry* entry = |
349 web_contents()->GetController().GetLastCommittedEntry(); | 263 web_contents()->GetController().GetLastCommittedEntry(); |
350 // Note that GetBaseURLForDataURL is only used by the Android WebView. | 264 // Note that GetBaseURLForDataURL is only used by the Android WebView. |
351 // FIXME: Should we only return valid specs and "about:blank" for invalid | 265 // FIXME: Should we only return valid specs and "about:blank" for invalid |
352 // ones? This may break apps. | 266 // ones? This may break apps. |
353 if (entry && !entry->GetBaseURLForDataURL().is_empty()) { | 267 if (entry && !entry->GetBaseURLForDataURL().is_empty()) { |
354 *url = entry->GetBaseURLForDataURL().possibly_invalid_spec(); | 268 *url = entry->GetBaseURLForDataURL().possibly_invalid_spec(); |
355 } else if (!base_url_of_last_started_data_url_.is_empty()) { | 269 } else if (!base_url_of_last_started_data_url_.is_empty()) { |
356 // NavigationController can lose the pending entry and recreate it without | 270 // NavigationController can lose the pending entry and recreate it without |
357 // a base URL if there has been a loadUrl("javascript:...") after | 271 // a base URL if there has been a loadUrl("javascript:...") after |
358 // loadDataWithBaseUrl. | 272 // loadDataWithBaseUrl. |
359 *url = base_url_of_last_started_data_url_.possibly_invalid_spec(); | 273 *url = base_url_of_last_started_data_url_.possibly_invalid_spec(); |
360 } | 274 } |
361 } | 275 } |
362 | 276 |
363 bool RegisterWebContentsObserverProxy(JNIEnv* env) { | 277 bool RegisterWebContentsObserverProxy(JNIEnv* env) { |
364 return RegisterNativesImpl(env); | 278 return RegisterNativesImpl(env); |
365 } | 279 } |
366 } // namespace content | 280 } // namespace content |
OLD | NEW |