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 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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, |
184 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), | 185 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), |
185 base::CommandLine::ForCurrentProcess()->HasSwitch( | 186 base::CommandLine::ForCurrentProcess()->HasSwitch( |
186 switches::kDisablePageVisibility)), | 187 switches::kDisablePageVisibility)), |
| 188 shared_renderer_state_( |
| 189 this, |
| 190 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)), |
187 web_contents_(std::move(web_contents)), | 191 web_contents_(std::move(web_contents)), |
188 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()) { | 192 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()) { |
189 base::subtle::NoBarrier_AtomicIncrement(&g_instance_count, 1); | 193 base::subtle::NoBarrier_AtomicIncrement(&g_instance_count, 1); |
190 icon_helper_.reset(new IconHelper(web_contents_.get())); | 194 icon_helper_.reset(new IconHelper(web_contents_.get())); |
191 icon_helper_->SetListener(this); | 195 icon_helper_->SetListener(this); |
192 web_contents_->SetUserData(android_webview::kAwContentsUserDataKey, | 196 web_contents_->SetUserData(android_webview::kAwContentsUserDataKey, |
193 new AwContentsUserData(this)); | 197 new AwContentsUserData(this)); |
194 browser_view_renderer_.RegisterWithWebContents(web_contents_.get()); | 198 browser_view_renderer_.RegisterWithWebContents(web_contents_.get()); |
195 render_view_host_ext_.reset( | 199 render_view_host_ext_.reset( |
196 new AwRenderViewHostExt(this, web_contents_.get())); | 200 new AwRenderViewHostExt(this, web_contents_.get())); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 } | 358 } |
355 | 359 |
356 // static | 360 // static |
357 jint GetNativeInstanceCount(JNIEnv* env, const JavaParamRef<jclass>&) { | 361 jint GetNativeInstanceCount(JNIEnv* env, const JavaParamRef<jclass>&) { |
358 return base::subtle::NoBarrier_Load(&g_instance_count); | 362 return base::subtle::NoBarrier_Load(&g_instance_count); |
359 } | 363 } |
360 | 364 |
361 jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, | 365 jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, |
362 const JavaParamRef<jobject>& obj) { | 366 const JavaParamRef<jobject>& obj) { |
363 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 367 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
364 return reinterpret_cast<intptr_t>( | 368 return reinterpret_cast<intptr_t>(&shared_renderer_state_); |
365 browser_view_renderer_.GetAwDrawGLViewContext()); | |
366 } | 369 } |
367 | 370 |
368 namespace { | 371 namespace { |
369 void DocumentHasImagesCallback(const ScopedJavaGlobalRef<jobject>& message, | 372 void DocumentHasImagesCallback(const ScopedJavaGlobalRef<jobject>& message, |
370 bool has_images) { | 373 bool has_images) { |
371 Java_AwContents_onDocumentHasImagesResponse(AttachCurrentThread(), | 374 Java_AwContents_onDocumentHasImagesResponse(AttachCurrentThread(), |
372 has_images, | 375 has_images, |
373 message.obj()); | 376 message.obj()); |
374 } | 377 } |
375 } // namespace | 378 } // namespace |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
649 permission_request_handler_->SendRequest( | 652 permission_request_handler_->SendRequest( |
650 scoped_ptr<AwPermissionRequestDelegate>(new SimplePermissionRequest( | 653 scoped_ptr<AwPermissionRequestDelegate>(new SimplePermissionRequest( |
651 origin, AwPermissionRequest::MIDISysex, callback))); | 654 origin, AwPermissionRequest::MIDISysex, callback))); |
652 } | 655 } |
653 | 656 |
654 void AwContents::CancelMIDISysexPermissionRequests(const GURL& origin) { | 657 void AwContents::CancelMIDISysexPermissionRequests(const GURL& origin) { |
655 permission_request_handler_->CancelRequest( | 658 permission_request_handler_->CancelRequest( |
656 origin, AwPermissionRequest::AwPermissionRequest::MIDISysex); | 659 origin, AwPermissionRequest::AwPermissionRequest::MIDISysex); |
657 } | 660 } |
658 | 661 |
| 662 void AwContents::DrawConstraintsUpdated( |
| 663 const ParentCompositorDrawConstraints& draw_constraints) { |
| 664 browser_view_renderer_.UpdateParentDrawConstraints(draw_constraints); |
| 665 } |
| 666 |
| 667 bool AwContents::IsHardwareEnabled() { |
| 668 return browser_view_renderer_.hardware_enabled(); |
| 669 } |
| 670 |
659 void AwContents::FindAllAsync(JNIEnv* env, | 671 void AwContents::FindAllAsync(JNIEnv* env, |
660 const JavaParamRef<jobject>& obj, | 672 const JavaParamRef<jobject>& obj, |
661 const JavaParamRef<jstring>& search_string) { | 673 const JavaParamRef<jstring>& search_string) { |
662 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 674 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
663 GetFindHelper()->FindAllAsync(ConvertJavaStringToUTF16(env, search_string)); | 675 GetFindHelper()->FindAllAsync(ConvertJavaStringToUTF16(env, search_string)); |
664 } | 676 } |
665 | 677 |
666 void AwContents::FindNext(JNIEnv* env, | 678 void AwContents::FindNext(JNIEnv* env, |
667 const JavaParamRef<jobject>& obj, | 679 const JavaParamRef<jobject>& obj, |
668 jboolean forward) { | 680 jboolean forward) { |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
882 const JavaParamRef<jobject>& obj, | 894 const JavaParamRef<jobject>& obj, |
883 int w, | 895 int w, |
884 int h) { | 896 int h) { |
885 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 897 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
886 browser_view_renderer_.OnAttachedToWindow(w, h); | 898 browser_view_renderer_.OnAttachedToWindow(w, h); |
887 } | 899 } |
888 | 900 |
889 void AwContents::OnDetachedFromWindow(JNIEnv* env, | 901 void AwContents::OnDetachedFromWindow(JNIEnv* env, |
890 const JavaParamRef<jobject>& obj) { | 902 const JavaParamRef<jobject>& obj) { |
891 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 903 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 904 shared_renderer_state_.DeleteHardwareRendererOnUI(); |
892 browser_view_renderer_.OnDetachedFromWindow(); | 905 browser_view_renderer_.OnDetachedFromWindow(); |
893 } | 906 } |
894 | 907 |
895 bool AwContents::IsVisible(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 908 bool AwContents::IsVisible(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
896 return browser_view_renderer_.IsClientVisible(); | 909 return browser_view_renderer_.IsClientVisible(); |
897 } | 910 } |
898 | 911 |
899 void AwContents::DetachFunctorFromView() { | 912 void AwContents::DetachFunctorFromView() { |
900 JNIEnv* env = AttachCurrentThread(); | 913 JNIEnv* env = AttachCurrentThread(); |
901 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 914 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
(...skipping 29 matching lines...) Expand all Loading... |
931 std::vector<uint8_t> state_vector; | 944 std::vector<uint8_t> state_vector; |
932 base::android::JavaByteArrayToByteVector(env, state, &state_vector); | 945 base::android::JavaByteArrayToByteVector(env, state, &state_vector); |
933 | 946 |
934 base::Pickle pickle(reinterpret_cast<const char*>(state_vector.data()), | 947 base::Pickle pickle(reinterpret_cast<const char*>(state_vector.data()), |
935 state_vector.size()); | 948 state_vector.size()); |
936 base::PickleIterator iterator(pickle); | 949 base::PickleIterator iterator(pickle); |
937 | 950 |
938 return RestoreFromPickle(&iterator, web_contents_.get()); | 951 return RestoreFromPickle(&iterator, web_contents_.get()); |
939 } | 952 } |
940 | 953 |
941 bool AwContents::OnDraw(JNIEnv* env, | 954 void AwContents::CleanUpUncommittedFrame() { |
942 const JavaParamRef<jobject>& obj, | 955 browser_view_renderer_.ReturnUnusedResource( |
943 const JavaParamRef<jobject>& canvas, | 956 shared_renderer_state_.PassUncommittedFrameOnUI()); |
944 jboolean is_hardware_accelerated, | 957 } |
945 jint scroll_x, | 958 |
946 jint scroll_y, | 959 void AwContents::CleanUpReturnedResources() { |
947 jint visible_left, | 960 SharedRendererState::ReturnedResourcesMap returned_resource_map; |
948 jint visible_top, | 961 shared_renderer_state_.SwapReturnedResourcesOnUI(&returned_resource_map); |
949 jint visible_right, | 962 |
950 jint visible_bottom) { | 963 for (auto iterator = returned_resource_map.begin(); |
951 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 964 iterator != returned_resource_map.end(); iterator++) { |
952 gfx::Vector2d scroll(scroll_x, scroll_y); | 965 browser_view_renderer_.ReturnResourceFromParent( |
953 browser_view_renderer_.PrepareToDraw( | 966 iterator->first, iterator->second.output_surface_id, |
954 scroll, gfx::Rect(visible_left, visible_top, visible_right - visible_left, | 967 &iterator->second.resources); |
955 visible_bottom - visible_top)); | |
956 if (is_hardware_accelerated && browser_view_renderer_.attached_to_window() && | |
957 !g_force_auxiliary_bitmap_rendering) { | |
958 return browser_view_renderer_.OnDrawHardware(); | |
959 } | 968 } |
| 969 } |
960 | 970 |
| 971 bool AwContents::OnDrawHardware(const gfx::Vector2d& scroll) { |
| 972 shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI(); |
| 973 CleanUpReturnedResources(); |
| 974 |
| 975 shared_renderer_state_.SetScrollOffsetOnUI(scroll); |
| 976 |
| 977 scoped_ptr<ChildFrame> child_frame = browser_view_renderer_.OnDrawHardware(); |
| 978 |
| 979 if (child_frame.get()) { |
| 980 CleanUpUncommittedFrame(); |
| 981 shared_renderer_state_.SetFrameOnUI(std::move(child_frame)); |
| 982 return true; |
| 983 } else { |
| 984 return shared_renderer_state_.HasFrameOnUI(); |
| 985 } |
| 986 } |
| 987 |
| 988 bool AwContents::OnDrawSoftware(const JavaRef<jobject>& canvas, |
| 989 const gfx::Vector2d& scroll) { |
961 gfx::Size view_size = browser_view_renderer_.size(); | 990 gfx::Size view_size = browser_view_renderer_.size(); |
962 if (view_size.IsEmpty()) { | 991 if (view_size.IsEmpty()) { |
963 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_EmptySize", | 992 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_EmptySize", |
964 TRACE_EVENT_SCOPE_THREAD); | 993 TRACE_EVENT_SCOPE_THREAD); |
965 return false; | 994 return false; |
966 } | 995 } |
967 | 996 |
968 // TODO(hush): Right now webview size is passed in as the auxiliary bitmap | 997 // 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 | 998 // size, which might hurt performace (only for software draws with auxiliary |
970 // bitmap). For better performance, get global visible rect, transform it | 999 // bitmap). For better performance, get global visible rect, transform it |
971 // from screen space to view space, then intersect with the webview in | 1000 // from screen space to view space, then intersect with the webview in |
972 // viewspace. Use the resulting rect as the auxiliary bitmap. | 1001 // viewspace. Use the resulting rect as the auxiliary bitmap. |
973 scoped_ptr<SoftwareCanvasHolder> canvas_holder = SoftwareCanvasHolder::Create( | 1002 scoped_ptr<SoftwareCanvasHolder> canvas_holder = SoftwareCanvasHolder::Create( |
974 canvas, scroll, view_size, g_force_auxiliary_bitmap_rendering); | 1003 canvas, scroll, view_size, g_force_auxiliary_bitmap_rendering); |
975 if (!canvas_holder || !canvas_holder->GetCanvas()) { | 1004 if (!canvas_holder || !canvas_holder->GetCanvas()) { |
976 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_NoSoftwareCanvas", | 1005 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_NoSoftwareCanvas", |
977 TRACE_EVENT_SCOPE_THREAD); | 1006 TRACE_EVENT_SCOPE_THREAD); |
978 return false; | 1007 return false; |
979 } | 1008 } |
| 1009 CleanUpReturnedResources(); |
980 return browser_view_renderer_.OnDrawSoftware(canvas_holder->GetCanvas()); | 1010 return browser_view_renderer_.OnDrawSoftware(canvas_holder->GetCanvas()); |
981 } | 1011 } |
982 | 1012 |
| 1013 bool AwContents::OnDraw(JNIEnv* env, |
| 1014 const JavaParamRef<jobject>& obj, |
| 1015 const JavaParamRef<jobject>& canvas, |
| 1016 jboolean is_hardware_accelerated, |
| 1017 jint scroll_x, |
| 1018 jint scroll_y, |
| 1019 jint visible_left, |
| 1020 jint visible_top, |
| 1021 jint visible_right, |
| 1022 jint visible_bottom) { |
| 1023 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1024 browser_view_renderer_.PrepareToDraw(gfx::Rect(visible_left, visible_top, |
| 1025 visible_right - visible_left, |
| 1026 visible_bottom - visible_top)); |
| 1027 gfx::Vector2d scroll(scroll_x, scroll_y); |
| 1028 if (is_hardware_accelerated && browser_view_renderer_.attached_to_window() && |
| 1029 !g_force_auxiliary_bitmap_rendering) { |
| 1030 return OnDrawHardware(scroll); |
| 1031 } else { |
| 1032 return OnDrawSoftware(canvas, scroll); |
| 1033 } |
| 1034 } |
| 1035 |
983 void AwContents::SetPendingWebContentsForPopup( | 1036 void AwContents::SetPendingWebContentsForPopup( |
984 scoped_ptr<content::WebContents> pending) { | 1037 scoped_ptr<content::WebContents> pending) { |
985 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1038 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
986 if (pending_contents_.get()) { | 1039 if (pending_contents_.get()) { |
987 // TODO(benm): Support holding multiple pop up window requests. | 1040 // TODO(benm): Support holding multiple pop up window requests. |
988 LOG(WARNING) << "Blocking popup window creation as an outstanding " | 1041 LOG(WARNING) << "Blocking popup window creation as an outstanding " |
989 << "popup window is still pending."; | 1042 << "popup window is still pending."; |
990 base::MessageLoop::current()->DeleteSoon(FROM_HERE, pending.release()); | 1043 base::MessageLoop::current()->DeleteSoon(FROM_HERE, pending.release()); |
991 return; | 1044 return; |
992 } | 1045 } |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1201 jboolean network_up) { | 1254 jboolean network_up) { |
1202 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1255 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1203 render_view_host_ext_->SetJsOnlineProperty(network_up); | 1256 render_view_host_ext_->SetJsOnlineProperty(network_up); |
1204 } | 1257 } |
1205 | 1258 |
1206 void AwContents::TrimMemory(JNIEnv* env, | 1259 void AwContents::TrimMemory(JNIEnv* env, |
1207 const JavaParamRef<jobject>& obj, | 1260 const JavaParamRef<jobject>& obj, |
1208 jint level, | 1261 jint level, |
1209 jboolean visible) { | 1262 jboolean visible) { |
1210 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1263 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1211 browser_view_renderer_.TrimMemory(level, visible); | 1264 // Constants from Android ComponentCallbacks2. |
| 1265 enum { |
| 1266 TRIM_MEMORY_RUNNING_LOW = 10, |
| 1267 TRIM_MEMORY_UI_HIDDEN = 20, |
| 1268 TRIM_MEMORY_BACKGROUND = 40, |
| 1269 TRIM_MEMORY_MODERATE = 60, |
| 1270 }; |
| 1271 |
| 1272 // Not urgent enough. TRIM_MEMORY_UI_HIDDEN is treated specially because |
| 1273 // it does not indicate memory pressure, but merely that the app is |
| 1274 // backgrounded. |
| 1275 if (level < TRIM_MEMORY_RUNNING_LOW || level == TRIM_MEMORY_UI_HIDDEN) |
| 1276 return; |
| 1277 |
| 1278 // Do not release resources on view we expect to get DrawGL soon. |
| 1279 if (level < TRIM_MEMORY_BACKGROUND && visible) |
| 1280 return; |
| 1281 |
| 1282 if (level >= TRIM_MEMORY_MODERATE) |
| 1283 shared_renderer_state_.TrimMemoryOnUI(level); |
| 1284 |
| 1285 browser_view_renderer_.TrimMemory(level); |
1212 } | 1286 } |
1213 | 1287 |
1214 // TODO(sgurun) add support for posting a frame whose name is known (only | 1288 // 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) | 1289 // main frame is supported at this time, see crbug.com/389721) |
1216 void AwContents::PostMessageToFrame(JNIEnv* env, | 1290 void AwContents::PostMessageToFrame(JNIEnv* env, |
1217 const JavaParamRef<jobject>& obj, | 1291 const JavaParamRef<jobject>& obj, |
1218 const JavaParamRef<jstring>& frame_name, | 1292 const JavaParamRef<jstring>& frame_name, |
1219 const JavaParamRef<jstring>& message, | 1293 const JavaParamRef<jstring>& message, |
1220 const JavaParamRef<jstring>& target_origin, | 1294 const JavaParamRef<jstring>& target_origin, |
1221 const JavaParamRef<jintArray>& sent_ports) { | 1295 const JavaParamRef<jintArray>& sent_ports) { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1276 const JavaParamRef<jobject>& obj) { | 1350 const JavaParamRef<jobject>& obj) { |
1277 web_contents_->ResumeLoadingCreatedWebContents(); | 1351 web_contents_->ResumeLoadingCreatedWebContents(); |
1278 } | 1352 } |
1279 | 1353 |
1280 void SetShouldDownloadFavicons(JNIEnv* env, | 1354 void SetShouldDownloadFavicons(JNIEnv* env, |
1281 const JavaParamRef<jclass>& jclazz) { | 1355 const JavaParamRef<jclass>& jclazz) { |
1282 g_should_download_favicons = true; | 1356 g_should_download_favicons = true; |
1283 } | 1357 } |
1284 | 1358 |
1285 } // namespace android_webview | 1359 } // namespace android_webview |
OLD | NEW |