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 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 Java_WebContentsObserverProxy_didFinishNavigation( | 86 Java_WebContentsObserverProxy_didFinishNavigation( |
87 env, obj.obj(), navigation_handle->IsInMainFrame(), | 87 env, obj.obj(), navigation_handle->IsInMainFrame(), |
88 navigation_handle->IsErrorPage(), navigation_handle->HasCommitted()); | 88 navigation_handle->IsErrorPage(), navigation_handle->HasCommitted()); |
89 } | 89 } |
90 | 90 |
91 void WebContentsObserverProxy::DidStartLoading() { | 91 void WebContentsObserverProxy::DidStartLoading() { |
92 JNIEnv* env = AttachCurrentThread(); | 92 JNIEnv* env = AttachCurrentThread(); |
93 ScopedJavaLocalRef<jobject> obj(java_observer_); | 93 ScopedJavaLocalRef<jobject> obj(java_observer_); |
94 ScopedJavaLocalRef<jstring> jstring_url( | 94 ScopedJavaLocalRef<jstring> jstring_url( |
95 ConvertUTF8ToJavaString(env, web_contents()->GetVisibleURL().spec())); | 95 ConvertUTF8ToJavaString(env, web_contents()->GetVisibleURL().spec())); |
| 96 if (auto entry = web_contents()->GetController().GetPendingEntry()) { |
| 97 base_url_of_last_started_data_url_ = entry->GetBaseURLForDataURL(); |
| 98 } |
96 Java_WebContentsObserverProxy_didStartLoading(env, obj.obj(), | 99 Java_WebContentsObserverProxy_didStartLoading(env, obj.obj(), |
97 jstring_url.obj()); | 100 jstring_url.obj()); |
98 } | 101 } |
99 | 102 |
100 void WebContentsObserverProxy::DidStopLoading() { | 103 void WebContentsObserverProxy::DidStopLoading() { |
101 JNIEnv* env = AttachCurrentThread(); | 104 JNIEnv* env = AttachCurrentThread(); |
102 ScopedJavaLocalRef<jobject> obj(java_observer_); | 105 ScopedJavaLocalRef<jobject> obj(java_observer_); |
103 std::string url_string = web_contents()->GetLastCommittedURL().spec(); | 106 std::string url_string = web_contents()->GetLastCommittedURL().spec(); |
104 SetToBaseURLForDataURLIfNeeded(&url_string); | 107 SetToBaseURLForDataURLIfNeeded(&url_string); |
| 108 // DidStopLoading is the last event we should get. |
| 109 base_url_of_last_started_data_url_ = GURL::EmptyGURL(); |
105 ScopedJavaLocalRef<jstring> jstring_url(ConvertUTF8ToJavaString( | 110 ScopedJavaLocalRef<jstring> jstring_url(ConvertUTF8ToJavaString( |
106 env, url_string)); | 111 env, url_string)); |
107 Java_WebContentsObserverProxy_didStopLoading(env, obj.obj(), | 112 Java_WebContentsObserverProxy_didStopLoading(env, obj.obj(), |
108 jstring_url.obj()); | 113 jstring_url.obj()); |
109 } | 114 } |
110 | 115 |
111 void WebContentsObserverProxy::DidFailProvisionalLoad( | 116 void WebContentsObserverProxy::DidFailProvisionalLoad( |
112 RenderFrameHost* render_frame_host, | 117 RenderFrameHost* render_frame_host, |
113 const GURL& validated_url, | 118 const GURL& validated_url, |
114 int error_code, | 119 int error_code, |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 | 315 |
311 Java_WebContentsObserverProxy_mediaSessionStateChanged( | 316 Java_WebContentsObserverProxy_mediaSessionStateChanged( |
312 env, obj.obj(), is_controllable, is_suspended); | 317 env, obj.obj(), is_controllable, is_suspended); |
313 } | 318 } |
314 | 319 |
315 void WebContentsObserverProxy::SetToBaseURLForDataURLIfNeeded( | 320 void WebContentsObserverProxy::SetToBaseURLForDataURLIfNeeded( |
316 std::string* url) { | 321 std::string* url) { |
317 NavigationEntry* entry = | 322 NavigationEntry* entry = |
318 web_contents()->GetController().GetLastCommittedEntry(); | 323 web_contents()->GetController().GetLastCommittedEntry(); |
319 // Note that GetBaseURLForDataURL is only used by the Android WebView. | 324 // Note that GetBaseURLForDataURL is only used by the Android WebView. |
320 if (entry && !entry->GetBaseURLForDataURL().is_empty()) | 325 // FIXME: Should we only return valid specs and "about:blank" for invalid |
| 326 // ones? This may break apps. |
| 327 if (entry && !entry->GetBaseURLForDataURL().is_empty()) { |
321 *url = entry->GetBaseURLForDataURL().possibly_invalid_spec(); | 328 *url = entry->GetBaseURLForDataURL().possibly_invalid_spec(); |
| 329 } else if (!base_url_of_last_started_data_url_.is_empty()) { |
| 330 // NavigationController can lose the pending entry and recreate it without |
| 331 // a base URL if there has been a loadUrl("javascript:...") after |
| 332 // loadDataWithBaseUrl. |
| 333 *url = base_url_of_last_started_data_url_.possibly_invalid_spec(); |
| 334 } |
322 } | 335 } |
323 | 336 |
324 bool RegisterWebContentsObserverProxy(JNIEnv* env) { | 337 bool RegisterWebContentsObserverProxy(JNIEnv* env) { |
325 return RegisterNativesImpl(env); | 338 return RegisterNativesImpl(env); |
326 } | 339 } |
327 } // namespace content | 340 } // namespace content |
OLD | NEW |