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..7e2420d5a960e348c0e9969641f5e632f7162b28 100644 |
--- a/third_party/WebKit/Source/modules/installedapp/InstalledAppController.cpp |
+++ b/third_party/WebKit/Source/modules/installedapp/InstalledAppController.cpp |
@@ -7,55 +7,117 @@ |
#include "core/dom/Document.h" |
#include "core/frame/LocalFrame.h" |
#include "platform/RuntimeEnabledFeatures.h" |
+#include "public/platform/InterfaceProvider.h" |
#include "public/platform/WebSecurityOrigin.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. |
+// TODO(mgiuca): Inline this. DO NOT SUBMIT. |
esprehn
2017/02/15 01:56:50
???
Matt Giuca
2017/02/15 07:55:35
I wrote this as a comment to myself to do before l
|
+class InstalledAppController::GetRelatedAppsCallbacks |
+ : public AppInstalledCallbacks { |
+ public: |
+ GetRelatedAppsCallbacks(InstalledAppController*, |
+ const WebSecurityOrigin& url, |
+ std::unique_ptr<AppInstalledCallbacks>); |
+ |
+ // AppInstalledCallbacks overrides: |
+ void onSuccess(const WebVector<WebRelatedApplication>& relatedApps) override; |
+ void onError() override; |
+ |
+ private: |
+ WeakPersistent<InstalledAppController> m_controller; |
+ const WebSecurityOrigin m_url; |
+ std::unique_ptr<AppInstalledCallbacks> m_callbacks; |
+}; |
+ |
+InstalledAppController::GetRelatedAppsCallbacks::GetRelatedAppsCallbacks( |
+ InstalledAppController* controller, |
+ const WebSecurityOrigin& url, |
+ std::unique_ptr<AppInstalledCallbacks> callbacks) |
+ : m_controller(controller), m_url(url), m_callbacks(std::move(callbacks)) {} |
+ |
+void InstalledAppController::GetRelatedAppsCallbacks::onSuccess( |
+ const WebVector<WebRelatedApplication>& relatedApps) { |
+ if (!m_controller) |
+ return; |
+ |
+ m_controller->filterByInstalledApps(m_url, relatedApps, |
+ std::move(m_callbacks)); |
+} |
+ |
+void InstalledAppController::GetRelatedAppsCallbacks::onError() { |
+ m_callbacks->onError(); |
+} |
+ |
InstalledAppController::~InstalledAppController() {} |
-void InstalledAppController::provideTo(LocalFrame& frame, |
- WebInstalledAppClient* client) { |
- ASSERT(RuntimeEnabledFeatures::installedAppEnabled()); |
+void InstalledAppController::getInstalledRelatedApps( |
+ const WebSecurityOrigin& 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 |
esprehn
2017/02/15 01:56:50
Do we have a test for this behavior?
Matt Giuca
2017/02/15 07:55:34
Hmmmmmm..
This is a "not supposed to happen" case
|
+ 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( |
+ const blink::WebSecurityOrigin& /*origin*/, |
+ const blink::WebVector<blink::WebRelatedApplication>& /*relatedApps*/, |
+ std::unique_ptr<blink::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(blink::WebVector<blink::WebRelatedApplication>()); |
} |
DEFINE_TRACE(InstalledAppController) { |