Web Inspector: REGRESSION(r266074): Uncaught Exception: undefined is not an object...
[WebKit-https.git] / Source / WebKit / UIProcess / WebsiteData / WebDeviceOrientationAndMotionAccessController.cpp
1 /*
2  * Copyright (C) 2019 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *  * Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  *  * Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "WebDeviceOrientationAndMotionAccessController.h"
28
29 #if ENABLE(DEVICE_ORIENTATION)
30
31 #include "APIUIClient.h"
32 #include "FrameInfoData.h"
33 #include "WebPageProxy.h"
34
35 namespace WebKit {
36
37 using namespace WebCore;
38
39 void WebDeviceOrientationAndMotionAccessController::shouldAllowAccess(WebPageProxy& page, WebFrameProxy& frame, FrameInfoData&& frameInfo, bool mayPrompt, CompletionHandler<void(DeviceOrientationOrMotionPermissionState)>&& completionHandler)
40 {
41     SecurityOriginData originData = frameInfo.securityOrigin;
42     auto currentPermission = cachedDeviceOrientationPermission(originData);
43     if (currentPermission != DeviceOrientationOrMotionPermissionState::Prompt || !mayPrompt)
44         return completionHandler(currentPermission);
45
46     auto& pendingRequests = m_pendingRequests.ensure(originData, [] {
47         return Vector<CompletionHandler<void(WebCore::DeviceOrientationOrMotionPermissionState)>> { };
48     }).iterator->value;
49     pendingRequests.append(WTFMove(completionHandler));
50     if (pendingRequests.size() > 1)
51         return;
52
53     page.uiClient().shouldAllowDeviceOrientationAndMotionAccess(page, frame, WTFMove(frameInfo), [this, weakThis = makeWeakPtr(this), originData](bool granted) mutable {
54         if (!weakThis)
55             return;
56         m_deviceOrientationPermissionDecisions.set(originData, granted);
57         auto requests = m_pendingRequests.take(originData);
58         for (auto& completionHandler : requests)
59             completionHandler(granted ? DeviceOrientationOrMotionPermissionState::Granted : DeviceOrientationOrMotionPermissionState::Denied);
60     });
61 }
62
63 DeviceOrientationOrMotionPermissionState WebDeviceOrientationAndMotionAccessController::cachedDeviceOrientationPermission(const SecurityOriginData& origin) const
64 {
65     if (!m_deviceOrientationPermissionDecisions.isValidKey(origin))
66         return DeviceOrientationOrMotionPermissionState::Denied;
67
68     auto it = m_deviceOrientationPermissionDecisions.find(origin);
69     if (it == m_deviceOrientationPermissionDecisions.end())
70         return DeviceOrientationOrMotionPermissionState::Prompt;
71     return it->value ? DeviceOrientationOrMotionPermissionState::Granted : DeviceOrientationOrMotionPermissionState::Denied;
72 }
73
74 void WebDeviceOrientationAndMotionAccessController::clearPermissions()
75 {
76     m_deviceOrientationPermissionDecisions.clear();
77 }
78
79 } // namespace WebKit
80
81 #endif // ENABLE(DEVICE_ORIENTATION)