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

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

Issue 2765443004: AndroidOverlay implementation using Dialog. (Closed)
Patch Set: fixes after rebase 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)
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(
50 BrowserThread::UI, FROM_HERE,
51 reinterpret_cast<DialogOverlayOperationsImpl*>(handle));
boliu 2017/04/04 23:53:21 impl?
liberato (no reviews please) 2017/04/05 15:13:30 Done.
52 }
53
54 DialogOverlayOperationsImpl::DialogOverlayOperationsImpl(
55 const JavaParamRef<jobject>& receiver,
56 const base::UnguessableToken& token)
57 : receiver_(receiver), token_(token), cvc_(nullptr) {
58 DCHECK_CURRENTLY_ON(BrowserThread::UI);
59 cvc_ = GetContentViewCore();
60
61 // If there's no CVC, then just post a null token immediately.
62 if (!cvc_) {
63 JNIEnv* env = AttachCurrentThread();
64 Java_DialogOverlayOperationsImpl_onDismissed(env, receiver_.obj());
65 return;
66 }
67
68 cvc_->AddObserver(this);
69
70 // Also send the initial token, since we'll only get changes.
71 if (ui::WindowAndroid* window = cvc_->GetWindowAndroid()) {
72 ScopedJavaLocalRef<jobject> token = window->GetWindowToken();
73 if (!token.is_null()) {
74 JNIEnv* env = AttachCurrentThread();
75 Java_DialogOverlayOperationsImpl_onWindowToken(env, receiver_.obj(),
76 token);
77 }
78 }
79 }
80
81 DialogOverlayOperationsImpl::~DialogOverlayOperationsImpl() {
82 DCHECK_CURRENTLY_ON(BrowserThread::UI);
83 UnregisterForTokensIfNeeded();
84 }
85
86 void DialogOverlayOperationsImpl::UnregisterForTokensIfNeeded() {
87 DCHECK_CURRENTLY_ON(BrowserThread::UI);
88 if (!cvc_)
89 return;
90
91 cvc_->RemoveObserver(this);
92 cvc_ = nullptr;
93 }
94
95 void DialogOverlayOperationsImpl::OnContentViewCoreDestroyed() {
96 DCHECK_CURRENTLY_ON(BrowserThread::UI);
97 cvc_ = nullptr;
98
99 JNIEnv* env = AttachCurrentThread();
100 Java_DialogOverlayOperationsImpl_onDismissed(env, receiver_.obj());
101 }
102
103 void DialogOverlayOperationsImpl::OnAttachedToWindow() {
104 DCHECK_CURRENTLY_ON(BrowserThread::UI);
105 JNIEnv* env = AttachCurrentThread();
106
107 ScopedJavaLocalRef<jobject> token;
108
109 if (ui::WindowAndroid* window = cvc_->GetWindowAndroid())
110 token = window->GetWindowToken();
111
112 Java_DialogOverlayOperationsImpl_onWindowToken(env, receiver_.obj(), token);
113 }
114
115 void DialogOverlayOperationsImpl::OnDetachedFromWindow() {
116 JNIEnv* env = AttachCurrentThread();
117 Java_DialogOverlayOperationsImpl_onWindowToken(env, receiver_.obj(), nullptr);
118 }
119
120 ContentViewCoreImpl* DialogOverlayOperationsImpl::GetContentViewCore() {
121 // Get the frame from the token.
122 DCHECK_CURRENTLY_ON(BrowserThread::UI);
123 content::RenderFrameHost* frame =
124 content::RenderFrameHostImpl::FromOverlayRoutingToken(token_);
125 if (!frame) {
126 DVLOG(1) << "Cannot find frame host for token " << token_;
127 return nullptr;
128 }
129
130 content::WebContents* web_contents =
131 content::WebContents::FromRenderFrameHost(frame);
132 DCHECK(web_contents);
133
134 content::ContentViewCoreImpl* cvc =
135 content::ContentViewCoreImpl::FromWebContents(web_contents);
136 if (!cvc) {
137 DVLOG(1) << "Cannot find cvc for token " << token_;
138 return nullptr;
139 }
140
141 return cvc;
142 }
143
144 static jint RegisterSurface(JNIEnv* env,
145 const base::android::JavaParamRef<jclass>& jcaller,
146 const JavaParamRef<jobject>& surface) {
147 DCHECK_CURRENTLY_ON(BrowserThread::UI);
148 return gpu::GpuSurfaceTracker::Get()->RegisterViewSurface(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()->UnregisterViewSurface(surface_id);
157 }
158
159 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698