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

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

Issue 2765443004: AndroidOverlay implementation using Dialog. (Closed)
Patch Set: fixed test Created 3 years, 7 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 Init(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 DialogOverlayImpl::DialogOverlayImpl(const JavaParamRef<jobject>& obj,
33 const base::UnguessableToken& token)
34 : token_(token), cvc_(nullptr) {
35 DCHECK_CURRENTLY_ON(BrowserThread::UI);
36 cvc_ = GetContentViewCore();
37
38 JNIEnv* env = AttachCurrentThread();
39 obj_ = JavaObjectWeakGlobalRef(env, obj);
40
41 // If there's no CVC, then just post a null token immediately.
42 if (!cvc_) {
43 Java_DialogOverlayImpl_onDismissed(env, obj.obj());
44 return;
45 }
46
47 cvc_->AddObserver(this);
48
49 // Also send the initial token, since we'll only get changes.
50 if (ui::WindowAndroid* window = cvc_->GetWindowAndroid()) {
51 ScopedJavaLocalRef<jobject> token = window->GetWindowToken();
52 if (!token.is_null())
53 Java_DialogOverlayImpl_onWindowToken(env, obj.obj(), token);
54 }
55 }
56
57 DialogOverlayImpl::~DialogOverlayImpl() {
58 DCHECK_CURRENTLY_ON(BrowserThread::UI);
59 // We should only be deleted after one unregisters for token callbacks.
60 DCHECK(!cvc_);
61 }
62
63 void DialogOverlayImpl::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
64 DCHECK_CURRENTLY_ON(BrowserThread::UI);
65 UnregisterForTokensIfNeeded();
66 // We delete soon since this might be part of an onDismissed callback.
67 BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, this);
68 }
69
70 void DialogOverlayImpl::UnregisterForTokensIfNeeded() {
71 DCHECK_CURRENTLY_ON(BrowserThread::UI);
72 if (!cvc_)
73 return;
74
75 cvc_->RemoveObserver(this);
76 cvc_ = nullptr;
77 }
78
79 void DialogOverlayImpl::OnContentViewCoreDestroyed() {
80 DCHECK_CURRENTLY_ON(BrowserThread::UI);
81 cvc_ = nullptr;
82
83 JNIEnv* env = AttachCurrentThread();
84 ScopedJavaLocalRef<jobject> obj = obj_.get(env);
85 if (!obj.is_null())
86 Java_DialogOverlayImpl_onDismissed(env, obj.obj());
87 }
88
89 void DialogOverlayImpl::OnAttachedToWindow() {
90 DCHECK_CURRENTLY_ON(BrowserThread::UI);
91 JNIEnv* env = AttachCurrentThread();
92
93 ScopedJavaLocalRef<jobject> token;
94
95 if (ui::WindowAndroid* window = cvc_->GetWindowAndroid())
96 token = window->GetWindowToken();
97
98 ScopedJavaLocalRef<jobject> obj = obj_.get(env);
99 if (!obj.is_null())
100 Java_DialogOverlayImpl_onWindowToken(env, obj.obj(), token);
101 }
102
103 void DialogOverlayImpl::OnDetachedFromWindow() {
104 JNIEnv* env = AttachCurrentThread();
105 ScopedJavaLocalRef<jobject> obj = obj_.get(env);
106 if (!obj.is_null())
107 Java_DialogOverlayImpl_onWindowToken(env, obj.obj(), nullptr);
108 }
109
110 ContentViewCoreImpl* DialogOverlayImpl::GetContentViewCore() {
111 // Get the frame from the token.
112 DCHECK_CURRENTLY_ON(BrowserThread::UI);
113 content::RenderFrameHost* frame =
114 content::RenderFrameHostImpl::FromOverlayRoutingToken(token_);
115 if (!frame) {
116 DVLOG(1) << "Cannot find frame host for token " << token_;
117 return nullptr;
118 }
119
120 content::WebContents* web_contents =
121 content::WebContents::FromRenderFrameHost(frame);
122 DCHECK(web_contents);
123
124 content::ContentViewCoreImpl* cvc =
125 content::ContentViewCoreImpl::FromWebContents(web_contents);
126 if (!cvc) {
127 DVLOG(1) << "Cannot find cvc for token " << token_;
128 return nullptr;
129 }
130
131 return cvc;
132 }
133
134 static jint RegisterSurface(JNIEnv* env,
135 const base::android::JavaParamRef<jclass>& jcaller,
136 const JavaParamRef<jobject>& surface) {
137 DCHECK_CURRENTLY_ON(BrowserThread::UI);
138 return gpu::GpuSurfaceTracker::Get()->AddSurfaceForNativeWidget(
139 gpu::GpuSurfaceTracker::SurfaceRecord(gfx::kNullAcceleratedWidget,
140 surface.obj()));
141 }
142
143 static void UnregisterSurface(
144 JNIEnv* env,
145 const base::android::JavaParamRef<jclass>& jcaller,
146 jint surface_id) {
147 DCHECK_CURRENTLY_ON(BrowserThread::UI);
148 gpu::GpuSurfaceTracker::Get()->RemoveSurface(surface_id);
149 }
150
151 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/android/dialog_overlay_impl.h ('k') | content/browser/frame_host/render_frame_host_android.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698