Commit 554a5a03 authored by Tibor Goldschwendt's avatar Tibor Goldschwendt Committed by Commit Bot

[vr] Refactor exit VR prompt API to enable prompting from other code.

- Move decision to show and close prompt to VrShell since it is a state
  change and shout not be part of UiSceneManager.
- Allow different content messages on the exit prompt.

Change-Id: I554948345638428fc48b763834619c40934498d9
Reviewed-on: https://chromium-review.googlesource.com/577674Reviewed-by: default avatarChristopher Grant <cjgrant@chromium.org>
Reviewed-by: default avatarYash Malik <ymalik@chromium.org>
Commit-Queue: Christopher Grant <cjgrant@chromium.org>
Cr-Commit-Position: refs/heads/master@{#488309}
parent d0acf2a7
...@@ -12096,7 +12096,10 @@ read aloud to screenreader users to announce that a completion is available."> ...@@ -12096,7 +12096,10 @@ read aloud to screenreader users to announce that a completion is available.">
</message> </message>
</if> </if>
<if expr="enable_vr"> <if expr="enable_vr">
<message name="IDS_VR_SHELL_EXIT_PROMPT_DESCRIPTION" desc="Text on the exit prompt that shows up when the user clicks on URL bar security icon in VR"> <message name="IDS_VR_SHELL_EXIT_PROMPT_DESCRIPTION" desc="Text on the exit prompt that shows up when the user tries to use a feature that is not supported in VR">
This feature is not supported in VR
</message>
<message name="IDS_VR_SHELL_EXIT_PROMPT_DESCRIPTION_SITE_INFO" desc="Text on the exit prompt that shows up when the user clicks on URL bar security icon in VR">
Site information is not available in VR Site information is not available in VR
</message> </message>
<message name="IDS_VR_SHELL_EXIT_PROMPT_EXIT_VR_BUTTON" desc="Text on the exit button of the exit prompt that shows up when the user clicks on URL bar security icon in VR"> <message name="IDS_VR_SHELL_EXIT_PROMPT_EXIT_VR_BUTTON" desc="Text on the exit button of the exit prompt that shows up when the user clicks on URL bar security icon in VR">
......
...@@ -143,8 +143,14 @@ void VrGLThread::OnGLInitialized() { ...@@ -143,8 +143,14 @@ void VrGLThread::OnGLInitialized() {
void VrGLThread::OnUnsupportedMode(vr::UiUnsupportedMode mode) { void VrGLThread::OnUnsupportedMode(vr::UiUnsupportedMode mode) {
main_thread_task_runner_->PostTask( main_thread_task_runner_->PostTask(
FROM_HERE, FROM_HERE, base::Bind(&VrShell::OnUnsupportedMode, weak_vr_shell_, mode));
base::Bind(&VrShell::ExitVrDueToUnsupportedMode, weak_vr_shell_, mode)); }
void VrGLThread::OnExitVrPromptResult(vr::UiUnsupportedMode reason,
vr::ExitVrPromptChoice choice) {
main_thread_task_runner_->PostTask(
FROM_HERE, base::Bind(&VrShell::OnExitVrPromptResult, weak_vr_shell_,
reason, choice));
} }
void VrGLThread::SetFullscreen(bool enabled) { void VrGLThread::SetFullscreen(bool enabled) {
...@@ -252,6 +258,14 @@ void VrGLThread::OnWebVrFrameAvailable() { ...@@ -252,6 +258,14 @@ void VrGLThread::OnWebVrFrameAvailable() {
scene_manager_->OnWebVrFrameAvailable(); scene_manager_->OnWebVrFrameAvailable();
} }
void VrGLThread::SetExitVrPromptEnabled(bool enabled,
vr::UiUnsupportedMode reason) {
WaitUntilThreadStarted();
task_runner()->PostTask(
FROM_HERE, base::Bind(&vr::UiSceneManager::SetExitVrPromptEnabled,
weak_scene_manager_, enabled, reason));
}
void VrGLThread::CleanUp() { void VrGLThread::CleanUp() {
scene_manager_.reset(); scene_manager_.reset();
vr_shell_gl_.reset(); vr_shell_gl_.reset();
......
...@@ -70,6 +70,8 @@ class VrGLThread : public base::Thread, ...@@ -70,6 +70,8 @@ class VrGLThread : public base::Thread,
void NavigateBack() override; void NavigateBack() override;
void ExitCct() override; void ExitCct() override;
void OnUnsupportedMode(vr::UiUnsupportedMode mode) override; void OnUnsupportedMode(vr::UiUnsupportedMode mode) override;
void OnExitVrPromptResult(vr::UiUnsupportedMode reason,
vr::ExitVrPromptChoice choice) override;
// vr::UiInterface implementation (VrShell and GL calling to the UI). // vr::UiInterface implementation (VrShell and GL calling to the UI).
void SetFullscreen(bool enabled) override; void SetFullscreen(bool enabled) override;
...@@ -87,6 +89,8 @@ class VrGLThread : public base::Thread, ...@@ -87,6 +89,8 @@ class VrGLThread : public base::Thread,
void SetLocationAccessIndicator(bool enabled) override; void SetLocationAccessIndicator(bool enabled) override;
void SetIsExiting() override; void SetIsExiting() override;
void SetSplashScreenIcon(const SkBitmap& bitmap) override; void SetSplashScreenIcon(const SkBitmap& bitmap) override;
void SetExitVrPromptEnabled(bool enabled,
vr::UiUnsupportedMode reason) override;
protected: protected:
void Init() override; void Init() override;
......
...@@ -585,7 +585,8 @@ void VrShell::ExitFullscreen() { ...@@ -585,7 +585,8 @@ void VrShell::ExitFullscreen() {
} }
} }
void VrShell::ExitVrDueToUnsupportedMode(vr::UiUnsupportedMode mode) { void VrShell::ExitVrDueToUnsupportedMode(vr::UiUnsupportedMode mode,
bool show_exit_warning) {
if (mode == vr::UiUnsupportedMode::kUnhandledPageInfo) { if (mode == vr::UiUnsupportedMode::kUnhandledPageInfo) {
UMA_HISTOGRAM_ENUMERATION("VR.Shell.EncounteredUnsupportedMode", mode, UMA_HISTOGRAM_ENUMERATION("VR.Shell.EncounteredUnsupportedMode", mode,
vr::UiUnsupportedMode::kCount); vr::UiUnsupportedMode::kCount);
...@@ -593,17 +594,45 @@ void VrShell::ExitVrDueToUnsupportedMode(vr::UiUnsupportedMode mode) { ...@@ -593,17 +594,45 @@ void VrShell::ExitVrDueToUnsupportedMode(vr::UiUnsupportedMode mode) {
Java_VrShellImpl_onUnhandledPageInfo(env, j_vr_shell_.obj()); Java_VrShellImpl_onUnhandledPageInfo(env, j_vr_shell_.obj());
return; return;
} }
ui_->SetIsExiting(); if (show_exit_warning) {
PostToGlThread(FROM_HERE, base::Bind(&VrShellGl::set_is_exiting, ui_->SetIsExiting();
gl_thread_->GetVrShellGl(), true)); PostToGlThread(FROM_HERE, base::Bind(&VrShellGl::set_is_exiting,
main_thread_task_runner_->PostDelayedTask( gl_thread_->GetVrShellGl(), true));
FROM_HERE, main_thread_task_runner_->PostDelayedTask(
base::Bind(&VrShell::ForceExitVr, weak_ptr_factory_.GetWeakPtr()), FROM_HERE,
kExitVrDueToUnsupportedModeDelay); base::Bind(&VrShell::ForceExitVr, weak_ptr_factory_.GetWeakPtr()),
kExitVrDueToUnsupportedModeDelay);
} else {
ForceExitVr();
}
UMA_HISTOGRAM_ENUMERATION("VR.Shell.EncounteredUnsupportedMode", mode, UMA_HISTOGRAM_ENUMERATION("VR.Shell.EncounteredUnsupportedMode", mode,
vr::UiUnsupportedMode::kCount); vr::UiUnsupportedMode::kCount);
} }
void VrShell::OnUnsupportedMode(vr::UiUnsupportedMode mode) {
switch (mode) {
case vr::UiUnsupportedMode::kUnhandledPageInfo:
ui_->SetExitVrPromptEnabled(true, mode);
break;
default:
ExitVrDueToUnsupportedMode(mode, true);
break;
}
}
void VrShell::OnExitVrPromptResult(vr::UiUnsupportedMode reason,
vr::ExitVrPromptChoice choice) {
switch (choice) {
case vr::ExitVrPromptChoice::CHOICE_NONE:
case vr::ExitVrPromptChoice::CHOICE_STAY:
ui_->SetExitVrPromptEnabled(false, vr::UiUnsupportedMode::kCount);
return;
case vr::ExitVrPromptChoice::CHOICE_EXIT:
ExitVrDueToUnsupportedMode(reason, false);
return;
}
}
void VrShell::UpdateVSyncInterval(base::TimeTicks vsync_timebase, void VrShell::UpdateVSyncInterval(base::TimeTicks vsync_timebase,
base::TimeDelta vsync_interval) { base::TimeDelta vsync_interval) {
PollMediaAccessFlag(); PollMediaAccessFlag();
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/single_thread_task_runner.h" #include "base/single_thread_task_runner.h"
#include "chrome/browser/ui/toolbar/chrome_toolbar_model_delegate.h" #include "chrome/browser/ui/toolbar/chrome_toolbar_model_delegate.h"
#include "chrome/browser/vr/exit_vr_prompt_choice.h"
#include "chrome/browser/vr/ui_interface.h" #include "chrome/browser/vr/ui_interface.h"
#include "chrome/browser/vr/ui_unsupported_mode.h" #include "chrome/browser/vr/ui_unsupported_mode.h"
#include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_observer.h"
...@@ -172,7 +173,9 @@ class VrShell : public device::GvrDelegate, ...@@ -172,7 +173,9 @@ class VrShell : public device::GvrDelegate,
void ForceExitVr(); void ForceExitVr();
void ExitPresent(); void ExitPresent();
void ExitFullscreen(); void ExitFullscreen();
void ExitVrDueToUnsupportedMode(vr::UiUnsupportedMode mode); void OnUnsupportedMode(vr::UiUnsupportedMode mode);
void OnExitVrPromptResult(vr::UiUnsupportedMode reason,
vr::ExitVrPromptChoice choice);
void ProcessContentGesture(std::unique_ptr<blink::WebInputEvent> event); void ProcessContentGesture(std::unique_ptr<blink::WebInputEvent> event);
...@@ -212,6 +215,9 @@ class VrShell : public device::GvrDelegate, ...@@ -212,6 +215,9 @@ class VrShell : public device::GvrDelegate,
bool HasDaydreamSupport(JNIEnv* env); bool HasDaydreamSupport(JNIEnv* env);
void ExitVrDueToUnsupportedMode(vr::UiUnsupportedMode mode,
bool show_exit_warning);
bool vr_shell_enabled_; bool vr_shell_enabled_;
bool content_paused_ = false; bool content_paused_ = false;
......
...@@ -72,6 +72,7 @@ static_library("vr_common") { ...@@ -72,6 +72,7 @@ static_library("vr_common") {
"elements/url_bar.h", "elements/url_bar.h",
"elements/url_bar_texture.cc", "elements/url_bar_texture.cc",
"elements/url_bar_texture.h", "elements/url_bar_texture.h",
"exit_vr_prompt_choice.h",
"font_fallback.cc", "font_fallback.cc",
"font_fallback.h", "font_fallback.h",
"fps_meter.cc", "fps_meter.cc",
......
...@@ -19,6 +19,10 @@ ExitPrompt::ExitPrompt(int preferred_width, ...@@ -19,6 +19,10 @@ ExitPrompt::ExitPrompt(int preferred_width,
ExitPrompt::~ExitPrompt() = default; ExitPrompt::~ExitPrompt() = default;
void ExitPrompt::SetContentMessageId(int message_id) {
texture_->SetContentMessageId(message_id);
}
void ExitPrompt::SetTextureForTesting(ExitPromptTexture* texture) { void ExitPrompt::SetTextureForTesting(ExitPromptTexture* texture) {
texture_.reset(texture); texture_.reset(texture);
} }
......
...@@ -22,6 +22,8 @@ class ExitPrompt : public TexturedElement { ...@@ -22,6 +22,8 @@ class ExitPrompt : public TexturedElement {
const base::Callback<void()>& secondary_buttton_callback); const base::Callback<void()>& secondary_buttton_callback);
~ExitPrompt() override; ~ExitPrompt() override;
void SetContentMessageId(int message_id);
void SetTextureForTesting(ExitPromptTexture* texture); void SetTextureForTesting(ExitPromptTexture* texture);
void OnHoverEnter(const gfx::PointF& position) override; void OnHoverEnter(const gfx::PointF& position) override;
......
...@@ -45,7 +45,7 @@ void ExitPromptTexture::Draw(SkCanvas* sk_canvas, ...@@ -45,7 +45,7 @@ void ExitPromptTexture::Draw(SkCanvas* sk_canvas,
gfx::Canvas* canvas = &gfx_canvas; gfx::Canvas* canvas = &gfx_canvas;
// Prompt text area. // Prompt text area.
auto text = l10n_util::GetStringUTF16(IDS_VR_SHELL_EXIT_PROMPT_DESCRIPTION); auto text = l10n_util::GetStringUTF16(content_message_id_);
gfx::FontList fonts; gfx::FontList fonts;
GetFontList(ToPixels(kFontSizePromptText), text, &fonts); GetFontList(ToPixels(kFontSizePromptText), text, &fonts);
gfx::Rect prompt_text_size(size_.width(), 0); gfx::Rect prompt_text_size(size_.width(), 0);
...@@ -163,6 +163,11 @@ void ExitPromptTexture::SetSecondaryButtonPressed(bool pressed) { ...@@ -163,6 +163,11 @@ void ExitPromptTexture::SetSecondaryButtonPressed(bool pressed) {
secondary_pressed_ = pressed; secondary_pressed_ = pressed;
} }
void ExitPromptTexture::SetContentMessageId(int message_id) {
content_message_id_ = message_id;
set_dirty();
}
gfx::Size ExitPromptTexture::GetPreferredTextureSize(int maximum_width) const { gfx::Size ExitPromptTexture::GetPreferredTextureSize(int maximum_width) const {
return gfx::Size(maximum_width, maximum_width * kHeight / kWidth); return gfx::Size(maximum_width, maximum_width * kHeight / kWidth);
} }
......
...@@ -26,6 +26,7 @@ class ExitPromptTexture : public UiTexture { ...@@ -26,6 +26,7 @@ class ExitPromptTexture : public UiTexture {
void SetPrimaryButtonPressed(bool pressed); void SetPrimaryButtonPressed(bool pressed);
void SetSecondaryButtonHovered(bool hovered); void SetSecondaryButtonHovered(bool hovered);
void SetSecondaryButtonPressed(bool pressed); void SetSecondaryButtonPressed(bool pressed);
void SetContentMessageId(int message_id);
virtual bool HitsSecondaryButton(const gfx::PointF& position) const; virtual bool HitsSecondaryButton(const gfx::PointF& position) const;
virtual bool HitsPrimaryButton(const gfx::PointF& position) const; virtual bool HitsPrimaryButton(const gfx::PointF& position) const;
...@@ -46,6 +47,7 @@ class ExitPromptTexture : public UiTexture { ...@@ -46,6 +47,7 @@ class ExitPromptTexture : public UiTexture {
bool primary_pressed_ = false; bool primary_pressed_ = false;
bool secondary_hovered_ = false; bool secondary_hovered_ = false;
bool secondary_pressed_ = false; bool secondary_pressed_ = false;
int content_message_id_ = -1;
DISALLOW_COPY_AND_ASSIGN(ExitPromptTexture); DISALLOW_COPY_AND_ASSIGN(ExitPromptTexture);
}; };
......
// Copyright 2017 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_EXIT_VR_PROMPT_CHOICE_H_
#define CHROME_BROWSER_VR_EXIT_VR_PROMPT_CHOICE_H_
namespace vr {
// The answer the user gave to an exit VR prompt.
enum ExitVrPromptChoice {
CHOICE_NONE, // No answer give, e.g. user dismissed exit prompt or another
// exit request was opened.
CHOICE_EXIT, // User wants to exit VR.
CHOICE_STAY, // User want to stay in VR.
};
} // namespace vr
#endif // CHROME_BROWSER_VR_EXIT_VR_PROMPT_CHOICE_H_
...@@ -21,6 +21,8 @@ class MockBrowserInterface : public UiBrowserInterface { ...@@ -21,6 +21,8 @@ class MockBrowserInterface : public UiBrowserInterface {
MOCK_METHOD0(NavigateBack, void()); MOCK_METHOD0(NavigateBack, void());
MOCK_METHOD0(ExitCct, void()); MOCK_METHOD0(ExitCct, void());
MOCK_METHOD1(OnUnsupportedMode, void(UiUnsupportedMode mode)); MOCK_METHOD1(OnUnsupportedMode, void(UiUnsupportedMode mode));
MOCK_METHOD2(OnExitVrPromptResult,
void(UiUnsupportedMode reason, ExitVrPromptChoice choice));
private: private:
DISALLOW_COPY_AND_ASSIGN(MockBrowserInterface); DISALLOW_COPY_AND_ASSIGN(MockBrowserInterface);
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#ifndef CHROME_BROWSER_VR_UI_BROWSER_INTERFACE_H_ #ifndef CHROME_BROWSER_VR_UI_BROWSER_INTERFACE_H_
#define CHROME_BROWSER_VR_UI_BROWSER_INTERFACE_H_ #define CHROME_BROWSER_VR_UI_BROWSER_INTERFACE_H_
#include "chrome/browser/vr/exit_vr_prompt_choice.h"
#include "chrome/browser/vr/ui_unsupported_mode.h" #include "chrome/browser/vr/ui_unsupported_mode.h"
namespace vr { namespace vr {
...@@ -20,6 +21,8 @@ class UiBrowserInterface { ...@@ -20,6 +21,8 @@ class UiBrowserInterface {
virtual void NavigateBack() = 0; virtual void NavigateBack() = 0;
virtual void ExitCct() = 0; virtual void ExitCct() = 0;
virtual void OnUnsupportedMode(UiUnsupportedMode mode) = 0; virtual void OnUnsupportedMode(UiUnsupportedMode mode) = 0;
virtual void OnExitVrPromptResult(UiUnsupportedMode reason,
ExitVrPromptChoice choice) = 0;
}; };
} // namespace vr } // namespace vr
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#ifndef CHROME_BROWSER_VR_UI_INTERFACE_H_ #ifndef CHROME_BROWSER_VR_UI_INTERFACE_H_
#define CHROME_BROWSER_VR_UI_INTERFACE_H_ #define CHROME_BROWSER_VR_UI_INTERFACE_H_
#include "chrome/browser/vr/ui_unsupported_mode.h"
#include "components/security_state/core/security_state.h" #include "components/security_state/core/security_state.h"
class SkBitmap; class SkBitmap;
...@@ -52,6 +53,9 @@ class UiInterface { ...@@ -52,6 +53,9 @@ class UiInterface {
virtual void FlushTabList() {} virtual void FlushTabList() {}
virtual void UpdateTab(bool incognito, int id, const std::string& title) {} virtual void UpdateTab(bool incognito, int id, const std::string& title) {}
virtual void RemoveTab(bool incognito, int id) {} virtual void RemoveTab(bool incognito, int id) {}
virtual void SetExitVrPromptEnabled(bool enabled,
UiUnsupportedMode reason) = 0;
}; };
} // namespace vr } // namespace vr
......
...@@ -401,12 +401,16 @@ void UiSceneManager::CreateCloseButton() { ...@@ -401,12 +401,16 @@ void UiSceneManager::CreateCloseButton() {
} }
void UiSceneManager::CreateExitPrompt() { void UiSceneManager::CreateExitPrompt() {
std::unique_ptr<UiElement> element = base::MakeUnique<ExitPrompt>( std::unique_ptr<UiElement> element;
std::unique_ptr<ExitPrompt> exit_prompt = base::MakeUnique<ExitPrompt>(
512, 512,
base::Bind(&UiSceneManager::OnExitPromptPrimaryButtonClicked, base::Bind(&UiSceneManager::OnExitPromptChoice, base::Unretained(this),
base::Unretained(this)), false),
base::Bind(&UiSceneManager::OnExitPromptSecondaryButtonClicked, base::Bind(&UiSceneManager::OnExitPromptChoice, base::Unretained(this),
base::Unretained(this))); true));
exit_prompt_ = exit_prompt.get();
element = std::move(exit_prompt);
element->set_debug_id(kExitPrompt); element->set_debug_id(kExitPrompt);
element->set_id(AllocateId()); element->set_id(AllocateId());
element->set_fill(vr::Fill::NONE); element->set_fill(vr::Fill::NONE);
...@@ -414,20 +418,20 @@ void UiSceneManager::CreateExitPrompt() { ...@@ -414,20 +418,20 @@ void UiSceneManager::CreateExitPrompt() {
element->SetTranslate(0.0, kExitPromptVerticalOffset, kTextureOffset); element->SetTranslate(0.0, kExitPromptVerticalOffset, kTextureOffset);
element->set_parent_id(main_content_->id()); element->set_parent_id(main_content_->id());
element->set_visible(false); element->set_visible(false);
exit_prompt_ = element.get();
scene_->AddUiElement(std::move(element)); scene_->AddUiElement(std::move(element));
// Place an invisible but hittable plane behind the exit prompt, to keep the // Place an invisible but hittable plane behind the exit prompt, to keep the
// reticle roughly planar with the content if near content. // reticle roughly planar with the content if near content.
element = base::MakeUnique<ExitPromptBackplane>(base::Bind( auto backplane = base::MakeUnique<ExitPromptBackplane>(base::Bind(
&UiSceneManager::OnExitPromptBackplaneClicked, base::Unretained(this))); &UiSceneManager::OnExitPromptBackplaneClicked, base::Unretained(this)));
exit_prompt_backplane_ = backplane.get();
element = std::move(backplane);
element->set_debug_id(kExitPromptBackplane); element->set_debug_id(kExitPromptBackplane);
element->set_id(AllocateId()); element->set_id(AllocateId());
element->set_fill(vr::Fill::NONE); element->set_fill(vr::Fill::NONE);
element->SetSize(kExitPromptBackplaneSize, kExitPromptBackplaneSize); element->SetSize(kExitPromptBackplaneSize, kExitPromptBackplaneSize);
element->SetTranslate(0.0, 0.0, -kTextureOffset); element->SetTranslate(0.0, 0.0, -kTextureOffset);
element->set_parent_id(exit_prompt_->id()); element->set_parent_id(exit_prompt_->id());
exit_prompt_backplane_ = element.get();
content_elements_.push_back(element.get()); content_elements_.push_back(element.get());
scene_->AddUiElement(std::move(element)); scene_->AddUiElement(std::move(element));
} }
...@@ -637,6 +641,22 @@ void UiSceneManager::SetFullscreen(bool fullscreen) { ...@@ -637,6 +641,22 @@ void UiSceneManager::SetFullscreen(bool fullscreen) {
ConfigureScene(); ConfigureScene();
} }
void UiSceneManager::SetExitVrPromptEnabled(bool enabled,
UiUnsupportedMode reason) {
DCHECK(enabled || reason == UiUnsupportedMode::kCount);
if (prompting_to_exit_ && enabled) {
browser_->OnExitVrPromptResult(exit_vr_prompt_reason_,
ExitVrPromptChoice::CHOICE_NONE);
}
exit_prompt_->SetContentMessageId(
(reason == UiUnsupportedMode::kUnhandledPageInfo)
? IDS_VR_SHELL_EXIT_PROMPT_DESCRIPTION_SITE_INFO
: IDS_VR_SHELL_EXIT_PROMPT_DESCRIPTION);
exit_vr_prompt_reason_ = reason;
prompting_to_exit_ = enabled;
ConfigureScene();
}
void UiSceneManager::ConfigureSecurityWarnings() { void UiSceneManager::ConfigureSecurityWarnings() {
bool enabled = bool enabled =
web_vr_mode_ && !secure_origin_ && !showing_web_vr_splash_screen_; web_vr_mode_ && !secure_origin_ && !showing_web_vr_splash_screen_;
...@@ -713,34 +733,23 @@ void UiSceneManager::OnSecurityIconClickedForTesting() { ...@@ -713,34 +733,23 @@ void UiSceneManager::OnSecurityIconClickedForTesting() {
OnSecurityIconClicked(); OnSecurityIconClicked();
} }
void UiSceneManager::OnExitPromptPrimaryButtonClickedForTesting() { void UiSceneManager::OnExitPromptChoiceForTesting(bool chose_exit) {
OnExitPromptPrimaryButtonClicked(); OnExitPromptChoice(chose_exit);
} }
void UiSceneManager::OnSecurityIconClicked() { void UiSceneManager::OnSecurityIconClicked() {
if (prompting_to_exit_) browser_->OnUnsupportedMode(UiUnsupportedMode::kUnhandledPageInfo);
return;
prompting_to_exit_ = true;
ConfigureScene();
} }
void UiSceneManager::OnExitPromptBackplaneClicked() { void UiSceneManager::OnExitPromptBackplaneClicked() {
CloseExitPrompt(); browser_->OnExitVrPromptResult(exit_vr_prompt_reason_,
} ExitVrPromptChoice::CHOICE_NONE);
void UiSceneManager::CloseExitPrompt() {
if (!prompting_to_exit_)
return;
prompting_to_exit_ = false;
ConfigureScene();
}
void UiSceneManager::OnExitPromptPrimaryButtonClicked() {
CloseExitPrompt();
} }
void UiSceneManager::OnExitPromptSecondaryButtonClicked() { void UiSceneManager::OnExitPromptChoice(bool chose_exit) {
OnUnsupportedMode(UiUnsupportedMode::kUnhandledPageInfo); browser_->OnExitVrPromptResult(exit_vr_prompt_reason_,
chose_exit ? ExitVrPromptChoice::CHOICE_EXIT
: ExitVrPromptChoice::CHOICE_STAY);
} }
void UiSceneManager::SetToolbarState(const ToolbarState& state) { void UiSceneManager::SetToolbarState(const ToolbarState& state) {
......
...@@ -25,6 +25,7 @@ class UiBrowserInterface; ...@@ -25,6 +25,7 @@ class UiBrowserInterface;
class UiElement; class UiElement;
class UiScene; class UiScene;
class UrlBar; class UrlBar;
class ExitPrompt;
class UiSceneManager { class UiSceneManager {
public: public:
...@@ -60,8 +61,10 @@ class UiSceneManager { ...@@ -60,8 +61,10 @@ class UiSceneManager {
void OnAppButtonGesturePerformed(UiInterface::Direction direction); void OnAppButtonGesturePerformed(UiInterface::Direction direction);
void OnWebVrFrameAvailable(); void OnWebVrFrameAvailable();
void SetExitVrPromptEnabled(bool enabled, UiUnsupportedMode reason);
void OnSecurityIconClickedForTesting(); void OnSecurityIconClickedForTesting();
void OnExitPromptPrimaryButtonClickedForTesting(); void OnExitPromptChoiceForTesting(bool chose_exit);
private: private:
void CreateScreenDimmer(); void CreateScreenDimmer();
...@@ -81,11 +84,9 @@ class UiSceneManager { ...@@ -81,11 +84,9 @@ class UiSceneManager {
void ConfigureExclusiveScreenToast(); void ConfigureExclusiveScreenToast();
void ConfigureIndicators(); void ConfigureIndicators();
void ConfigureBackgroundColor(); void ConfigureBackgroundColor();
void CloseExitPrompt();
void OnBackButtonClicked(); void OnBackButtonClicked();
void OnSecurityIconClicked(); void OnSecurityIconClicked();
void OnExitPromptPrimaryButtonClicked(); void OnExitPromptChoice(bool chose_exit);
void OnExitPromptSecondaryButtonClicked();
void OnExitPromptBackplaneClicked(); void OnExitPromptBackplaneClicked();
void OnCloseButtonClicked(); void OnCloseButtonClicked();
void OnUnsupportedMode(UiUnsupportedMode mode); void OnUnsupportedMode(UiUnsupportedMode mode);
...@@ -100,7 +101,7 @@ class UiSceneManager { ...@@ -100,7 +101,7 @@ class UiSceneManager {
UiElement* permanent_security_warning_ = nullptr; UiElement* permanent_security_warning_ = nullptr;
TransientSecurityWarning* transient_security_warning_ = nullptr; TransientSecurityWarning* transient_security_warning_ = nullptr;
ExclusiveScreenToast* exclusive_screen_toast_ = nullptr; ExclusiveScreenToast* exclusive_screen_toast_ = nullptr;
UiElement* exit_prompt_ = nullptr; ExitPrompt* exit_prompt_ = nullptr;
UiElement* exit_prompt_backplane_ = nullptr; UiElement* exit_prompt_backplane_ = nullptr;
UiElement* exit_warning_ = nullptr; UiElement* exit_warning_ = nullptr;
UiElement* main_content_ = nullptr; UiElement* main_content_ = nullptr;
...@@ -139,6 +140,7 @@ class UiSceneManager { ...@@ -139,6 +140,7 @@ class UiSceneManager {
bool screen_capturing_ = false; bool screen_capturing_ = false;
bool location_access_ = false; bool location_access_ = false;
bool bluetooth_connected_ = false; bool bluetooth_connected_ = false;
UiUnsupportedMode exit_vr_prompt_reason_ = UiUnsupportedMode::kCount;
int next_available_id_ = 1; int next_available_id_ = 1;
......
...@@ -32,9 +32,9 @@ TEST_F(UiSceneManagerTest, ExitPresentAndFullscreenOnAppButtonClick) { ...@@ -32,9 +32,9 @@ TEST_F(UiSceneManagerTest, ExitPresentAndFullscreenOnAppButtonClick) {
MakeManager(kNotInCct, kInWebVr); MakeManager(kNotInCct, kInWebVr);
// Clicking app button should trigger to exit presentation. // Clicking app button should trigger to exit presentation.
EXPECT_CALL(*browser_, ExitPresent()).Times(1); EXPECT_CALL(*browser_, ExitPresent());
// And also trigger exit fullscreen. // And also trigger exit fullscreen.
EXPECT_CALL(*browser_, ExitFullscreen()).Times(1); EXPECT_CALL(*browser_, ExitFullscreen());
manager_->OnAppButtonClicked(); manager_->OnAppButtonClicked();
} }
...@@ -302,7 +302,7 @@ TEST_F(UiSceneManagerTest, UiUpdatesForFullscreenChanges) { ...@@ -302,7 +302,7 @@ TEST_F(UiSceneManagerTest, UiUpdatesForFullscreenChanges) {
EXPECT_EQ(initial_position, content_quad->transform_operations().Apply()); EXPECT_EQ(initial_position, content_quad->transform_operations().Apply());
} }
TEST_F(UiSceneManagerTest, UiUpdatesExitPrompt) { TEST_F(UiSceneManagerTest, SecurityIconClickTriggersUnsupportedMode) {
MakeManager(kNotInCct, kNotInWebVr); MakeManager(kNotInCct, kNotInWebVr);
manager_->SetWebVrSecureOrigin(true); manager_->SetWebVrSecureOrigin(true);
...@@ -310,31 +310,111 @@ TEST_F(UiSceneManagerTest, UiUpdatesExitPrompt) { ...@@ -310,31 +310,111 @@ TEST_F(UiSceneManagerTest, UiUpdatesExitPrompt) {
// Initial state. // Initial state.
VerifyElementsVisible("Initial", kElementsVisibleInBrowsing); VerifyElementsVisible("Initial", kElementsVisibleInBrowsing);
// Exit prompt visible state. // Clicking on security icon should trigger unsupported mode.
EXPECT_CALL(*browser_,
OnUnsupportedMode(UiUnsupportedMode::kUnhandledPageInfo));
manager_->OnSecurityIconClickedForTesting(); manager_->OnSecurityIconClickedForTesting();
VerifyElementsVisible("Prompt invisible", kElementsVisibleInBrowsing);
}
TEST_F(UiSceneManagerTest, UiUpdatesForShowingExitPrompt) {
MakeManager(kNotInCct, kNotInWebVr);
manager_->SetWebVrSecureOrigin(true);
// Initial state.
VerifyElementsVisible("Initial", kElementsVisibleInBrowsing);
// Showing exit VR prompt should make prompt visible.
manager_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo);
VerifyElementsVisible("Prompt visible", kElementsVisibleWithExitPrompt); VerifyElementsVisible("Prompt visible", kElementsVisibleWithExitPrompt);
}
// Back to initial state. TEST_F(UiSceneManagerTest, UiUpdatesForHidingExitPrompt) {
manager_->OnExitPromptPrimaryButtonClickedForTesting(); MakeManager(kNotInCct, kNotInWebVr);
VerifyElementsVisible("Restore initial", kElementsVisibleInBrowsing);
manager_->SetWebVrSecureOrigin(true);
// Initial state.
manager_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo);
VerifyElementsVisible("Initial", kElementsVisibleWithExitPrompt);
// Hiding exit VR prompt should make prompt invisible.
manager_->SetExitVrPromptEnabled(false, UiUnsupportedMode::kCount);
VerifyElementsVisible("Prompt invisible", kElementsVisibleInBrowsing);
} }
TEST_F(UiSceneManagerTest, BackplaneClickClosesExitPrompt) { TEST_F(UiSceneManagerTest, BackplaneClickTriggersOnExitPrompt) {
MakeManager(kNotInCct, kNotInWebVr); MakeManager(kNotInCct, kNotInWebVr);
manager_->SetWebVrSecureOrigin(true); manager_->SetWebVrSecureOrigin(true);
// Initial state. // Initial state.
VerifyElementsVisible("Initial", kElementsVisibleInBrowsing); VerifyElementsVisible("Initial", kElementsVisibleInBrowsing);
manager_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo);
// Exit prompt visible state. // Click on backplane should trigger UI browser interface but not close
manager_->OnSecurityIconClickedForTesting(); // prompt.
VerifyElementsVisible("Prompt visble", kElementsVisibleWithExitPrompt); EXPECT_CALL(*browser_,
OnExitVrPromptResult(UiUnsupportedMode::kUnhandledPageInfo,
// Back to initial state. ExitVrPromptChoice::CHOICE_NONE));
scene_->GetUiElementByDebugId(kExitPromptBackplane) scene_->GetUiElementByDebugId(kExitPromptBackplane)
->OnButtonUp(gfx::PointF()); ->OnButtonUp(gfx::PointF());
VerifyElementsVisible("Restore initial", kElementsVisibleInBrowsing); VerifyElementsVisible("Prompt still visible", kElementsVisibleWithExitPrompt);
}
TEST_F(UiSceneManagerTest, PrimaryButtonClickTriggersOnExitPrompt) {
MakeManager(kNotInCct, kNotInWebVr);
manager_->SetWebVrSecureOrigin(true);
// Initial state.
VerifyElementsVisible("Initial", kElementsVisibleInBrowsing);
manager_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo);
// Click on 'OK' should trigger UI browser interface but not close prompt.
EXPECT_CALL(*browser_,
OnExitVrPromptResult(UiUnsupportedMode::kUnhandledPageInfo,
ExitVrPromptChoice::CHOICE_STAY));
manager_->OnExitPromptChoiceForTesting(false);
VerifyElementsVisible("Prompt still visible", kElementsVisibleWithExitPrompt);
}
TEST_F(UiSceneManagerTest, SecondaryButtonClickTriggersOnExitPrompt) {
MakeManager(kNotInCct, kNotInWebVr);
manager_->SetWebVrSecureOrigin(true);
// Initial state.
VerifyElementsVisible("Initial", kElementsVisibleInBrowsing);
manager_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo);
// Click on 'Exit VR' should trigger UI browser interface but not close
// prompt.
EXPECT_CALL(*browser_,
OnExitVrPromptResult(UiUnsupportedMode::kUnhandledPageInfo,
ExitVrPromptChoice::CHOICE_EXIT));
manager_->OnExitPromptChoiceForTesting(true);
VerifyElementsVisible("Prompt still visible", kElementsVisibleWithExitPrompt);
}
TEST_F(UiSceneManagerTest, SecondExitPromptTriggersOnExitPrompt) {
MakeManager(kNotInCct, kNotInWebVr);
manager_->SetWebVrSecureOrigin(true);
// Initial state.
VerifyElementsVisible("Initial", kElementsVisibleInBrowsing);
manager_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo);
// Click on 'Exit VR' should trigger UI browser interface but not close
// prompt.
EXPECT_CALL(*browser_,
OnExitVrPromptResult(UiUnsupportedMode::kUnhandledPageInfo,
ExitVrPromptChoice::CHOICE_NONE));
manager_->SetExitVrPromptEnabled(true,
UiUnsupportedMode::kUnhandledCodePoint);
VerifyElementsVisible("Prompt still visible", kElementsVisibleWithExitPrompt);
} }
TEST_F(UiSceneManagerTest, UiUpdatesForWebVR) { TEST_F(UiSceneManagerTest, UiUpdatesForWebVR) {
......
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