blob: c2da0aed1fc9639bbc6f0fda2d72cf04e5567680 [file] [log] [blame]
// Copyright 2017 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 "content/browser/installedapp/installed_app_provider_impl.h"
#include "build/build_config.h"
#include "content/browser/installedapp/installed_app_provider_impl_win.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"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
namespace content {
namespace {
#if defined(OS_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)
: content::WebContentsObserver(
WebContents::FromRenderFrameHost(render_frame_host)),
render_frame_host_(render_frame_host) {
DCHECK(render_frame_host_);
}
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) &&
render_frame_host_) {
#if defined(OS_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>());
}
}
void InstalledAppProviderImpl::RenderFrameDeleted(
RenderFrameHost* render_frame_host) {
if (render_frame_host_ == render_frame_host) {
render_frame_host_ = nullptr;
}
}
// static
void InstalledAppProviderImpl::Create(
RenderFrameHost* host,
mojo::PendingReceiver<blink::mojom::InstalledAppProvider> receiver) {
mojo::MakeSelfOwnedReceiver(std::make_unique<InstalledAppProviderImpl>(host),
std::move(receiver));
}
} // namespace content