<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[242951] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/242951">242951</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2019-03-14 11:57:58 -0700 (Thu, 14 Mar 2019)</dd>
</dl>

<h3>Log Message</h3>
<pre>Device orientation's permission should only require a user gesture to prompt the user
https://bugs.webkit.org/show_bug.cgi?id=195731

Reviewed by Geoffrey Garen.

Source/WebCore:

Device orientation's permission should only require a user gesture to prompt the user. If the
user already made a decision, we should resolve the promise with this decision, even without
user gesture.

This is useful for JS to figure out if they are access to device orientation or not because
showing UI for the user to give permission.

No new tests, updated existing tests.

* dom/DeviceOrientationAndMotionAccessController.cpp:
(WebCore::DeviceOrientationAndMotionAccessController::shouldAllowAccess):
* dom/DeviceOrientationAndMotionAccessController.h:
* dom/DeviceOrientationOrMotionEvent.cpp:
(WebCore::DeviceOrientationOrMotionEvent::requestPermission):

LayoutTests:

Update layout tests accordingly.

* fast/device-orientation/device-motion-request-permission-denied.html:
* fast/device-orientation/device-motion-request-permission-granted.html:
* fast/device-orientation/device-motion-request-permission-user-gesture-expected.txt:
* fast/device-orientation/device-orientation-request-permission-denied.html:
* fast/device-orientation/device-orientation-request-permission-granted.html:
* fast/device-orientation/device-orientation-request-permission-user-gesture-expected.txt:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfastdeviceorientationdevicemotionrequestpermissiondeniedhtml">trunk/LayoutTests/fast/device-orientation/device-motion-request-permission-denied.html</a></li>
<li><a href="#trunkLayoutTestsfastdeviceorientationdevicemotionrequestpermissiongrantedhtml">trunk/LayoutTests/fast/device-orientation/device-motion-request-permission-granted.html</a></li>
<li><a href="#trunkLayoutTestsfastdeviceorientationdevicemotionrequestpermissionusergestureexpectedtxt">trunk/LayoutTests/fast/device-orientation/device-motion-request-permission-user-gesture-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdeviceorientationdeviceorientationrequestpermissiondeniedhtml">trunk/LayoutTests/fast/device-orientation/device-orientation-request-permission-denied.html</a></li>
<li><a href="#trunkLayoutTestsfastdeviceorientationdeviceorientationrequestpermissiongrantedhtml">trunk/LayoutTests/fast/device-orientation/device-orientation-request-permission-granted.html</a></li>
<li><a href="#trunkLayoutTestsfastdeviceorientationdeviceorientationrequestpermissionusergestureexpectedtxt">trunk/LayoutTests/fast/device-orientation/device-orientation-request-permission-user-gesture-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoredomDeviceOrientationAndMotionAccessControllercpp">trunk/Source/WebCore/dom/DeviceOrientationAndMotionAccessController.cpp</a></li>
<li><a href="#trunkSourceWebCoredomDeviceOrientationAndMotionAccessControllerh">trunk/Source/WebCore/dom/DeviceOrientationAndMotionAccessController.h</a></li>
<li><a href="#trunkSourceWebCoredomDeviceOrientationOrMotionEventcpp">trunk/Source/WebCore/dom/DeviceOrientationOrMotionEvent.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (242950 => 242951)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog      2019-03-14 18:40:50 UTC (rev 242950)
+++ trunk/LayoutTests/ChangeLog 2019-03-14 18:57:58 UTC (rev 242951)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2019-03-14  Chris Dumez  <cdumez@apple.com>
+
+        Device orientation's permission should only require a user gesture to prompt the user
+        https://bugs.webkit.org/show_bug.cgi?id=195731
+
+        Reviewed by Geoffrey Garen.
+
+        Update layout tests accordingly.
+
+        * fast/device-orientation/device-motion-request-permission-denied.html:
+        * fast/device-orientation/device-motion-request-permission-granted.html:
+        * fast/device-orientation/device-motion-request-permission-user-gesture-expected.txt:
+        * fast/device-orientation/device-orientation-request-permission-denied.html:
+        * fast/device-orientation/device-orientation-request-permission-granted.html:
+        * fast/device-orientation/device-orientation-request-permission-user-gesture-expected.txt:
+
</ins><span class="cx"> 2019-03-14  Dean Jackson  <dino@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Block all plugins smaller than 5x5px
</span></span></pre></div>
<a id="trunkLayoutTestsfastdeviceorientationdevicemotionrequestpermissiondeniedhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/device-orientation/device-motion-request-permission-denied.html (242950 => 242951)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/device-orientation/device-motion-request-permission-denied.html   2019-03-14 18:40:50 UTC (rev 242950)
+++ trunk/LayoutTests/fast/device-orientation/device-motion-request-permission-denied.html      2019-03-14 18:57:58 UTC (rev 242951)
</span><span class="lines">@@ -18,12 +18,10 @@
</span><span class="cx"> 
</span><span class="cx">         addEventListener("devicemotion", () => {});
</span><span class="cx"> 
</span><del>-        internals.withUserGesture(() => {
-            DeviceMotionEvent.requestPermission().then((_result) => {
-                result = _result;
-                shouldBeEqualToString("result", "denied");
-                finishJSTest();
-            });
</del><ins>+        DeviceMotionEvent.requestPermission().then((_result) => {
+            result = _result;
+            shouldBeEqualToString("result", "denied");
+            finishJSTest();
</ins><span class="cx">         });
</span><span class="cx">     });
</span><span class="cx"> });
</span></span></pre></div>
<a id="trunkLayoutTestsfastdeviceorientationdevicemotionrequestpermissiongrantedhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/device-orientation/device-motion-request-permission-granted.html (242950 => 242951)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/device-orientation/device-motion-request-permission-granted.html  2019-03-14 18:40:50 UTC (rev 242950)
+++ trunk/LayoutTests/fast/device-orientation/device-motion-request-permission-granted.html     2019-03-14 18:57:58 UTC (rev 242951)
</span><span class="lines">@@ -18,12 +18,10 @@
</span><span class="cx"> 
</span><span class="cx">         addEventListener("devicemotion", () => {});
</span><span class="cx"> 
</span><del>-        internals.withUserGesture(() => {
-            DeviceMotionEvent.requestPermission().then((_result) => {
-                result = _result;
-                shouldBeEqualToString("result", "granted");
-                finishJSTest();
-            });
</del><ins>+        DeviceMotionEvent.requestPermission().then((_result) => {
+            result = _result;
+            shouldBeEqualToString("result", "granted");
+            finishJSTest();
</ins><span class="cx">         });
</span><span class="cx">     });
</span><span class="cx"> });
</span></span></pre></div>
<a id="trunkLayoutTestsfastdeviceorientationdevicemotionrequestpermissionusergestureexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/device-orientation/device-motion-request-permission-user-gesture-expected.txt (242950 => 242951)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/device-orientation/device-motion-request-permission-user-gesture-expected.txt     2019-03-14 18:40:50 UTC (rev 242950)
+++ trunk/LayoutTests/fast/device-orientation/device-motion-request-permission-user-gesture-expected.txt        2019-03-14 18:57:58 UTC (rev 242951)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-CONSOLE MESSAGE: line 14: NotAllowedError: Calling requestPermission() requires a user gesture
</del><ins>+CONSOLE MESSAGE: line 14: NotAllowedError: Requesting device orientation or motion access requires a user gesture
</ins><span class="cx"> Tests that DeviceMotionEvent.requestPermission() requires a user gesture.
</span><span class="cx"> 
</span><span class="cx"> On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
</span></span></pre></div>
<a id="trunkLayoutTestsfastdeviceorientationdeviceorientationrequestpermissiondeniedhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/device-orientation/device-orientation-request-permission-denied.html (242950 => 242951)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/device-orientation/device-orientation-request-permission-denied.html      2019-03-14 18:40:50 UTC (rev 242950)
+++ trunk/LayoutTests/fast/device-orientation/device-orientation-request-permission-denied.html 2019-03-14 18:57:58 UTC (rev 242951)
</span><span class="lines">@@ -18,12 +18,10 @@
</span><span class="cx"> 
</span><span class="cx">         addEventListener("deviceorientation", () => {});
</span><span class="cx"> 
</span><del>-        internals.withUserGesture(() => {
-            DeviceOrientationEvent.requestPermission().then((_result) => {
-                result = _result;
-                shouldBeEqualToString("result", "denied");
-                finishJSTest();
-            });
</del><ins>+        DeviceOrientationEvent.requestPermission().then((_result) => {
+            result = _result;
+            shouldBeEqualToString("result", "denied");
+            finishJSTest();
</ins><span class="cx">         });
</span><span class="cx">     });
</span><span class="cx"> });
</span></span></pre></div>
<a id="trunkLayoutTestsfastdeviceorientationdeviceorientationrequestpermissiongrantedhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/device-orientation/device-orientation-request-permission-granted.html (242950 => 242951)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/device-orientation/device-orientation-request-permission-granted.html     2019-03-14 18:40:50 UTC (rev 242950)
+++ trunk/LayoutTests/fast/device-orientation/device-orientation-request-permission-granted.html        2019-03-14 18:57:58 UTC (rev 242951)
</span><span class="lines">@@ -18,12 +18,10 @@
</span><span class="cx"> 
</span><span class="cx">         addEventListener("deviceorientation", () => {});
</span><span class="cx"> 
</span><del>-        internals.withUserGesture(() => {
-            DeviceOrientationEvent.requestPermission().then((_result) => {
-                result = _result;
-                shouldBeEqualToString("result", "granted");
-                finishJSTest();
-            });
</del><ins>+        DeviceOrientationEvent.requestPermission().then((_result) => {
+            result = _result;
+            shouldBeEqualToString("result", "granted");
+            finishJSTest();
</ins><span class="cx">         });
</span><span class="cx">     });
</span><span class="cx"> });
</span></span></pre></div>
<a id="trunkLayoutTestsfastdeviceorientationdeviceorientationrequestpermissionusergestureexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/device-orientation/device-orientation-request-permission-user-gesture-expected.txt (242950 => 242951)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/device-orientation/device-orientation-request-permission-user-gesture-expected.txt        2019-03-14 18:40:50 UTC (rev 242950)
+++ trunk/LayoutTests/fast/device-orientation/device-orientation-request-permission-user-gesture-expected.txt   2019-03-14 18:57:58 UTC (rev 242951)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-CONSOLE MESSAGE: line 14: NotAllowedError: Calling requestPermission() requires a user gesture
</del><ins>+CONSOLE MESSAGE: line 14: NotAllowedError: Requesting device orientation or motion access requires a user gesture
</ins><span class="cx"> Tests that DeviceOrientationEvent.requestPermission() requires a user gesture.
</span><span class="cx"> 
</span><span class="cx"> On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (242950 => 242951)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2019-03-14 18:40:50 UTC (rev 242950)
+++ trunk/Source/WebCore/ChangeLog      2019-03-14 18:57:58 UTC (rev 242951)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2019-03-14  Chris Dumez  <cdumez@apple.com>
+
+        Device orientation's permission should only require a user gesture to prompt the user
+        https://bugs.webkit.org/show_bug.cgi?id=195731
+
+        Reviewed by Geoffrey Garen.
+
+        Device orientation's permission should only require a user gesture to prompt the user. If the
+        user already made a decision, we should resolve the promise with this decision, even without
+        user gesture.
+
+        This is useful for JS to figure out if they are access to device orientation or not because
+        showing UI for the user to give permission.
+
+        No new tests, updated existing tests.
+
+        * dom/DeviceOrientationAndMotionAccessController.cpp:
+        (WebCore::DeviceOrientationAndMotionAccessController::shouldAllowAccess):
+        * dom/DeviceOrientationAndMotionAccessController.h:
+        * dom/DeviceOrientationOrMotionEvent.cpp:
+        (WebCore::DeviceOrientationOrMotionEvent::requestPermission):
+
</ins><span class="cx"> 2019-03-14  Youenn Fablet  <youenn@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Reset storage quota when clearing IDB/Cache API entries
</span></span></pre></div>
<a id="trunkSourceWebCoredomDeviceOrientationAndMotionAccessControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/DeviceOrientationAndMotionAccessController.cpp (242950 => 242951)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/DeviceOrientationAndMotionAccessController.cpp  2019-03-14 18:40:50 UTC (rev 242950)
+++ trunk/Source/WebCore/dom/DeviceOrientationAndMotionAccessController.cpp     2019-03-14 18:57:58 UTC (rev 242951)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> #include "Document.h"
</span><span class="cx"> #include "Frame.h"
</span><span class="cx"> #include "Page.h"
</span><ins>+#include "UserGestureIndicator.h"
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -43,11 +44,14 @@
</span><span class="cx">     ASSERT(&m_document.topDocument() == &m_document);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DeviceOrientationAndMotionAccessController::shouldAllowAccess(Function<void(bool granted)>&& callback)
</del><ins>+void DeviceOrientationAndMotionAccessController::shouldAllowAccess(Function<void(ExceptionOr<bool> granted)>&& callback)
</ins><span class="cx"> {
</span><span class="cx">     if (m_accessState)
</span><span class="cx">         return callback(*m_accessState);
</span><span class="cx"> 
</span><ins>+    if (!UserGestureIndicator::processingUserGesture())
+        return callback(Exception { NotAllowedError, "Requesting device orientation or motion access requires a user gesture"_s });
+
</ins><span class="cx">     auto* page = m_document.page();
</span><span class="cx">     if (!page)
</span><span class="cx">         return callback(false);
</span></span></pre></div>
<a id="trunkSourceWebCoredomDeviceOrientationAndMotionAccessControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/DeviceOrientationAndMotionAccessController.h (242950 => 242951)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/DeviceOrientationAndMotionAccessController.h    2019-03-14 18:40:50 UTC (rev 242950)
+++ trunk/Source/WebCore/dom/DeviceOrientationAndMotionAccessController.h       2019-03-14 18:57:58 UTC (rev 242951)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(DEVICE_ORIENTATION)
</span><span class="cx"> 
</span><ins>+#include "ExceptionOr.h"
</ins><span class="cx"> #include <wtf/Function.h>
</span><span class="cx"> #include <wtf/Vector.h>
</span><span class="cx"> #include <wtf/WeakPtr.h>
</span><span class="lines">@@ -41,7 +42,7 @@
</span><span class="cx">     explicit DeviceOrientationAndMotionAccessController(Document&);
</span><span class="cx"> 
</span><span class="cx">     const Optional<bool>& accessState() const { return m_accessState; }
</span><del>-    void shouldAllowAccess(Function<void(bool granted)>&&);
</del><ins>+    void shouldAllowAccess(Function<void(ExceptionOr<bool> granted)>&&);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     void setAccessState(bool);
</span></span></pre></div>
<a id="trunkSourceWebCoredomDeviceOrientationOrMotionEventcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/DeviceOrientationOrMotionEvent.cpp (242950 => 242951)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/DeviceOrientationOrMotionEvent.cpp      2019-03-14 18:40:50 UTC (rev 242950)
+++ trunk/Source/WebCore/dom/DeviceOrientationOrMotionEvent.cpp 2019-03-14 18:57:58 UTC (rev 242951)
</span><span class="lines">@@ -27,7 +27,6 @@
</span><span class="cx"> #include "DeviceOrientationOrMotionEvent.h"
</span><span class="cx"> 
</span><span class="cx"> #include "Document.h"
</span><del>-#include "UserGestureIndicator.h"
</del><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -38,9 +37,6 @@
</span><span class="cx">     if (!window)
</span><span class="cx">         return promise.reject(Exception { InvalidStateError, "No browsing context"_s });
</span><span class="cx"> 
</span><del>-    if (!UserGestureIndicator::processingUserGesture())
-        return promise.reject(Exception { NotAllowedError, "Calling requestPermission() requires a user gesture"_s });
-
</del><span class="cx">     String errorMessage;
</span><span class="cx">     if (!window->isAllowedToUseDeviceMotionOrientation(errorMessage)) {
</span><span class="cx">         document.addConsoleMessage(MessageSource::JS, MessageLevel::Warning, makeString("Call to requestPermission() failed, reason: ", errorMessage, "."));
</span><span class="lines">@@ -47,8 +43,10 @@
</span><span class="cx">         return promise.resolve(PermissionState::Denied);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    document.deviceOrientationAndMotionAccessController().shouldAllowAccess([promise = WTFMove(promise)](bool granted) mutable {
-        promise.resolve(granted ? PermissionState::Granted : PermissionState::Denied);
</del><ins>+    document.deviceOrientationAndMotionAccessController().shouldAllowAccess([promise = WTFMove(promise)](ExceptionOr<bool> granted) mutable {
+        if (granted.hasException())
+            return promise.reject(granted.releaseException());
+        promise.resolve(granted.returnValue() ? PermissionState::Granted : PermissionState::Denied);
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> #endif
</span></span></pre>
</div>
</div>

</body>
</html>