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