DeviceOrientationAndMotionAccessController.cpp [plain text]
#include "config.h"
#include "DeviceOrientationAndMotionAccessController.h"
#if ENABLE(DEVICE_ORIENTATION)
#include "Chrome.h"
#include "ChromeClient.h"
#include "DOMWindow.h"
#include "Document.h"
#include "DocumentLoader.h"
#include "Frame.h"
#include "Page.h"
#include "UserGestureIndicator.h"
namespace WebCore {
DeviceOrientationAndMotionAccessController::DeviceOrientationAndMotionAccessController(Document& document)
: m_document(document)
{
ASSERT(&m_document.topDocument() == &m_document);
auto* frame = m_document.frame();
if (auto* documentLoader = frame ? frame->loader().documentLoader() : nullptr)
m_accessState = documentLoader->deviceOrientationAndMotionAccessState();
}
void DeviceOrientationAndMotionAccessController::shouldAllowAccess(Function<void(DeviceOrientationOrMotionPermissionState)>&& callback)
{
auto* page = m_document.page();
auto* frame = m_document.frame();
if (!page || !frame)
return callback(DeviceOrientationOrMotionPermissionState::Denied);
bool mayPrompt = UserGestureIndicator::processingUserGesture();
if (m_accessState != DeviceOrientationOrMotionPermissionState::Prompt)
return callback(m_accessState);
page->chrome().client().shouldAllowDeviceOrientationAndMotionAccess(*m_document.frame(), mayPrompt, [this, weakThis = makeWeakPtr(this), callback = WTFMove(callback)](DeviceOrientationOrMotionPermissionState permissionState) mutable {
if (!weakThis)
return;
m_accessState = permissionState;
callback(permissionState);
if (permissionState != DeviceOrientationOrMotionPermissionState::Granted)
return;
for (auto* frame = m_document.frame(); frame && frame->window(); frame = frame->tree().traverseNext(m_document.frame())) {
frame->window()->startListeningForDeviceOrientationIfNecessary();
frame->window()->startListeningForDeviceMotionIfNecessary();
}
});
}
}
#endif // ENABLE(DEVICE_ORIENTATION)