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

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

Issue 2765443004: AndroidOverlay implementation using Dialog. (Closed)
Patch Set: removed a TODO that wouldn't work 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_impl.h"
6
7 #include "content/public/browser/web_contents.h"
8 #include "gpu/ipc/common/gpu_surface_tracker.h"
9 #include "jni/DialogOverlayImpl_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 DialogOverlayImpl::RegisterDialogOverlayImpl(JNIEnv* env) {
20 return RegisterNativesImpl(env);
21 }
22
23 static jlong RegisterForTokens(JNIEnv* env,
24 const JavaParamRef<jobject>& obj,
25 jlong high,
26 jlong low) {
27 DCHECK_CURRENTLY_ON(BrowserThread::UI);
28 return reinterpret_cast<jlong>(new DialogOverlayImpl(
29 obj, base::UnguessableToken::Deserialize(high, low)));
30 }
31
32 static void UnregisterForTokens(
33 JNIEnv* env,
34 const base::android::JavaParamRef<jclass>& jcaller,
35 jlong handle) {
36 DCHECK_CURRENTLY_ON(BrowserThread::UI);
37
38 DialogOverlayImpl* impl = reinterpret_cast<DialogOverlayImpl*>(handle);
39
40 // Make sure that no tokens are sent after this, even though destruction will
41 // be deferred.
42 impl->UnregisterForTokensIfNeeded();
43
44 // We delete soon since this might be part of an onDismissed callback.
45 BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, impl);
46 }
47
48 DialogOverlayImpl::DialogOverlayImpl(const JavaParamRef<jobject>& receiver,
49 const base::UnguessableToken& token)
50 : receiver_(receiver), token_(token), cvc_(nullptr) {
51 DCHECK_CURRENTLY_ON(BrowserThread::UI);
52 cvc_ = GetContentViewCore();
53
54 // If there's no CVC, then just post a null token immediately.
55 if (!cvc_) {
56 JNIEnv* env = AttachCurrentThread();
57 Java_DialogOverlayImpl_onDismissed(env, receiver_.obj());
58 return;
59 }
60
61 cvc_->AddObserver(this);
62
63 // Also send the initial token, since we'll only get changes.
64 if (ui::WindowAndroid* window = cvc_->GetWindowAndroid()) {
65 ScopedJavaLocalRef<jobject> token = window->GetWindowToken();
66 if (!token.is_null()) {
67 JNIEnv* env = AttachCurrentThread();
68 Java_DialogOverlayImpl_onWindowToken(env, receiver_.obj(), token);
69 }
70 }
71 }
72
73 DialogOverlayImpl::~DialogOverlayImpl() {
74 DCHECK_CURRENTLY_ON(BrowserThread::UI);
75 // We should only be deleted after one unregisters for token callbacks.
76 DCHECK(!cvc_);
77 }
78
79 void DialogOverlayImpl::UnregisterForTokensIfNeeded() {
80 DCHECK_CURRENTLY_ON(BrowserThread::UI);
81 if (!cvc_)
82 return;
83
84 cvc_->RemoveObserver(this);
85 cvc_ = nullptr;
86 }
87
88 void DialogOverlayImpl::OnContentViewCoreDestroyed() {
89 DCHECK_CURRENTLY_ON(BrowserThread::UI);
90 cvc_ = nullptr;
91
92 JNIEnv* env = AttachCurrentThread();
93 Java_DialogOverlayImpl_onDismissed(env, receiver_.obj());
94 }
95
96 void DialogOverlayImpl::OnAttachedToWindow() {
97 DCHECK_CURRENTLY_ON(BrowserThread::UI);
98 JNIEnv* env = AttachCurrentThread();
99
100 ScopedJavaLocalRef<jobject> token;
101
102 if (ui::WindowAndroid* window = cvc_->GetWindowAndroid())
103 token = window->GetWindowToken();
104
105 Java_DialogOverlayImpl_onWindowToken(env, receiver_.obj(), token);
106 }
107
108 void DialogOverlayImpl::OnDetachedFromWindow() {
109 JNIEnv* env = AttachCurrentThread();
110 Java_DialogOverlayImpl_onWindowToken(env, receiver_.obj(), nullptr);
111 }
112
113 ContentViewCoreImpl* DialogOverlayImpl::GetContentViewCore() {
114 // Get the frame from the token.
115 DCHECK_CURRENTLY_ON(BrowserThread::UI);
116 content::RenderFrameHost* frame =
117 content::RenderFrameHostImpl::FromOverlayRoutingToken(token_);
118 if (!frame) {
119 DVLOG(1) << "Cannot find frame host for token " << token_;
120 return nullptr;
121 }
122
123 content::WebContents* web_contents =
124 content::WebContents::FromRenderFrameHost(frame);
125 DCHECK(web_contents);
126
127 content::ContentViewCoreImpl* cvc =
128 content::ContentViewCoreImpl::FromWebContents(web_contents);
129 if (!cvc) {
130 DVLOG(1) << "Cannot find cvc for token " << token_;
131 return nullptr;
132 }
133
134 return cvc;
135 }
136
137 static jint RegisterSurface(JNIEnv* env,
138 const base::android::JavaParamRef<jclass>& jcaller,
139 const JavaParamRef<jobject>& surface) {
140 DCHECK_CURRENTLY_ON(BrowserThread::UI);
141 return gpu::GpuSurfaceTracker::Get()->AddSurfaceForNativeWidget(
142 gpu::GpuSurfaceTracker::SurfaceRecord(gfx::kNullAcceleratedWidget,
143 surface.obj()));
144 }
145
146 static void UnregisterSurface(
147 JNIEnv* env,
148 const base::android::JavaParamRef<jclass>& jcaller,
149 jint surface_id) {
150 DCHECK_CURRENTLY_ON(BrowserThread::UI);
151 gpu::GpuSurfaceTracker::Get()->RemoveSurface(surface_id);
152 }
153
154 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698