From 6fca3ec615102f9ce2e1b3330406ef1d654d2474 Mon Sep 17 00:00:00 2001 From: Pierre Rossi Date: Tue, 18 Mar 2014 15:29:22 +0100 Subject: WebRTC Widgets API Simply reuse the existing feature request approach that was used for geolocation and notifications in QtWebKit. Change-Id: I8fec4f4e9e81b491163912fadb4ce17d343864dd Reviewed-by: Zeno Albisser --- src/webenginewidgets/api/qwebenginepage.cpp | 42 +++++++++++++++++++++++++++++ src/webenginewidgets/api/qwebenginepage.h | 18 +++++++++++++ src/webenginewidgets/api/qwebenginepage_p.h | 2 +- 3 files changed, 61 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index ec0c0224d..0006cbd42 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -312,6 +312,21 @@ void QWebEnginePagePrivate::authenticationRequired(const QUrl &requestUrl, const *outPassword = networkAuth.password(); } +void QWebEnginePagePrivate::runMediaAccessPermissionRequest(const QUrl &securityOrigin, WebContentsAdapterClient::MediaRequestFlags requestFlags) +{ + Q_Q(QWebEnginePage); + QWebEnginePage::Feature requestedFeature; + if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture) && requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) + requestedFeature = QWebEnginePage::MediaAudioVideoDevices; + else if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture)) + requestedFeature = QWebEnginePage::MediaAudioDevices; + else if (requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) + requestedFeature = QWebEnginePage::MediaVideoDevices; + else + return; + Q_EMIT q->featurePermissionRequested(securityOrigin, requestedFeature); +} + void QWebEnginePagePrivate::updateAction(QWebEnginePage::WebAction action) const { #ifdef QT_NO_ACTION @@ -680,6 +695,33 @@ QMenu *QWebEnginePage::createStandardContextMenu() return menu; } +void QWebEnginePage::setFeaturePermission(const QUrl &securityOrigin, QWebEnginePage::Feature feature, QWebEnginePage::PermissionPolicy policy) +{ + Q_D(QWebEnginePage); + WebContentsAdapterClient::MediaRequestFlags flags = WebContentsAdapterClient::MediaNone; + switch (feature) { + case MediaAudioVideoDevices: + case MediaAudioDevices: + case MediaVideoDevices: + if (policy != PermissionUnknown) { + if (policy == PermissionDeniedByUser) + flags = WebContentsAdapterClient::MediaNone; + else { + if (feature == MediaAudioDevices) + flags = WebContentsAdapterClient::MediaAudioCapture; + else if (feature == MediaVideoDevices) + flags = WebContentsAdapterClient::MediaVideoCapture; + else + flags = WebContentsAdapterClient::MediaRequestFlags(WebContentsAdapterClient::MediaVideoCapture | WebContentsAdapterClient::MediaAudioCapture); + } + d->adapter->grantMediaAccessPermission(securityOrigin, flags); + } + break; + default: + break; + } +} + static inline QWebEnginePage::FileSelectionMode toPublic(WebContentsAdapterClient::FileChooserMode mode) { // Should the underlying values change, we'll need a switch here. diff --git a/src/webenginewidgets/api/qwebenginepage.h b/src/webenginewidgets/api/qwebenginepage.h index 4e0eaf27f..9ef6e6840 100644 --- a/src/webenginewidgets/api/qwebenginepage.h +++ b/src/webenginewidgets/api/qwebenginepage.h @@ -111,6 +111,19 @@ public: WebDialog }; + enum PermissionPolicy { + PermissionUnknown, + PermissionGrantedByUser, + PermissionDeniedByUser + }; + + enum Feature { + Notifications, + Geolocation, + MediaAudioDevices, + MediaVideoDevices, + MediaAudioVideoDevices + }; // Ex-QWebFrame enum enum FileSelectionMode { @@ -144,6 +157,8 @@ public: void findText(const QString &subString, FindFlags options = 0, const QWebEngineCallback &resultCallback = QWebEngineCallback()); QMenu *createStandardContextMenu(); + void setFeaturePermission(const QUrl &securityOrigin, Feature feature, PermissionPolicy policy); + // Ex-QWebFrame methods void load(const QUrl &url); void setHtml(const QString &html, const QUrl &baseUrl = QUrl()); @@ -172,6 +187,9 @@ Q_SIGNALS: void geometryChangeRequested(const QRect& geom); void windowCloseRequested(); + void featurePermissionRequested(const QUrl &securityOrigin, QWebEnginePage::Feature feature); + void featurePermissionRequestCanceled(const QUrl &securityOrigin, QWebEnginePage::Feature feature); + void authenticationRequired(const QUrl &requestUrl, QAuthenticator *authenticator); void proxyAuthenticationRequired(const QUrl &requestUrl, QAuthenticator *authenticator, const QString &proxyHost); diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h index 0c4d3b850..827840c7b 100644 --- a/src/webenginewidgets/api/qwebenginepage_p.h +++ b/src/webenginewidgets/api/qwebenginepage_p.h @@ -136,7 +136,7 @@ public: virtual void passOnFocus(bool reverse) Q_DECL_OVERRIDE { Q_UNUSED(reverse); }; virtual void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString& message, int lineNumber, const QString& sourceID) Q_DECL_OVERRIDE; virtual void authenticationRequired(const QUrl &requestUrl, const QString &realm, bool isProxy, const QString &challengingHost, QString *outUser, QString *outPassword) Q_DECL_OVERRIDE; - virtual void runMediaAccessPermissionRequest(const QUrl &securityOrigin, MediaRequestFlags requestFlags) Q_DECL_OVERRIDE {}; + virtual void runMediaAccessPermissionRequest(const QUrl &securityOrigin, MediaRequestFlags requestFlags) Q_DECL_OVERRIDE; void updateAction(QWebEnginePage::WebAction) const; void updateNavigationActions(); -- cgit v1.2.3