|  | // Copyright 2017 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "content/browser/installedapp/installed_app_provider_impl.h" | 
|  |  | 
|  | #include "build/build_config.h" | 
|  | #include "content/public/browser/browser_context.h" | 
|  | #include "content/public/browser/render_frame_host.h" | 
|  | #include "content/public/browser/render_process_host.h" | 
|  | #include "content/public/browser/web_contents.h" | 
|  | #include "content/public/common/content_features.h" | 
|  |  | 
|  | #if BUILDFLAG(IS_WIN) | 
|  | #include "content/browser/installedapp/installed_app_provider_impl_win.h" | 
|  | #endif | 
|  |  | 
|  | namespace content { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | #if BUILDFLAG(IS_WIN) | 
|  | void DidGetInstalledApps( | 
|  | bool is_off_the_record, | 
|  | InstalledAppProviderImpl::FilterInstalledAppsCallback callback, | 
|  | std::vector<blink::mojom::RelatedApplicationPtr> apps) { | 
|  | if (is_off_the_record) { | 
|  | // Don't expose the installed apps if this is off the record. | 
|  | std::move(callback).Run({}); | 
|  | return; | 
|  | } | 
|  |  | 
|  | std::move(callback).Run(std::move(apps)); | 
|  | } | 
|  | #endif | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | InstalledAppProviderImpl::InstalledAppProviderImpl( | 
|  | RenderFrameHost& render_frame_host, | 
|  | mojo::PendingReceiver<blink::mojom::InstalledAppProvider> pending_receiver) | 
|  | : DocumentService(render_frame_host, std::move(pending_receiver)) {} | 
|  |  | 
|  | InstalledAppProviderImpl::~InstalledAppProviderImpl() = default; | 
|  |  | 
|  | void InstalledAppProviderImpl::FilterInstalledApps( | 
|  | std::vector<blink::mojom::RelatedApplicationPtr> related_apps, | 
|  | const GURL& manifest_url, | 
|  | FilterInstalledAppsCallback callback) { | 
|  | bool is_implemented = false; | 
|  | if (base::FeatureList::IsEnabled(features::kInstalledAppProvider)) { | 
|  | #if BUILDFLAG(IS_WIN) | 
|  | is_implemented = true; | 
|  | bool is_off_the_record = | 
|  | render_frame_host().GetProcess()->GetBrowserContext()->IsOffTheRecord(); | 
|  | installed_app_provider_win::FilterInstalledAppsForWin( | 
|  | std::move(related_apps), | 
|  | base::BindOnce(&DidGetInstalledApps, is_off_the_record, | 
|  | std::move(callback)), | 
|  | render_frame_host().GetLastCommittedURL()); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | if (!is_implemented) { | 
|  | // Do not return any results. | 
|  | std::move(callback).Run(std::vector<blink::mojom::RelatedApplicationPtr>()); | 
|  | } | 
|  | } | 
|  |  | 
|  | // static | 
|  | void InstalledAppProviderImpl::Create( | 
|  | RenderFrameHost& host, | 
|  | mojo::PendingReceiver<blink::mojom::InstalledAppProvider> receiver) { | 
|  | if (host.GetParentOrOuterDocument()) { | 
|  | // The renderer is supposed to disallow this and we shouldn't end up here. | 
|  | mojo::ReportBadMessage( | 
|  | "InstalledAppProvider only allowed for outermost main frame."); | 
|  | return; | 
|  | } | 
|  |  | 
|  | // The object is bound to the lifetime of |host|'s current document and the | 
|  | // mojo connection. See DocumentService for details. | 
|  | new InstalledAppProviderImpl(host, std::move(receiver)); | 
|  | } | 
|  |  | 
|  | }  // namespace content |