diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-10-23 15:07:16 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-11-02 09:53:21 +0000 |
commit | 18ea13a7f5e083538910646c52a96a5e4642d1f2 (patch) | |
tree | 93e9d944d16030669be07d5d597bdf4f2d323d64 | |
parent | ba63729ed9a39e122475ac8860cee27fc235241b (diff) |
Add setting to inhibit autoplay until user interaction
Pass through the PlaybackRequiresUserGesture Chromium setting which
Chrome enables by default on Android.
Task-number: QTBUG-60799
Change-Id: I105fc7d558f9b67417a0047ecb1efe7677817ea4
Reviewed-by: Florian Bruhin <qt-project.org@the-compiler.org>
Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu>
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
-rw-r--r-- | src/core/web_engine_settings.cpp | 21 | ||||
-rw-r--r-- | src/core/web_engine_settings.h | 4 | ||||
-rw-r--r-- | src/webengine/api/qquickwebenginesettings.cpp | 22 | ||||
-rw-r--r-- | src/webengine/api/qquickwebenginesettings_p.h | 4 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginesettings.cpp | 2 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginesettings.h | 3 | ||||
-rw-r--r-- | src/webenginewidgets/doc/src/qwebenginesettings_lgpl.qdoc | 5 |
7 files changed, 59 insertions, 2 deletions
diff --git a/src/core/web_engine_settings.cpp b/src/core/web_engine_settings.cpp index 44ecaf2ef..a585e7bb3 100644 --- a/src/core/web_engine_settings.cpp +++ b/src/core/web_engine_settings.cpp @@ -48,6 +48,7 @@ #include "content/browser/gpu/gpu_process_host.h" #include "content/public/common/content_switches.h" #include "content/public/common/web_preferences.h" +#include "media/base/media_switches.h" #include "ui/events/event_switches.h" #include <QFont> @@ -152,6 +153,17 @@ bool WebEngineSettings::testAttribute(WebEngineSettings::Attribute attr) const return m_attributes.value(attr, parentSettings->testAttribute(attr)); } +bool WebEngineSettings::isAttributeExplicitlySet(Attribute attr) const +{ + if (m_attributes.contains(attr)) + return true; + + if (parentSettings) + return parentSettings->isAttributeExplicitlySet(attr); + + return false; +} + void WebEngineSettings::resetAttribute(WebEngineSettings::Attribute attr) { m_attributes.remove(attr); @@ -270,6 +282,10 @@ void WebEngineSettings::initDefaults() s_defaultAttributes.insert(AllowRunningInsecureContent, allowRunningInsecureContent); s_defaultAttributes.insert(AllowGeolocationOnInsecureOrigins, false); s_defaultAttributes.insert(AllowWindowActivationFromJavaScript, false); + bool playbackRequiresUserGesture = false; + if (commandLine->HasSwitch(switches::kAutoplayPolicy)) + playbackRequiresUserGesture = (commandLine->GetSwitchValueASCII(switches::kAutoplayPolicy) != switches::autoplay::kNoUserGestureRequiredPolicy); + s_defaultAttributes.insert(PlaybackRequiresUserGesture, playbackRequiresUserGesture); } if (s_defaultFontFamilies.isEmpty()) { @@ -353,6 +369,11 @@ void WebEngineSettings::applySettingsToWebPreferences(content::WebPreferences *p prefs->allow_running_insecure_content = testAttribute(AllowRunningInsecureContent); prefs->allow_geolocation_on_insecure_origins = testAttribute(AllowGeolocationOnInsecureOrigins); prefs->hide_scrollbars = !testAttribute(ShowScrollBars); + if (isAttributeExplicitlySet(PlaybackRequiresUserGesture)) { + prefs->autoplay_policy = testAttribute(PlaybackRequiresUserGesture) + ? content::AutoplayPolicy::kUserGestureRequired + : content::AutoplayPolicy::kNoUserGestureRequired; + } // Fonts settings. prefs->standard_font_family_map[content::kCommonScript] = toString16(fontFamily(StandardFont)); diff --git a/src/core/web_engine_settings.h b/src/core/web_engine_settings.h index ea647a61f..5881303a2 100644 --- a/src/core/web_engine_settings.h +++ b/src/core/web_engine_settings.h @@ -85,7 +85,8 @@ public: AllowRunningInsecureContent, AllowGeolocationOnInsecureOrigins, AllowWindowActivationFromJavaScript, - ShowScrollBars + ShowScrollBars, + PlaybackRequiresUserGesture, }; // Must match the values from the public API in qwebenginesettings.h. @@ -125,6 +126,7 @@ public: void setAttribute(Attribute, bool on); bool testAttribute(Attribute) const; void resetAttribute(Attribute); + bool isAttributeExplicitlySet(Attribute) const; void setFontFamily(FontFamily, const QString &); QString fontFamily(FontFamily); diff --git a/src/webengine/api/qquickwebenginesettings.cpp b/src/webengine/api/qquickwebenginesettings.cpp index 71af00d30..b238833ad 100644 --- a/src/webengine/api/qquickwebenginesettings.cpp +++ b/src/webengine/api/qquickwebenginesettings.cpp @@ -398,6 +398,20 @@ bool QQuickWebEngineSettings::showScrollBars() const } /*! + \qmlproperty bool WebEngineSettings::playbackRequiresUserGesture + \since QtWebEngine 1.7 + Inhibits playback of media content until the user interacts with + the page. Disabled by default. + + \note The behavior is similar to Chrome on Android when enabled, + and similar to Chrome on desktops when disabled (default). +*/ +bool QQuickWebEngineSettings::playbackRequiresUserGesture() const +{ + return d_ptr->testAttribute(WebEngineSettings::PlaybackRequiresUserGesture); +} + +/*! \qmlproperty string WebEngineSettings::defaultTextEncoding \since QtWebEngine 1.2 @@ -631,6 +645,14 @@ void QQuickWebEngineSettings::setShowScrollBars(bool on) Q_EMIT showScrollBarsChanged(); } +void QQuickWebEngineSettings::setPlaybackRequiresUserGesture(bool on) +{ + bool wasOn = d_ptr->testAttribute(WebEngineSettings::PlaybackRequiresUserGesture); + d_ptr->setAttribute(WebEngineSettings::PlaybackRequiresUserGesture, on); + if (wasOn != on) + Q_EMIT playbackRequiresUserGestureChanged(); +} + void QQuickWebEngineSettings::setUnknownUrlSchemePolicy(QQuickWebEngineSettings::UnknownUrlSchemePolicy policy) { WebEngineSettings::UnknownUrlSchemePolicy oldPolicy = d_ptr->unknownUrlSchemePolicy(); diff --git a/src/webengine/api/qquickwebenginesettings_p.h b/src/webengine/api/qquickwebenginesettings_p.h index 6e0900c58..63c397d21 100644 --- a/src/webengine/api/qquickwebenginesettings_p.h +++ b/src/webengine/api/qquickwebenginesettings_p.h @@ -89,6 +89,7 @@ class Q_WEBENGINE_PRIVATE_EXPORT QQuickWebEngineSettings : public QObject { Q_PROPERTY(bool allowWindowActivationFromJavaScript READ allowWindowActivationFromJavaScript WRITE setAllowWindowActivationFromJavaScript NOTIFY allowWindowActivationFromJavaScriptChanged REVISION 5 FINAL) Q_PROPERTY(bool showScrollBars READ showScrollBars WRITE setShowScrollBars NOTIFY showScrollBarsChanged REVISION 5 FINAL) Q_PROPERTY(UnknownUrlSchemePolicy unknownUrlSchemePolicy READ unknownUrlSchemePolicy WRITE setUnknownUrlSchemePolicy NOTIFY unknownUrlSchemePolicyChanged REVISION 6 FINAL) + Q_PROPERTY(bool playbackRequiresUserGesture READ playbackRequiresUserGesture WRITE setPlaybackRequiresUserGesture NOTIFY playbackRequiresUserGestureChanged REVISION 6 FINAL) public: enum UnknownUrlSchemePolicy { @@ -127,6 +128,7 @@ public: bool allowWindowActivationFromJavaScript() const; bool showScrollBars() const; UnknownUrlSchemePolicy unknownUrlSchemePolicy() const; + bool playbackRequiresUserGesture() const; void setAutoLoadImages(bool on); void setJavascriptEnabled(bool on); @@ -154,6 +156,7 @@ public: void setAllowWindowActivationFromJavaScript(bool on); void setShowScrollBars(bool on); void setUnknownUrlSchemePolicy(UnknownUrlSchemePolicy policy); + void setPlaybackRequiresUserGesture(bool on); signals: void autoLoadImagesChanged(); @@ -182,6 +185,7 @@ signals: Q_REVISION(5) void allowWindowActivationFromJavaScriptChanged(); Q_REVISION(5) void showScrollBarsChanged(); Q_REVISION(6) void unknownUrlSchemePolicyChanged(); + Q_REVISION(6) void playbackRequiresUserGestureChanged(); private: explicit QQuickWebEngineSettings(QQuickWebEngineSettings *parentSettings = 0); diff --git a/src/webenginewidgets/api/qwebenginesettings.cpp b/src/webenginewidgets/api/qwebenginesettings.cpp index 2d7c68926..b51f502a5 100644 --- a/src/webenginewidgets/api/qwebenginesettings.cpp +++ b/src/webenginewidgets/api/qwebenginesettings.cpp @@ -101,6 +101,8 @@ static WebEngineSettings::Attribute toWebEngineAttribute(QWebEngineSettings::Web return WebEngineSettings::AllowWindowActivationFromJavaScript; case QWebEngineSettings::ShowScrollBars: return WebEngineSettings::ShowScrollBars; + case QWebEngineSettings::PlaybackRequiresUserGesture: + return WebEngineSettings::PlaybackRequiresUserGesture; default: return WebEngineSettings::UnsupportedInCoreSettings; diff --git a/src/webenginewidgets/api/qwebenginesettings.h b/src/webenginewidgets/api/qwebenginesettings.h index fc9372968..ab03e207a 100644 --- a/src/webenginewidgets/api/qwebenginesettings.h +++ b/src/webenginewidgets/api/qwebenginesettings.h @@ -91,7 +91,8 @@ public: AllowRunningInsecureContent, AllowGeolocationOnInsecureOrigins, AllowWindowActivationFromJavaScript, - ShowScrollBars + ShowScrollBars, + PlaybackRequiresUserGesture }; enum FontSize { diff --git a/src/webenginewidgets/doc/src/qwebenginesettings_lgpl.qdoc b/src/webenginewidgets/doc/src/qwebenginesettings_lgpl.qdoc index fb5ed019e..2f33d2e7a 100644 --- a/src/webenginewidgets/doc/src/qwebenginesettings_lgpl.qdoc +++ b/src/webenginewidgets/doc/src/qwebenginesettings_lgpl.qdoc @@ -168,6 +168,11 @@ \value ShowScrollBars Shows scroll bars. Enabled by default. (Added in Qt 5.10) + \value PlaybackRequiresUserGesture + Inhibits playback of media content until the user interacts with + the page. This is similar to how Chrome on Android behaves, while + the default behavior when it is disabled is similar to Chrome on desktops. + Disabled by default. (Added in Qt 5.11) */ /*! |