1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/renderer/screen_orientation/screen_orientation_dispatcher.h"
6
7 #include "content/common/screen_orientation_messages.h"
8
9 namespace content {
10
ScreenOrientationDispatcher(RenderFrame * render_frame)11 ScreenOrientationDispatcher::ScreenOrientationDispatcher(
12 RenderFrame* render_frame)
13 : RenderFrameObserver(render_frame) {
14 }
15
~ScreenOrientationDispatcher()16 ScreenOrientationDispatcher::~ScreenOrientationDispatcher() {
17 }
18
OnMessageReceived(const IPC::Message & message)19 bool ScreenOrientationDispatcher::OnMessageReceived(
20 const IPC::Message& message) {
21 bool handled = true;
22
23 IPC_BEGIN_MESSAGE_MAP(ScreenOrientationDispatcher, message)
24 IPC_MESSAGE_HANDLER(ScreenOrientationMsg_LockSuccess,
25 OnLockSuccess)
26 IPC_MESSAGE_HANDLER(ScreenOrientationMsg_LockError,
27 OnLockError)
28 IPC_MESSAGE_UNHANDLED(handled = false)
29 IPC_END_MESSAGE_MAP()
30
31 return handled;
32 }
33
OnLockSuccess(int request_id,unsigned angle,blink::WebScreenOrientationType orientation)34 void ScreenOrientationDispatcher::OnLockSuccess(
35 int request_id,
36 unsigned angle,
37 blink::WebScreenOrientationType orientation) {
38 blink::WebLockOrientationCallback* callback =
39 pending_callbacks_.Lookup(request_id);
40 if (!callback)
41 return;
42 callback->onSuccess(angle, orientation);
43 pending_callbacks_.Remove(request_id);
44 }
45
OnLockError(int request_id,blink::WebLockOrientationCallback::ErrorType error)46 void ScreenOrientationDispatcher::OnLockError(
47 int request_id,
48 blink::WebLockOrientationCallback::ErrorType error) {
49 blink::WebLockOrientationCallback* callback =
50 pending_callbacks_.Lookup(request_id);
51 if (!callback)
52 return;
53 callback->onError(error);
54 pending_callbacks_.Remove(request_id);
55 }
56
CancelPendingLocks()57 void ScreenOrientationDispatcher::CancelPendingLocks() {
58 for (CallbackMap::Iterator<blink::WebLockOrientationCallback>
59 iterator(&pending_callbacks_); !iterator.IsAtEnd(); iterator.Advance()) {
60 iterator.GetCurrentValue()->onError(
61 blink::WebLockOrientationCallback::ErrorTypeCanceled);
62 pending_callbacks_.Remove(iterator.GetCurrentKey());
63 }
64 }
65
lockOrientation(blink::WebScreenOrientationLockType orientation,blink::WebLockOrientationCallback * callback)66 void ScreenOrientationDispatcher::lockOrientation(
67 blink::WebScreenOrientationLockType orientation,
68 blink::WebLockOrientationCallback* callback) {
69 CancelPendingLocks();
70
71 int request_id = pending_callbacks_.Add(callback);
72 Send(new ScreenOrientationHostMsg_LockRequest(
73 routing_id(), orientation, request_id));
74 }
75
unlockOrientation()76 void ScreenOrientationDispatcher::unlockOrientation() {
77 CancelPendingLocks();
78 Send(new ScreenOrientationHostMsg_Unlock(routing_id()));
79 }
80
81 } // namespace content
82