blob: 28e86de680d285cc3b7516c61a0f42c8b0948c22 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// 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_enumeration/screen_manager.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
#include "third_party/blink/renderer/modules/screen_enumeration/display.h"
#include "third_party/blink/renderer/platform/bindings/exception_state.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h"
#include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
#include "third_party/blink/renderer/platform/heap/heap.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
namespace blink {
namespace {
void DidReceiveDisplays(ScriptPromiseResolver* resolver,
WTF::Vector<mojom::blink::DisplayPtr> backend_displays,
bool success) {
ScriptState* script_state = resolver->GetScriptState();
if (!script_state->ContextIsValid())
return;
HeapVector<Member<Display>> displays;
displays.ReserveInitialCapacity(backend_displays.size());
for (const auto& backend_display : backend_displays) {
auto* display = MakeGarbageCollected<Display>();
display->setName(backend_display->name);
display->setScaleFactor(backend_display->scale_factor);
display->setWidth(backend_display->width);
display->setHeight(backend_display->height);
display->setLeft(backend_display->left);
display->setTop(backend_display->top);
display->setColorDepth(backend_display->color_depth);
display->setIsPrimary(backend_display->is_primary);
display->setIsInternal(backend_display->is_internal);
displays.emplace_back(display);
}
resolver->Resolve(std::move(displays));
}
} // namespace
ScreenManager::ScreenManager(
mojo::Remote<mojom::blink::ScreenEnumeration> backend)
: backend_(std::move(backend)) {
backend_.set_disconnect_handler(WTF::Bind(
&ScreenManager::OnBackendDisconnected, WrapWeakPersistent(this)));
}
ScriptPromise ScreenManager::requestDisplays(ScriptState* script_state,
ExceptionState& exception_state) {
if (!backend_) {
exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
"ScreenManager backend went away");
return ScriptPromise();
}
auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
backend_->RequestDisplays(
WTF::Bind(&DidReceiveDisplays, WrapPersistent(resolver)));
return resolver->Promise();
}
void ScreenManager::OnBackendDisconnected() {
backend_.reset();
}
} // namespace blink