1 // Copyright 2019 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 "weblayer/browser/fullscreen_callback_proxy.h"
6 
7 #include "base/android/jni_string.h"
8 #include "url/gurl.h"
9 #include "weblayer/browser/java/jni/FullscreenCallbackProxy_jni.h"
10 #include "weblayer/browser/tab_impl.h"
11 
12 using base::android::AttachCurrentThread;
13 using base::android::ConvertUTF8ToJavaString;
14 using base::android::ScopedJavaLocalRef;
15 
16 namespace weblayer {
17 
FullscreenCallbackProxy(JNIEnv * env,jobject obj,Tab * tab)18 FullscreenCallbackProxy::FullscreenCallbackProxy(JNIEnv* env,
19                                                  jobject obj,
20                                                  Tab* tab)
21     : tab_(tab), java_delegate_(env, obj) {
22   tab_->SetFullscreenDelegate(this);
23 }
24 
~FullscreenCallbackProxy()25 FullscreenCallbackProxy::~FullscreenCallbackProxy() {
26   tab_->SetFullscreenDelegate(nullptr);
27 }
28 
EnterFullscreen(base::OnceClosure exit_closure)29 void FullscreenCallbackProxy::EnterFullscreen(base::OnceClosure exit_closure) {
30   exit_fullscreen_closure_ = std::move(exit_closure);
31   TRACE_EVENT0("weblayer", "Java_FullscreenCallbackProxy_enterFullscreen");
32   Java_FullscreenCallbackProxy_enterFullscreen(AttachCurrentThread(),
33                                                java_delegate_);
34 }
35 
ExitFullscreen()36 void FullscreenCallbackProxy::ExitFullscreen() {
37   TRACE_EVENT0("weblayer", "Java_FullscreenCallbackProxy_exitFullscreen");
38   // If the web contents initiated the fullscreen exit, the closure will still
39   // be valid, so clean it up now.
40   exit_fullscreen_closure_.Reset();
41   Java_FullscreenCallbackProxy_exitFullscreen(AttachCurrentThread(),
42                                               java_delegate_);
43 }
44 
DoExitFullscreen(JNIEnv * env)45 void FullscreenCallbackProxy::DoExitFullscreen(JNIEnv* env) {
46   if (exit_fullscreen_closure_)
47     std::move(exit_fullscreen_closure_).Run();
48 }
49 
JNI_FullscreenCallbackProxy_CreateFullscreenCallbackProxy(JNIEnv * env,const base::android::JavaParamRef<jobject> & proxy,jlong tab)50 static jlong JNI_FullscreenCallbackProxy_CreateFullscreenCallbackProxy(
51     JNIEnv* env,
52     const base::android::JavaParamRef<jobject>& proxy,
53     jlong tab) {
54   return reinterpret_cast<jlong>(
55       new FullscreenCallbackProxy(env, proxy, reinterpret_cast<TabImpl*>(tab)));
56 }
57 
JNI_FullscreenCallbackProxy_DeleteFullscreenCallbackProxy(JNIEnv * env,jlong proxy)58 static void JNI_FullscreenCallbackProxy_DeleteFullscreenCallbackProxy(
59     JNIEnv* env,
60     jlong proxy) {
61   delete reinterpret_cast<FullscreenCallbackProxy*>(proxy);
62 }
63 
64 }  // namespace weblayer
65