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) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/screen_orientation/screen_orientation_dispatcher_host_impl.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/common/screen_orientation_messages.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/navigation_details.h" 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/public/browser/render_frame_host.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/render_process_host.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/render_view_host.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/render_widget_host.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/screen_orientation_provider.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/public/browser/web_contents.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/WebKit/public/platform/WebScreenInfo.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content { 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciScreenOrientationDispatcherHostImpl::LockInformation::LockInformation( 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int request_id, int process_id, int routing_id) 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : request_id(request_id), 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch process_id(process_id), 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch routing_id(routing_id) { 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciScreenOrientationDispatcherHostImpl::ScreenOrientationDispatcherHostImpl( 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebContents* web_contents) 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : WebContentsObserver(web_contents), 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch current_lock_(NULL) { 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch provider_.reset(ScreenOrientationProvider::Create(this, web_contents)); 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciScreenOrientationDispatcherHostImpl::~ScreenOrientationDispatcherHostImpl() { 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResetCurrentLock(); 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ScreenOrientationDispatcherHostImpl::ResetCurrentLock() { 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (current_lock_) { 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delete current_lock_; 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch current_lock_ = 0; 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ScreenOrientationDispatcherHostImpl::OnMessageReceived( 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const IPC::Message& message, 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderFrameHost* render_frame_host) { 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool handled = true; 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(ScreenOrientationDispatcherHostImpl, message, 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) render_frame_host) 5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IPC_MESSAGE_HANDLER(ScreenOrientationHostMsg_LockRequest, OnLockRequest) 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(ScreenOrientationHostMsg_Unlock, OnUnlockRequest) 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_END_MESSAGE_MAP() 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return handled; 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ScreenOrientationDispatcherHostImpl::DidNavigateMainFrame( 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const LoadCommittedDetails& details, const FrameNavigateParams& params) { 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!provider_ || details.is_in_page) 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci provider_->UnlockOrientation(); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 66116680a4aac90f2aa7413d9095a592090648e557Ben MurdochRenderFrameHost* 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciScreenOrientationDispatcherHostImpl::GetRenderFrameHostForRequestID( 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int request_id) { 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!current_lock_ || current_lock_->request_id != request_id) 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return NULL; 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return RenderFrameHost::FromID(current_lock_->process_id, 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch current_lock_->routing_id); 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ScreenOrientationDispatcherHostImpl::NotifyLockSuccess(int request_id) { 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHost* render_frame_host = 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetRenderFrameHostForRequestID(request_id); 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!render_frame_host) 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_frame_host->Send(new ScreenOrientationMsg_LockSuccess( 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) render_frame_host->GetRoutingID(), request_id)); 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResetCurrentLock(); 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ScreenOrientationDispatcherHostImpl::NotifyLockError( 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int request_id, blink::WebLockOrientationError error) { 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHost* render_frame_host = 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetRenderFrameHostForRequestID(request_id); 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!render_frame_host) 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NotifyLockError(request_id, render_frame_host, error); 956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ScreenOrientationDispatcherHostImpl::NotifyLockError( 986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int request_id, 996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) RenderFrameHost* render_frame_host, 1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) blink::WebLockOrientationError error) { 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_frame_host->Send(new ScreenOrientationMsg_LockError( 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_frame_host->GetRoutingID(), request_id, error)); 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResetCurrentLock(); 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ScreenOrientationDispatcherHostImpl::OnOrientationChange() { 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (provider_) 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch provider_->OnOrientationChange(); 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ScreenOrientationDispatcherHostImpl::OnLockRequest( 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderFrameHost* render_frame_host, 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) blink::WebScreenOrientationLockType orientation, 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int request_id) { 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (current_lock_) { 1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NotifyLockError(current_lock_->request_id, render_frame_host, 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebLockOrientationErrorCanceled); 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!provider_) { 1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NotifyLockError(request_id, render_frame_host, 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebLockOrientationErrorNotAvailable); 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) current_lock_ = new LockInformation(request_id, 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) render_frame_host->GetProcess()->GetID(), 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) render_frame_host->GetRoutingID()); 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch provider_->LockOrientation(request_id, orientation); 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ScreenOrientationDispatcherHostImpl::OnUnlockRequest( 134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RenderFrameHost* render_frame_host) { 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (current_lock_) { 1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NotifyLockError(current_lock_->request_id, render_frame_host, 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebLockOrientationErrorCanceled); 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!provider_) 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) provider_->UnlockOrientation(); 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace content 147