1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/screen_orientation/screen_orientation_dispatcher.h"
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/screen_orientation_messages.h"
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content {
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)ScreenOrientationDispatcher::ScreenOrientationDispatcher(
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    RenderFrame* render_frame)
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : RenderFrameObserver(render_frame) {
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ScreenOrientationDispatcher::~ScreenOrientationDispatcher() {
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ScreenOrientationDispatcher::OnMessageReceived(
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const IPC::Message& message) {
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool handled = true;
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(ScreenOrientationDispatcher, message)
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ScreenOrientationMsg_LockSuccess,
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        OnLockSuccess)
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ScreenOrientationMsg_LockError,
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        OnLockError)
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return handled;
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ScreenOrientationDispatcher::OnLockSuccess(int request_id) {
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  blink::WebLockOrientationCallback* callback =
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      pending_callbacks_.Lookup(request_id);
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!callback)
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return;
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  callback->onSuccess();
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  pending_callbacks_.Remove(request_id);
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void ScreenOrientationDispatcher::OnLockError(
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int request_id, blink::WebLockOrientationError error) {
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  blink::WebLockOrientationCallback* callback =
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      pending_callbacks_.Lookup(request_id);
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!callback)
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return;
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  callback->onError(error);
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  pending_callbacks_.Remove(request_id);
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void ScreenOrientationDispatcher::CancelPendingLocks() {
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (CallbackMap::Iterator<blink::WebLockOrientationCallback>
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       iterator(&pending_callbacks_); !iterator.IsAtEnd(); iterator.Advance()) {
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    iterator.GetCurrentValue()->onError(blink::WebLockOrientationErrorCanceled);
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    pending_callbacks_.Remove(iterator.GetCurrentKey());
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ScreenOrientationDispatcher::lockOrientation(
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    blink::WebScreenOrientationLockType orientation,
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    blink::WebLockOrientationCallback* callback) {
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CancelPendingLocks();
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int request_id = pending_callbacks_.Add(callback);
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Send(new ScreenOrientationHostMsg_LockRequest(
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      routing_id(), orientation, request_id));
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ScreenOrientationDispatcher::unlockOrientation() {
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CancelPendingLocks();
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Send(new ScreenOrientationHostMsg_Unlock(routing_id()));
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace content
77