• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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