| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "modules/installedapp/InstalledAppController.h" | 5 #include "modules/installedapp/InstalledAppController.h" |
| 6 | 6 |
| 7 #include "core/dom/Document.h" | 7 #include "core/dom/Document.h" |
| 8 #include "core/frame/LocalFrame.h" | 8 #include "core/frame/LocalFrame.h" |
| 9 #include "platform/RuntimeEnabledFeatures.h" | 9 #include "platform/RuntimeEnabledFeatures.h" |
| 10 #include "platform/weborigin/SecurityOrigin.h" | |
| 11 #include "public/platform/InterfaceProvider.h" | 10 #include "public/platform/InterfaceProvider.h" |
| 12 #include "wtf/Functional.h" | 11 #include "wtf/Functional.h" |
| 13 | 12 |
| 14 #include <utility> | 13 #include <utility> |
| 15 | 14 |
| 16 namespace blink { | 15 namespace blink { |
| 17 | 16 |
| 18 // Callbacks for the result of | 17 // Callbacks for the result of |
| 19 // WebRelatedAppsFetcher::getManifestRelatedApplications. Calls | 18 // WebRelatedAppsFetcher::getManifestRelatedApplications. Calls |
| 20 // filterByInstalledApps upon receiving the list of related applications. | 19 // filterByInstalledApps upon receiving the list of related applications. |
| 21 class InstalledAppController::GetRelatedAppsCallbacks | 20 class InstalledAppController::GetRelatedAppsCallbacks |
| 22 : public AppInstalledCallbacks { | 21 : public AppInstalledCallbacks { |
| 23 public: | 22 public: |
| 24 GetRelatedAppsCallbacks(InstalledAppController* controller, | 23 GetRelatedAppsCallbacks(InstalledAppController* controller, |
| 25 WTF::RefPtr<SecurityOrigin> url, | |
| 26 std::unique_ptr<AppInstalledCallbacks> callbacks) | 24 std::unique_ptr<AppInstalledCallbacks> callbacks) |
| 27 : m_controller(controller), | 25 : m_controller(controller), |
| 28 m_url(url), | |
| 29 m_callbacks(std::move(callbacks)) {} | 26 m_callbacks(std::move(callbacks)) {} |
| 30 | 27 |
| 31 // AppInstalledCallbacks overrides: | 28 // AppInstalledCallbacks overrides: |
| 32 void onSuccess(const WebVector<WebRelatedApplication>& relatedApps) override { | 29 void onSuccess(const WebVector<WebRelatedApplication>& relatedApps) override { |
| 33 if (!m_controller) | 30 if (!m_controller) |
| 34 return; | 31 return; |
| 35 | 32 |
| 36 m_controller->filterByInstalledApps(m_url, relatedApps, | 33 m_controller->filterByInstalledApps(relatedApps, std::move(m_callbacks)); |
| 37 std::move(m_callbacks)); | |
| 38 } | 34 } |
| 39 void onError() override { m_callbacks->onError(); } | 35 void onError() override { m_callbacks->onError(); } |
| 40 | 36 |
| 41 private: | 37 private: |
| 42 WeakPersistent<InstalledAppController> m_controller; | 38 WeakPersistent<InstalledAppController> m_controller; |
| 43 WTF::RefPtr<SecurityOrigin> m_url; | |
| 44 std::unique_ptr<AppInstalledCallbacks> m_callbacks; | 39 std::unique_ptr<AppInstalledCallbacks> m_callbacks; |
| 45 }; | 40 }; |
| 46 | 41 |
| 47 InstalledAppController::~InstalledAppController() {} | 42 InstalledAppController::~InstalledAppController() {} |
| 48 | 43 |
| 49 void InstalledAppController::getInstalledRelatedApps( | 44 void InstalledAppController::getInstalledRelatedApps( |
| 50 WTF::RefPtr<SecurityOrigin> url, | |
| 51 std::unique_ptr<AppInstalledCallbacks> callbacks) { | 45 std::unique_ptr<AppInstalledCallbacks> callbacks) { |
| 52 // When detached, the fetcher is no longer valid. | 46 // When detached, the fetcher is no longer valid. |
| 53 if (!m_relatedAppsFetcher) { | 47 if (!m_relatedAppsFetcher) { |
| 54 // TODO(mgiuca): AbortError rather than simply undefined. | 48 // TODO(mgiuca): AbortError rather than simply undefined. |
| 55 // https://crbug.com/687846 | 49 // https://crbug.com/687846 |
| 56 callbacks->onError(); | 50 callbacks->onError(); |
| 57 return; | 51 return; |
| 58 } | 52 } |
| 59 | 53 |
| 60 // Get the list of related applications from the manifest. This requires a | 54 // Get the list of related applications from the manifest. This requires a |
| 61 // request to the content layer (because the manifest is not a Blink concept). | 55 // request to the content layer (because the manifest is not a Blink concept). |
| 62 // Upon returning, filter the result list to those apps that are installed. | 56 // Upon returning, filter the result list to those apps that are installed. |
| 63 // TODO(mgiuca): This roundtrip to content could be eliminated if the Manifest | 57 // TODO(mgiuca): This roundtrip to content could be eliminated if the Manifest |
| 64 // class was moved from content into Blink. | 58 // class was moved from content into Blink. |
| 65 m_relatedAppsFetcher->getManifestRelatedApplications( | 59 m_relatedAppsFetcher->getManifestRelatedApplications( |
| 66 WTF::makeUnique<GetRelatedAppsCallbacks>(this, url, | 60 WTF::makeUnique<GetRelatedAppsCallbacks>(this, std::move(callbacks))); |
| 67 std::move(callbacks))); | |
| 68 } | 61 } |
| 69 | 62 |
| 70 void InstalledAppController::provideTo( | 63 void InstalledAppController::provideTo( |
| 71 LocalFrame& frame, | 64 LocalFrame& frame, |
| 72 WebRelatedAppsFetcher* relatedAppsFetcher) { | 65 WebRelatedAppsFetcher* relatedAppsFetcher) { |
| 73 DCHECK(RuntimeEnabledFeatures::installedAppEnabled()); | 66 DCHECK(RuntimeEnabledFeatures::installedAppEnabled()); |
| 74 | 67 |
| 75 InstalledAppController* controller = | 68 InstalledAppController* controller = |
| 76 new InstalledAppController(frame, relatedAppsFetcher); | 69 new InstalledAppController(frame, relatedAppsFetcher); |
| 77 Supplement<LocalFrame>::provideTo(frame, supplementName(), controller); | 70 Supplement<LocalFrame>::provideTo(frame, supplementName(), controller); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 89 } | 82 } |
| 90 | 83 |
| 91 InstalledAppController::InstalledAppController( | 84 InstalledAppController::InstalledAppController( |
| 92 LocalFrame& frame, | 85 LocalFrame& frame, |
| 93 WebRelatedAppsFetcher* relatedAppsFetcher) | 86 WebRelatedAppsFetcher* relatedAppsFetcher) |
| 94 : Supplement<LocalFrame>(frame), | 87 : Supplement<LocalFrame>(frame), |
| 95 ContextLifecycleObserver(frame.document()), | 88 ContextLifecycleObserver(frame.document()), |
| 96 m_relatedAppsFetcher(relatedAppsFetcher) {} | 89 m_relatedAppsFetcher(relatedAppsFetcher) {} |
| 97 | 90 |
| 98 void InstalledAppController::contextDestroyed(ExecutionContext*) { | 91 void InstalledAppController::contextDestroyed(ExecutionContext*) { |
| 92 m_provider.reset(); |
| 99 m_relatedAppsFetcher = nullptr; | 93 m_relatedAppsFetcher = nullptr; |
| 100 } | 94 } |
| 101 | 95 |
| 102 void InstalledAppController::filterByInstalledApps( | 96 void InstalledAppController::filterByInstalledApps( |
| 103 WTF::RefPtr<SecurityOrigin> /*origin*/, | 97 const blink::WebVector<blink::WebRelatedApplication>& relatedApps, |
| 104 const WebVector<WebRelatedApplication>& /*relatedApps*/, | 98 std::unique_ptr<blink::AppInstalledCallbacks> callbacks) { |
| 105 std::unique_ptr<AppInstalledCallbacks> callbacks) { | 99 WTF::Vector<mojom::blink::RelatedApplicationPtr> mojoRelatedApps; |
| 106 // TODO(mgiuca): Call through to the browser to filter the list of | 100 for (const auto& relatedApplication : relatedApps) { |
| 107 // applications down to just those that are installed on the device. | 101 mojom::blink::RelatedApplicationPtr convertedApplication( |
| 108 // For now, just return the empty list (no applications are installed). | 102 mojom::blink::RelatedApplication::New()); |
| 109 callbacks->onSuccess(WebVector<WebRelatedApplication>()); | 103 DCHECK(!relatedApplication.platform.isEmpty()); |
| 104 convertedApplication->platform = relatedApplication.platform; |
| 105 convertedApplication->id = relatedApplication.id; |
| 106 convertedApplication->url = relatedApplication.url; |
| 107 mojoRelatedApps.push_back(std::move(convertedApplication)); |
| 108 } |
| 109 |
| 110 if (!m_provider) { |
| 111 supplementable()->interfaceProvider()->getInterface( |
| 112 mojo::MakeRequest(&m_provider)); |
| 113 // TODO(mgiuca): Set a connection error handler. This requires a refactor to |
| 114 // work like NavigatorShare.cpp (retain a persistent list of clients to |
| 115 // reject all of their promises). |
| 116 DCHECK(m_provider); |
| 117 } |
| 118 |
| 119 m_provider->FilterInstalledApps( |
| 120 std::move(mojoRelatedApps), |
| 121 convertToBaseCallback( |
| 122 WTF::bind(&InstalledAppController::OnFilterInstalledApps, |
| 123 wrapPersistent(this), WTF::passed(std::move(callbacks))))); |
| 124 } |
| 125 |
| 126 void InstalledAppController::OnFilterInstalledApps( |
| 127 std::unique_ptr<blink::AppInstalledCallbacks> callbacks, |
| 128 WTF::Vector<mojom::blink::RelatedApplicationPtr> result) { |
| 129 std::vector<blink::WebRelatedApplication> applications; |
| 130 for (const auto& res : result) { |
| 131 blink::WebRelatedApplication app; |
| 132 app.platform = res->platform; |
| 133 app.url = res->url; |
| 134 app.id = res->id; |
| 135 applications.push_back(app); |
| 136 } |
| 137 callbacks->onSuccess( |
| 138 blink::WebVector<blink::WebRelatedApplication>(applications)); |
| 110 } | 139 } |
| 111 | 140 |
| 112 DEFINE_TRACE(InstalledAppController) { | 141 DEFINE_TRACE(InstalledAppController) { |
| 113 Supplement<LocalFrame>::trace(visitor); | 142 Supplement<LocalFrame>::trace(visitor); |
| 114 ContextLifecycleObserver::trace(visitor); | 143 ContextLifecycleObserver::trace(visitor); |
| 115 } | 144 } |
| 116 | 145 |
| 117 } // namespace blink | 146 } // namespace blink |
| OLD | NEW |