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/mock_screen_orientation_controller.h"
6
7#include "base/bind.h"
8#include "base/logging.h"
9#include "base/message_loop/message_loop.h"
10#include "content/renderer/render_view_impl.h"
11
12namespace content {
13
14MockScreenOrientationController::MockScreenOrientationController()
15    : RenderViewObserver(NULL),
16      current_lock_(blink::WebScreenOrientationLockDefault),
17      device_orientation_(blink::WebScreenOrientationPortraitPrimary),
18      current_orientation_(blink::WebScreenOrientationPortraitPrimary) {
19  // Since MockScreenOrientationController is held by LazyInstance reference,
20  // add this ref for it.
21  AddRef();
22}
23
24MockScreenOrientationController::~MockScreenOrientationController() {
25}
26
27void MockScreenOrientationController::ResetData() {
28  if (render_view_impl())
29    render_view_impl()->RemoveObserver(this);
30
31  current_lock_ = blink::WebScreenOrientationLockDefault;
32  device_orientation_ = blink::WebScreenOrientationPortraitPrimary;
33  current_orientation_ = blink::WebScreenOrientationPortraitPrimary;
34}
35
36void MockScreenOrientationController::UpdateDeviceOrientation(
37    RenderView* render_view,
38    blink::WebScreenOrientationType orientation) {
39  if (this->render_view()) {
40    // Make sure that render_view_ did not change during test.
41    DCHECK_EQ(this->render_view(), render_view);
42  } else {
43    Observe(render_view);
44  }
45
46  if (device_orientation_ == orientation)
47    return;
48  device_orientation_ = orientation;
49  if (!IsOrientationAllowedByCurrentLock(orientation))
50    return;
51  UpdateScreenOrientation(orientation);
52}
53
54RenderViewImpl* MockScreenOrientationController::render_view_impl() const {
55  return static_cast<RenderViewImpl*>(render_view());
56}
57
58void MockScreenOrientationController::UpdateScreenOrientation(
59    blink::WebScreenOrientationType orientation) {
60  if (current_orientation_ == orientation)
61    return;
62  current_orientation_ = orientation;
63  if (render_view_impl())
64    render_view_impl()->SetScreenOrientationForTesting(orientation);
65}
66
67bool MockScreenOrientationController::IsOrientationAllowedByCurrentLock(
68    blink::WebScreenOrientationType orientation) {
69  if (current_lock_ == blink::WebScreenOrientationLockDefault ||
70      current_lock_ == blink::WebScreenOrientationLockAny) {
71    return true;
72  }
73
74  switch (orientation) {
75    case blink::WebScreenOrientationPortraitPrimary:
76      return current_lock_ == blink::WebScreenOrientationLockPortraitPrimary ||
77             current_lock_ == blink::WebScreenOrientationLockPortrait;
78    case blink::WebScreenOrientationPortraitSecondary:
79      return current_lock_ ==
80                 blink::WebScreenOrientationLockPortraitSecondary ||
81             current_lock_ == blink::WebScreenOrientationLockPortrait;
82    case blink::WebScreenOrientationLandscapePrimary:
83      return current_lock_ == blink::WebScreenOrientationLockLandscapePrimary ||
84             current_lock_ == blink::WebScreenOrientationLockLandscape;
85    case blink::WebScreenOrientationLandscapeSecondary:
86      return current_lock_ ==
87                 blink::WebScreenOrientationLockLandscapeSecondary ||
88             current_lock_ == blink::WebScreenOrientationLockLandscape;
89    default:
90      return false;
91  }
92}
93
94void MockScreenOrientationController::OnDestruct() {
95}
96
97} // namespace content
98