// Copyright 2020 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_WEBSHARE_CHROMEOS_SHARESHEET_CLIENT_H_
#define CHROME_BROWSER_WEBSHARE_CHROMEOS_SHARESHEET_CLIENT_H_
#include <optional>
#include <string>
#include <vector>
#include "base/memory/weak_ptr.h"
#include "chrome/browser/sharesheet/sharesheet_types.h"
#include "chromeos/components/sharesheet/constants.h"
#include "content/public/browser/web_contents_observer.h"
#include "third_party/blink/public/mojom/webshare/webshare.mojom.h"
#include "url/gurl.h"
namespace content {
class WebContents;
}
namespace webshare {
class PrepareDirectoryTask;
class PrepareSubDirectoryTask;
// Chrome-OS implementation of navigator.share() sharing to
// sharesheet::SharesheetService.
class SharesheetClient : public content::WebContentsObserver {
public:
using DeliveredCallback = sharesheet::DeliveredCallback;
using SharesheetCallback = base::RepeatingCallback<void(
content::WebContents* web_contents,
const std::vector<base::FilePath>& file_paths,
const std::vector<std::string>& content_types,
const std::vector<uint64_t>& file_sizes,
const std::string& text,
const std::string& title,
DeliveredCallback delivered_callback)>;
explicit SharesheetClient(content::WebContents* web_contents);
SharesheetClient(const SharesheetClient&) = delete;
SharesheetClient& operator=(const SharesheetClient&) = delete;
~SharesheetClient() override;
void Share(const std::string& title,
const std::string& text,
const GURL& share_url,
std::vector<blink::mojom::SharedFilePtr> files,
blink::mojom::ShareService::ShareCallback callback);
static void SetSharesheetCallbackForTesting(SharesheetCallback callback);
private:
void OnPrepareDirectory(blink::mojom::ShareError);
void OnPrepareSubdirectory(blink::mojom::ShareError);
void OnStoreFiles(blink::mojom::ShareError);
void OnShowSharesheet(sharesheet::SharesheetResult result);
static void ShowSharesheet(content::WebContents* web_contents,
const std::vector<base::FilePath>& file_paths,
const std::vector<std::string>& content_types,
const std::vector<uint64_t>& file_sizes,
const std::string& text,
const std::string& title,
DeliveredCallback delivered_callback);
static SharesheetCallback& GetSharesheetCallback();
// WebContentsObserver:
void WebContentsDestroyed() override;
struct CurrentShare {
CurrentShare();
CurrentShare(CurrentShare&&);
CurrentShare& operator=(CurrentShare&&);
CurrentShare(const CurrentShare&) = delete;
CurrentShare& operator=(const CurrentShare&) = delete;
~CurrentShare();
std::vector<blink::mojom::SharedFilePtr> files;
base::FilePath directory;
std::vector<base::FilePath> file_paths;
std::vector<std::string> content_types;
std::vector<uint64_t> file_sizes;
std::string text;
std::string title;
blink::mojom::ShareService::ShareCallback callback;
std::unique_ptr<PrepareDirectoryTask> prepare_directory_task;
std::unique_ptr<PrepareSubDirectoryTask> prepare_subdirectory_task;
};
std::optional<CurrentShare> current_share_;
base::WeakPtrFactory<SharesheetClient> weak_ptr_factory_{this};
};
} // namespace webshare
#endif // CHROME_BROWSER_WEBSHARE_CHROMEOS_SHARESHEET_CLIENT_H_