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 | 8 |
| 9 #include "android_webview/browser/aw_browser_context.h" | 9 #include "android_webview/browser/aw_browser_context.h" |
| 10 #include "android_webview/browser/aw_browser_main_parts.h" | 10 #include "android_webview/browser/aw_browser_main_parts.h" |
| 11 #include "android_webview/browser/aw_resource_context.h" | 11 #include "android_webview/browser/aw_resource_context.h" |
| 12 #include "android_webview/browser/browser_view_renderer.h" | 12 #include "android_webview/browser/browser_view_renderer.h" |
| 13 #include "android_webview/browser/deferred_gpu_command_service.h" | |
| 13 #include "android_webview/browser/gpu_memory_buffer_factory_impl.h" | 14 #include "android_webview/browser/gpu_memory_buffer_factory_impl.h" |
| 14 #include "android_webview/browser/hardware_renderer.h" | 15 #include "android_webview/browser/hardware_renderer.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" |
| 18 #include "android_webview/browser/scoped_app_gl_state_restore.h" | |
| 17 #include "android_webview/common/aw_hit_test_data.h" | 19 #include "android_webview/common/aw_hit_test_data.h" |
| 18 #include "android_webview/common/devtools_instrumentation.h" | 20 #include "android_webview/common/devtools_instrumentation.h" |
| 19 #include "android_webview/native/aw_autofill_manager_delegate.h" | 21 #include "android_webview/native/aw_autofill_manager_delegate.h" |
| 20 #include "android_webview/native/aw_browser_dependency_factory.h" | 22 #include "android_webview/native/aw_browser_dependency_factory.h" |
| 21 #include "android_webview/native/aw_contents_client_bridge.h" | 23 #include "android_webview/native/aw_contents_client_bridge.h" |
| 22 #include "android_webview/native/aw_contents_io_thread_client_impl.h" | 24 #include "android_webview/native/aw_contents_io_thread_client_impl.h" |
| 23 #include "android_webview/native/aw_pdf_exporter.h" | 25 #include "android_webview/native/aw_pdf_exporter.h" |
| 24 #include "android_webview/native/aw_picture.h" | 26 #include "android_webview/native/aw_picture.h" |
| 25 #include "android_webview/native/aw_web_contents_delegate.h" | 27 #include "android_webview/native/aw_web_contents_delegate.h" |
| 26 #include "android_webview/native/java_browser_view_renderer_helper.h" | 28 #include "android_webview/native/java_browser_view_renderer_helper.h" |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 152 : weak_factory_on_ui_thread_(this), | 154 : weak_factory_on_ui_thread_(this), |
| 153 ui_thread_weak_ptr_(weak_factory_on_ui_thread_.GetWeakPtr()), | 155 ui_thread_weak_ptr_(weak_factory_on_ui_thread_.GetWeakPtr()), |
| 154 web_contents_(web_contents.Pass()), | 156 web_contents_(web_contents.Pass()), |
| 155 shared_renderer_state_( | 157 shared_renderer_state_( |
| 156 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), | 158 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), |
| 157 this), | 159 this), |
| 158 browser_view_renderer_( | 160 browser_view_renderer_( |
| 159 this, | 161 this, |
| 160 &shared_renderer_state_, | 162 &shared_renderer_state_, |
| 161 web_contents_.get(), | 163 web_contents_.get(), |
| 162 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)) { | 164 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)), |
| 165 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()) { | |
| 163 base::subtle::NoBarrier_AtomicIncrement(&g_instance_count, 1); | 166 base::subtle::NoBarrier_AtomicIncrement(&g_instance_count, 1); |
| 164 icon_helper_.reset(new IconHelper(web_contents_.get())); | 167 icon_helper_.reset(new IconHelper(web_contents_.get())); |
| 165 icon_helper_->SetListener(this); | 168 icon_helper_->SetListener(this); |
| 166 web_contents_->SetUserData(kAwContentsUserDataKey, | 169 web_contents_->SetUserData(kAwContentsUserDataKey, |
| 167 new AwContentsUserData(this)); | 170 new AwContentsUserData(this)); |
| 168 render_view_host_ext_.reset( | 171 render_view_host_ext_.reset( |
| 169 new AwRenderViewHostExt(this, web_contents_.get())); | 172 new AwRenderViewHostExt(this, web_contents_.get())); |
| 170 | 173 |
| 171 permission_request_handler_.reset(new PermissionRequestHandler(this)); | 174 permission_request_handler_.reset(new PermissionRequestHandler(this)); |
| 172 | 175 |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 317 jint GetNativeInstanceCount(JNIEnv* env, jclass) { | 320 jint GetNativeInstanceCount(JNIEnv* env, jclass) { |
| 318 return base::subtle::NoBarrier_Load(&g_instance_count); | 321 return base::subtle::NoBarrier_Load(&g_instance_count); |
| 319 } | 322 } |
| 320 | 323 |
| 321 jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) { | 324 jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) { |
| 322 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 325 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 323 return reinterpret_cast<intptr_t>(this); | 326 return reinterpret_cast<intptr_t>(this); |
| 324 } | 327 } |
| 325 | 328 |
| 326 void AwContents::DrawGL(AwDrawGLInfo* draw_info) { | 329 void AwContents::DrawGL(AwDrawGLInfo* draw_info) { |
| 330 GLViewRendererManager::GetInstance()->DidDrawGL(renderer_manager_key_); | |
| 331 | |
| 332 ScopedAppGLStateRestore state_restore( | |
| 333 draw_info->mode == AwDrawGLInfo::kModeDraw | |
| 334 ? ScopedAppGLStateRestore::MODE_DRAW | |
| 335 : ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT); | |
| 336 ScopedAllowGL allow_gl; | |
| 337 | |
| 327 for (base::Closure c = shared_renderer_state_.PopFrontClosure(); !c.is_null(); | 338 for (base::Closure c = shared_renderer_state_.PopFrontClosure(); !c.is_null(); |
| 328 c = shared_renderer_state_.PopFrontClosure()) { | 339 c = shared_renderer_state_.PopFrontClosure()) { |
| 329 c.Run(); | 340 c.Run(); |
| 330 } | 341 } |
| 331 | 342 |
| 343 if (!hardware_renderer_) | |
| 344 return; | |
| 345 | |
| 332 // TODO(boliu): Make this a task as well. | 346 // TODO(boliu): Make this a task as well. |
| 333 DrawGLResult result; | 347 DrawGLResult result; |
| 334 if (hardware_renderer_ && hardware_renderer_->DrawGL(draw_info, &result)) { | 348 if (hardware_renderer_->DrawGL(state_restore.stencil_enabled(), |
| 349 state_restore.framebuffer_binding_ext(), | |
| 350 draw_info, | |
| 351 &result)) { | |
| 335 content::BrowserThread::PostTask( | 352 content::BrowserThread::PostTask( |
| 336 content::BrowserThread::UI, | 353 content::BrowserThread::UI, |
| 337 FROM_HERE, | 354 FROM_HERE, |
| 338 base::Bind(&AwContents::DidDrawGL, ui_thread_weak_ptr_, result)); | 355 base::Bind(&AwContents::DidDrawGL, ui_thread_weak_ptr_, result)); |
| 339 } | 356 } |
| 340 } | 357 } |
| 341 | 358 |
| 342 void AwContents::DidDrawGL(const DrawGLResult& result) { | 359 void AwContents::DidDrawGL(const DrawGLResult& result) { |
| 343 browser_view_renderer_.DidDrawGL(result); | 360 browser_view_renderer_.DidDrawGL(result); |
| 344 } | 361 } |
| (...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 752 if (cvc) { | 769 if (cvc) { |
| 753 cvc->PauseOrResumeGeolocation(paused); | 770 cvc->PauseOrResumeGeolocation(paused); |
| 754 if (paused) { | 771 if (paused) { |
| 755 cvc->PauseVideo(); | 772 cvc->PauseVideo(); |
| 756 } | 773 } |
| 757 } | 774 } |
| 758 } | 775 } |
| 759 | 776 |
| 760 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) { | 777 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) { |
| 761 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 778 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 762 // Add task but don't schedule it. It will run when DrawGL is called for | |
| 763 // the first time. | |
| 764 shared_renderer_state_.AppendClosure( | |
| 765 base::Bind(&AwContents::InitializeHardwareDrawOnRenderThread, | |
| 766 base::Unretained(this))); | |
| 767 browser_view_renderer_.OnAttachedToWindow(w, h); | 779 browser_view_renderer_.OnAttachedToWindow(w, h); |
| 768 } | 780 } |
| 769 | 781 |
| 782 void AwContents::InitializeHardwareDrawIfNeeded() { | |
| 783 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); | |
| 784 if (renderer_manager_key_ == manager->NullKey()) { | |
| 785 // Add task but don't schedule it. It will run when DrawGL is called for | |
| 786 // the first time. | |
| 787 shared_renderer_state_.AppendClosure( | |
| 788 base::Bind(&AwContents::InitializeHardwareDrawOnRenderThread, | |
| 789 base::Unretained(this))); | |
| 790 renderer_manager_key_ = manager->PushBack(&shared_renderer_state_); | |
| 791 DeferredGpuCommandService::SetInstance(); | |
| 792 } | |
| 793 } | |
| 794 | |
| 770 void AwContents::InitializeHardwareDrawOnRenderThread() { | 795 void AwContents::InitializeHardwareDrawOnRenderThread() { |
| 771 DCHECK(!hardware_renderer_); | 796 DCHECK(!hardware_renderer_); |
| 772 DCHECK(!shared_renderer_state_.IsHardwareInitialized()); | 797 DCHECK(!shared_renderer_state_.IsHardwareInitialized()); |
| 773 hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_)); | 798 hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_)); |
| 774 shared_renderer_state_.SetHardwareInitialized(true); | 799 shared_renderer_state_.SetHardwareInitialized(true); |
| 775 } | 800 } |
| 776 | 801 |
| 777 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) { | 802 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) { |
| 778 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 803 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 779 | 804 |
| 780 shared_renderer_state_.ClearClosureQueue(); | 805 shared_renderer_state_.ClearClosureQueue(); |
| 781 shared_renderer_state_.AppendClosure(base::Bind( | 806 shared_renderer_state_.AppendClosure(base::Bind( |
| 782 &AwContents::ReleaseHardwareDrawOnRenderThread, base::Unretained(this))); | 807 &AwContents::ReleaseHardwareDrawOnRenderThread, base::Unretained(this))); |
| 783 bool draw_functor_succeeded = RequestDrawGL(NULL, true); | 808 bool draw_functor_succeeded = RequestDrawGL(NULL, true); |
| 784 if (!draw_functor_succeeded && | 809 if (!draw_functor_succeeded && |
| 785 shared_renderer_state_.IsHardwareInitialized()) { | 810 shared_renderer_state_.IsHardwareInitialized()) { |
| 786 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked"; | 811 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked?"; |
| 787 // Calling release on wrong thread intentionally. | 812 // Calling release on wrong thread intentionally. |
| 788 ReleaseHardwareDrawOnRenderThread(); | 813 AwDrawGLInfo info; |
| 814 info.mode = AwDrawGLInfo::kModeProcess; | |
| 815 DrawGL(&info); | |
| 789 } else { | 816 } else { |
| 790 shared_renderer_state_.ClearClosureQueue(); | 817 shared_renderer_state_.ClearClosureQueue(); |
| 791 } | 818 } |
| 792 | 819 |
| 793 browser_view_renderer_.OnDetachedFromWindow(); | 820 browser_view_renderer_.OnDetachedFromWindow(); |
| 821 | |
| 822 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); | |
| 823 if (renderer_manager_key_ != manager->NullKey()) { | |
| 824 manager->Remove(renderer_manager_key_); | |
| 825 renderer_manager_key_ = manager->NullKey(); | |
| 826 } | |
| 794 } | 827 } |
| 795 | 828 |
| 796 void AwContents::ReleaseHardwareDrawOnRenderThread() { | 829 void AwContents::ReleaseHardwareDrawOnRenderThread() { |
| 797 // No point in running any other commands if we released hardware already. | 830 // No point in running any other commands if we released hardware already. |
| 798 shared_renderer_state_.ClearClosureQueue(); | 831 shared_renderer_state_.ClearClosureQueue(); |
| 799 if (!shared_renderer_state_.IsHardwareInitialized()) | 832 if (!shared_renderer_state_.IsHardwareInitialized()) |
| 800 return; | 833 return; |
| 801 | 834 |
| 802 hardware_renderer_.reset(); | 835 hardware_renderer_.reset(); |
| 803 shared_renderer_state_.SetHardwareInitialized(false); | 836 shared_renderer_state_.SetHardwareInitialized(false); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 843 jint scroll_y, | 876 jint scroll_y, |
| 844 jint visible_left, | 877 jint visible_left, |
| 845 jint visible_top, | 878 jint visible_top, |
| 846 jint visible_right, | 879 jint visible_right, |
| 847 jint visible_bottom, | 880 jint visible_bottom, |
| 848 jint clip_left, | 881 jint clip_left, |
| 849 jint clip_top, | 882 jint clip_top, |
| 850 jint clip_right, | 883 jint clip_right, |
| 851 jint clip_bottom) { | 884 jint clip_bottom) { |
| 852 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 885 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 886 if (is_hardware_accelerated) | |
|
sgurun-gerrit only
2014/05/08 22:55:12
why is moving the initialization to here a better
boliu
2014/05/08 23:03:47
It didn't really move, it's just preparation for u
| |
| 887 InitializeHardwareDrawIfNeeded(); | |
| 853 return browser_view_renderer_.OnDraw( | 888 return browser_view_renderer_.OnDraw( |
| 854 canvas, | 889 canvas, |
| 855 is_hardware_accelerated, | 890 is_hardware_accelerated, |
| 856 gfx::Vector2d(scroll_x, scroll_y), | 891 gfx::Vector2d(scroll_x, scroll_y), |
| 857 gfx::Rect(visible_left, | 892 gfx::Rect(visible_left, |
| 858 visible_top, | 893 visible_top, |
| 859 visible_right - visible_left, | 894 visible_right - visible_left, |
| 860 visible_bottom - visible_top), | 895 visible_bottom - visible_top), |
| 861 gfx::Rect( | 896 gfx::Rect( |
| 862 clip_left, clip_top, clip_right - clip_left, clip_bottom - clip_top)); | 897 clip_left, clip_top, clip_right - clip_left, clip_bottom - clip_top)); |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1062 return; | 1097 return; |
| 1063 | 1098 |
| 1064 browser_view_renderer_.TrimMemory(level, visible); | 1099 browser_view_renderer_.TrimMemory(level, visible); |
| 1065 } | 1100 } |
| 1066 | 1101 |
| 1067 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) { | 1102 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) { |
| 1068 g_should_download_favicons = true; | 1103 g_should_download_favicons = true; |
| 1069 } | 1104 } |
| 1070 | 1105 |
| 1071 } // namespace android_webview | 1106 } // namespace android_webview |
| OLD | NEW |