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" |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 309 jint GetNativeInstanceCount(JNIEnv* env, jclass) { | 309 jint GetNativeInstanceCount(JNIEnv* env, jclass) { |
| 310 return base::subtle::NoBarrier_Load(&g_instance_count); | 310 return base::subtle::NoBarrier_Load(&g_instance_count); |
| 311 } | 311 } |
| 312 | 312 |
| 313 jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) { | 313 jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) { |
| 314 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 314 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 315 return reinterpret_cast<intptr_t>(this); | 315 return reinterpret_cast<intptr_t>(this); |
| 316 } | 316 } |
| 317 | 317 |
| 318 void AwContents::DrawGL(AwDrawGLInfo* draw_info) { | 318 void AwContents::DrawGL(AwDrawGLInfo* draw_info) { |
| 319 if (!hardware_renderer_) { | 319 for (base::Closure c = shared_renderer_state_.PopFrontClosure(); !c.is_null(); |
| 320 // TODO(boliu): Use executeHardwareAction to synchronously initialize | 320 c = shared_renderer_state_.PopFrontClosure()) { |
| 321 // hardware on first functor request. Then functor can point directly | 321 c.Run(); |
| 322 // to HardwareRenderer. | |
| 323 hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_)); | |
| 324 } | 322 } |
| 325 | 323 |
| 324 // TODO(boliu): Make this a task as well. | |
| 326 DrawGLResult result; | 325 DrawGLResult result; |
| 327 if (hardware_renderer_->DrawGL(draw_info, &result)) { | 326 if (hardware_renderer_ && hardware_renderer_->DrawGL(draw_info, &result)) { |
| 328 content::BrowserThread::PostTask( | 327 content::BrowserThread::PostTask( |
| 329 content::BrowserThread::UI, | 328 content::BrowserThread::UI, |
| 330 FROM_HERE, | 329 FROM_HERE, |
| 331 base::Bind(&AwContents::DidDrawGL, ui_thread_weak_ptr_, result)); | 330 base::Bind(&AwContents::DidDrawGL, ui_thread_weak_ptr_, result)); |
| 332 } | 331 } |
| 333 } | 332 } |
| 334 | 333 |
| 335 void AwContents::DidDrawGL(const DrawGLResult& result) { | 334 void AwContents::DidDrawGL(const DrawGLResult& result) { |
| 336 browser_view_renderer_.DidDrawGL(result); | 335 browser_view_renderer_.DidDrawGL(result); |
| 337 } | 336 } |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 598 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 597 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 599 JNIEnv* env = AttachCurrentThread(); | 598 JNIEnv* env = AttachCurrentThread(); |
| 600 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 599 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
| 601 if (obj.is_null()) | 600 if (obj.is_null()) |
| 602 return; | 601 return; |
| 603 | 602 |
| 604 Java_AwContents_onReceivedTouchIconUrl( | 603 Java_AwContents_onReceivedTouchIconUrl( |
| 605 env, obj.obj(), ConvertUTF8ToJavaString(env, url).obj(), precomposed); | 604 env, obj.obj(), ConvertUTF8ToJavaString(env, url).obj(), precomposed); |
| 606 } | 605 } |
| 607 | 606 |
| 608 bool AwContents::RequestDrawGL(jobject canvas) { | 607 bool AwContents::RequestDrawGL(jobject canvas, bool wait_for_completion) { |
| 609 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 608 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 610 JNIEnv* env = AttachCurrentThread(); | 609 JNIEnv* env = AttachCurrentThread(); |
| 611 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 610 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
| 612 if (obj.is_null()) | 611 if (obj.is_null()) |
| 613 return false; | 612 return false; |
| 614 return Java_AwContents_requestDrawGL(env, obj.obj(), canvas); | 613 return Java_AwContents_requestDrawGL( |
| 614 env, obj.obj(), canvas, wait_for_completion); | |
| 615 } | 615 } |
| 616 | 616 |
| 617 void AwContents::PostInvalidate() { | 617 void AwContents::PostInvalidate() { |
| 618 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 618 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 619 JNIEnv* env = AttachCurrentThread(); | 619 JNIEnv* env = AttachCurrentThread(); |
| 620 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 620 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
| 621 if (!obj.is_null()) | 621 if (!obj.is_null()) |
| 622 Java_AwContents_postInvalidateOnAnimation(env, obj.obj()); | 622 Java_AwContents_postInvalidateOnAnimation(env, obj.obj()); |
| 623 } | 623 } |
| 624 | 624 |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 719 if (cvc) { | 719 if (cvc) { |
| 720 cvc->PauseOrResumeGeolocation(paused); | 720 cvc->PauseOrResumeGeolocation(paused); |
| 721 if (paused) { | 721 if (paused) { |
| 722 cvc->PauseVideo(); | 722 cvc->PauseVideo(); |
| 723 } | 723 } |
| 724 } | 724 } |
| 725 } | 725 } |
| 726 | 726 |
| 727 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) { | 727 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) { |
| 728 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 728 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 729 // Add task but don't schedule it. It will run when DrawGL is called for | |
| 730 // the first time. | |
| 731 shared_renderer_state_.AppendClosure( | |
| 732 base::Bind(&AwContents::InitializeHardwareDrawOnRenderThread, | |
| 733 base::Unretained(this))); | |
| 729 browser_view_renderer_.OnAttachedToWindow(w, h); | 734 browser_view_renderer_.OnAttachedToWindow(w, h); |
| 730 } | 735 } |
| 731 | 736 |
| 737 void AwContents::InitializeHardwareDrawOnRenderThread() { | |
| 738 DCHECK(!hardware_renderer_); | |
| 739 DCHECK(!shared_renderer_state_.IsHardwareInitialized()); | |
| 740 hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_)); | |
| 741 shared_renderer_state_.SetHardwareInitialized(true); | |
|
hush (inactive)
2014/05/01 00:35:54
why do we need this?
We are resetting hardware_ren
boliu
2014/05/01 00:46:36
Can't query hardware_renderer_ on UI thread since
hush (inactive)
2014/05/01 01:08:04
okay
On 2014/05/01 00:46:36, boliu wrote:
| |
| 742 } | |
| 743 | |
| 732 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) { | 744 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) { |
| 733 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 745 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 746 | |
| 747 shared_renderer_state_.ClearClosureQueue(); | |
| 748 shared_renderer_state_.AppendClosure(base::Bind( | |
| 749 &AwContents::ReleaseHardwareDrawOnRenderThread, base::Unretained(this))); | |
| 750 bool draw_functor_succeeded = RequestDrawGL(NULL, true); | |
|
hush (inactive)
2014/05/01 00:35:54
these 3 lines seem like a good candidate for a mem
boliu
2014/05/01 00:46:36
I thought about it, but we have 3 tasks and 3 diff
hush (inactive)
2014/05/01 01:08:04
alright
On 2014/05/01 00:46:36, boliu wrote:
| |
| 751 if (!draw_functor_succeeded && | |
| 752 shared_renderer_state_.IsHardwareInitialized()) { | |
| 753 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked"; | |
| 754 // Calling release on wrong thread intentionally. | |
| 755 ReleaseHardwareDrawOnRenderThread(); | |
| 756 } else { | |
| 757 shared_renderer_state_.ClearClosureQueue(); | |
| 758 } | |
| 759 | |
| 734 browser_view_renderer_.OnDetachedFromWindow(); | 760 browser_view_renderer_.OnDetachedFromWindow(); |
| 735 } | 761 } |
| 736 | 762 |
| 737 void AwContents::ReleaseHardwareDrawOnRenderThread(JNIEnv* env, jobject obj) { | 763 void AwContents::ReleaseHardwareDrawOnRenderThread() { |
| 764 DCHECK(hardware_renderer_); | |
| 765 DCHECK(shared_renderer_state_.IsHardwareInitialized()); | |
| 766 // No point in running any other commands if we released hardware already. | |
| 767 shared_renderer_state_.ClearClosureQueue(); | |
| 738 hardware_renderer_.reset(); | 768 hardware_renderer_.reset(); |
| 769 shared_renderer_state_.SetHardwareInitialized(false); | |
| 739 } | 770 } |
| 740 | 771 |
| 741 base::android::ScopedJavaLocalRef<jbyteArray> | 772 base::android::ScopedJavaLocalRef<jbyteArray> |
| 742 AwContents::GetOpaqueState(JNIEnv* env, jobject obj) { | 773 AwContents::GetOpaqueState(JNIEnv* env, jobject obj) { |
| 743 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 774 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 744 // Required optimization in WebViewClassic to not save any state if | 775 // Required optimization in WebViewClassic to not save any state if |
| 745 // there has been no navigations. | 776 // there has been no navigations. |
| 746 if (!web_contents_->GetController().GetEntryCount()) | 777 if (!web_contents_->GetController().GetEntryCount()) |
| 747 return ScopedJavaLocalRef<jbyteArray>(); | 778 return ScopedJavaLocalRef<jbyteArray>(); |
| 748 | 779 |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 987 base::Bind(&NotifyClientCertificatesChanged)); | 1018 base::Bind(&NotifyClientCertificatesChanged)); |
| 988 } | 1019 } |
| 989 | 1020 |
| 990 void AwContents::SetJsOnlineProperty(JNIEnv* env, | 1021 void AwContents::SetJsOnlineProperty(JNIEnv* env, |
| 991 jobject obj, | 1022 jobject obj, |
| 992 jboolean network_up) { | 1023 jboolean network_up) { |
| 993 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1024 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 994 render_view_host_ext_->SetJsOnlineProperty(network_up); | 1025 render_view_host_ext_->SetJsOnlineProperty(network_up); |
| 995 } | 1026 } |
| 996 | 1027 |
| 997 void AwContents::TrimMemoryOnRenderThread(JNIEnv* env, | 1028 void AwContents::TrimMemory(JNIEnv* env, |
| 998 jobject obj, | 1029 jobject obj, |
| 999 jint level, | 1030 jint level, |
| 1000 jboolean visible) { | 1031 jboolean visible) { |
| 1001 if (hardware_renderer_) { | 1032 if (!shared_renderer_state_.IsHardwareInitialized()) |
| 1002 if (hardware_renderer_->TrimMemory(level, visible)) { | 1033 return; |
| 1003 content::BrowserThread::PostTask( | 1034 |
| 1004 content::BrowserThread::UI, | 1035 shared_renderer_state_.AppendClosure( |
| 1005 FROM_HERE, | 1036 base::Bind(&AwContents::TrimMemoryOnRenderThread, |
| 1006 base::Bind(&AwContents::ForceFakeComposite, ui_thread_weak_ptr_)); | 1037 base::Unretained(this), |
| 1007 } | 1038 level, |
| 1039 visible)); | |
| 1040 RequestDrawGL(NULL, true); | |
| 1041 } | |
| 1042 | |
| 1043 void AwContents::TrimMemoryOnRenderThread(int level, bool visible) { | |
| 1044 if (hardware_renderer_ && hardware_renderer_->TrimMemory(level, visible)) { | |
| 1045 content::BrowserThread::PostTask( | |
| 1046 content::BrowserThread::UI, | |
| 1047 FROM_HERE, | |
| 1048 base::Bind(&AwContents::ForceFakeComposite, ui_thread_weak_ptr_)); | |
| 1008 } | 1049 } |
| 1009 } | 1050 } |
| 1010 | 1051 |
| 1011 void AwContents::ForceFakeComposite() { | 1052 void AwContents::ForceFakeComposite() { |
| 1012 browser_view_renderer_.ForceFakeCompositeSW(); | 1053 browser_view_renderer_.ForceFakeCompositeSW(); |
| 1013 } | 1054 } |
| 1014 | 1055 |
| 1015 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) { | 1056 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) { |
| 1016 g_should_download_favicons = true; | 1057 g_should_download_favicons = true; |
| 1017 } | 1058 } |
| 1018 | 1059 |
| 1019 } // namespace android_webview | 1060 } // namespace android_webview |
| OLD | NEW |