File: screen_orientation.cc

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (157 lines) | stat: -rw-r--r-- 5,867 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "third_party/blink/renderer/modules/screen_orientation/screen_orientation.h"

#include <memory>

#include "base/memory/raw_ptr_exclusion.h"
#include "services/network/public/mojom/web_sandbox_flags.mojom-blink.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_orientation_lock_type.h"
#include "third_party/blink/renderer/core/dom/dom_exception.h"
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/modules/event_target_modules.h"
#include "third_party/blink/renderer/modules/screen_orientation/lock_orientation_callback.h"
#include "third_party/blink/renderer/modules/screen_orientation/screen_orientation_controller.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/wtf/assertions.h"

namespace blink {

V8OrientationType::Enum ScreenOrientation::OrientationTypeToV8Enum(
    display::mojom::blink::ScreenOrientation orientation) {
  switch (orientation) {
    case display::mojom::blink::ScreenOrientation::kPortraitPrimary:
      return V8OrientationType::Enum::kPortraitPrimary;
    case display::mojom::blink::ScreenOrientation::kPortraitSecondary:
      return V8OrientationType::Enum::kPortraitSecondary;
    case display::mojom::blink::ScreenOrientation::kLandscapePrimary:
      return V8OrientationType::Enum::kLandscapePrimary;
    case display::mojom::blink::ScreenOrientation::kLandscapeSecondary:
      return V8OrientationType::Enum::kLandscapeSecondary;
    case display::mojom::blink::ScreenOrientation::kUndefined:
      break;
  }
  NOTREACHED();
}

static device::mojom::blink::ScreenOrientationLockType V8EnumToOrientationLock(
    V8OrientationLockType::Enum orientation_lock) {
  switch (orientation_lock) {
    case V8OrientationLockType::Enum::kPortraitPrimary:
      return device::mojom::blink::ScreenOrientationLockType::PORTRAIT_PRIMARY;
    case V8OrientationLockType::Enum::kPortraitSecondary:
      return device::mojom::blink::ScreenOrientationLockType::
          PORTRAIT_SECONDARY;
    case V8OrientationLockType::Enum::kLandscapePrimary:
      return device::mojom::blink::ScreenOrientationLockType::LANDSCAPE_PRIMARY;
    case V8OrientationLockType::Enum::kLandscapeSecondary:
      return device::mojom::blink::ScreenOrientationLockType::
          LANDSCAPE_SECONDARY;
    case V8OrientationLockType::Enum::kAny:
      return device::mojom::blink::ScreenOrientationLockType::ANY;
    case V8OrientationLockType::Enum::kNatural:
      return device::mojom::blink::ScreenOrientationLockType::NATURAL;
    case V8OrientationLockType::Enum::kPortrait:
      return device::mojom::blink::ScreenOrientationLockType::PORTRAIT;
    case V8OrientationLockType::Enum::kLandscape:
      return device::mojom::blink::ScreenOrientationLockType::LANDSCAPE;
  }
  NOTREACHED();
}

// static
ScreenOrientation* ScreenOrientation::Create(LocalDOMWindow* window) {
  DCHECK(window);
  ScreenOrientation* orientation =
      MakeGarbageCollected<ScreenOrientation>(window);
  orientation->Controller()->SetOrientation(orientation);
  return orientation;
}

ScreenOrientation::ScreenOrientation(LocalDOMWindow* window)
    : ExecutionContextClient(window),
      type_(display::mojom::blink::ScreenOrientation::kUndefined),
      angle_(0) {}

ScreenOrientation::~ScreenOrientation() = default;

const WTF::AtomicString& ScreenOrientation::InterfaceName() const {
  return event_target_names::kScreenOrientation;
}

ExecutionContext* ScreenOrientation::GetExecutionContext() const {
  return ExecutionContextClient::GetExecutionContext();
}

V8OrientationType ScreenOrientation::type() const {
  return V8OrientationType(OrientationTypeToV8Enum(type_));
}

uint16_t ScreenOrientation::angle() const {
  return angle_;
}

void ScreenOrientation::SetType(display::mojom::blink::ScreenOrientation type) {
  type_ = type;
}

void ScreenOrientation::SetAngle(uint16_t angle) {
  angle_ = angle;
}

ScriptPromise<IDLUndefined> ScreenOrientation::lock(
    ScriptState* state,
    const V8OrientationLockType& orientation,
    ExceptionState& exception_state) {
  if (!state->ContextIsValid() || !Controller()) {
    exception_state.ThrowDOMException(
        DOMExceptionCode::kInvalidStateError,
        "The object is no longer associated to a window.");
    return EmptyPromise();
  }

  if (GetExecutionContext()->IsSandboxed(
          network::mojom::blink::WebSandboxFlags::kOrientationLock)) {
    exception_state.ThrowSecurityError(
        To<LocalDOMWindow>(GetExecutionContext())
                ->GetFrame()
                ->IsInFencedFrameTree()
            ? "The window is in a fenced frame tree."
            : "The window is sandboxed and lacks the 'allow-orientation-lock' "
              "flag.");
    return EmptyPromise();
  }

  auto* resolver =
      MakeGarbageCollected<ScriptPromiseResolver<IDLUndefined>>(state);
  auto promise = resolver->Promise();
  Controller()->lock(V8EnumToOrientationLock(orientation.AsEnum()),
                     std::make_unique<LockOrientationCallback>(resolver));
  return promise;
}

void ScreenOrientation::unlock() {
  if (!Controller())
    return;

  Controller()->unlock();
}

ScreenOrientationController* ScreenOrientation::Controller() {
  if (!GetExecutionContext())
    return nullptr;

  return ScreenOrientationController::From(
      *To<LocalDOMWindow>(GetExecutionContext()));
}

void ScreenOrientation::Trace(Visitor* visitor) const {
  EventTarget::Trace(visitor);
  ExecutionContextClient::Trace(visitor);
}

}  // namespace blink