| Index: third_party/WebKit/Source/modules/installedapp/InstalledAppController.cpp
|
| diff --git a/third_party/WebKit/Source/modules/installedapp/InstalledAppController.cpp b/third_party/WebKit/Source/modules/installedapp/InstalledAppController.cpp
|
| index 2d06c5f3fdbdb7d656ee19d6344cb50835d32393..66ac9ff72ff4fa788e2cbf77050c09d5d9e58cb8 100644
|
| --- a/third_party/WebKit/Source/modules/installedapp/InstalledAppController.cpp
|
| +++ b/third_party/WebKit/Source/modules/installedapp/InstalledAppController.cpp
|
| @@ -7,55 +7,106 @@
|
| #include "core/dom/Document.h"
|
| #include "core/frame/LocalFrame.h"
|
| #include "platform/RuntimeEnabledFeatures.h"
|
| -#include "public/platform/WebSecurityOrigin.h"
|
| +#include "platform/weborigin/SecurityOrigin.h"
|
| +#include "public/platform/InterfaceProvider.h"
|
| +#include "wtf/Functional.h"
|
|
|
| #include <utility>
|
|
|
| namespace blink {
|
|
|
| +// Callbacks for the result of
|
| +// WebRelatedAppsFetcher::getManifestRelatedApplications. Calls
|
| +// filterByInstalledApps upon receiving the list of related applications.
|
| +class InstalledAppController::GetRelatedAppsCallbacks
|
| + : public AppInstalledCallbacks {
|
| + public:
|
| + GetRelatedAppsCallbacks(InstalledAppController* controller,
|
| + WTF::RefPtr<SecurityOrigin> url,
|
| + std::unique_ptr<AppInstalledCallbacks> callbacks)
|
| + : m_controller(controller),
|
| + m_url(url),
|
| + m_callbacks(std::move(callbacks)) {}
|
| +
|
| + // AppInstalledCallbacks overrides:
|
| + void onSuccess(const WebVector<WebRelatedApplication>& relatedApps) override {
|
| + if (!m_controller)
|
| + return;
|
| +
|
| + m_controller->filterByInstalledApps(m_url, relatedApps,
|
| + std::move(m_callbacks));
|
| + }
|
| + void onError() override { m_callbacks->onError(); }
|
| +
|
| + private:
|
| + WeakPersistent<InstalledAppController> m_controller;
|
| + WTF::RefPtr<SecurityOrigin> m_url;
|
| + std::unique_ptr<AppInstalledCallbacks> m_callbacks;
|
| +};
|
| +
|
| InstalledAppController::~InstalledAppController() {}
|
|
|
| -void InstalledAppController::provideTo(LocalFrame& frame,
|
| - WebInstalledAppClient* client) {
|
| - ASSERT(RuntimeEnabledFeatures::installedAppEnabled());
|
| +void InstalledAppController::getInstalledRelatedApps(
|
| + WTF::RefPtr<SecurityOrigin> url,
|
| + std::unique_ptr<AppInstalledCallbacks> callbacks) {
|
| + // When detached, the fetcher is no longer valid.
|
| + if (!m_relatedAppsFetcher) {
|
| + // TODO(mgiuca): AbortError rather than simply undefined.
|
| + // https://crbug.com/687846
|
| + callbacks->onError();
|
| + return;
|
| + }
|
| +
|
| + // Get the list of related applications from the manifest. This requires a
|
| + // request to the content layer (because the manifest is not a Blink concept).
|
| + // Upon returning, filter the result list to those apps that are installed.
|
| + // TODO(mgiuca): This roundtrip to content could be eliminated if the Manifest
|
| + // class was moved from content into Blink.
|
| + m_relatedAppsFetcher->getManifestRelatedApplications(
|
| + WTF::makeUnique<GetRelatedAppsCallbacks>(this, url,
|
| + std::move(callbacks)));
|
| +}
|
| +
|
| +void InstalledAppController::provideTo(
|
| + LocalFrame& frame,
|
| + WebRelatedAppsFetcher* relatedAppsFetcher) {
|
| + DCHECK(RuntimeEnabledFeatures::installedAppEnabled());
|
|
|
| InstalledAppController* controller =
|
| - new InstalledAppController(frame, client);
|
| + new InstalledAppController(frame, relatedAppsFetcher);
|
| Supplement<LocalFrame>::provideTo(frame, supplementName(), controller);
|
| }
|
|
|
| InstalledAppController* InstalledAppController::from(LocalFrame& frame) {
|
| InstalledAppController* controller = static_cast<InstalledAppController*>(
|
| Supplement<LocalFrame>::from(frame, supplementName()));
|
| - ASSERT(controller);
|
| + DCHECK(controller);
|
| return controller;
|
| }
|
|
|
| -InstalledAppController::InstalledAppController(LocalFrame& frame,
|
| - WebInstalledAppClient* client)
|
| - : Supplement<LocalFrame>(frame),
|
| - ContextLifecycleObserver(frame.document()),
|
| - m_client(client) {}
|
| -
|
| const char* InstalledAppController::supplementName() {
|
| return "InstalledAppController";
|
| }
|
|
|
| -void InstalledAppController::getInstalledApps(
|
| - const WebSecurityOrigin& url,
|
| - std::unique_ptr<AppInstalledCallbacks> callback) {
|
| - // When detached, the client is no longer valid.
|
| - if (!m_client) {
|
| - callback.release()->onError();
|
| - return;
|
| - }
|
| +InstalledAppController::InstalledAppController(
|
| + LocalFrame& frame,
|
| + WebRelatedAppsFetcher* relatedAppsFetcher)
|
| + : Supplement<LocalFrame>(frame),
|
| + ContextLifecycleObserver(frame.document()),
|
| + m_relatedAppsFetcher(relatedAppsFetcher) {}
|
|
|
| - // Client is expected to take ownership of the callback
|
| - m_client->getInstalledRelatedApps(url, std::move(callback));
|
| +void InstalledAppController::contextDestroyed(ExecutionContext*) {
|
| + m_relatedAppsFetcher = nullptr;
|
| }
|
|
|
| -void InstalledAppController::contextDestroyed(ExecutionContext*) {
|
| - m_client = nullptr;
|
| +void InstalledAppController::filterByInstalledApps(
|
| + WTF::RefPtr<SecurityOrigin> /*origin*/,
|
| + const WebVector<WebRelatedApplication>& /*relatedApps*/,
|
| + std::unique_ptr<AppInstalledCallbacks> callbacks) {
|
| + // TODO(mgiuca): Call through to the browser to filter the list of
|
| + // applications down to just those that are installed on the device.
|
| + // For now, just return the empty list (no applications are installed).
|
| + callbacks->onSuccess(WebVector<WebRelatedApplication>());
|
| }
|
|
|
| DEFINE_TRACE(InstalledAppController) {
|
|
|