Commit d1389bea authored by Ian Vollick's avatar Ian Vollick Committed by Commit Bot

[vr] Fade out 2d browsing elements when showing modal dialogs

With this CL, I change how the visibility of modal dialogs and the
related visibility of 2d browsing scene elements are managed.

I have also added two elements in the ancestor chain for the
audio permission prompt: a shadow and a full screen hit target
(similar to the exit prompt backplane).

Bug: 768512
Cq-Include-Trybots: master.tryserver.chromium.android:android_optional_gpu_tests_rel;master.tryserver.chromium.linux:linux_optional_gpu_tests_rel;master.tryserver.chromium.mac:mac_optional_gpu_tests_rel;master.tryserver.chromium.win:win_optional_gpu_tests_rel
Change-Id: Ia5dcbe865fb8d92e90538039d9dfaa4679573dac
Reviewed-on: https://chromium-review.googlesource.com/774908
Commit-Queue: Ian Vollick <vollick@chromium.org>
Reviewed-by: default avatarYash Malik <ymalik@chromium.org>
Reviewed-by: default avatarBiao She <bshe@chromium.org>
Reviewed-by: default avatarAmirhossein Simjour <asimjour@chromium.org>
Cr-Commit-Position: refs/heads/master@{#517298}
parent 5097c6d9
...@@ -116,6 +116,8 @@ static_library("vr_common") { ...@@ -116,6 +116,8 @@ static_library("vr_common") {
"gltf_parser.h", "gltf_parser.h",
"macros.h", "macros.h",
"model/controller_model.h", "model/controller_model.h",
"model/modal_prompt_type.cc",
"model/modal_prompt_type.h",
"model/model.cc", "model/model.cc",
"model/model.h", "model/model.h",
"model/omnibox_suggestions.cc", "model/omnibox_suggestions.cc",
...@@ -250,6 +252,7 @@ test("vr_common_unittests") { ...@@ -250,6 +252,7 @@ test("vr_common_unittests") {
"ui_renderer_unittest.cc", "ui_renderer_unittest.cc",
"ui_scene_manager_unittest.cc", "ui_scene_manager_unittest.cc",
"ui_scene_unittest.cc", "ui_scene_unittest.cc",
"ui_unittest.cc",
"vr_gl_util_unittest.cc", "vr_gl_util_unittest.cc",
] ]
......
...@@ -24,6 +24,7 @@ namespace vr { ...@@ -24,6 +24,7 @@ namespace vr {
class ContentInputForwarder { class ContentInputForwarder {
public: public:
virtual ~ContentInputForwarder() {}
virtual void ForwardEvent(std::unique_ptr<blink::WebInputEvent> event, virtual void ForwardEvent(std::unique_ptr<blink::WebInputEvent> event,
int content_id) = 0; int content_id) = 0;
}; };
......
...@@ -10,8 +10,8 @@ ...@@ -10,8 +10,8 @@
namespace vr { namespace vr {
ExitPrompt::ExitPrompt(int preferred_width, ExitPrompt::ExitPrompt(int preferred_width,
const base::Callback<void()>& primary_button_callback, const ExitPrompt::Callback& primary_button_callback,
const base::Callback<void()>& secondary_buttton_callback) const ExitPrompt::Callback& secondary_buttton_callback)
: TexturedElement(preferred_width), : TexturedElement(preferred_width),
texture_(base::MakeUnique<ExitPromptTexture>()), texture_(base::MakeUnique<ExitPromptTexture>()),
primary_button_callback_(primary_button_callback), primary_button_callback_(primary_button_callback),
...@@ -50,9 +50,9 @@ void ExitPrompt::OnButtonDown(const gfx::PointF& position) { ...@@ -50,9 +50,9 @@ void ExitPrompt::OnButtonDown(const gfx::PointF& position) {
void ExitPrompt::OnButtonUp(const gfx::PointF& position) { void ExitPrompt::OnButtonUp(const gfx::PointF& position) {
if (primary_down_ && texture_->HitsPrimaryButton(position)) if (primary_down_ && texture_->HitsPrimaryButton(position))
primary_button_callback_.Run(); primary_button_callback_.Run(reason_);
else if (secondary_down_ && texture_->HitsSecondaryButton(position)) else if (secondary_down_ && texture_->HitsSecondaryButton(position))
secondary_buttton_callback_.Run(); secondary_buttton_callback_.Run(reason_);
primary_down_ = false; primary_down_ = false;
secondary_down_ = false; secondary_down_ = false;
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "base/callback.h" #include "base/callback.h"
#include "base/macros.h" #include "base/macros.h"
#include "chrome/browser/vr/elements/textured_element.h" #include "chrome/browser/vr/elements/textured_element.h"
#include "chrome/browser/vr/ui_unsupported_mode.h"
namespace vr { namespace vr {
...@@ -17,15 +18,18 @@ class ExitPromptTexture; ...@@ -17,15 +18,18 @@ class ExitPromptTexture;
class ExitPrompt : public TexturedElement { class ExitPrompt : public TexturedElement {
public: public:
typedef typename base::Callback<void(UiUnsupportedMode)> Callback;
ExitPrompt(int preferred_width, ExitPrompt(int preferred_width,
const base::Callback<void()>& primary_button_callback, const Callback& primary_button_callback,
const base::Callback<void()>& secondary_buttton_callback); const Callback& secondary_buttton_callback);
~ExitPrompt() override; ~ExitPrompt() override;
void SetContentMessageId(int message_id); void SetContentMessageId(int message_id);
void SetTextureForTesting(ExitPromptTexture* texture); void SetTextureForTesting(ExitPromptTexture* texture);
void set_reason(UiUnsupportedMode reason) { reason_ = reason; }
void OnHoverEnter(const gfx::PointF& position) override; void OnHoverEnter(const gfx::PointF& position) override;
void OnHoverLeave() override; void OnHoverLeave() override;
void OnMove(const gfx::PointF& position) override; void OnMove(const gfx::PointF& position) override;
...@@ -39,11 +43,12 @@ class ExitPrompt : public TexturedElement { ...@@ -39,11 +43,12 @@ class ExitPrompt : public TexturedElement {
bool primary_down_ = false; bool primary_down_ = false;
bool secondary_down_ = false; bool secondary_down_ = false;
UiUnsupportedMode reason_ = UiUnsupportedMode::kCount;
std::unique_ptr<ExitPromptTexture> texture_; std::unique_ptr<ExitPromptTexture> texture_;
base::Callback<void()> primary_button_callback_; Callback primary_button_callback_;
base::Callback<void()> secondary_buttton_callback_; Callback secondary_buttton_callback_;
DISALLOW_COPY_AND_ASSIGN(ExitPrompt); DISALLOW_COPY_AND_ASSIGN(ExitPrompt);
}; };
......
...@@ -45,8 +45,12 @@ class TestExitPrompt : public ExitPrompt { ...@@ -45,8 +45,12 @@ class TestExitPrompt : public ExitPrompt {
bool secondary_button_pressed() const { return secondary_button_pressed_; } bool secondary_button_pressed() const { return secondary_button_pressed_; }
private: private:
void OnPrimaryButtonPressed() { primary_button_pressed_ = true; } void OnPrimaryButtonPressed(UiUnsupportedMode reason) {
void OnSecondaryButtonPressed() { secondary_button_pressed_ = true; } primary_button_pressed_ = true;
}
void OnSecondaryButtonPressed(UiUnsupportedMode reason) {
secondary_button_pressed_ = true;
}
bool primary_button_pressed_ = false; bool primary_button_pressed_ = false;
bool secondary_button_pressed_ = false; bool secondary_button_pressed_ = false;
......
...@@ -43,8 +43,10 @@ static const char* g_ui_element_name_strings[] = { ...@@ -43,8 +43,10 @@ static const char* g_ui_element_name_strings[] = {
"kScreenDimmer", "kScreenDimmer",
"kExitWarning", "kExitWarning",
"kExitPrompt", "kExitPrompt",
"kAudioPermissionPrompt",
"kExitPromptBackplane", "kExitPromptBackplane",
"kAudioPermissionPrompt",
"kAudioPermissionPromptShadow",
"kAudioPermissionPromptBackplane",
"kWebVrUrlToastTransientParent", "kWebVrUrlToastTransientParent",
"kWebVrUrlToast", "kWebVrUrlToast",
"kExclusiveScreenToastTransientParent", "kExclusiveScreenToastTransientParent",
......
...@@ -43,8 +43,10 @@ enum UiElementName { ...@@ -43,8 +43,10 @@ enum UiElementName {
kScreenDimmer, kScreenDimmer,
kExitWarning, kExitWarning,
kExitPrompt, kExitPrompt,
kAudioPermissionPrompt,
kExitPromptBackplane, kExitPromptBackplane,
kAudioPermissionPrompt,
kAudioPermissionPromptShadow,
kAudioPermissionPromptBackplane,
kWebVrUrlToastTransientParent, kWebVrUrlToastTransientParent,
kWebVrUrlToast, kWebVrUrlToast,
kExclusiveScreenToastTransientParent, kExclusiveScreenToastTransientParent,
......
// 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.
#include "chrome/browser/vr/model/modal_prompt_type.h"
#include "base/logging.h"
namespace vr {
UiUnsupportedMode GetReasonForPrompt(ModalPromptType prompt) {
switch (prompt) {
case kModalPromptTypeExitVRForSiteInfo:
return UiUnsupportedMode::kUnhandledPageInfo;
case kModalPromptTypeExitVRForAudioPermission:
return UiUnsupportedMode::kAndroidPermissionNeeded;
case kModalPromptTypeNone:
return UiUnsupportedMode::kCount;
}
NOTREACHED();
return UiUnsupportedMode::kCount;
}
} // namespace vr
// 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_MODEL_MODAL_PROMPT_TYPE_H_
#define CHROME_BROWSER_VR_MODEL_MODAL_PROMPT_TYPE_H_
#include "chrome/browser/vr/ui_unsupported_mode.h"
namespace vr {
enum ModalPromptType {
kModalPromptTypeNone,
kModalPromptTypeExitVRForSiteInfo,
kModalPromptTypeExitVRForAudioPermission,
};
UiUnsupportedMode GetReasonForPrompt(ModalPromptType prompt);
} // namespace vr
#endif // CHROME_BROWSER_VR_MODEL_MODAL_PROMPT_TYPE_H_
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#define CHROME_BROWSER_VR_MODEL_MODEL_H_ #define CHROME_BROWSER_VR_MODEL_MODEL_H_
#include "chrome/browser/vr/model/controller_model.h" #include "chrome/browser/vr/model/controller_model.h"
#include "chrome/browser/vr/model/modal_prompt_type.h"
#include "chrome/browser/vr/model/omnibox_suggestions.h" #include "chrome/browser/vr/model/omnibox_suggestions.h"
#include "chrome/browser/vr/model/reticle_model.h" #include "chrome/browser/vr/model/reticle_model.h"
#include "chrome/browser/vr/model/speech_recognition_model.h" #include "chrome/browser/vr/model/speech_recognition_model.h"
...@@ -30,6 +31,8 @@ struct Model { ...@@ -30,6 +31,8 @@ struct Model {
bool experimental_features_enabled = false; bool experimental_features_enabled = false;
bool incognito = false; bool incognito = false;
ModalPromptType active_modal_prompt_type = kModalPromptTypeNone;
std::vector<OmniboxSuggestion> omnibox_suggestions; std::vector<OmniboxSuggestion> omnibox_suggestions;
}; };
......
...@@ -66,4 +66,17 @@ void FakeUiElementRenderer::DrawReticle( ...@@ -66,4 +66,17 @@ void FakeUiElementRenderer::DrawReticle(
called_ = true; called_ = true;
} }
void FakeUiElementRenderer::DrawShadow(
const gfx::Transform& model_view_proj_matrix,
const gfx::SizeF& element_size,
float x_padding,
float y_padding,
float y_offset,
SkColor color,
float opacity,
float corner_radius) {
// We do not verify the opacity used by shadows -- they adjust this at the
// last moment before calling into the UiElementRenderer.
}
} // namespace vr } // namespace vr
...@@ -50,6 +50,15 @@ class FakeUiElementRenderer : public UiElementRenderer { ...@@ -50,6 +50,15 @@ class FakeUiElementRenderer : public UiElementRenderer {
void DrawReticle(float opacity, void DrawReticle(float opacity,
const gfx::Transform& view_proj_matrix) override; const gfx::Transform& view_proj_matrix) override;
void DrawShadow(const gfx::Transform& model_view_proj_matrix,
const gfx::SizeF& element_size,
float x_padding,
float y_padding,
float y_offset,
SkColor color,
float opacity,
float corner_radius) override;
private: private:
float opacity_ = -1.f; float opacity_ = -1.f;
float called_ = false; float called_ = false;
......
...@@ -302,14 +302,18 @@ gfx::Transform VrTestContext::ViewProjectionMatrix() const { ...@@ -302,14 +302,18 @@ gfx::Transform VrTestContext::ViewProjectionMatrix() const {
return ProjectionMatrix() * head_pose_; return ProjectionMatrix() * head_pose_;
} }
void VrTestContext::SetVoiceSearchActive(bool active) {} void VrTestContext::SetVoiceSearchActive(bool active) {
OnUnsupportedMode(UiUnsupportedMode::kAndroidPermissionNeeded);
}
void VrTestContext::ExitPresent() {} void VrTestContext::ExitPresent() {}
void VrTestContext::ExitFullscreen() {} void VrTestContext::ExitFullscreen() {}
void VrTestContext::NavigateBack() {} void VrTestContext::NavigateBack() {}
void VrTestContext::ExitCct() {} void VrTestContext::ExitCct() {}
void VrTestContext::OnUnsupportedMode(vr::UiUnsupportedMode mode) { void VrTestContext::OnUnsupportedMode(vr::UiUnsupportedMode mode) {
if (mode == UiUnsupportedMode::kUnhandledPageInfo) if (mode == UiUnsupportedMode::kUnhandledPageInfo ||
mode == UiUnsupportedMode::kAndroidPermissionNeeded) {
ui_->SetExitVrPromptEnabled(true, mode); ui_->SetExitVrPromptEnabled(true, mode);
}
} }
void VrTestContext::OnExitVrPromptResult(vr::UiUnsupportedMode reason, void VrTestContext::OnExitVrPromptResult(vr::UiUnsupportedMode reason,
vr::ExitVrPromptChoice choice) { vr::ExitVrPromptChoice choice) {
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "chrome/browser/vr/model/model.h" #include "chrome/browser/vr/model/model.h"
#include "chrome/browser/vr/model/omnibox_suggestions.h" #include "chrome/browser/vr/model/omnibox_suggestions.h"
#include "chrome/browser/vr/speech_recognizer.h" #include "chrome/browser/vr/speech_recognizer.h"
#include "chrome/browser/vr/ui_browser_interface.h"
#include "chrome/browser/vr/ui_element_renderer.h" #include "chrome/browser/vr/ui_element_renderer.h"
#include "chrome/browser/vr/ui_input_manager.h" #include "chrome/browser/vr/ui_input_manager.h"
#include "chrome/browser/vr/ui_renderer.h" #include "chrome/browser/vr/ui_renderer.h"
...@@ -25,7 +26,8 @@ namespace vr { ...@@ -25,7 +26,8 @@ namespace vr {
Ui::Ui(UiBrowserInterface* browser, Ui::Ui(UiBrowserInterface* browser,
ContentInputForwarder* content_input_forwarder, ContentInputForwarder* content_input_forwarder,
const UiInitialState& ui_initial_state) const UiInitialState& ui_initial_state)
: scene_(base::MakeUnique<UiScene>()), : browser_(browser),
scene_(base::MakeUnique<UiScene>()),
model_(base::MakeUnique<Model>()), model_(base::MakeUnique<Model>()),
content_input_delegate_( content_input_delegate_(
base::MakeUnique<ContentInputDelegate>(content_input_forwarder)), base::MakeUnique<ContentInputDelegate>(content_input_forwarder)),
...@@ -105,7 +107,28 @@ void Ui::SetLocationAccessIndicator(bool enabled) { ...@@ -105,7 +107,28 @@ void Ui::SetLocationAccessIndicator(bool enabled) {
} }
void Ui::SetExitVrPromptEnabled(bool enabled, UiUnsupportedMode reason) { void Ui::SetExitVrPromptEnabled(bool enabled, UiUnsupportedMode reason) {
scene_manager_->SetExitVrPromptEnabled(enabled, reason); if (!enabled) {
model_->active_modal_prompt_type = kModalPromptTypeNone;
return;
}
if (model_->active_modal_prompt_type != kModalPromptTypeNone) {
browser_->OnExitVrPromptResult(
GetReasonForPrompt(model_->active_modal_prompt_type),
ExitVrPromptChoice::CHOICE_NONE);
}
switch (reason) {
case UiUnsupportedMode::kUnhandledPageInfo:
model_->active_modal_prompt_type = kModalPromptTypeExitVRForSiteInfo;
break;
case UiUnsupportedMode::kAndroidPermissionNeeded:
model_->active_modal_prompt_type =
kModalPromptTypeExitVRForAudioPermission;
break;
default:
NOTREACHED();
}
} }
void Ui::SetSpeechRecognitionEnabled(bool enabled) { void Ui::SetSpeechRecognitionEnabled(bool enabled) {
......
...@@ -95,6 +95,8 @@ class Ui : public BrowserUiInterface { ...@@ -95,6 +95,8 @@ class Ui : public BrowserUiInterface {
void SetOmniboxSuggestions(std::unique_ptr<OmniboxSuggestions> suggestions); void SetOmniboxSuggestions(std::unique_ptr<OmniboxSuggestions> suggestions);
private: private:
UiBrowserInterface* browser_;
// This state may be further abstracted into a SkiaUi object. // This state may be further abstracted into a SkiaUi object.
std::unique_ptr<vr::UiScene> scene_; std::unique_ptr<vr::UiScene> scene_;
std::unique_ptr<vr::Model> model_; std::unique_ptr<vr::Model> model_;
......
...@@ -266,7 +266,7 @@ TEST_F(UiInputManagerContentTest, NoMouseMovesDuringClick) { ...@@ -266,7 +266,7 @@ TEST_F(UiInputManagerContentTest, NoMouseMovesDuringClick) {
} }
TEST_F(UiInputManagerContentTest, ExitPromptHitTesting) { TEST_F(UiInputManagerContentTest, ExitPromptHitTesting) {
manager_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo); model_->active_modal_prompt_type = kModalPromptTypeExitVRForSiteInfo;
EXPECT_TRUE(AnimateBy(MsToDelta(500))); EXPECT_TRUE(AnimateBy(MsToDelta(500)));
UiElement* exit_prompt = UiElement* exit_prompt =
......
...@@ -147,9 +147,6 @@ TestParams params[] = { ...@@ -147,9 +147,6 @@ TestParams params[] = {
kScreenCaptureIndicator, kScreenCaptureIndicator,
kBluetoothConnectedIndicator, kBluetoothConnectedIndicator,
kLocationAccessIndicator, kLocationAccessIndicator,
kExitPromptBackplane,
kExitPrompt,
kAudioPermissionPrompt,
kUrlBar, kUrlBar,
kLoadingIndicator, kLoadingIndicator,
kLoadingIndicatorForeground, kLoadingIndicatorForeground,
...@@ -157,6 +154,11 @@ TestParams params[] = { ...@@ -157,6 +154,11 @@ TestParams params[] = {
kVoiceSearchButton, kVoiceSearchButton,
kCloseButton, kCloseButton,
kExclusiveScreenToast, kExclusiveScreenToast,
kExitPromptBackplane,
kExitPrompt,
kAudioPermissionPromptBackplane,
kAudioPermissionPromptShadow,
kAudioPermissionPrompt,
kSpeechRecognitionResultText, kSpeechRecognitionResultText,
kSpeechRecognitionResultCircle, kSpeechRecognitionResultCircle,
kSpeechRecognitionResultMicrophoneIcon, kSpeechRecognitionResultMicrophoneIcon,
......
...@@ -53,6 +53,7 @@ static constexpr float kUrlBarRotationRad = -0.175f; ...@@ -53,6 +53,7 @@ static constexpr float kUrlBarRotationRad = -0.175f;
static constexpr float kAudioPermissionPromptWidth = 0.63f * kUrlBarDistance; static constexpr float kAudioPermissionPromptWidth = 0.63f * kUrlBarDistance;
static constexpr float kAudioPermissionPromptHeight = 0.218f * kUrlBarDistance; static constexpr float kAudioPermissionPromptHeight = 0.218f * kUrlBarDistance;
static constexpr float kAudionPermisionPromptDepth = 0.11f;
static constexpr float kIndicatorHeight = 0.08f; static constexpr float kIndicatorHeight = 0.08f;
static constexpr float kIndicatorGap = 0.05f; static constexpr float kIndicatorGap = 0.05f;
...@@ -207,6 +208,8 @@ static constexpr float kSpeechRecognitionResultTextYOffset = 0.5f; ...@@ -207,6 +208,8 @@ static constexpr float kSpeechRecognitionResultTextYOffset = 0.5f;
static constexpr int kSpeechRecognitionResultTimeoutSeconds = 2; static constexpr int kSpeechRecognitionResultTimeoutSeconds = 2;
static constexpr int kSpeechRecognitionOpacityAnimationDurationMs = 200; static constexpr int kSpeechRecognitionOpacityAnimationDurationMs = 200;
static constexpr float kModalPromptFadeOpacity = 0.5f;
} // namespace vr } // namespace vr
#endif // CHROME_BROWSER_VR_UI_SCENE_CONSTANTS_H_ #endif // CHROME_BROWSER_VR_UI_SCENE_CONSTANTS_H_
This diff is collapsed.
...@@ -27,8 +27,6 @@ class UiBrowserInterface; ...@@ -27,8 +27,6 @@ class UiBrowserInterface;
class UiElement; class UiElement;
class UiScene; class UiScene;
class UrlBar; class UrlBar;
class ExitPrompt;
class AudioPermissionPrompt;
struct Model; struct Model;
struct UiInitialState; struct UiInitialState;
...@@ -57,6 +55,10 @@ struct UiInitialState; ...@@ -57,6 +55,10 @@ struct UiInitialState;
// kBluetoothConnectedIndicator // kBluetoothConnectedIndicator
// kExitPromptBackplane // kExitPromptBackplane
// kExitPrompt // kExitPrompt
// (unnamed) a toggle element for hiding out of browser mode.
// kAudioPermissionPromptBackplane
// kAudioPermissounPromptShadow
// kAudioPermissionPrompt
// kExclusiveScreenToastTransientParent // kExclusiveScreenToastTransientParent
// kExclusiveScreenToast // kExclusiveScreenToast
// kCloseButton // kCloseButton
...@@ -131,7 +133,6 @@ class UiSceneManager { ...@@ -131,7 +133,6 @@ class UiSceneManager {
void SetLocationAccessIndicator(bool enabled); void SetLocationAccessIndicator(bool enabled);
void SetBluetoothConnectedIndicator(bool enabled); void SetBluetoothConnectedIndicator(bool enabled);
void SetHistoryButtonsEnabled(bool can_go_back, bool can_go_forward); void SetHistoryButtonsEnabled(bool can_go_back, bool can_go_forward);
void SetExitVrPromptEnabled(bool enabled, UiUnsupportedMode reason);
bool ShouldRenderWebVr(); bool ShouldRenderWebVr();
void OnGlInitialized(unsigned int content_texture_id, void OnGlInitialized(unsigned int content_texture_id,
...@@ -146,7 +147,7 @@ class UiSceneManager { ...@@ -146,7 +147,7 @@ class UiSceneManager {
void OnSplashScreenHidden(TransientElementHideReason); void OnSplashScreenHidden(TransientElementHideReason);
void OnSecurityIconClickedForTesting(); void OnSecurityIconClickedForTesting();
void OnExitPromptChoiceForTesting(bool chose_exit); void OnExitPromptChoiceForTesting(bool chose_exit, UiUnsupportedMode reason);
// TODO(vollick): these should move to the model. // TODO(vollick): these should move to the model.
const ColorScheme& color_scheme() const; const ColorScheme& color_scheme() const;
...@@ -158,10 +159,6 @@ class UiSceneManager { ...@@ -158,10 +159,6 @@ class UiSceneManager {
bool browsing_mode() const { bool browsing_mode() const {
return !web_vr_mode_ && !showing_web_vr_splash_screen_; return !web_vr_mode_ && !showing_web_vr_splash_screen_;
} }
bool prompting_to_exit() const { return prompting_to_exit_; }
bool prompting_to_audio_permission() const {
return prompting_to_audio_permission_;
}
bool fullscreen() const { return fullscreen_; } bool fullscreen() const { return fullscreen_; }
private: private:
...@@ -179,8 +176,8 @@ class UiSceneManager { ...@@ -179,8 +176,8 @@ class UiSceneManager {
void CreateSuggestionList(Model* model); void CreateSuggestionList(Model* model);
void CreateWebVrUrlToast(); void CreateWebVrUrlToast();
void CreateCloseButton(); void CreateCloseButton();
void CreateExitPrompt(); void CreateExitPrompt(Model* model);
void CreateAudioPermissionPrompt(); void CreateAudioPermissionPrompt(Model* model);
void CreateToasts(Model* model); void CreateToasts(Model* model);
void CreateVoiceSearchUiGroup(Model* model); void CreateVoiceSearchUiGroup(Model* model);
void CreateController(Model* model); void CreateController(Model* model);
...@@ -190,8 +187,8 @@ class UiSceneManager { ...@@ -190,8 +187,8 @@ class UiSceneManager {
void ConfigureBackgroundColor(); void ConfigureBackgroundColor();
void OnBackButtonClicked(); void OnBackButtonClicked();
void OnSecurityIconClicked(); void OnSecurityIconClicked();
void OnExitPromptChoice(bool chose_exit); void OnExitPromptChoice(bool chose_exit, UiUnsupportedMode reason);
void OnExitPromptBackplaneClicked(); void OnExitPromptBackplaneClicked(UiUnsupportedMode reason);
void OnExitRecognizingSpeechClicked(); void OnExitRecognizingSpeechClicked();
void OnCloseButtonClicked(); void OnCloseButtonClicked();
void OnUnsupportedMode(UiUnsupportedMode mode); void OnUnsupportedMode(UiUnsupportedMode mode);
...@@ -211,9 +208,6 @@ class UiSceneManager { ...@@ -211,9 +208,6 @@ class UiSceneManager {
TransientElement* exclusive_screen_toast_viewport_aware_transient_parent_ = TransientElement* exclusive_screen_toast_viewport_aware_transient_parent_ =
nullptr; nullptr;
ShowUntilSignalTransientElement* splash_screen_transient_parent_ = nullptr; ShowUntilSignalTransientElement* splash_screen_transient_parent_ = nullptr;
ExitPrompt* exit_prompt_ = nullptr;
AudioPermissionPrompt* audio_permission_prompt_ = nullptr;
UiElement* exit_prompt_backplane_ = nullptr;
UiElement* speech_recognition_prompt_backplane_ = nullptr; UiElement* speech_recognition_prompt_backplane_ = nullptr;
UiElement* exit_warning_ = nullptr; UiElement* exit_warning_ = nullptr;
ContentElement* main_content_ = nullptr; ContentElement* main_content_ = nullptr;
...@@ -240,8 +234,6 @@ class UiSceneManager { ...@@ -240,8 +234,6 @@ class UiSceneManager {
// before we hide the splash screen. This is used in the case of WebVR // before we hide the splash screen. This is used in the case of WebVR
// auto-presentation. // auto-presentation.
bool showing_web_vr_splash_screen_ = false; bool showing_web_vr_splash_screen_ = false;
bool prompting_to_exit_ = false;
bool prompting_to_audio_permission_ = false;
bool exiting_ = false; bool exiting_ = false;
bool browsing_disabled_ = false; bool browsing_disabled_ = false;
bool configuring_scene_ = false; bool configuring_scene_ = false;
...@@ -253,7 +245,6 @@ class UiSceneManager { ...@@ -253,7 +245,6 @@ 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;
std::vector<Rect*> background_panels_; std::vector<Rect*> background_panels_;
......
...@@ -55,6 +55,7 @@ const std::set<UiElementName> kHitTestableElements = { ...@@ -55,6 +55,7 @@ const std::set<UiElementName> kHitTestableElements = {
kExitPrompt, kExitPrompt,
kExitPromptBackplane, kExitPromptBackplane,
kAudioPermissionPrompt, kAudioPermissionPrompt,
kAudioPermissionPromptBackplane,
kUrlBar, kUrlBar,
kLoadingIndicator, kLoadingIndicator,
kWebVrTimeoutSpinner, kWebVrTimeoutSpinner,
...@@ -390,7 +391,7 @@ TEST_F(UiSceneManagerTest, UiUpdatesForShowingExitPrompt) { ...@@ -390,7 +391,7 @@ TEST_F(UiSceneManagerTest, UiUpdatesForShowingExitPrompt) {
VerifyElementsVisible("Initial", kElementsVisibleInBrowsing); VerifyElementsVisible("Initial", kElementsVisibleInBrowsing);
// Showing exit VR prompt should make prompt visible. // Showing exit VR prompt should make prompt visible.
manager_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo); model_->active_modal_prompt_type = kModalPromptTypeExitVRForSiteInfo;
VerifyElementsVisible("Prompt visible", kElementsVisibleWithExitPrompt); VerifyElementsVisible("Prompt visible", kElementsVisibleWithExitPrompt);
} }
...@@ -398,11 +399,12 @@ TEST_F(UiSceneManagerTest, UiUpdatesForHidingExitPrompt) { ...@@ -398,11 +399,12 @@ TEST_F(UiSceneManagerTest, UiUpdatesForHidingExitPrompt) {
MakeManager(kNotInCct, kNotInWebVr); MakeManager(kNotInCct, kNotInWebVr);
// Initial state. // Initial state.
manager_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo); model_->active_modal_prompt_type = kModalPromptTypeExitVRForSiteInfo;
VerifyElementsVisible("Initial", kElementsVisibleWithExitPrompt); VerifyElementsVisible("Initial", kElementsVisibleWithExitPrompt);
// Hiding exit VR prompt should make prompt invisible. // Hiding exit VR prompt should make prompt invisible.
manager_->SetExitVrPromptEnabled(false, UiUnsupportedMode::kCount); model_->active_modal_prompt_type = kModalPromptTypeNone;
EXPECT_TRUE(AnimateBy(MsToDelta(1000)));
VerifyElementsVisible("Prompt invisible", kElementsVisibleInBrowsing); VerifyElementsVisible("Prompt invisible", kElementsVisibleInBrowsing);
} }
...@@ -411,7 +413,7 @@ TEST_F(UiSceneManagerTest, BackplaneClickTriggersOnExitPrompt) { ...@@ -411,7 +413,7 @@ TEST_F(UiSceneManagerTest, BackplaneClickTriggersOnExitPrompt) {
// Initial state. // Initial state.
VerifyElementsVisible("Initial", kElementsVisibleInBrowsing); VerifyElementsVisible("Initial", kElementsVisibleInBrowsing);
manager_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo); model_->active_modal_prompt_type = kModalPromptTypeExitVRForSiteInfo;
// Click on backplane should trigger UI browser interface but not close // Click on backplane should trigger UI browser interface but not close
// prompt. // prompt.
...@@ -427,13 +429,14 @@ TEST_F(UiSceneManagerTest, PrimaryButtonClickTriggersOnExitPrompt) { ...@@ -427,13 +429,14 @@ TEST_F(UiSceneManagerTest, PrimaryButtonClickTriggersOnExitPrompt) {
// Initial state. // Initial state.
VerifyElementsVisible("Initial", kElementsVisibleInBrowsing); VerifyElementsVisible("Initial", kElementsVisibleInBrowsing);
manager_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo); model_->active_modal_prompt_type = kModalPromptTypeExitVRForSiteInfo;
// Click on 'OK' should trigger UI browser interface but not close prompt. // Click on 'OK' should trigger UI browser interface but not close prompt.
EXPECT_CALL(*browser_, EXPECT_CALL(*browser_,
OnExitVrPromptResult(UiUnsupportedMode::kUnhandledPageInfo, OnExitVrPromptResult(UiUnsupportedMode::kUnhandledPageInfo,
ExitVrPromptChoice::CHOICE_STAY)); ExitVrPromptChoice::CHOICE_STAY));
manager_->OnExitPromptChoiceForTesting(false); manager_->OnExitPromptChoiceForTesting(false,
UiUnsupportedMode::kUnhandledPageInfo);
VerifyElementsVisible("Prompt still visible", kElementsVisibleWithExitPrompt); VerifyElementsVisible("Prompt still visible", kElementsVisibleWithExitPrompt);
} }
...@@ -442,31 +445,15 @@ TEST_F(UiSceneManagerTest, SecondaryButtonClickTriggersOnExitPrompt) { ...@@ -442,31 +445,15 @@ TEST_F(UiSceneManagerTest, SecondaryButtonClickTriggersOnExitPrompt) {
// Initial state. // Initial state.
VerifyElementsVisible("Initial", kElementsVisibleInBrowsing); VerifyElementsVisible("Initial", kElementsVisibleInBrowsing);
manager_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo); model_->active_modal_prompt_type = kModalPromptTypeExitVRForSiteInfo;
// Click on 'Exit VR' should trigger UI browser interface but not close // Click on 'Exit VR' should trigger UI browser interface but not close
// prompt. // prompt.
EXPECT_CALL(*browser_, EXPECT_CALL(*browser_,
OnExitVrPromptResult(UiUnsupportedMode::kUnhandledPageInfo, OnExitVrPromptResult(UiUnsupportedMode::kUnhandledPageInfo,
ExitVrPromptChoice::CHOICE_EXIT)); ExitVrPromptChoice::CHOICE_EXIT));
manager_->OnExitPromptChoiceForTesting(true); manager_->OnExitPromptChoiceForTesting(true,
VerifyElementsVisible("Prompt still visible", kElementsVisibleWithExitPrompt); UiUnsupportedMode::kUnhandledPageInfo);
}
TEST_F(UiSceneManagerTest, SecondExitPromptTriggersOnExitPrompt) {
MakeManager(kNotInCct, kNotInWebVr);
// 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); VerifyElementsVisible("Prompt still visible", kElementsVisibleWithExitPrompt);
} }
...@@ -536,6 +523,7 @@ TEST_F(UiSceneManagerTest, CaptureIndicatorsVisibility) { ...@@ -536,6 +523,7 @@ TEST_F(UiSceneManagerTest, CaptureIndicatorsVisibility) {
manager_->SetFullscreen(false); manager_->SetFullscreen(false);
// Back to browser, make sure the indicators reappear. // Back to browser, make sure the indicators reappear.
EXPECT_TRUE(AnimateBy(MsToDelta(500)));
EXPECT_TRUE(VerifyVisibility(indicators, true)); EXPECT_TRUE(VerifyVisibility(indicators, true));
EXPECT_TRUE(VerifyRequiresLayout(indicators, true)); EXPECT_TRUE(VerifyRequiresLayout(indicators, true));
...@@ -648,7 +636,7 @@ TEST_F(UiSceneManagerTest, EnforceSceneHierarchyForProjMatrixChanges) { ...@@ -648,7 +636,7 @@ TEST_F(UiSceneManagerTest, EnforceSceneHierarchyForProjMatrixChanges) {
UiElement* browsing_root = scene_->GetUiElementByName(k2dBrowsingRoot); UiElement* browsing_root = scene_->GetUiElementByName(k2dBrowsingRoot);
UiElement* root = scene_->GetUiElementByName(kRoot); UiElement* root = scene_->GetUiElementByName(kRoot);
EXPECT_EQ(browsing_content_group->parent(), browsing_foreground); EXPECT_EQ(browsing_content_group->parent(), browsing_foreground);
EXPECT_EQ(browsing_foreground->parent(), browsing_root); EXPECT_EQ(browsing_foreground->parent()->parent(), browsing_root);
EXPECT_EQ(browsing_root->parent(), root); EXPECT_EQ(browsing_root->parent(), root);
EXPECT_EQ(root->parent(), nullptr); EXPECT_EQ(root->parent(), nullptr);
// Parents of k2dBrowsingContentGroup should not animate transform. Note that // Parents of k2dBrowsingContentGroup should not animate transform. Note that
......
// 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.
#include "chrome/browser/vr/ui.h"
#include "base/memory/ptr_util.h"
#include "chrome/browser/vr/content_input_delegate.h"
#include "chrome/browser/vr/test/mock_browser_interface.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace vr {
class FakeContentInputForwarder : public ContentInputForwarder {
public:
FakeContentInputForwarder() {}
~FakeContentInputForwarder() override {}
void ForwardEvent(std::unique_ptr<blink::WebInputEvent> event,
int content_id) override {}
};
class UiTest : public testing::Test {
public:
UiTest() {}
~UiTest() override {}
void SetUp() override {
UiInitialState initial_state;
forwarder_ = base::MakeUnique<FakeContentInputForwarder>();
browser_ = base::MakeUnique<testing::NiceMock<MockBrowserInterface>>();
ui_ = base::MakeUnique<Ui>(browser_.get(), forwarder_.get(), initial_state);
}
protected:
std::unique_ptr<FakeContentInputForwarder> forwarder_;
std::unique_ptr<MockBrowserInterface> browser_;
std::unique_ptr<Ui> ui_;
};
TEST_F(UiTest, SecondExitPromptTriggersOnExitPrompt) {
ui_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo);
// Initiating another exit VR prompt while a previous one was in flight should
// result in a call to the UiBrowserInterface.
EXPECT_CALL(*browser_,
OnExitVrPromptResult(UiUnsupportedMode::kUnhandledPageInfo,
ExitVrPromptChoice::CHOICE_NONE));
ui_->SetExitVrPromptEnabled(true,
UiUnsupportedMode::kAndroidPermissionNeeded);
}
} // namespace vr
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