blob: 90a7c60fee2a04f993db12736c11bf26a181e3b5 [file] [log] [blame]
// Copyright 2016 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 "modules/installedapp/NavigatorInstalledApp.h"
#include "bindings/core/v8/CallbackPromiseAdapter.h"
#include "bindings/core/v8/ScriptPromise.h"
#include "bindings/core/v8/ScriptPromiseResolver.h"
#include "bindings/core/v8/ScriptState.h"
#include "core/dom/DOMException.h"
#include "core/dom/Document.h"
#include "core/dom/ExceptionCode.h"
#include "core/frame/LocalDOMWindow.h"
#include "core/frame/LocalFrame.h"
#include "core/frame/Navigator.h"
#include "modules/installedapp/InstalledAppController.h"
#include "modules/installedapp/RelatedApplication.h"
#include "public/platform/modules/installedapp/WebInstalledAppClient.h"
#include "public/platform/modules/installedapp/WebRelatedApplication.h"
namespace blink {
NavigatorInstalledApp::NavigatorInstalledApp(LocalFrame* frame)
: DOMWindowProperty(frame)
{
}
NavigatorInstalledApp* NavigatorInstalledApp::from(Document& document)
{
if (!document.frame() || !document.frame()->domWindow())
return nullptr;
Navigator& navigator = *document.frame()->domWindow()->navigator();
return &from(navigator);
}
NavigatorInstalledApp& NavigatorInstalledApp::from(Navigator& navigator)
{
NavigatorInstalledApp* supplement = static_cast<NavigatorInstalledApp*>(Supplement<Navigator>::from(navigator, supplementName()));
if (!supplement) {
supplement = new NavigatorInstalledApp(navigator.frame());
provideTo(navigator, supplementName(), supplement);
}
return *supplement;
}
ScriptPromise NavigatorInstalledApp::getInstalledRelatedApps(ScriptState* scriptState, Navigator& navigator)
{
return NavigatorInstalledApp::from(navigator).getInstalledRelatedApps(scriptState);
}
class RelatedAppArray {
STATIC_ONLY(RelatedAppArray);
public:
using WebType = const WebVector<WebRelatedApplication>&;
static HeapVector<Member<RelatedApplication>> take(ScriptPromiseResolver*, const WebVector<WebRelatedApplication>& webInfo)
{
HeapVector<Member<RelatedApplication>> applications;
for (const auto& webApplication : webInfo)
applications.append(RelatedApplication::create(webApplication.platform, webApplication.url, webApplication.id));
return applications;
}
};
ScriptPromise NavigatorInstalledApp::getInstalledRelatedApps(ScriptState* scriptState)
{
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
// Don't crash when called and unattached to document.
Document* document = m_frame ? m_frame->document() : 0;
if (!document || !controller()) {
DOMException* exception = DOMException::create(InvalidStateError, "The object is no longer associated to a document.");
resolver->reject(exception);
return promise;
}
controller()->getInstalledApps(
WebSecurityOrigin(scriptState->getExecutionContext()->getSecurityOrigin()),
adoptWebPtr(new CallbackPromiseAdapter<RelatedAppArray, void>(resolver)));
return promise;
}
InstalledAppController* NavigatorInstalledApp::controller()
{
if (!frame())
return nullptr;
return InstalledAppController::from(*frame());
}
const char* NavigatorInstalledApp::supplementName()
{
return "NavigatorInstalledApp";
}
DEFINE_TRACE(NavigatorInstalledApp)
{
Supplement<Navigator>::trace(visitor);
DOMWindowProperty::trace(visitor);
}
} // namespace blink