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

Side by Side Diff: content/browser/android/dialog_overlay_operations_impl.cc

Issue 2765443004: AndroidOverlay implementation using Dialog. (Closed)
Patch Set: rebased onto gpu_surface_tracker Created 3 years, 8 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
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/android/dialog_overlay_operations_impl.h"
6
7 #include "content/public/browser/web_contents.h"
8 #include "gpu/ipc/common/gpu_surface_tracker.h"
9 #include "jni/DialogOverlayOperationsImpl_jni.h"
10 #include "ui/android/window_android.h"
11
12 using base::android::AttachCurrentThread;
13 using base::android::JavaParamRef;
14 using base::android::ScopedJavaLocalRef;
15
16 namespace content {
17
18 // static
19 bool DialogOverlayOperationsImpl::RegisterDialogOverlayOperationsImpl(
20 JNIEnv* env) {
21 return RegisterNativesImpl(env);
22 }
23
24 static jlong RegisterForTokens(JNIEnv* env,
25 const JavaParamRef<jobject>& obj,
26 jlong high,
27 jlong low) {
28 DCHECK_CURRENTLY_ON(BrowserThread::UI);
29 return reinterpret_cast<jlong>(new DialogOverlayOperationsImpl(
30 obj, base::UnguessableToken::Deserialize(high, low)));
31 }
32
33 static void UnregisterForTokens(
34 JNIEnv* env,
35 const base::android::JavaParamRef<jclass>& jcaller,
36 jlong handle) {
37 DCHECK_CURRENTLY_ON(BrowserThread::UI);
38
39 DialogOverlayOperationsImpl* impl =
40 reinterpret_cast<DialogOverlayOperationsImpl*>(handle);
41 if (!impl)
boliu 2017/04/22 00:22:43 check redundant with java side one
liberato (no reviews please) 2017/04/24 22:19:41 Done.
42 return;
43
44 // Make sure that no tokens are sent after this, even though destruction will
45 // be deferred.
46 impl->UnregisterForTokensIfNeeded();
47
48 // We delete soon since this might be part of an onDismissed callback.
49 BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, impl);
50 }
51
52 DialogOverlayOperationsImpl::DialogOverlayOperationsImpl(
53 const JavaParamRef<jobject>& receiver,
54 const base::UnguessableToken& token)
55 : receiver_(receiver), token_(token), cvc_(nullptr) {
56 DCHECK_CURRENTLY_ON(BrowserThread::UI);
57 cvc_ = GetContentViewCore();
58
59 // If there's no CVC, then just post a null token immediately.
60 if (!cvc_) {
61 JNIEnv* env = AttachCurrentThread();
62 Java_DialogOverlayOperationsImpl_onDismissed(env, receiver_.obj());
63 return;
64 }
65
66 cvc_->AddObserver(this);
67
68 // Also send the initial token, since we'll only get changes.
69 if (ui::WindowAndroid* window = cvc_->GetWindowAndroid()) {
70 ScopedJavaLocalRef<jobject> token = window->GetWindowToken();
71 if (!token.is_null()) {
72 JNIEnv* env = AttachCurrentThread();
73 Java_DialogOverlayOperationsImpl_onWindowToken(env, receiver_.obj(),
74 token);
75 }
76 }
77 }
78
79 DialogOverlayOperationsImpl::~DialogOverlayOperationsImpl() {
80 DCHECK_CURRENTLY_ON(BrowserThread::UI);
81 UnregisterForTokensIfNeeded();
boliu 2017/04/22 00:22:42 DCHECK(!cvc_) instead?
liberato (no reviews please) 2017/04/24 22:19:41 Done.
82 }
83
84 void DialogOverlayOperationsImpl::UnregisterForTokensIfNeeded() {
85 DCHECK_CURRENTLY_ON(BrowserThread::UI);
86 if (!cvc_)
87 return;
88
89 cvc_->RemoveObserver(this);
90 cvc_ = nullptr;
91 }
92
93 void DialogOverlayOperationsImpl::OnContentViewCoreDestroyed() {
94 DCHECK_CURRENTLY_ON(BrowserThread::UI);
95 cvc_ = nullptr;
96
97 JNIEnv* env = AttachCurrentThread();
98 Java_DialogOverlayOperationsImpl_onDismissed(env, receiver_.obj());
99 }
100
101 void DialogOverlayOperationsImpl::OnAttachedToWindow() {
102 DCHECK_CURRENTLY_ON(BrowserThread::UI);
103 JNIEnv* env = AttachCurrentThread();
104
105 ScopedJavaLocalRef<jobject> token;
106
107 if (ui::WindowAndroid* window = cvc_->GetWindowAndroid())
108 token = window->GetWindowToken();
109
110 Java_DialogOverlayOperationsImpl_onWindowToken(env, receiver_.obj(), token);
111 }
112
113 void DialogOverlayOperationsImpl::OnDetachedFromWindow() {
114 JNIEnv* env = AttachCurrentThread();
115 Java_DialogOverlayOperationsImpl_onWindowToken(env, receiver_.obj(), nullptr);
116 }
117
118 ContentViewCoreImpl* DialogOverlayOperationsImpl::GetContentViewCore() {
119 // Get the frame from the token.
120 DCHECK_CURRENTLY_ON(BrowserThread::UI);
121 content::RenderFrameHost* frame =
122 content::RenderFrameHostImpl::FromOverlayRoutingToken(token_);
123 if (!frame) {
124 DVLOG(1) << "Cannot find frame host for token " << token_;
125 return nullptr;
126 }
127
128 content::WebContents* web_contents =
129 content::WebContents::FromRenderFrameHost(frame);
130 DCHECK(web_contents);
131
132 content::ContentViewCoreImpl* cvc =
133 content::ContentViewCoreImpl::FromWebContents(web_contents);
134 if (!cvc) {
135 DVLOG(1) << "Cannot find cvc for token " << token_;
136 return nullptr;
137 }
138
139 return cvc;
140 }
141
142 static jint RegisterSurface(JNIEnv* env,
143 const base::android::JavaParamRef<jclass>& jcaller,
144 const JavaParamRef<jobject>& surface) {
145 DCHECK_CURRENTLY_ON(BrowserThread::UI);
146 return gpu::GpuSurfaceTracker::Get()->AddSurfaceForNativeWidget(
147 gpu::GpuSurfaceTracker::SurfaceRecord(gfx::kNullAcceleratedWidget,
148 surface.obj()));
149 }
150
151 static void UnregisterSurface(
152 JNIEnv* env,
153 const base::android::JavaParamRef<jclass>& jcaller,
154 jint surface_id) {
155 DCHECK_CURRENTLY_ON(BrowserThread::UI);
156 gpu::GpuSurfaceTracker::Get()->RemoveSurface(surface_id);
157 }
158
159 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698