Commit 31c3e864 authored by Ian Vollick's avatar Ian Vollick Committed by Commit Bot

[vr] Add not-web-exposed media feature for immersive mode.

With this change, I've added a media feature that returns true when
in immersive mode (eg, in VR). I've added extra plumbing to ensure that
this new feature is not web exposed.

More info on media features here:
https://www.w3.org/TR/css3-mediaqueries/#media1

The plumbing for this particular feature is very close to the plumbing
for -webkit-transform-3d.

I've also changed the "page popups suppressed" setting (which was only
ever true in immersive mode) to be named immersive, accordingly.
However, the uses of the immersive mode setting for suppressing page
popups are meant to be temporary, so I've added comments referencing
the bug that explains the removals.

Bug: 809021
Cq-Include-Trybots: master.tryserver.chromium.android:android_optional_gpu_tests_rel;master.tryserver.chromium.linux:linux_optional_gpu_tests_rel;master.tryserver.chromium.linux:linux_vr;master.tryserver.chromium.mac:mac_optional_gpu_tests_rel;master.tryserver.chromium.win:win_optional_gpu_tests_rel
Change-Id: Ib46237b7c7f518830d0134c51baefeb3a1d89c11
Reviewed-on: https://chromium-review.googlesource.com/901484Reviewed-by: default avatarRick Byers <rbyers@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Reviewed-by: default avatarKen Buchanan <kenrb@chromium.org>
Commit-Queue: Ian Vollick <vollick@chromium.org>
Cr-Commit-Position: refs/heads/master@{#534497}
parent 66ef4b79
......@@ -29,7 +29,7 @@ void VrTabHelper::SetIsInVr(bool is_in_vr) {
WebPreferences web_prefs =
web_contents_->GetRenderViewHost()->GetWebkitPreferences();
web_prefs.page_popups_suppressed = is_in_vr_;
web_prefs.immersive_mode_enabled = is_in_vr_;
web_contents_->GetRenderViewHost()->UpdateWebkitPreferences(web_prefs);
}
......
......@@ -224,7 +224,7 @@ IPC_STRUCT_TRAITS_BEGIN(content::WebPreferences)
IPC_STRUCT_TRAITS_MEMBER(video_rotate_to_fullscreen_enabled)
IPC_STRUCT_TRAITS_MEMBER(video_fullscreen_detection_enabled)
IPC_STRUCT_TRAITS_MEMBER(embedded_media_experience_enabled)
IPC_STRUCT_TRAITS_MEMBER(page_popups_suppressed)
IPC_STRUCT_TRAITS_MEMBER(immersive_mode_enabled)
IPC_STRUCT_TRAITS_MEMBER(css_hex_alpha_color_enabled)
IPC_STRUCT_TRAITS_MEMBER(enable_media_download_in_product_help)
IPC_STRUCT_TRAITS_MEMBER(scroll_top_left_interop_enabled)
......
......@@ -186,7 +186,7 @@ WebPreferences::WebPreferences()
animation_policy(IMAGE_ANIMATION_POLICY_ALLOWED),
user_gesture_required_for_presentation(true),
text_track_margin_percentage(0.0f),
page_popups_suppressed(false),
immersive_mode_enabled(false),
#if defined(OS_ANDROID)
text_autosizing_enabled(true),
font_scale_factor(1.0f),
......
......@@ -222,7 +222,7 @@ struct CONTENT_EXPORT WebPreferences {
// Cues will not be placed in this margin area.
float text_track_margin_percentage;
bool page_popups_suppressed;
bool immersive_mode_enabled;
#if defined(OS_ANDROID)
bool text_autosizing_enabled;
......
......@@ -941,7 +941,7 @@ void RenderView::ApplyWebPreferences(const WebPreferences& prefs,
prefs.video_fullscreen_detection_enabled);
settings->SetEmbeddedMediaExperienceEnabled(
prefs.embedded_media_experience_enabled);
settings->SetPagePopupsSuppressed(prefs.page_popups_suppressed);
settings->SetImmersiveModeEnabled(prefs.immersive_mode_enabled);
settings->SetMediaDownloadInProductHelpEnabled(
prefs.enable_media_download_in_product_help);
settings->SetDoNotUpdateSelectionOnMutatingSelectionRange(
......
......@@ -628,6 +628,26 @@ static bool Transform3dMediaFeatureEval(const MediaQueryExpValue& value,
return return_value_if_no_parameter;
}
static bool ImmersiveMediaFeatureEval(const MediaQueryExpValue& value,
MediaFeaturePrefix op,
const MediaValues& media_values) {
bool return_value_if_no_parameter;
int is_immersive_numeric_value;
bool immersive = media_values.InImmersiveMode();
return_value_if_no_parameter = immersive;
is_immersive_numeric_value = immersive ? 1 : 0;
if (value.IsValid()) {
float number;
return NumberValue(value, number) &&
CompareValue(is_immersive_numeric_value, static_cast<int>(number),
op);
}
return return_value_if_no_parameter;
}
static bool HoverMediaFeatureEval(const MediaQueryExpValue& value,
MediaFeaturePrefix,
const MediaValues& media_values) {
......
......@@ -8,7 +8,10 @@
#include "core/css/MediaList.h"
#include "core/css/MediaValuesCached.h"
#include "core/css/MediaValuesInitialViewport.h"
#include "core/css/parser/CSSTokenizer.h"
#include "core/css/parser/MediaQueryParser.h"
#include "core/frame/LocalFrameView.h"
#include "core/frame/Settings.h"
#include "core/media_type_names.h"
#include "core/testing/DummyPageHolder.h"
#include "platform/wtf/text/StringBuilder.h"
......@@ -152,16 +155,47 @@ MediaQueryEvaluatorTestCase g_print_test_cases[] = {
{nullptr, 0} // Do not remove the terminator line.
};
MediaQueryEvaluatorTestCase g_non_immersive_test_cases[] = {
{"(immersive: 1)", 0},
{"(immersive: 0)", 1},
{nullptr, 0} // Do not remove the terminator line.
};
MediaQueryEvaluatorTestCase g_immersive_test_cases[] = {
{"(immersive: 1)", 1},
{"(immersive: 0)", 0},
{nullptr, 0} // Do not remove the terminator line.
};
MediaQueryEvaluatorTestCase g_non_ua_sheet_immersive_test_cases[] = {
{"(immersive: 1)", 0},
{"(immersive: 0)", 0},
{nullptr, 0} // Do not remove the terminator line.
};
void TestMQEvaluator(MediaQueryEvaluatorTestCase* test_cases,
const MediaQueryEvaluator& media_query_evaluator) {
const MediaQueryEvaluator& media_query_evaluator,
CSSParserMode mode) {
scoped_refptr<MediaQuerySet> query_set = nullptr;
for (unsigned i = 0; test_cases[i].input; ++i) {
query_set = MediaQuerySet::Create(test_cases[i].input);
if (String(test_cases[i].input).IsEmpty()) {
query_set = MediaQuerySet::Create();
} else {
query_set = MediaQueryParser::ParseMediaQuerySetInMode(
CSSParserTokenRange(
CSSTokenizer(test_cases[i].input).TokenizeToEOF()),
mode);
}
EXPECT_EQ(test_cases[i].output, media_query_evaluator.Eval(*query_set))
<< "Query: " << test_cases[i].input;
}
}
void TestMQEvaluator(MediaQueryEvaluatorTestCase* test_cases,
const MediaQueryEvaluator& media_query_evaluator) {
TestMQEvaluator(test_cases, media_query_evaluator, kHTMLStandardMode);
}
TEST(MediaQueryEvaluatorTest, Cached) {
MediaValuesCached::MediaValuesCachedData data;
data.viewport_width = 500;
......@@ -179,6 +213,7 @@ TEST(MediaQueryEvaluatorTest, Cached) {
data.strict_mode = true;
data.display_mode = kWebDisplayModeBrowser;
data.display_shape = kDisplayShapeRect;
data.immersive_mode = false;
// Default values.
{
......@@ -186,6 +221,9 @@ TEST(MediaQueryEvaluatorTest, Cached) {
MediaQueryEvaluator media_query_evaluator(*media_values);
TestMQEvaluator(g_screen_test_cases, media_query_evaluator);
TestMQEvaluator(g_viewport_test_cases, media_query_evaluator);
TestMQEvaluator(g_non_immersive_test_cases, media_query_evaluator,
kUASheetMode);
TestMQEvaluator(g_non_ua_sheet_immersive_test_cases, media_query_evaluator);
}
// Print values.
......@@ -207,6 +245,17 @@ TEST(MediaQueryEvaluatorTest, Cached) {
data.color_bits_per_component = 24;
data.monochrome_bits_per_component = 0;
}
// Immersive values.
{
data.immersive_mode = true;
MediaValues* media_values = MediaValuesCached::Create(data);
MediaQueryEvaluator media_query_evaluator(*media_values);
TestMQEvaluator(g_immersive_test_cases, media_query_evaluator,
kUASheetMode);
TestMQEvaluator(g_non_ua_sheet_immersive_test_cases, media_query_evaluator);
data.immersive_mode = false;
}
}
TEST(MediaQueryEvaluatorTest, Dynamic) {
......@@ -266,4 +315,18 @@ TEST(MediaQueryEvaluatorTest, InitialViewport) {
TestMQEvaluator(g_viewport_test_cases, media_query_evaluator);
}
TEST(MediaQueryEvaluatorTest, DynamicImmersive) {
std::unique_ptr<DummyPageHolder> page_holder =
DummyPageHolder::Create(IntSize(500, 500));
page_holder->GetFrameView().SetMediaType(MediaTypeNames::screen);
MediaQueryEvaluator media_query_evaluator(&page_holder->GetFrame());
page_holder->GetDocument().GetSettings()->SetImmersiveModeEnabled(false);
TestMQEvaluator(g_non_immersive_test_cases, media_query_evaluator,
kUASheetMode);
page_holder->GetDocument().GetSettings()->SetImmersiveModeEnabled(true);
TestMQEvaluator(g_immersive_test_cases, media_query_evaluator, kUASheetMode);
}
} // namespace blink
......@@ -122,7 +122,8 @@ static inline bool FeatureExpectingPositiveInteger(
media_feature == minColorIndexMediaFeature ||
media_feature == monochromeMediaFeature ||
media_feature == maxMonochromeMediaFeature ||
media_feature == minMonochromeMediaFeature;
media_feature == minMonochromeMediaFeature ||
media_feature == immersiveMediaFeature;
}
static inline bool FeatureWithPositiveInteger(const String& media_feature,
......@@ -184,7 +185,8 @@ static inline bool FeatureWithoutValue(const String& media_feature) {
media_feature == displayModeMediaFeature ||
media_feature == scanMediaFeature ||
media_feature == shapeMediaFeature ||
media_feature == colorGamutMediaFeature;
media_feature == colorGamutMediaFeature ||
media_feature == immersiveMediaFeature;
}
bool MediaQueryExp::IsViewportDependent() const {
......
......@@ -133,6 +133,12 @@ bool MediaValues::CalculateThreeDEnabled(LocalFrame* frame) {
return three_d_enabled;
}
bool MediaValues::CalculateInImmersiveMode(LocalFrame* frame) {
DCHECK(frame);
DCHECK(frame->GetSettings());
return frame->GetSettings()->GetImmersiveModeEnabled();
}
PointerType MediaValues::CalculatePrimaryPointerType(LocalFrame* frame) {
DCHECK(frame);
DCHECK(frame->GetSettings());
......
......@@ -66,6 +66,7 @@ class CORE_EXPORT MediaValues : public GarbageCollectedFinalized<MediaValues> {
virtual HoverType PrimaryHoverType() const = 0;
virtual int AvailableHoverTypes() const = 0;
virtual bool ThreeDEnabled() const = 0;
virtual bool InImmersiveMode() const = 0;
virtual const String MediaType() const = 0;
virtual WebDisplayMode DisplayMode() const = 0;
virtual bool StrictMode() const = 0;
......@@ -89,6 +90,7 @@ class CORE_EXPORT MediaValues : public GarbageCollectedFinalized<MediaValues> {
static const String CalculateMediaType(LocalFrame*);
static WebDisplayMode CalculateDisplayMode(LocalFrame*);
static bool CalculateThreeDEnabled(LocalFrame*);
static bool CalculateInImmersiveMode(LocalFrame*);
static PointerType CalculatePrimaryPointerType(LocalFrame*);
static int CalculateAvailablePointerTypes(LocalFrame*);
static HoverType CalculatePrimaryHoverType(LocalFrame*);
......
......@@ -62,6 +62,7 @@ MediaValuesCached::MediaValuesCachedData::MediaValuesCachedData(
available_hover_types = MediaValues::CalculateAvailableHoverTypes(frame);
default_font_size = MediaValues::CalculateDefaultFontSize(frame);
three_d_enabled = MediaValues::CalculateThreeDEnabled(frame);
immersive_mode = MediaValues::CalculateInImmersiveMode(frame);
strict_mode = MediaValues::CalculateStrictMode(frame);
display_mode = MediaValues::CalculateDisplayMode(frame);
media_type = MediaValues::CalculateMediaType(frame);
......@@ -152,6 +153,10 @@ bool MediaValuesCached::ThreeDEnabled() const {
return data_.three_d_enabled;
}
bool MediaValuesCached::InImmersiveMode() const {
return data_.immersive_mode;
}
bool MediaValuesCached::StrictMode() const {
return data_.strict_mode;
}
......
......@@ -30,6 +30,7 @@ class CORE_EXPORT MediaValuesCached final : public MediaValues {
int available_hover_types;
int default_font_size;
bool three_d_enabled;
bool immersive_mode;
bool strict_mode;
String media_type;
WebDisplayMode display_mode;
......@@ -54,6 +55,7 @@ class CORE_EXPORT MediaValuesCached final : public MediaValues {
data.available_hover_types = available_hover_types;
data.default_font_size = default_font_size;
data.three_d_enabled = three_d_enabled;
data.immersive_mode = immersive_mode;
data.strict_mode = strict_mode;
data.media_type = media_type.IsolatedCopy();
data.display_mode = display_mode;
......@@ -85,6 +87,7 @@ class CORE_EXPORT MediaValuesCached final : public MediaValues {
HoverType PrimaryHoverType() const override;
int AvailableHoverTypes() const override;
bool ThreeDEnabled() const override;
bool InImmersiveMode() const override;
bool StrictMode() const override;
Document* GetDocument() const override;
bool HasValues() const override;
......
......@@ -117,6 +117,10 @@ bool MediaValuesDynamic::ThreeDEnabled() const {
return CalculateThreeDEnabled(frame_);
}
bool MediaValuesDynamic::InImmersiveMode() const {
return CalculateInImmersiveMode(frame_);
}
const String MediaValuesDynamic::MediaType() const {
return CalculateMediaType(frame_);
}
......
......@@ -35,6 +35,7 @@ class CORE_EXPORT MediaValuesDynamic : public MediaValues {
HoverType PrimaryHoverType() const override;
int AvailableHoverTypes() const override;
bool ThreeDEnabled() const override;
bool InImmersiveMode() const override;
bool StrictMode() const override;
const String MediaType() const override;
WebDisplayMode DisplayMode() const override;
......
......@@ -22,6 +22,9 @@
"device-height",
"device-width",
"display-mode",
// This has not been standardized and is only available to UA style sheets.
// See crbug.com/809165
"immersive",
"max-color",
"max-color-index",
"max-aspect-ratio",
......
......@@ -811,6 +811,7 @@ message MfName {
SCAN = 43;
SHAPE = 44;
INVALID_NAME = 45;
IMMERSIVE = 46;
}
required ValueId id = 1;
}
......
......@@ -17,12 +17,20 @@ scoped_refptr<MediaQuerySet> MediaQueryParser::ParseMediaQuerySet(
scoped_refptr<MediaQuerySet> MediaQueryParser::ParseMediaQuerySet(
CSSParserTokenRange range) {
return MediaQueryParser(kMediaQuerySetParser).ParseImpl(range);
return MediaQueryParser(kMediaQuerySetParser, kHTMLStandardMode)
.ParseImpl(range);
}
scoped_refptr<MediaQuerySet> MediaQueryParser::ParseMediaQuerySetInMode(
CSSParserTokenRange range,
CSSParserMode mode) {
return MediaQueryParser(kMediaQuerySetParser, mode).ParseImpl(range);
}
scoped_refptr<MediaQuerySet> MediaQueryParser::ParseMediaCondition(
CSSParserTokenRange range) {
return MediaQueryParser(kMediaConditionParser).ParseImpl(range);
return MediaQueryParser(kMediaConditionParser, kHTMLStandardMode)
.ParseImpl(range);
}
const MediaQueryParser::State MediaQueryParser::kReadRestrictor =
......@@ -49,8 +57,10 @@ const MediaQueryParser::State MediaQueryParser::kSkipUntilBlockEnd =
&MediaQueryParser::SkipUntilBlockEnd;
const MediaQueryParser::State MediaQueryParser::kDone = &MediaQueryParser::Done;
MediaQueryParser::MediaQueryParser(ParserType parser_type)
: parser_type_(parser_type), query_set_(MediaQuerySet::Create()) {
MediaQueryParser::MediaQueryParser(ParserType parser_type, CSSParserMode mode)
: parser_type_(parser_type),
query_set_(MediaQuerySet::Create()),
mode_(mode) {
if (parser_type == kMediaQuerySetParser)
state_ = &MediaQueryParser::ReadRestrictor;
else // MediaConditionParser
......@@ -150,8 +160,13 @@ void MediaQueryParser::ReadFeature(CSSParserTokenType type,
const CSSParserToken& token,
CSSParserTokenRange& range) {
if (type == kIdentToken) {
media_query_data_.SetMediaFeature(token.Value().ToString());
state_ = kReadFeatureColon;
String media_feature = token.Value().ToString();
if (IsMediaFeatureAllowedInMode(media_feature)) {
media_query_data_.SetMediaFeature(media_feature);
state_ = kReadFeatureColon;
} else {
state_ = kSkipUntilComma;
}
} else {
state_ = kSkipUntilComma;
}
......@@ -265,6 +280,12 @@ scoped_refptr<MediaQuerySet> MediaQueryParser::ParseImpl(
return query_set_;
}
bool MediaQueryParser::IsMediaFeatureAllowedInMode(
const String& media_feature) const {
return mode_ == kUASheetMode ||
media_feature != MediaFeatureNames::immersiveMediaFeature;
}
MediaQueryData::MediaQueryData()
: restrictor_(MediaQuery::kNone),
media_type_(MediaTypeNames::all),
......
......@@ -10,6 +10,7 @@
#include "core/css/MediaList.h"
#include "core/css/MediaQuery.h"
#include "core/css/MediaQueryExp.h"
#include "core/css/parser/CSSParserMode.h"
#include "core/css/parser/CSSParserToken.h"
#include "core/css/parser/CSSParserTokenRange.h"
#include "core/css/parser/MediaQueryBlockWatcher.h"
......@@ -59,6 +60,9 @@ class CORE_EXPORT MediaQueryParser {
static scoped_refptr<MediaQuerySet> ParseMediaQuerySet(const String&);
static scoped_refptr<MediaQuerySet> ParseMediaQuerySet(CSSParserTokenRange);
static scoped_refptr<MediaQuerySet> ParseMediaCondition(CSSParserTokenRange);
static scoped_refptr<MediaQuerySet> ParseMediaQuerySetInMode(
CSSParserTokenRange,
CSSParserMode);
private:
enum ParserType {
......@@ -66,7 +70,7 @@ class CORE_EXPORT MediaQueryParser {
kMediaConditionParser,
};
MediaQueryParser(ParserType);
MediaQueryParser(ParserType, CSSParserMode);
virtual ~MediaQueryParser();
scoped_refptr<MediaQuerySet> ParseImpl(CSSParserTokenRange);
......@@ -113,11 +117,14 @@ class CORE_EXPORT MediaQueryParser {
void SetStateAndRestrict(State, MediaQuery::RestrictorType);
void HandleBlocks(const CSSParserToken&);
bool IsMediaFeatureAllowedInMode(const String& media_feature) const;
State state_;
ParserType parser_type_;
MediaQueryData media_query_data_;
scoped_refptr<MediaQuerySet> query_set_;
MediaQueryBlockWatcher block_watcher_;
CSSParserMode mode_;
const static State kReadRestrictor;
const static State kReadMediaNot;
......
......@@ -636,8 +636,8 @@ void WebSettingsImpl::SetEmbeddedMediaExperienceEnabled(bool enabled) {
settings_->SetEmbeddedMediaExperienceEnabled(enabled);
}
void WebSettingsImpl::SetPagePopupsSuppressed(bool suppressed) {
settings_->SetPagePopupsSuppressed(suppressed);
void WebSettingsImpl::SetImmersiveModeEnabled(bool enabled) {
settings_->SetImmersiveModeEnabled(enabled);
}
void WebSettingsImpl::SetViewportEnabled(bool enabled) {
......
......@@ -120,7 +120,7 @@ class CORE_EXPORT WebSettingsImpl final : public WebSettings {
void SetMediaPlaybackGestureWhitelistScope(const WebString&) override;
void SetPresentationRequiresUserGesture(bool) override;
void SetEmbeddedMediaExperienceEnabled(bool) override;
void SetPagePopupsSuppressed(bool) override;
void SetImmersiveModeEnabled(bool) override;
void SetMinimumAccelerated2dCanvasSize(int) override;
void SetMinimumFontSize(int) override;
void SetMinimumLogicalFontSize(int) override;
......
......@@ -230,15 +230,12 @@
initial: false,
},
// This is used when page popups should not be presented at all from time
// to time in the life of a renderer. This is different than the runtime
// enabled feature to enable page popups which remains fixed for the
// lifetime of a render and semantically means that an alternative UI
// should be shown. An example of when this might be used is in an
// embedder than cannot render these popups (in VR mode, say).
// This is true when the page is being displayed in a 3D context (eg, a VR
// headset).
{
name: "pagePopupsSuppressed",
name: "immersiveModeEnabled",
initial: false,
invalidate: "MediaQuery",
},
{
......
......@@ -550,7 +550,8 @@ ColorChooser* ChromeClientImpl::OpenColorChooser(
NotifyPopupOpeningObservers();
ColorChooserUIController* controller = nullptr;
if (frame->GetDocument()->GetSettings()->GetPagePopupsSuppressed())
// TODO(crbug.com/779126): add support for the chooser in immersive mode.
if (frame->GetDocument()->GetSettings()->GetImmersiveModeEnabled())
return nullptr;
if (RuntimeEnabledFeatures::PagePopupEnabled()) {
......@@ -566,10 +567,11 @@ ColorChooser* ChromeClientImpl::OpenColorChooser(
DateTimeChooser* ChromeClientImpl::OpenDateTimeChooser(
DateTimeChooserClient* picker_client,
const DateTimeChooserParameters& parameters) {
// TODO(crbug.com/779126): add support for the chooser in immersive mode.
if (picker_client->OwnerElement()
.GetDocument()
.GetSettings()
->GetPagePopupsSuppressed())
->GetImmersiveModeEnabled())
return nullptr;
NotifyPopupOpeningObservers();
......@@ -772,7 +774,8 @@ bool ChromeClientImpl::HasOpenedPopup() const {
PopupMenu* ChromeClientImpl::OpenPopupMenu(LocalFrame& frame,
HTMLSelectElement& select) {
if (frame.GetDocument()->GetSettings()->GetPagePopupsSuppressed())
// TODO(crbug.com/779126): add support for the menu in immersive mode.
if (frame.GetDocument()->GetSettings()->GetImmersiveModeEnabled())
return nullptr;
NotifyPopupOpeningObservers();
......
......@@ -161,6 +161,9 @@ class FakeDateTimeChooserClient
Member<Element> owner_element_;
};
// TODO(crbug.com/779126): A number of popups are not supported in immersive
// mode. The PagePopupSuppressionTests ensure that these unsupported popups
// do not appear in immersive mode.
class PagePopupSuppressionTest : public ::testing::Test {
public:
PagePopupSuppressionTest() = default;
......@@ -218,11 +221,11 @@ TEST_F(PagePopupSuppressionTest, SuppressColorChooser) {
EXPECT_TRUE(CanOpenColorChooser());
Settings* settings = GetSettings();
settings->SetPagePopupsSuppressed(true);
settings->SetImmersiveModeEnabled(true);
EXPECT_FALSE(CanOpenColorChooser());
settings->SetPagePopupsSuppressed(false);
settings->SetImmersiveModeEnabled(false);
EXPECT_TRUE(CanOpenColorChooser());
}
......@@ -231,11 +234,11 @@ TEST_F(PagePopupSuppressionTest, SuppressDateTimeChooser) {
EXPECT_TRUE(CanOpenDateTimeChooser());
Settings* settings = GetSettings();
settings->SetPagePopupsSuppressed(true);
settings->SetImmersiveModeEnabled(true);
EXPECT_FALSE(CanOpenDateTimeChooser());
settings->SetPagePopupsSuppressed(false);
settings->SetImmersiveModeEnabled(false);
EXPECT_TRUE(CanOpenDateTimeChooser());
}
......@@ -244,11 +247,11 @@ TEST_F(PagePopupSuppressionTest, SuppressPopupMenu) {
EXPECT_TRUE(CanOpenPopupMenu());
Settings* settings = GetSettings();
settings->SetPagePopupsSuppressed(true);
settings->SetImmersiveModeEnabled(true);
EXPECT_FALSE(CanOpenPopupMenu());
settings->SetPagePopupsSuppressed(false);
settings->SetImmersiveModeEnabled(false);
EXPECT_TRUE(CanOpenPopupMenu());
}
......
......@@ -813,9 +813,9 @@ ScriptPromise PaymentRequest::show(ScriptState* script_state) {
"Cannot show the payment request"));
}
// VR mode uses popup suppression setting to disable html select element,
// date pickers, etc.
if (GetFrame()->GetDocument()->GetSettings()->GetPagePopupsSuppressed()) {
// TODO(crbug.com/779126): add support for handling payment requests in
// immersive mode.
if (GetFrame()->GetDocument()->GetSettings()->GetImmersiveModeEnabled()) {
return ScriptPromise::RejectWithDOMException(
script_state,
DOMException::Create(kInvalidStateError, "Page popups are suppressed"));
......
......@@ -211,7 +211,7 @@ class WebSettings {
virtual void SetMediaPlaybackGestureWhitelistScope(const WebString&) = 0;
virtual void SetPresentationRequiresUserGesture(bool) = 0;
virtual void SetEmbeddedMediaExperienceEnabled(bool) = 0;
virtual void SetPagePopupsSuppressed(bool) = 0;
virtual void SetImmersiveModeEnabled(bool) = 0;
virtual void SetMinimumAccelerated2dCanvasSize(int) = 0;
virtual void SetMinimumFontSize(int) = 0;
virtual void SetMinimumLogicalFontSize(int) = 0;
......
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