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