From 5244b35aa64ea15f188fa0fa1c9df23006c90e27 Mon Sep 17 00:00:00 2001
From: Pierre Rossi <pierre.rossi@digia.com>
Date: Tue, 25 Mar 2014 19:44:14 +0100
Subject: [PATCH] Simple experimental WebRTC API for QtQuick

Change-Id: I18059c2894893d28c03dc790037bdd3ff28cfd07
Reviewed-by: Zeno Albisser <zeno.albisser@digia.com>
---
 src/webengine/api/qquickwebengineview.cpp   | 35 +++++++++++++++++++++
 src/webengine/api/qquickwebengineview_p_p.h | 11 ++++++-
 2 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp
index 20610150a..772befe12 100644
--- a/src/webengine/api/qquickwebengineview.cpp
+++ b/src/webengine/api/qquickwebengineview.cpp
@@ -343,6 +343,20 @@ void QQuickWebEngineViewPrivate::javaScriptConsoleMessage(JavaScriptConsoleMessa
     Q_EMIT q->javaScriptConsoleMessage(static_cast<QQuickWebEngineView::JavaScriptConsoleMessageLevel>(level), message, lineNumber, sourceID);
 }
 
+void QQuickWebEngineViewPrivate::runMediaAccessPermissionRequest(const QUrl &securityOrigin, WebContentsAdapterClient::MediaRequestFlags requestFlags)
+{
+   if (!requestFlags)
+       return;
+   QQuickWebEngineViewExperimental::Feature feature;
+   if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture) && requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture))
+       feature = QQuickWebEngineViewExperimental::MediaAudioVideoDevices;
+   else if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture))
+       feature = QQuickWebEngineViewExperimental::MediaAudioDevices;
+   else if (requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture))
+       feature = QQuickWebEngineViewExperimental::MediaVideoDevices;
+   Q_EMIT e->featurePermissionRequested(securityOrigin, feature);
+}
+
 void QQuickWebEngineViewPrivate::setDevicePixelRatio(qreal devicePixelRatio)
 {
     this->devicePixelRatio = devicePixelRatio;
@@ -541,6 +555,27 @@ QQuickWebEngineHistory *QQuickWebEngineViewExperimental::navigationHistory() con
     return d_ptr->m_history.data();
 }
 
+void QQuickWebEngineViewExperimental::grantFeaturePermission(const QUrl &securityOrigin, QQuickWebEngineViewExperimental::Feature feature, bool granted)
+{
+    if (!granted && feature >= MediaAudioDevices && feature <= MediaAudioVideoDevices) {
+         d_ptr->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaNone);
+         return;
+    }
+
+    switch (feature) {
+    case MediaAudioDevices:
+        d_ptr->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaAudioCapture);
+        break;
+    case MediaVideoDevices:
+        d_ptr->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaVideoCapture);
+        break;
+    case MediaAudioVideoDevices:
+        d_ptr->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaRequestFlags(WebContentsAdapterClient::MediaAudioCapture
+                                                                                                               | WebContentsAdapterClient::MediaVideoCapture));
+        break;
+    }
+}
+
 void QQuickWebEngineViewExperimental::goBackTo(int index)
 {
     int count = d_ptr->adapter->currentNavigationEntryIndex();
diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h
index cde8d297d..ec03badaf 100644
--- a/src/webengine/api/qquickwebengineview_p_p.h
+++ b/src/webengine/api/qquickwebengineview_p_p.h
@@ -85,8 +85,15 @@ class Q_WEBENGINE_PRIVATE_EXPORT QQuickWebEngineViewExperimental : public QObjec
     Q_PROPERTY(QQmlComponent *extraContextMenuEntriesComponent READ extraContextMenuEntriesComponent WRITE setExtraContextMenuEntriesComponent NOTIFY extraContextMenuEntriesComponentChanged)
     Q_PROPERTY(bool isFullScreen READ isFullScreen WRITE setIsFullScreen NOTIFY isFullScreenChanged)
     Q_PROPERTY(QQuickWebEngineHistory *navigationHistory READ navigationHistory CONSTANT FINAL)
+    Q_ENUMS(Feature)
 
 public:
+    enum Feature {
+        MediaAudioDevices,
+        MediaVideoDevices,
+        MediaAudioVideoDevices
+    };
+
     void setIsFullScreen(bool fullscreen);
     bool isFullScreen() const;
     QQuickWebEngineViewport *viewport() const;
@@ -98,12 +105,14 @@ public Q_SLOTS:
     void goBackTo(int index);
     void goForwardTo(int index);
     void runJavaScript(const QString&, const QJSValue & = QJSValue());
+    void grantFeaturePermission(const QUrl &securityOrigin, Feature, bool granted);
 
 Q_SIGNALS:
     void newViewRequested(QQuickWebEngineNewViewRequest *request);
     void fullScreenRequested(bool fullScreen);
     void isFullScreenChanged();
     void extraContextMenuEntriesComponentChanged();
+    void featurePermissionRequested(const QUrl &securityOrigin, Feature feature);
 
 private:
     QQuickWebEngineViewExperimental(QQuickWebEngineViewPrivate* viewPrivate);
@@ -153,7 +162,7 @@ public:
     virtual void passOnFocus(bool reverse) Q_DECL_OVERRIDE;
     virtual void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString& message, int lineNumber, const QString& sourceID) Q_DECL_OVERRIDE;
     virtual void authenticationRequired(const QUrl&, const QString&, bool, const QString&, QString*, QString*) 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 setDevicePixelRatio(qreal);
     void adoptWebContents(WebContentsAdapter *webContents);
-- 
GitLab