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
|
// 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/presentation/presentation.h"
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/core/frame/navigator.h"
#include "third_party/blink/renderer/core/frame/settings.h"
#include "third_party/blink/renderer/modules/presentation/presentation_controller.h"
#include "third_party/blink/renderer/modules/presentation/presentation_receiver.h"
#include "third_party/blink/renderer/modules/presentation/presentation_request.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"
namespace blink {
namespace {
// Checks if the frame of the provided window is the outermost frame, which
// means, neither an iframe, or a fenced frame.
bool IsOutermostDocument(LocalDOMWindow* window) {
return window->GetFrame()->IsMainFrame() &&
!window->GetFrame()->IsInFencedFrameTree();
}
} // namespace
// static
const char Presentation::kSupplementName[] = "Presentation";
// static
Presentation* Presentation::presentation(Navigator& navigator) {
if (!navigator.DomWindow())
return nullptr;
auto* presentation = Supplement<Navigator>::From<Presentation>(navigator);
if (!presentation) {
presentation = MakeGarbageCollected<Presentation>(navigator);
ProvideTo(navigator, presentation);
}
return presentation;
}
Presentation::Presentation(Navigator& navigator)
: Supplement<Navigator>(navigator) {
PresentationController::From(*navigator.DomWindow())->SetPresentation(this);
MaybeInitReceiver();
}
void Presentation::Trace(Visitor* visitor) const {
visitor->Trace(default_request_);
visitor->Trace(receiver_);
ScriptWrappable::Trace(visitor);
Supplement<Navigator>::Trace(visitor);
}
PresentationRequest* Presentation::defaultRequest() const {
return default_request_.Get();
}
void Presentation::setDefaultRequest(PresentationRequest* request) {
default_request_ = request;
LocalDOMWindow* window = GetSupplementable()->DomWindow();
if (!window)
return;
PresentationController* controller = PresentationController::From(*window);
controller->GetPresentationService()->SetDefaultPresentationUrls(
request ? request->Urls() : WTF::Vector<KURL>());
}
void Presentation::MaybeInitReceiver() {
LocalDOMWindow* window = GetSupplementable()->DomWindow();
if (!receiver_ && window && IsOutermostDocument(window) &&
window->GetFrame()->GetSettings()->GetPresentationReceiver()) {
receiver_ = MakeGarbageCollected<PresentationReceiver>(window);
}
}
PresentationReceiver* Presentation::receiver() {
MaybeInitReceiver();
return receiver_.Get();
}
} // namespace blink
|