1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_WEB_APPLICATIONS_WEB_INSTALL_SERVICE_IMPL_H_
#define CHROME_BROWSER_WEB_APPLICATIONS_WEB_INSTALL_SERVICE_IMPL_H_
#include <optional>
#include <vector>
#include "base/memory/weak_ptr.h"
#include "components/webapps/common/web_app_id.h"
#include "content/public/browser/document_service.h"
#include "third_party/blink/public/mojom/manifest/manifest.mojom-forward.h"
#include "third_party/blink/public/mojom/permissions/permission_status.mojom.h"
#include "third_party/blink/public/mojom/web_install/web_install.mojom.h"
#include "url/gurl.h"
namespace content {
class WebContents;
}
namespace webapps {
enum class InstallResultCode;
enum class InstallableStatusCode;
}
namespace web_app {
class AppLock;
class WebAppProvider;
// Service side implementation for the Blink Web Install API. Takes the
// parameters from the API call in the form of `InstallOptionsPtr`, and decides
// whether to install the current document or a background document.
// Background document installs will prompt for approval/denial of the Web app
// installation permission for the calling origin.
class WebInstallServiceImpl
: public content::DocumentService<blink::mojom::WebInstallService> {
public:
WebInstallServiceImpl(const WebInstallServiceImpl&) = delete;
WebInstallServiceImpl& operator=(const WebInstallServiceImpl&) = delete;
static void CreateIfAllowed(
content::RenderFrameHost* render_frame_host,
mojo::PendingReceiver<blink::mojom::WebInstallService> receiver);
// blink::mojom::WebInstallService implementation:
void Install(blink::mojom::InstallOptionsPtr options,
InstallCallback callback) override;
private:
WebInstallServiceImpl(
content::RenderFrameHost& render_frame_host,
mojo::PendingReceiver<blink::mojom::WebInstallService> receiver);
~WebInstallServiceImpl() override;
void TryInstallCurrentDocument(InstallCallback callback);
void CheckForInstalledAppMaybeLaunch(content::WebContents* web_contents,
InstallCallback callback,
AppLock& lock,
base::Value::Dict& debug_value);
void OnIntentPickerMaybeLaunched(InstallCallback callback,
webapps::AppId app_id,
bool user_chose_to_open);
void OnDidRetrieveManifestForCurrentDocumentInstall(
InstallCallback callback,
WebAppProvider* provider,
blink::mojom::ManifestPtr opt_manifest,
bool valid_manifest_for_web_app,
webapps::InstallableStatusCode error_code);
void RequestWebInstallPermission(
base::OnceCallback<
void(const std::vector<blink::mojom::PermissionStatus>&)> callback);
void OnPermissionDecided(
const GURL& install_target,
const std::optional<GURL>& manifest_id,
InstallCallback callback,
const std::vector<blink::mojom::PermissionStatus>& permission_status);
// Used by the launch dialog to report whether the user accepted the launch.
void OnBackgroundAppLaunchDialogClosed(InstallCallback callback,
const GURL& manifest_id,
bool accepted);
// Used by web app install dialog code as the WebAppInstalledCallback.
// Reports install success or failure back to Blink via `callback`.
void OnAppInstalled(InstallCallback callback,
const webapps::AppId& app_id,
webapps::InstallResultCode code);
blink::mojom::InstallOptionsPtr install_options_;
const content::GlobalRenderFrameHostId frame_routing_id_;
base::WeakPtrFactory<web_app::WebInstallServiceImpl> weak_ptr_factory_{this};
};
} // namespace web_app
#endif // CHROME_BROWSER_WEB_APPLICATIONS_WEB_INSTALL_SERVICE_IMPL_H_
|