blob: f0060ef0b2127ad16113a5b36b936729f88e2e90 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/renderer/screen_orientation/screen_orientation_dispatcher.h"
#include "content/common/screen_orientation_messages.h"
namespace content {
ScreenOrientationDispatcher::ScreenOrientationDispatcher(
RenderFrame* render_frame)
: RenderFrameObserver(render_frame) {
}
ScreenOrientationDispatcher::~ScreenOrientationDispatcher() {
}
bool ScreenOrientationDispatcher::OnMessageReceived(
const IPC::Message& message) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(ScreenOrientationDispatcher, message)
IPC_MESSAGE_HANDLER(ScreenOrientationMsg_LockSuccess,
OnLockSuccess)
IPC_MESSAGE_HANDLER(ScreenOrientationMsg_LockError,
OnLockError)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
}
void ScreenOrientationDispatcher::OnLockSuccess(int request_id) {
blink::WebLockOrientationCallback* callback =
pending_callbacks_.Lookup(request_id);
if (!callback)
return;
callback->onSuccess();
pending_callbacks_.Remove(request_id);
}
void ScreenOrientationDispatcher::OnLockError(
int request_id, blink::WebLockOrientationError error) {
blink::WebLockOrientationCallback* callback =
pending_callbacks_.Lookup(request_id);
if (!callback)
return;
callback->onError(error);
pending_callbacks_.Remove(request_id);
}
void ScreenOrientationDispatcher::CancelPendingLocks() {
for (CallbackMap::Iterator<blink::WebLockOrientationCallback>
iterator(&pending_callbacks_); !iterator.IsAtEnd(); iterator.Advance()) {
iterator.GetCurrentValue()->onError(blink::WebLockOrientationErrorCanceled);
pending_callbacks_.Remove(iterator.GetCurrentKey());
}
}
void ScreenOrientationDispatcher::lockOrientation(
blink::WebScreenOrientationLockType orientation,
blink::WebLockOrientationCallback* callback) {
CancelPendingLocks();
int request_id = pending_callbacks_.Add(callback);
Send(new ScreenOrientationHostMsg_LockRequest(
routing_id(), orientation, request_id));
}
void ScreenOrientationDispatcher::unlockOrientation() {
CancelPendingLocks();
Send(new ScreenOrientationHostMsg_Unlock(routing_id()));
}
} // namespace content