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 |