Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 "android_webview/native/aw_contents.h" | 5 #include "android_webview/native/aw_contents.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "android_webview/browser/aw_browser_context.h" | 10 #include "android_webview/browser/aw_browser_context.h" |
| 11 #include "android_webview/browser/aw_browser_main_parts.h" | 11 #include "android_webview/browser/aw_browser_main_parts.h" |
| 12 #include "android_webview/browser/aw_resource_context.h" | 12 #include "android_webview/browser/aw_resource_context.h" |
| 13 #include "android_webview/browser/browser_view_renderer.h" | 13 #include "android_webview/browser/browser_view_renderer.h" |
| 14 #include "android_webview/browser/child_frame.h" | |
| 14 #include "android_webview/browser/deferred_gpu_command_service.h" | 15 #include "android_webview/browser/deferred_gpu_command_service.h" |
| 15 #include "android_webview/browser/net_disk_cache_remover.h" | 16 #include "android_webview/browser/net_disk_cache_remover.h" |
| 16 #include "android_webview/browser/renderer_host/aw_resource_dispatcher_host_dele gate.h" | 17 #include "android_webview/browser/renderer_host/aw_resource_dispatcher_host_dele gate.h" |
| 17 #include "android_webview/browser/scoped_app_gl_state_restore.h" | 18 #include "android_webview/browser/scoped_app_gl_state_restore.h" |
| 18 #include "android_webview/browser/shared_renderer_state.h" | 19 #include "android_webview/browser/shared_renderer_state.h" |
| 19 #include "android_webview/common/aw_hit_test_data.h" | 20 #include "android_webview/common/aw_hit_test_data.h" |
| 20 #include "android_webview/common/aw_switches.h" | 21 #include "android_webview/common/aw_switches.h" |
| 21 #include "android_webview/common/devtools_instrumentation.h" | 22 #include "android_webview/common/devtools_instrumentation.h" |
| 22 #include "android_webview/native/aw_autofill_client.h" | 23 #include "android_webview/native/aw_autofill_client.h" |
| 23 #include "android_webview/native/aw_browser_dependency_factory.h" | 24 #include "android_webview/native/aw_browser_dependency_factory.h" |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 173 int render_process_id, int render_frame_id) { | 174 int render_process_id, int render_frame_id) { |
| 174 AwContents* aw_contents = AwContents::FromWebContents( | 175 AwContents* aw_contents = AwContents::FromWebContents( |
| 175 content::WebContents::FromRenderFrameHost( | 176 content::WebContents::FromRenderFrameHost( |
| 176 content::RenderFrameHost::FromID(render_process_id, | 177 content::RenderFrameHost::FromID(render_process_id, |
| 177 render_frame_id))); | 178 render_frame_id))); |
| 178 return aw_contents; | 179 return aw_contents; |
| 179 } | 180 } |
| 180 | 181 |
| 181 AwContents::AwContents(scoped_ptr<WebContents> web_contents) | 182 AwContents::AwContents(scoped_ptr<WebContents> web_contents) |
| 182 : browser_view_renderer_( | 183 : browser_view_renderer_( |
| 183 this, | 184 this, BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), |
| 184 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), | |
| 185 base::CommandLine::ForCurrentProcess()->HasSwitch( | 185 base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 186 switches::kDisablePageVisibility)), | 186 switches::kDisablePageVisibility)), |
| 187 shared_renderer_state_( | |
| 188 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)), | |
| 187 web_contents_(std::move(web_contents)), | 189 web_contents_(std::move(web_contents)), |
| 188 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()) { | 190 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()) { |
| 191 browser_view_renderer_.SetSharedRendererState(&shared_renderer_state_); | |
| 189 base::subtle::NoBarrier_AtomicIncrement(&g_instance_count, 1); | 192 base::subtle::NoBarrier_AtomicIncrement(&g_instance_count, 1); |
| 190 icon_helper_.reset(new IconHelper(web_contents_.get())); | 193 icon_helper_.reset(new IconHelper(web_contents_.get())); |
| 191 icon_helper_->SetListener(this); | 194 icon_helper_->SetListener(this); |
| 192 web_contents_->SetUserData(android_webview::kAwContentsUserDataKey, | 195 web_contents_->SetUserData(android_webview::kAwContentsUserDataKey, |
| 193 new AwContentsUserData(this)); | 196 new AwContentsUserData(this)); |
| 194 browser_view_renderer_.RegisterWithWebContents(web_contents_.get()); | 197 browser_view_renderer_.RegisterWithWebContents(web_contents_.get()); |
| 195 render_view_host_ext_.reset( | 198 render_view_host_ext_.reset( |
| 196 new AwRenderViewHostExt(this, web_contents_.get())); | 199 new AwRenderViewHostExt(this, web_contents_.get())); |
| 197 | 200 |
| 198 permission_request_handler_.reset( | 201 permission_request_handler_.reset( |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 433 devtools_instrumentation::ScopedEmbedderCallbackTask embedder_callback( | 436 devtools_instrumentation::ScopedEmbedderCallbackTask embedder_callback( |
| 434 "onReceivedHttpAuthRequest"); | 437 "onReceivedHttpAuthRequest"); |
| 435 Java_AwContents_onReceivedHttpAuthRequest(env, obj.obj(), handler.obj(), | 438 Java_AwContents_onReceivedHttpAuthRequest(env, obj.obj(), handler.obj(), |
| 436 jhost.obj(), jrealm.obj()); | 439 jhost.obj(), jrealm.obj()); |
| 437 return true; | 440 return true; |
| 438 } | 441 } |
| 439 | 442 |
| 440 void AwContents::SetOffscreenPreRaster(bool enabled) { | 443 void AwContents::SetOffscreenPreRaster(bool enabled) { |
| 441 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 444 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 442 browser_view_renderer_.SetOffscreenPreRaster(enabled); | 445 browser_view_renderer_.SetOffscreenPreRaster(enabled); |
| 446 browser_view_renderer_.UpdateMemoryPolicy( | |
| 447 browser_view_renderer_.GetInterestRect( | |
| 448 shared_renderer_state_.GetParentDrawConstraintsOnUI().is_layer)); | |
| 443 } | 449 } |
| 444 | 450 |
| 445 void AwContents::AddVisitedLinks( | 451 void AwContents::AddVisitedLinks( |
| 446 JNIEnv* env, | 452 JNIEnv* env, |
| 447 const JavaParamRef<jobject>& obj, | 453 const JavaParamRef<jobject>& obj, |
| 448 const JavaParamRef<jobjectArray>& jvisited_links) { | 454 const JavaParamRef<jobjectArray>& jvisited_links) { |
| 449 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 455 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 450 std::vector<base::string16> visited_link_strings; | 456 std::vector<base::string16> visited_link_strings; |
| 451 base::android::AppendJavaStringArrayToStringVector( | 457 base::android::AppendJavaStringArrayToStringVector( |
| 452 env, jvisited_links, &visited_link_strings); | 458 env, jvisited_links, &visited_link_strings); |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 882 const JavaParamRef<jobject>& obj, | 888 const JavaParamRef<jobject>& obj, |
| 883 int w, | 889 int w, |
| 884 int h) { | 890 int h) { |
| 885 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 891 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 886 browser_view_renderer_.OnAttachedToWindow(w, h); | 892 browser_view_renderer_.OnAttachedToWindow(w, h); |
| 887 } | 893 } |
| 888 | 894 |
| 889 void AwContents::OnDetachedFromWindow(JNIEnv* env, | 895 void AwContents::OnDetachedFromWindow(JNIEnv* env, |
| 890 const JavaParamRef<jobject>& obj) { | 896 const JavaParamRef<jobject>& obj) { |
| 891 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 897 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 898 shared_renderer_state_.ReleaseCompositorResourcesIfNeededOnUI(); | |
| 892 browser_view_renderer_.OnDetachedFromWindow(); | 899 browser_view_renderer_.OnDetachedFromWindow(); |
| 893 } | 900 } |
| 894 | 901 |
| 895 bool AwContents::IsVisible(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 902 bool AwContents::IsVisible(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
| 896 return browser_view_renderer_.IsClientVisible(); | 903 return browser_view_renderer_.IsClientVisible(); |
| 897 } | 904 } |
| 898 | 905 |
| 899 void AwContents::DetachFunctorFromView() { | 906 void AwContents::DetachFunctorFromView() { |
| 900 JNIEnv* env = AttachCurrentThread(); | 907 JNIEnv* env = AttachCurrentThread(); |
| 901 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 908 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 931 std::vector<uint8_t> state_vector; | 938 std::vector<uint8_t> state_vector; |
| 932 base::android::JavaByteArrayToByteVector(env, state, &state_vector); | 939 base::android::JavaByteArrayToByteVector(env, state, &state_vector); |
| 933 | 940 |
| 934 base::Pickle pickle(reinterpret_cast<const char*>(state_vector.data()), | 941 base::Pickle pickle(reinterpret_cast<const char*>(state_vector.data()), |
| 935 state_vector.size()); | 942 state_vector.size()); |
| 936 base::PickleIterator iterator(pickle); | 943 base::PickleIterator iterator(pickle); |
| 937 | 944 |
| 938 return RestoreFromPickle(&iterator, web_contents_.get()); | 945 return RestoreFromPickle(&iterator, web_contents_.get()); |
| 939 } | 946 } |
| 940 | 947 |
| 948 void AwContents::CleanUpUncommittedFrame() { | |
| 949 browser_view_renderer_.ReturnUnusedResource( | |
| 950 shared_renderer_state_.PassUncommittedFrameOnUI()); | |
| 951 } | |
| 952 | |
| 953 void AwContents::CleanUpReturnedResources() { | |
| 954 SharedRendererState::ReturnedResourcesMap returned_resource_map; | |
| 955 shared_renderer_state_.SwapReturnedResourcesOnUI(&returned_resource_map); | |
| 956 | |
| 957 for (auto iterator = returned_resource_map.begin(); | |
| 958 iterator != returned_resource_map.end(); iterator++) { | |
| 959 browser_view_renderer_.ReturnResourceFromParent( | |
| 960 iterator->first, iterator->second.output_surface_id, | |
| 961 &iterator->second.resources); | |
| 962 } | |
| 963 } | |
| 964 | |
| 965 bool AwContents::OnDrawHardware() { | |
| 966 shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI(); | |
| 967 | |
| 968 shared_renderer_state_.SetScrollOffsetOnUI( | |
| 969 browser_view_renderer_.last_on_draw_scroll_offset()); | |
| 970 | |
| 971 browser_view_renderer_.UpdateMemoryPolicy( | |
| 972 browser_view_renderer_.GetInterestRect( | |
| 973 shared_renderer_state_.GetParentDrawConstraintsOnUI().is_layer)); | |
| 974 | |
| 975 CleanUpReturnedResources(); | |
|
boliu
2016/03/23 20:42:32
return resources before UpdateMemoryPolicy.
Actua
Tobias Sargeant
2016/03/24 16:53:05
Done.
| |
| 976 | |
| 977 scoped_ptr<ChildFrame> child_frame = browser_view_renderer_.OnDrawHardware( | |
|
boliu
2016/03/23 20:42:32
indent
Tobias Sargeant
2016/03/24 16:53:05
Done.
| |
| 978 shared_renderer_state_.GetParentDrawConstraintsOnUI()); | |
| 979 | |
| 980 if (child_frame.get()) { | |
| 981 CleanUpUncommittedFrame(); | |
| 982 shared_renderer_state_.SetCompositorFrameOnUI(std::move(child_frame)); | |
| 983 return true; | |
| 984 } else { | |
| 985 return shared_renderer_state_.HasFrameOnUI(); | |
| 986 } | |
| 987 } | |
| 988 | |
| 941 bool AwContents::OnDraw(JNIEnv* env, | 989 bool AwContents::OnDraw(JNIEnv* env, |
| 942 const JavaParamRef<jobject>& obj, | 990 const JavaParamRef<jobject>& obj, |
| 943 const JavaParamRef<jobject>& canvas, | 991 const JavaParamRef<jobject>& canvas, |
| 944 jboolean is_hardware_accelerated, | 992 jboolean is_hardware_accelerated, |
| 945 jint scroll_x, | 993 jint scroll_x, |
| 946 jint scroll_y, | 994 jint scroll_y, |
| 947 jint visible_left, | 995 jint visible_left, |
| 948 jint visible_top, | 996 jint visible_top, |
| 949 jint visible_right, | 997 jint visible_right, |
| 950 jint visible_bottom) { | 998 jint visible_bottom) { |
| 951 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 999 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 952 gfx::Vector2d scroll(scroll_x, scroll_y); | 1000 gfx::Vector2d scroll(scroll_x, scroll_y); |
| 953 browser_view_renderer_.PrepareToDraw( | 1001 browser_view_renderer_.PrepareToDraw( |
| 954 scroll, gfx::Rect(visible_left, visible_top, visible_right - visible_left, | 1002 scroll, gfx::Rect(visible_left, visible_top, visible_right - visible_left, |
| 955 visible_bottom - visible_top)); | 1003 visible_bottom - visible_top)); |
| 956 if (is_hardware_accelerated && browser_view_renderer_.attached_to_window() && | 1004 if (is_hardware_accelerated && browser_view_renderer_.attached_to_window() && |
| 957 !g_force_auxiliary_bitmap_rendering) { | 1005 !g_force_auxiliary_bitmap_rendering) { |
| 958 return browser_view_renderer_.OnDrawHardware(); | 1006 return OnDrawHardware(); |
| 959 } | 1007 } |
| 960 | 1008 |
| 961 gfx::Size view_size = browser_view_renderer_.size(); | 1009 gfx::Size view_size = browser_view_renderer_.size(); |
| 962 if (view_size.IsEmpty()) { | 1010 if (view_size.IsEmpty()) { |
| 963 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_EmptySize", | 1011 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_EmptySize", |
| 964 TRACE_EVENT_SCOPE_THREAD); | 1012 TRACE_EVENT_SCOPE_THREAD); |
| 965 return false; | 1013 return false; |
| 966 } | 1014 } |
| 967 | 1015 |
| 968 // TODO(hush): Right now webview size is passed in as the auxiliary bitmap | 1016 // TODO(hush): Right now webview size is passed in as the auxiliary bitmap |
| 969 // size, which might hurt performace (only for software draws with auxiliary | 1017 // size, which might hurt performace (only for software draws with auxiliary |
| 970 // bitmap). For better performance, get global visible rect, transform it | 1018 // bitmap). For better performance, get global visible rect, transform it |
| 971 // from screen space to view space, then intersect with the webview in | 1019 // from screen space to view space, then intersect with the webview in |
| 972 // viewspace. Use the resulting rect as the auxiliary bitmap. | 1020 // viewspace. Use the resulting rect as the auxiliary bitmap. |
| 973 scoped_ptr<SoftwareCanvasHolder> canvas_holder = SoftwareCanvasHolder::Create( | 1021 scoped_ptr<SoftwareCanvasHolder> canvas_holder = SoftwareCanvasHolder::Create( |
| 974 canvas, scroll, view_size, g_force_auxiliary_bitmap_rendering); | 1022 canvas, scroll, view_size, g_force_auxiliary_bitmap_rendering); |
| 975 if (!canvas_holder || !canvas_holder->GetCanvas()) { | 1023 if (!canvas_holder || !canvas_holder->GetCanvas()) { |
| 976 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_NoSoftwareCanvas", | 1024 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_NoSoftwareCanvas", |
| 977 TRACE_EVENT_SCOPE_THREAD); | 1025 TRACE_EVENT_SCOPE_THREAD); |
| 978 return false; | 1026 return false; |
| 979 } | 1027 } |
| 1028 CleanUpReturnedResources(); | |
| 980 return browser_view_renderer_.OnDrawSoftware(canvas_holder->GetCanvas()); | 1029 return browser_view_renderer_.OnDrawSoftware(canvas_holder->GetCanvas()); |
| 981 } | 1030 } |
| 982 | 1031 |
| 983 void AwContents::SetPendingWebContentsForPopup( | 1032 void AwContents::SetPendingWebContentsForPopup( |
| 984 scoped_ptr<content::WebContents> pending) { | 1033 scoped_ptr<content::WebContents> pending) { |
| 985 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1034 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 986 if (pending_contents_.get()) { | 1035 if (pending_contents_.get()) { |
| 987 // TODO(benm): Support holding multiple pop up window requests. | 1036 // TODO(benm): Support holding multiple pop up window requests. |
| 988 LOG(WARNING) << "Blocking popup window creation as an outstanding " | 1037 LOG(WARNING) << "Blocking popup window creation as an outstanding " |
| 989 << "popup window is still pending."; | 1038 << "popup window is still pending."; |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1202 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1251 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1203 render_view_host_ext_->SetJsOnlineProperty(network_up); | 1252 render_view_host_ext_->SetJsOnlineProperty(network_up); |
| 1204 } | 1253 } |
| 1205 | 1254 |
| 1206 void AwContents::TrimMemory(JNIEnv* env, | 1255 void AwContents::TrimMemory(JNIEnv* env, |
| 1207 const JavaParamRef<jobject>& obj, | 1256 const JavaParamRef<jobject>& obj, |
| 1208 jint level, | 1257 jint level, |
| 1209 jboolean visible) { | 1258 jboolean visible) { |
| 1210 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1259 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1211 browser_view_renderer_.TrimMemory(level, visible); | 1260 browser_view_renderer_.TrimMemory(level, visible); |
| 1261 shared_renderer_state_.TrimMemoryOnUI(level); | |
|
boliu
2016/03/23 20:42:32
trim SRS first (to match old code)
Tobias Sargeant
2016/03/24 16:53:05
Done.
| |
| 1212 } | 1262 } |
| 1213 | 1263 |
| 1214 // TODO(sgurun) add support for posting a frame whose name is known (only | 1264 // TODO(sgurun) add support for posting a frame whose name is known (only |
| 1215 // main frame is supported at this time, see crbug.com/389721) | 1265 // main frame is supported at this time, see crbug.com/389721) |
| 1216 void AwContents::PostMessageToFrame(JNIEnv* env, | 1266 void AwContents::PostMessageToFrame(JNIEnv* env, |
| 1217 const JavaParamRef<jobject>& obj, | 1267 const JavaParamRef<jobject>& obj, |
| 1218 const JavaParamRef<jstring>& frame_name, | 1268 const JavaParamRef<jstring>& frame_name, |
| 1219 const JavaParamRef<jstring>& message, | 1269 const JavaParamRef<jstring>& message, |
| 1220 const JavaParamRef<jstring>& target_origin, | 1270 const JavaParamRef<jstring>& target_origin, |
| 1221 const JavaParamRef<jintArray>& sent_ports) { | 1271 const JavaParamRef<jintArray>& sent_ports) { |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1276 const JavaParamRef<jobject>& obj) { | 1326 const JavaParamRef<jobject>& obj) { |
| 1277 web_contents_->ResumeLoadingCreatedWebContents(); | 1327 web_contents_->ResumeLoadingCreatedWebContents(); |
| 1278 } | 1328 } |
| 1279 | 1329 |
| 1280 void SetShouldDownloadFavicons(JNIEnv* env, | 1330 void SetShouldDownloadFavicons(JNIEnv* env, |
| 1281 const JavaParamRef<jclass>& jclazz) { | 1331 const JavaParamRef<jclass>& jclazz) { |
| 1282 g_should_download_favicons = true; | 1332 g_should_download_favicons = true; |
| 1283 } | 1333 } |
| 1284 | 1334 |
| 1285 } // namespace android_webview | 1335 } // namespace android_webview |
| OLD | NEW |