Commit a2da872d authored by Alex Cooper's avatar Alex Cooper Committed by Commit Bot

Refactor Android Consent Prompt lifetimes

In preparation for splitting out the DFM installation logic which lives
inside of the consent prompts, this change refactors the lifetime of
those objects to no longer be static. This will pave the way to
managing the installation logic in a much cleaner way.

Bug:1045130

Change-Id: Ib5150f690d9d5beafcf40e98afc7fd01bd6f5c1c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2015611
Commit-Queue: Alexander Cooper <alcooper@chromium.org>
Reviewed-by: default avatarKlaus Weidner <klausw@chromium.org>
Reviewed-by: default avatarPiotr Bialecki <bialpio@chromium.org>
Cr-Commit-Position: refs/heads/master@{#735211}
parent 5b8b10c7
...@@ -32,8 +32,8 @@ import org.chromium.ui.modelutil.PropertyModel; ...@@ -32,8 +32,8 @@ import org.chromium.ui.modelutil.PropertyModel;
public class VrConsentDialog public class VrConsentDialog
extends WebContentsObserver implements ModalDialogProperties.Controller { extends WebContentsObserver implements ModalDialogProperties.Controller {
@NativeMethods @NativeMethods
/* package */ interface VrConsentUiHelperImpl { /* package */ interface VrConsentUiHelper {
void onUserConsentResult(long nativeGvrConsentHelperImpl, boolean allowed); void onUserConsentResult(long nativeGvrConsentHelper, boolean allowed);
} }
private ModalDialogManager mModalDialogManager; private ModalDialogManager mModalDialogManager;
......
...@@ -35,7 +35,6 @@ public class VrModuleProvider implements ModuleInstallUi.FailureUiListener { ...@@ -35,7 +35,6 @@ public class VrModuleProvider implements ModuleInstallUi.FailureUiListener {
*/ */
public static void maybeInit() { public static void maybeInit() {
if (!VrBuildConfig.IS_VR_ENABLED) return; if (!VrBuildConfig.IS_VR_ENABLED) return;
VrModuleProviderJni.get().init();
// Always install the VR module on Daydream-ready devices. // Always install the VR module on Daydream-ready devices.
maybeRequestModuleIfDaydreamReady(); maybeRequestModuleIfDaydreamReady();
} }
...@@ -168,7 +167,6 @@ public class VrModuleProvider implements ModuleInstallUi.FailureUiListener { ...@@ -168,7 +167,6 @@ public class VrModuleProvider implements ModuleInstallUi.FailureUiListener {
@NativeMethods @NativeMethods
interface Natives { interface Natives {
void init();
void registerJni(); void registerJni();
void onInstalledModule( void onInstalledModule(
long nativeVrModuleProvider, VrModuleProvider caller, boolean success); long nativeVrModuleProvider, VrModuleProvider caller, boolean success);
......
...@@ -5307,6 +5307,8 @@ jumbo_static_library("browser") { ...@@ -5307,6 +5307,8 @@ jumbo_static_library("browser") {
"vr/service/browser_xr_runtime.h", "vr/service/browser_xr_runtime.h",
"vr/service/vr_service_impl.cc", "vr/service/vr_service_impl.cc",
"vr/service/vr_service_impl.h", "vr/service/vr_service_impl.h",
"vr/service/xr_consent_helper.cc",
"vr/service/xr_consent_helper.h",
"vr/service/xr_runtime_manager.cc", "vr/service/xr_runtime_manager.cc",
"vr/service/xr_runtime_manager.h", "vr/service/xr_runtime_manager.h",
] ]
......
...@@ -25,8 +25,8 @@ static_library("vr_android") { ...@@ -25,8 +25,8 @@ static_library("vr_android") {
"cardboard_input_delegate.cc", "cardboard_input_delegate.cc",
"cardboard_input_delegate.h", "cardboard_input_delegate.h",
"gl_browser_interface.h", "gl_browser_interface.h",
"gvr_consent_helper_impl.cc", "gvr_consent_helper.cc",
"gvr_consent_helper_impl.h", "gvr_consent_helper.h",
"gvr_graphics_delegate.cc", "gvr_graphics_delegate.cc",
"gvr_graphics_delegate.h", "gvr_graphics_delegate.h",
"gvr_input_delegate.cc", "gvr_input_delegate.cc",
......
...@@ -9,15 +9,11 @@ ...@@ -9,15 +9,11 @@
#include "base/bind.h" #include "base/bind.h"
#include "chrome/android/features/vr/jni_headers/ArConsentDialog_jni.h" #include "chrome/android/features/vr/jni_headers/ArConsentDialog_jni.h"
#include "chrome/browser/android/tab_android.h"
#include "chrome/browser/android/vr/ar_jni_headers/ArCoreInstallUtils_jni.h" #include "chrome/browser/android/vr/ar_jni_headers/ArCoreInstallUtils_jni.h"
#include "chrome/browser/android/vr/arcore_device/arcore_device_provider.h" #include "chrome/browser/android/vr/arcore_device/arcore_device_provider.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
#include "device/vr/android/arcore/arcore_device_provider_factory.h" #include "device/vr/android/arcore/arcore_device_provider_factory.h"
using base::android::AttachCurrentThread; using base::android::AttachCurrentThread;
using base::android::ScopedJavaLocalRef;
namespace vr { namespace vr {
...@@ -39,30 +35,10 @@ ArCoreDeviceProviderFactoryImpl::CreateDeviceProvider() { ...@@ -39,30 +35,10 @@ ArCoreDeviceProviderFactoryImpl::CreateDeviceProvider() {
return std::make_unique<device::ArCoreDeviceProvider>(); return std::make_unique<device::ArCoreDeviceProvider>();
} }
base::android::ScopedJavaLocalRef<jobject> GetTabFromRenderer(
int render_process_id,
int render_frame_id) {
content::RenderFrameHost* render_frame_host =
content::RenderFrameHost::FromID(render_process_id, render_frame_id);
DCHECK(render_frame_host);
content::WebContents* web_contents =
content::WebContents::FromRenderFrameHost(render_frame_host);
DCHECK(web_contents);
TabAndroid* tab_android = TabAndroid::FromWebContents(web_contents);
DCHECK(tab_android);
base::android::ScopedJavaLocalRef<jobject> j_tab_android =
tab_android->GetJavaObject();
DCHECK(!j_tab_android.is_null());
return j_tab_android;
}
} // namespace } // namespace
ArCoreConsentPrompt::ArCoreConsentPrompt() : weak_ptr_factory_(this) {} ArCoreConsentPrompt::ArCoreConsentPrompt()
: XrConsentHelper(), weak_ptr_factory_(this) {}
ArCoreConsentPrompt::~ArCoreConsentPrompt() = default; ArCoreConsentPrompt::~ArCoreConsentPrompt() = default;
...@@ -89,12 +65,14 @@ void ArCoreConsentPrompt::OnUserConsentResult(JNIEnv* env, ...@@ -89,12 +65,14 @@ void ArCoreConsentPrompt::OnUserConsentResult(JNIEnv* env,
RequestArModule(); RequestArModule();
} }
// static
void ArCoreConsentPrompt::ShowConsentPrompt( void ArCoreConsentPrompt::ShowConsentPrompt(
int render_process_id, int render_process_id,
int render_frame_id, int render_frame_id,
base::OnceCallback<void(bool)> response_callback) { XrConsentPromptLevel consent_level,
OnUserConsentCallback response_callback) {
DCHECK(!on_user_consent_callback_);
on_user_consent_callback_ = std::move(response_callback); on_user_consent_callback_ = std::move(response_callback);
consent_level_ = consent_level;
render_process_id_ = render_process_id; render_process_id_ = render_process_id;
render_frame_id_ = render_frame_id; render_frame_id_ = render_frame_id;
...@@ -103,7 +81,7 @@ void ArCoreConsentPrompt::ShowConsentPrompt( ...@@ -103,7 +81,7 @@ void ArCoreConsentPrompt::ShowConsentPrompt(
env, reinterpret_cast<jlong>(this), env, reinterpret_cast<jlong>(this),
GetTabFromRenderer(render_process_id_, render_frame_id_)); GetTabFromRenderer(render_process_id_, render_frame_id_));
if (jdelegate_.is_null()) { if (jdelegate_.is_null()) {
std::move(on_user_consent_callback_).Run(false); CallDeferredUserConsentCallback(false);
} }
} }
...@@ -212,8 +190,10 @@ void ArCoreConsentPrompt::OnRequestArCoreInstallOrUpdateResult(bool success) { ...@@ -212,8 +190,10 @@ void ArCoreConsentPrompt::OnRequestArCoreInstallOrUpdateResult(bool success) {
void ArCoreConsentPrompt::CallDeferredUserConsentCallback( void ArCoreConsentPrompt::CallDeferredUserConsentCallback(
bool is_permission_granted) { bool is_permission_granted) {
if (on_user_consent_callback_) if (on_user_consent_callback_) {
std::move(on_user_consent_callback_).Run(is_permission_granted); std::move(on_user_consent_callback_)
.Run(consent_level_, is_permission_granted);
}
} }
static void JNI_ArCoreInstallUtils_InstallArCoreDeviceProviderFactory( static void JNI_ArCoreInstallUtils_InstallArCoreDeviceProviderFactory(
......
...@@ -11,21 +11,20 @@ ...@@ -11,21 +11,20 @@
#include "base/callback.h" #include "base/callback.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/threading/thread_checker.h" #include "base/threading/thread_checker.h"
#include "chrome/browser/vr/service/arcore_consent_prompt_interface.h" #include "chrome/browser/vr/service/xr_consent_helper.h"
#include "chrome/browser/vr/vr_export.h" #include "chrome/browser/vr/vr_export.h"
namespace vr { namespace vr {
class VR_EXPORT ArCoreConsentPrompt : public ArCoreConsentPromptInterface { class VR_EXPORT ArCoreConsentPrompt : public XrConsentHelper {
public: public:
ArCoreConsentPrompt(); ArCoreConsentPrompt();
~ArCoreConsentPrompt(); ~ArCoreConsentPrompt() override;
// ArCoreConsentPromptInterface: void ShowConsentPrompt(int render_process_id,
void ShowConsentPrompt(
int render_process_id,
int render_frame_id, int render_frame_id,
base::OnceCallback<void(bool)> response_callback) override; XrConsentPromptLevel consent_level,
OnUserConsentCallback response_callback) override;
// Called from Java end. // Called from Java end.
void OnUserConsentResult(JNIEnv* env, void OnUserConsentResult(JNIEnv* env,
...@@ -57,7 +56,8 @@ class VR_EXPORT ArCoreConsentPrompt : public ArCoreConsentPromptInterface { ...@@ -57,7 +56,8 @@ class VR_EXPORT ArCoreConsentPrompt : public ArCoreConsentPromptInterface {
return weak_ptr_factory_.GetWeakPtr(); return weak_ptr_factory_.GetWeakPtr();
} }
base::OnceCallback<void(bool)> on_user_consent_callback_; OnUserConsentCallback on_user_consent_callback_;
XrConsentPromptLevel consent_level_;
base::OnceCallback<void(bool)> on_request_ar_module_result_callback_; base::OnceCallback<void(bool)> on_request_ar_module_result_callback_;
base::OnceCallback<void(bool)> base::OnceCallback<void(bool)>
......
...@@ -2,53 +2,25 @@ ...@@ -2,53 +2,25 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "chrome/browser/android/vr/gvr_consent_helper_impl.h" #include "chrome/browser/android/vr/gvr_consent_helper.h"
#include <utility> #include <utility>
#include "base/android/jni_string.h" #include "base/android/jni_string.h"
#include "base/bind.h"
#include "base/callback.h" #include "base/callback.h"
#include "base/macros.h" #include "base/macros.h"
#include "chrome/android/features/vr/jni_headers/VrConsentDialog_jni.h" #include "chrome/android/features/vr/jni_headers/VrConsentDialog_jni.h"
#include "chrome/browser/android/tab_android.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
using base::android::AttachCurrentThread; using base::android::AttachCurrentThread;
using base::android::ScopedJavaLocalRef;
namespace vr { namespace vr {
namespace { GvrConsentHelper::GvrConsentHelper() : XrConsentHelper() {}
base::android::ScopedJavaLocalRef<jobject> GetTabFromRenderer( GvrConsentHelper::~GvrConsentHelper() = default;
int render_process_id,
int render_frame_id) {
content::RenderFrameHost* render_frame_host =
content::RenderFrameHost::FromID(render_process_id, render_frame_id);
DCHECK(render_frame_host);
content::WebContents* web_contents =
content::WebContents::FromRenderFrameHost(render_frame_host);
DCHECK(web_contents);
TabAndroid* tab_android = TabAndroid::FromWebContents(web_contents);
DCHECK(tab_android);
base::android::ScopedJavaLocalRef<jobject> j_tab_android =
tab_android->GetJavaObject();
DCHECK(!j_tab_android.is_null());
return j_tab_android;
}
} // namespace
GvrConsentHelperImpl::GvrConsentHelperImpl() {}
GvrConsentHelperImpl::~GvrConsentHelperImpl() = default;
void GvrConsentHelperImpl::PromptUserAndGetConsent( void GvrConsentHelper::ShowConsentPrompt(
int render_process_id, int render_process_id,
int render_frame_id, int render_frame_id,
XrConsentPromptLevel consent_level, XrConsentPromptLevel consent_level,
...@@ -70,9 +42,7 @@ void GvrConsentHelperImpl::PromptUserAndGetConsent( ...@@ -70,9 +42,7 @@ void GvrConsentHelperImpl::PromptUserAndGetConsent(
} }
} }
void GvrConsentHelperImpl::OnUserConsentResult( void GvrConsentHelper::OnUserConsentResult(JNIEnv* env, jboolean is_granted) {
JNIEnv* env,
jboolean is_granted) {
jdelegate_.Reset(); jdelegate_.Reset();
if (!on_user_consent_callback_) if (!on_user_consent_callback_)
return; return;
...@@ -97,14 +67,14 @@ void GvrConsentHelperImpl::OnUserConsentResult( ...@@ -97,14 +67,14 @@ void GvrConsentHelperImpl::OnUserConsentResult(
if (!module_delegate_->ModuleInstalled()) { if (!module_delegate_->ModuleInstalled()) {
module_delegate_->InstallModule(base::BindOnce( module_delegate_->InstallModule(base::BindOnce(
&GvrConsentHelperImpl::OnModuleInstalled, weak_ptr_.GetWeakPtr())); &GvrConsentHelper::OnModuleInstalled, weak_ptr_.GetWeakPtr()));
return; return;
} }
std::move(on_user_consent_callback_).Run(consent_level_, true); std::move(on_user_consent_callback_).Run(consent_level_, true);
} }
void GvrConsentHelperImpl::OnModuleInstalled(bool success) { void GvrConsentHelper::OnModuleInstalled(bool success) {
if (!success) { if (!success) {
std::move(on_user_consent_callback_).Run(consent_level_, false); std::move(on_user_consent_callback_).Run(consent_level_, false);
return; return;
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef CHROME_BROWSER_ANDROID_VR_GVR_CONSENT_HELPER_IMPL_H_ #ifndef CHROME_BROWSER_ANDROID_VR_GVR_CONSENT_HELPER_H_
#define CHROME_BROWSER_ANDROID_VR_GVR_CONSENT_HELPER_IMPL_H_ #define CHROME_BROWSER_ANDROID_VR_GVR_CONSENT_HELPER_H_
#include <jni.h> #include <jni.h>
#include <memory> #include <memory>
...@@ -12,23 +12,22 @@ ...@@ -12,23 +12,22 @@
#include "base/callback.h" #include "base/callback.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "chrome/browser/android/vr/vr_module_provider.h" #include "chrome/browser/android/vr/vr_module_provider.h"
#include "chrome/browser/vr/service/gvr_consent_helper.h" #include "chrome/browser/vr/service/xr_consent_helper.h"
namespace vr { namespace vr {
class GvrConsentHelperImpl : public GvrConsentHelper { class GvrConsentHelper : public XrConsentHelper {
public: public:
GvrConsentHelperImpl(); GvrConsentHelper();
~GvrConsentHelperImpl() override; ~GvrConsentHelper() override;
// Caller must ensure not to call this a second time before the first dialog // Caller must ensure not to call this a second time before the first dialog
// is dismissed. // is dismissed.
void PromptUserAndGetConsent(int render_process_id, void ShowConsentPrompt(int render_process_id,
int render_frame_id, int render_frame_id,
XrConsentPromptLevel consent_level, XrConsentPromptLevel consent_level,
OnUserConsentCallback) override; OnUserConsentCallback response_callback) override;
void OnUserConsentResult(JNIEnv* env, void OnUserConsentResult(JNIEnv* env, jboolean is_granted);
jboolean is_granted);
private: private:
void OnModuleInstalled(bool success); void OnModuleInstalled(bool success);
...@@ -41,10 +40,10 @@ class GvrConsentHelperImpl : public GvrConsentHelper { ...@@ -41,10 +40,10 @@ class GvrConsentHelperImpl : public GvrConsentHelper {
OnUserConsentCallback on_user_consent_callback_; OnUserConsentCallback on_user_consent_callback_;
base::android::ScopedJavaGlobalRef<jobject> jdelegate_; base::android::ScopedJavaGlobalRef<jobject> jdelegate_;
base::WeakPtrFactory<GvrConsentHelperImpl> weak_ptr_{this}; base::WeakPtrFactory<GvrConsentHelper> weak_ptr_{this};
DISALLOW_COPY_AND_ASSIGN(GvrConsentHelperImpl); DISALLOW_COPY_AND_ASSIGN(GvrConsentHelper);
}; };
} // namespace vr } // namespace vr
#endif // CHROME_BROWSER_ANDROID_VR_GVR_CONSENT_HELPER_IMPL_H_ #endif // CHROME_BROWSER_ANDROID_VR_GVR_CONSENT_HELPER_H_
...@@ -8,16 +8,11 @@ ...@@ -8,16 +8,11 @@
#include <utility> #include <utility>
#include "chrome/android/features/vr/jni_headers/VrModuleProvider_jni.h" #include "chrome/android/features/vr/jni_headers/VrModuleProvider_jni.h"
#include "chrome/browser/android/vr/gvr_consent_helper_impl.h"
#include "chrome/browser/android/vr/register_jni.h" #include "chrome/browser/android/vr/register_jni.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "device/vr/buildflags/buildflags.h" #include "device/vr/buildflags/buildflags.h"
#if BUILDFLAG(ENABLE_ARCORE)
#include "chrome/browser/android/vr/arcore_device/arcore_consent_prompt.h"
#endif
namespace vr { namespace vr {
VrModuleProvider::VrModuleProvider(TabAndroid* tab) VrModuleProvider::VrModuleProvider(TabAndroid* tab)
...@@ -85,13 +80,6 @@ std::unique_ptr<VrModuleProvider> VrModuleProviderFactory::CreateModuleProvider( ...@@ -85,13 +80,6 @@ std::unique_ptr<VrModuleProvider> VrModuleProviderFactory::CreateModuleProvider(
return std::make_unique<VrModuleProvider>(tab); return std::make_unique<VrModuleProvider>(tab);
} }
static void JNI_VrModuleProvider_Init(JNIEnv* env) {
GvrConsentHelper::SetInstance(std::make_unique<vr::GvrConsentHelperImpl>());
#if BUILDFLAG(ENABLE_ARCORE)
ArCoreConsentPromptInterface::SetInstance(new ArCoreConsentPrompt());
#endif
}
static void JNI_VrModuleProvider_RegisterJni(JNIEnv* env) { static void JNI_VrModuleProvider_RegisterJni(JNIEnv* env) {
CHECK(RegisterJni(env)); CHECK(RegisterJni(env));
} }
......
...@@ -244,8 +244,6 @@ component("vr_common") { ...@@ -244,8 +244,6 @@ component("vr_common") {
"platform_controller.h", "platform_controller.h",
"scheduler_browser_renderer_interface.h", "scheduler_browser_renderer_interface.h",
"scheduler_delegate.h", "scheduler_delegate.h",
"service/gvr_consent_helper.cc",
"service/gvr_consent_helper.h",
"service/xr_device_service.cc", "service/xr_device_service.cc",
"service/xr_device_service.h", "service/xr_device_service.h",
"service/xr_runtime_manager_observer.h", "service/xr_runtime_manager_observer.h",
...@@ -265,13 +263,6 @@ component("vr_common") { ...@@ -265,13 +263,6 @@ component("vr_common") {
"platform_controller_for_testing.h", "platform_controller_for_testing.h",
] ]
if (enable_arcore) {
sources += [
"service/arcore_consent_prompt_interface.cc",
"service/arcore_consent_prompt_interface.h",
]
}
public_deps = [ public_deps = [
":vr_base", ":vr_base",
"//device/vr/public/mojom", "//device/vr/public/mojom",
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/vr/service/arcore_consent_prompt_interface.h"
namespace vr {
namespace {
ArCoreConsentPromptInterface* g_arcore_consent_prompt = nullptr;
}
// static
void ArCoreConsentPromptInterface::SetInstance(
ArCoreConsentPromptInterface* instance) {
g_arcore_consent_prompt = instance;
}
// static
ArCoreConsentPromptInterface* ArCoreConsentPromptInterface::GetInstance() {
return g_arcore_consent_prompt;
}
} // namespace vr
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_VR_SERVICE_ARCORE_CONSENT_PROMPT_INTERFACE_H_
#define CHROME_BROWSER_VR_SERVICE_ARCORE_CONSENT_PROMPT_INTERFACE_H_
#include "base/callback.h"
#include "chrome/browser/vr/vr_export.h"
namespace vr {
// TODO(crbug.com/968233): Unify consent flow.
// This class solves layering problem until the above bug gets fixed.
class VR_EXPORT ArCoreConsentPromptInterface {
public:
static void SetInstance(ArCoreConsentPromptInterface*);
static ArCoreConsentPromptInterface* GetInstance();
virtual void ShowConsentPrompt(
int render_process_id,
int render_frame_id,
base::OnceCallback<void(bool)> response_callback) = 0;
};
} // namespace vr
#endif // CHROME_BROWSER_VR_SERVICE_ARCORE_CONSENT_PROMPT_INTERFACE_H_
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "base/bind_helpers.h" #include "base/bind_helpers.h"
#include "base/numerics/ranges.h" #include "base/numerics/ranges.h"
#include "build/build_config.h"
#include "chrome/browser/vr/service/vr_service_impl.h" #include "chrome/browser/vr/service/vr_service_impl.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host.h"
...@@ -20,6 +21,15 @@ ...@@ -20,6 +21,15 @@
#include "ui/gfx/transform.h" #include "ui/gfx/transform.h"
#include "ui/gfx/transform_util.h" #include "ui/gfx/transform_util.h"
#if defined(OS_WIN)
#include "chrome/browser/vr/service/xr_session_request_consent_manager.h"
#elif defined(OS_ANDROID)
#include "chrome/browser/android/vr/gvr_consent_helper.h"
#if BUILDFLAG(ENABLE_ARCORE)
#include "chrome/browser/android/vr/arcore_device/arcore_consent_prompt.h"
#endif
#endif
namespace vr { namespace vr {
namespace { namespace {
...@@ -205,6 +215,21 @@ bool ContainsFeature( ...@@ -205,6 +215,21 @@ bool ContainsFeature(
return std::find(feature_list.begin(), feature_list.end(), feature) != return std::find(feature_list.begin(), feature_list.end(), feature) !=
feature_list.end(); feature_list.end();
} }
#if defined(OS_WIN)
content::WebContents* GetWebContents(int render_process_id,
int render_frame_id) {
content::RenderFrameHost* render_frame_host =
content::RenderFrameHost::FromID(render_process_id, render_frame_id);
DCHECK(render_frame_host);
content::WebContents* web_contents =
content::WebContents::FromRenderFrameHost(render_frame_host);
DCHECK(web_contents);
return web_contents;
}
#endif
} // anonymous namespace } // anonymous namespace
BrowserXRRuntime::BrowserXRRuntime( BrowserXRRuntime::BrowserXRRuntime(
...@@ -221,6 +246,17 @@ BrowserXRRuntime::BrowserXRRuntime( ...@@ -221,6 +246,17 @@ BrowserXRRuntime::BrowserXRRuntime(
receiver_.BindNewEndpointAndPassRemote(), receiver_.BindNewEndpointAndPassRemote(),
base::BindOnce(&BrowserXRRuntime::OnDisplayInfoChanged, base::BindOnce(&BrowserXRRuntime::OnDisplayInfoChanged,
base::Unretained(this))); base::Unretained(this)));
#if defined(OS_ANDROID)
if (id_ == device::mojom::XRDeviceId::GVR_DEVICE_ID) {
consent_helper_ = std::make_unique<GvrConsentHelper>();
}
#if BUILDFLAG(ENABLE_ARCORE)
if (id_ == device::mojom::XRDeviceId::ARCORE_DEVICE_ID) {
consent_helper_ = std::make_unique<ArCoreConsentPrompt>();
}
#endif
#endif
} }
BrowserXRRuntime::~BrowserXRRuntime() { BrowserXRRuntime::~BrowserXRRuntime() {
...@@ -475,6 +511,28 @@ void BrowserXRRuntime::OnRequestSessionResult( ...@@ -475,6 +511,28 @@ void BrowserXRRuntime::OnRequestSessionResult(
} }
} }
void BrowserXRRuntime::ShowConsentPrompt(
int render_process_id,
int render_frame_id,
XrConsentPromptLevel consent_level,
OnUserConsentCallback consent_callback) {
#if defined(OS_WIN)
XRSessionRequestConsentManager::Instance()->ShowDialogAndGetConsent(
GetWebContents(render_process_id, render_frame_id), consent_level,
std::move(consent_callback));
#else
// It is the responsibility of the consent prompt to ensure that the callback
// is run in the event that we get removed (and it gets destroyed).
if (consent_helper_) {
consent_helper_->ShowConsentPrompt(render_process_id, render_frame_id,
consent_level,
std::move(consent_callback));
} else {
std::move(consent_callback).Run(consent_level, false);
}
#endif
}
void BrowserXRRuntime::OnImmersiveSessionError() { void BrowserXRRuntime::OnImmersiveSessionError() {
DVLOG(2) << __func__ << ": id=" << id_; DVLOG(2) << __func__ << ": id=" << id_;
StopImmersiveSession(base::DoNothing()); StopImmersiveSession(base::DoNothing());
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/observer_list.h" #include "base/observer_list.h"
#include "base/observer_list_types.h" #include "base/observer_list_types.h"
#include "chrome/browser/vr/service/vr_service_impl.h" #include "chrome/browser/vr/service/vr_service_impl.h"
#include "chrome/browser/vr/service/xr_consent_helper.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "device/vr/public/mojom/isolated_xr_service.mojom.h" #include "device/vr/public/mojom/isolated_xr_service.mojom.h"
#include "device/vr/public/mojom/vr_service.mojom.h" #include "device/vr/public/mojom/vr_service.mojom.h"
...@@ -76,6 +77,10 @@ class BrowserXRRuntime : public device::mojom::XRRuntimeEventListener { ...@@ -76,6 +77,10 @@ class BrowserXRRuntime : public device::mojom::XRRuntimeEventListener {
void RequestSession(VRServiceImpl* service, void RequestSession(VRServiceImpl* service,
const device::mojom::XRRuntimeSessionOptionsPtr& options, const device::mojom::XRRuntimeSessionOptionsPtr& options,
RequestSessionCallback callback); RequestSessionCallback callback);
void ShowConsentPrompt(int render_frame_id,
int render_process_id,
XrConsentPromptLevel consent_level,
OnUserConsentCallback consent_callback);
VRServiceImpl* GetServiceWithActiveImmersiveSession() { VRServiceImpl* GetServiceWithActiveImmersiveSession() {
return presenting_service_; return presenting_service_;
} }
...@@ -126,6 +131,7 @@ class BrowserXRRuntime : public device::mojom::XRRuntimeEventListener { ...@@ -126,6 +131,7 @@ class BrowserXRRuntime : public device::mojom::XRRuntimeEventListener {
this}; this};
base::ObserverList<BrowserXRRuntimeObserver> observers_; base::ObserverList<BrowserXRRuntimeObserver> observers_;
std::unique_ptr<XrConsentHelper> consent_helper_;
base::WeakPtrFactory<BrowserXRRuntime> weak_ptr_factory_{this}; base::WeakPtrFactory<BrowserXRRuntime> weak_ptr_factory_{this};
}; };
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/vr/service/gvr_consent_helper.h"
#include "base/logging.h"
namespace vr {
namespace {
GvrConsentHelper* g_instance = nullptr;
} // namespace
GvrConsentHelper::GvrConsentHelper() = default;
void GvrConsentHelper::SetInstance(std::unique_ptr<GvrConsentHelper> instance) {
if (g_instance)
delete g_instance;
g_instance = instance.release();
}
GvrConsentHelper* GvrConsentHelper::GetInstance() {
DCHECK(g_instance);
return g_instance;
}
GvrConsentHelper::~GvrConsentHelper() = default;
} // namespace vr
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_VR_SERVICE_GVR_CONSENT_HELPER_H_
#define CHROME_BROWSER_VR_SERVICE_GVR_CONSENT_HELPER_H_
#include <memory>
#include "base/callback_forward.h"
#include "base/macros.h"
#include "chrome/browser/vr/service/xr_consent_prompt_level.h"
#include "chrome/browser/vr/vr_export.h"
namespace vr {
typedef base::OnceCallback<void(XrConsentPromptLevel, bool)>
OnUserConsentCallback;
// Used for displaying a user consent dialog. Breaks the cyclic dependency
// between device/vr and the Android UI code in browser.
class VR_EXPORT GvrConsentHelper {
public:
static void SetInstance(std::unique_ptr<GvrConsentHelper>);
static GvrConsentHelper* GetInstance();
virtual ~GvrConsentHelper();
virtual void PromptUserAndGetConsent(int render_process_id,
int render_frame_id,
XrConsentPromptLevel consent_level,
OnUserConsentCallback) = 0;
protected:
GvrConsentHelper();
private:
DISALLOW_COPY_AND_ASSIGN(GvrConsentHelper);
};
} // namespace vr
#endif // CHROME_BROWSER_VR_SERVICE_GVR_CONSENT_HELPER_H_
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
#include "base/feature_list.h" #include "base/feature_list.h"
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/trace_event/common/trace_event_common.h" #include "base/trace_event/common/trace_event_common.h"
#include "build/build_config.h"
#include "chrome/browser/permissions/permission_manager.h" #include "chrome/browser/permissions/permission_manager.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/vr/metrics/session_metrics_helper.h" #include "chrome/browser/vr/metrics/session_metrics_helper.h"
...@@ -33,15 +32,6 @@ ...@@ -33,15 +32,6 @@
#include "device/vr/public/cpp/session_mode.h" #include "device/vr/public/cpp/session_mode.h"
#include "device/vr/vr_device.h" #include "device/vr/vr_device.h"
#if defined(OS_WIN)
#include "chrome/browser/vr/service/xr_session_request_consent_manager.h"
#elif defined(OS_ANDROID)
#include "chrome/browser/vr/service/gvr_consent_helper.h"
#if BUILDFLAG(ENABLE_ARCORE)
#include "chrome/browser/vr/service/arcore_consent_prompt_interface.h"
#endif
#endif
namespace { namespace {
device::mojom::XRRuntimeSessionOptionsPtr GetRuntimeOptions( device::mojom::XRRuntimeSessionOptionsPtr GetRuntimeOptions(
...@@ -459,44 +449,13 @@ void VRServiceImpl::ShowConsentPrompt( ...@@ -459,44 +449,13 @@ void VRServiceImpl::ShowConsentPrompt(
return; return;
} }
// TODO(crbug.com/968233): Unify the below consent flow. runtime->ShowConsentPrompt(
#if defined(OS_ANDROID)
if (options->mode == device::mojom::XRSessionMode::kImmersiveAr) {
#if BUILDFLAG(ENABLE_ARCORE)
ArCoreConsentPromptInterface::GetInstance()->ShowConsentPrompt(
render_frame_host_->GetProcess()->GetID(),
render_frame_host_->GetRoutingID(),
base::BindOnce(&VRServiceImpl::OnConsentResult,
weak_ptr_factory_.GetWeakPtr(), std::move(options),
std::move(callback), runtime->GetId(),
std::move(requested_features), consent_level));
return;
#else
std::move(callback).Run(nullptr);
return;
#endif
} else {
// GVR.
GvrConsentHelper::GetInstance()->PromptUserAndGetConsent(
render_frame_host_->GetProcess()->GetID(), render_frame_host_->GetProcess()->GetID(),
render_frame_host_->GetRoutingID(), consent_level, render_frame_host_->GetRoutingID(), consent_level,
base::BindOnce(&VRServiceImpl::OnConsentResult, base::BindOnce(&VRServiceImpl::OnConsentResult,
weak_ptr_factory_.GetWeakPtr(), std::move(options), weak_ptr_factory_.GetWeakPtr(), std::move(options),
std::move(callback), runtime->GetId(), std::move(callback), runtime->GetId(),
std::move(requested_features))); std::move(requested_features)));
return;
}
#elif defined(OS_WIN)
XRSessionRequestConsentManager::Instance()->ShowDialogAndGetConsent(
GetWebContents(), consent_level,
base::BindOnce(&VRServiceImpl::OnConsentResult,
weak_ptr_factory_.GetWeakPtr(), std::move(options),
std::move(callback), runtime->GetId(),
std::move(requested_features)));
return;
#endif
NOTREACHED();
} }
// TODO(alcooper): Once the ConsentFlow can be removed expected_runtime_id and // TODO(alcooper): Once the ConsentFlow can be removed expected_runtime_id and
......
...@@ -12,8 +12,9 @@ ...@@ -12,8 +12,9 @@
#include "base/macros.h" #include "base/macros.h"
#include "base/util/type_safety/pass_key.h" #include "base/util/type_safety/pass_key.h"
#include "build/build_config.h"
#include "chrome/browser/vr/metrics/session_metrics_helper.h" #include "chrome/browser/vr/metrics/session_metrics_helper.h"
#include "chrome/browser/vr/service/xr_consent_helper.h"
#include "chrome/browser/vr/service/xr_consent_prompt_level.h" #include "chrome/browser/vr/service/xr_consent_prompt_level.h"
#include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings.h"
#include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_observer.h"
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/vr/service/xr_consent_helper.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
#if defined(OS_ANDROID)
#include "chrome/browser/android/tab_android.h"
#endif
namespace vr {
XrConsentHelper::XrConsentHelper() = default;
XrConsentHelper::~XrConsentHelper() = default;
// static
content::WebContents* XrConsentHelper::GetWebContentsFromRenderer(
int render_process_id,
int render_frame_id) {
content::RenderFrameHost* render_frame_host =
content::RenderFrameHost::FromID(render_process_id, render_frame_id);
DCHECK(render_frame_host);
content::WebContents* web_contents =
content::WebContents::FromRenderFrameHost(render_frame_host);
DCHECK(web_contents);
return web_contents;
}
#if defined(OS_ANDROID)
// static
base::android::ScopedJavaLocalRef<jobject> XrConsentHelper::GetTabFromRenderer(
int render_process_id,
int render_frame_id) {
auto* web_contents =
GetWebContentsFromRenderer(render_process_id, render_frame_id);
DCHECK(web_contents);
TabAndroid* tab_android = TabAndroid::FromWebContents(web_contents);
DCHECK(tab_android);
base::android::ScopedJavaLocalRef<jobject> j_tab_android =
tab_android->GetJavaObject();
DCHECK(!j_tab_android.is_null());
return j_tab_android;
}
#endif
} // namespace vr
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_VR_SERVICE_XR_CONSENT_HELPER_H_
#define CHROME_BROWSER_VR_SERVICE_XR_CONSENT_HELPER_H_
#include <memory>
#include "base/callback_forward.h"
#include "base/macros.h"
#include "build/build_config.h"
#include "chrome/browser/vr/service/xr_consent_prompt_level.h"
#if defined(OS_ANDROID)
#include "base/android/jni_android.h"
#endif
namespace content {
class WebContents;
}
namespace vr {
typedef base::OnceCallback<void(XrConsentPromptLevel, bool)>
OnUserConsentCallback;
class XrConsentHelper {
public:
virtual ~XrConsentHelper();
virtual void ShowConsentPrompt(int render_process_id,
int render_frame_id,
XrConsentPromptLevel consent_level,
OnUserConsentCallback) = 0;
protected:
XrConsentHelper();
// Gets a WebContents from a given |render_process_id| and |render_frame_id|.
// The return value is guaranteed non-null.
static content::WebContents* GetWebContentsFromRenderer(int render_process_id,
int render_frame_id);
#if defined(OS_ANDROID)
static base::android::ScopedJavaLocalRef<jobject> GetTabFromRenderer(
int render_process_id,
int render_frame_id);
#endif
private:
XrConsentHelper(const XrConsentHelper&) = delete;
XrConsentHelper& operator=(const XrConsentHelper&) = delete;
};
} // namespace vr
#endif // CHROME_BROWSER_VR_SERVICE_XR_CONSENT_HELPER_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment