Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(494)

Side by Side Diff: android_webview/glue/java/src/com/android/webview/chromium/DrawGLFunctor.java

Issue 872403006: aw: Make repeated detachGLFunctor work (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 package com.android.webview.chromium; 5 package com.android.webview.chromium;
6 6
7 import android.graphics.Canvas; 7 import android.graphics.Canvas;
8 import android.view.View; 8 import android.view.View;
9 9
10 import com.android.webview.chromium.WebViewDelegateFactory.WebViewDelegate; 10 import com.android.webview.chromium.WebViewDelegateFactory.WebViewDelegate;
11 11
12 import org.chromium.content.common.CleanupReference; 12 import org.chromium.content.common.CleanupReference;
13 13
14 /** 14 /**
15 * Simple Java abstraction and wrapper for the native DrawGLFunctor flow. 15 * Simple Java abstraction and wrapper for the native DrawGLFunctor flow.
16 * An instance of this class can be constructed, bound to a single view context (i.e. AwContennts) 16 * An instance of this class can be constructed, bound to a single view context (i.e. AwContennts)
17 * and then drawn and detached from the view tree any number of times (using req uestDrawGL and 17 * and then drawn and detached from the view tree any number of times (using req uestDrawGL and
18 * detach respectively). Then when finished with, it can be explicitly released by calling 18 * detach respectively). Then when finished with, it can be explicitly released by calling
19 * destroy() or will clean itself up as required via finalizer / CleanupReferenc e. 19 * destroy() or will clean itself up as required via finalizer / CleanupReferenc e.
20 */ 20 */
21 class DrawGLFunctor { 21 class DrawGLFunctor {
22 private static final String TAG = DrawGLFunctor.class.getSimpleName(); 22 private static final String TAG = DrawGLFunctor.class.getSimpleName();
23 23
24 // Pointer to native side instance 24 // Pointer to native side instance
25 private CleanupReference mCleanupReference; 25 private CleanupReference mCleanupReference;
26 private DestroyRunnable mDestroyRunnable; 26 private DestroyRunnable mDestroyRunnable;
27 private final long mNativeDrawGLFunctor;
27 private WebViewDelegate mWebViewDelegate; 28 private WebViewDelegate mWebViewDelegate;
29 View mContainerView;
28 30
29 public DrawGLFunctor(long viewContext, WebViewDelegate webViewDelegate) { 31 public DrawGLFunctor(long viewContext, WebViewDelegate webViewDelegate) {
30 mDestroyRunnable = new DestroyRunnable(nativeCreateGLFunctor(viewContext ), webViewDelegate); 32 mNativeDrawGLFunctor = nativeCreateGLFunctor(viewContext);
33 mDestroyRunnable = new DestroyRunnable(mNativeDrawGLFunctor);
31 mCleanupReference = new CleanupReference(this, mDestroyRunnable); 34 mCleanupReference = new CleanupReference(this, mDestroyRunnable);
32 mWebViewDelegate = webViewDelegate; 35 mWebViewDelegate = webViewDelegate;
33 } 36 }
34 37
35 public void destroy() { 38 public void destroy() {
36 detach(); 39 detach();
37 if (mCleanupReference != null) { 40 if (mCleanupReference != null) {
38 mCleanupReference.cleanupNow(); 41 mCleanupReference.cleanupNow();
39 mCleanupReference = null; 42 mCleanupReference = null;
40 mDestroyRunnable = null; 43 mDestroyRunnable = null;
41 mWebViewDelegate = null; 44 mWebViewDelegate = null;
45 mContainerView = null;
42 } 46 }
43 } 47 }
44 48
45 public void detach() { 49 public void detach() {
46 mDestroyRunnable.detachNativeFunctor(); 50 if (mWebViewDelegate != null && mContainerView != null) {
51 mWebViewDelegate.detachDrawGlFunctor(mContainerView, mNativeDrawGLFu nctor);
52 }
47 } 53 }
48 54
49 public boolean requestDrawGL(Canvas canvas, View containerView, boolean wait ForCompletion) { 55 public boolean requestDrawGL(Canvas canvas, View containerView, boolean wait ForCompletion) {
50 if (mDestroyRunnable.mNativeDrawGLFunctor == 0) { 56 if (mDestroyRunnable.mNativeDrawGLFunctor == 0) {
51 throw new RuntimeException("requested DrawGL on already destroyed Dr awGLFunctor"); 57 throw new RuntimeException("requested DrawGL on already destroyed Dr awGLFunctor");
52 } 58 }
53 59
54 if (canvas != null && waitForCompletion) { 60 if (canvas != null && waitForCompletion) {
55 throw new IllegalArgumentException( 61 throw new IllegalArgumentException(
56 "requested a blocking DrawGL with a not null canvas."); 62 "requested a blocking DrawGL with a not null canvas.");
57 } 63 }
58 64
59 if (!mWebViewDelegate.canInvokeDrawGlFunctor(containerView)) { 65 if (!mWebViewDelegate.canInvokeDrawGlFunctor(containerView)) {
60 return false; 66 return false;
61 } 67 }
62 68
63 mDestroyRunnable.mContainerView = containerView; 69 mContainerView = containerView;
64 70
65 if (canvas == null) { 71 if (canvas == null) {
66 mWebViewDelegate.invokeDrawGlFunctor( 72 mWebViewDelegate.invokeDrawGlFunctor(
67 containerView, mDestroyRunnable.mNativeDrawGLFunctor, waitFo rCompletion); 73 containerView, mDestroyRunnable.mNativeDrawGLFunctor, waitFo rCompletion);
68 return true; 74 return true;
69 } 75 }
70 76
71 mWebViewDelegate.callDrawGlFunction(canvas, mDestroyRunnable.mNativeDraw GLFunctor); 77 mWebViewDelegate.callDrawGlFunction(canvas, mDestroyRunnable.mNativeDraw GLFunctor);
72 return true; 78 return true;
73 } 79 }
74 80
75 public static void setChromiumAwDrawGLFunction(long functionPointer) { 81 public static void setChromiumAwDrawGLFunction(long functionPointer) {
76 nativeSetChromiumAwDrawGLFunction(functionPointer); 82 nativeSetChromiumAwDrawGLFunction(functionPointer);
77 } 83 }
78 84
79 // Holds the core resources of the class, everything required to correctly c leanup. 85 // Holds the core resources of the class, everything required to correctly c leanup.
80 // IMPORTANT: this class must not hold any reference back to the outer DrawG LFunctor 86 // IMPORTANT: this class must not hold any reference back to the outer DrawG LFunctor
81 // instance, as that will defeat GC of that object. 87 // instance, as that will defeat GC of that object.
82 private static final class DestroyRunnable implements Runnable { 88 private static final class DestroyRunnable implements Runnable {
83 private WebViewDelegate mWebViewDelegate; 89 private long mNativeDrawGLFunctor;
84 View mContainerView; 90 DestroyRunnable(long nativeDrawGLFunctor) {
85 long mNativeDrawGLFunctor;
86 DestroyRunnable(long nativeDrawGLFunctor, WebViewDelegate webViewDelegat e) {
87 mNativeDrawGLFunctor = nativeDrawGLFunctor; 91 mNativeDrawGLFunctor = nativeDrawGLFunctor;
88 mWebViewDelegate = webViewDelegate; 92 assert mNativeDrawGLFunctor != 0;
89 } 93 }
90 94
91 // Called when the outer DrawGLFunctor instance has been GC'ed, i.e this is its finalizer. 95 // Called when the outer DrawGLFunctor instance has been GC'ed, i.e this is its finalizer.
92 @Override 96 @Override
93 public void run() { 97 public void run() {
94 detachNativeFunctor(); 98 assert mNativeDrawGLFunctor != 0;
95 nativeDestroyGLFunctor(mNativeDrawGLFunctor); 99 nativeDestroyGLFunctor(mNativeDrawGLFunctor);
96 mNativeDrawGLFunctor = 0; 100 mNativeDrawGLFunctor = 0;
97 } 101 }
98
99 void detachNativeFunctor() {
100 if (mNativeDrawGLFunctor != 0 && mContainerView != null && mWebViewD elegate != null) {
101 mWebViewDelegate.detachDrawGlFunctor(mContainerView, mNativeDraw GLFunctor);
102 }
103 mContainerView = null;
104 mWebViewDelegate = null;
105 }
106 } 102 }
107 103
108 private static native long nativeCreateGLFunctor(long viewContext); 104 private static native long nativeCreateGLFunctor(long viewContext);
109 private static native void nativeDestroyGLFunctor(long functor); 105 private static native void nativeDestroyGLFunctor(long functor);
110 private static native void nativeSetChromiumAwDrawGLFunction(long functionPo inter); 106 private static native void nativeSetChromiumAwDrawGLFunction(long functionPo inter);
111 } 107 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698