diff --git a/chrome/browser/webshare/chromeos/sharesheet_client.cc b/chrome/browser/webshare/chromeos/sharesheet_client.cc index ae646b9a61a43..dc41bc483368b 100644 --- a/chrome/browser/webshare/chromeos/sharesheet_client.cc +++ b/chrome/browser/webshare/chromeos/sharesheet_client.cc @@ -91,12 +91,6 @@ void SharesheetClient::Share( return; } - if (files.empty()) { - // TODO(crbug.com/1127670): Support title/text/url sharing without files. - std::move(callback).Run(blink::mojom::ShareError::CANCELED); - return; - } - Profile* const profile = Profile::FromBrowserContext(web_contents()->GetBrowserContext()); DCHECK(profile); @@ -117,6 +111,16 @@ void SharesheetClient::Share( current_share_->title = title; current_share_->callback = std::move(callback); + if (current_share_->files.empty()) { + GetSharesheetCallback().Run( + web_contents(), current_share_->file_paths, + current_share_->content_types, current_share_->text, + current_share_->title, + base::BindOnce(&SharesheetClient::OnShowSharesheet, + weak_ptr_factory_.GetWeakPtr())); + return; + } + current_share_->prepare_directory_task = std::make_unique<PrepareDirectoryTask>( current_share_->directory, kMaxSharedFileBytes, @@ -167,9 +171,8 @@ void SharesheetClient::OnStoreFiles(blink::mojom::ShareError error) { } GetSharesheetCallback().Run( - web_contents(), std::move(current_share_->file_paths), - std::move(current_share_->content_types), current_share_->text, - current_share_->title, + web_contents(), current_share_->file_paths, current_share_->content_types, + current_share_->text, current_share_->title, base::BindOnce(&SharesheetClient::OnShowSharesheet, weak_ptr_factory_.GetWeakPtr())); } diff --git a/chrome/browser/webshare/chromeos/sharesheet_client_browsertest.cc b/chrome/browser/webshare/chromeos/sharesheet_client_browsertest.cc index 2a073637df432..a566235e624df 100644 --- a/chrome/browser/webshare/chromeos/sharesheet_client_browsertest.cc +++ b/chrome/browser/webshare/chromeos/sharesheet_client_browsertest.cc @@ -59,12 +59,14 @@ class SharesheetClientBrowserTest : public InProcessBrowserTest { return embedded_test_server()->GetURL("/webshare/index.html"); } - void ConfirmShareText(const std::string& script, - const char* expected_text, - const char* expected_title) { + void ConfirmShareText( + const std::string& script, + const char* expected_text, + const char* expected_title, + const std::vector<std::string>& expected_content_types) { SharesheetClient::SetSharesheetCallbackForTesting( base::BindLambdaForTesting( - [&expected_text, &expected_title]( + [&expected_text, &expected_title, &expected_content_types]( content::WebContents* in_contents, const std::vector<base::FilePath>& file_paths, const std::vector<std::string>& content_types, @@ -72,14 +74,15 @@ class SharesheetClientBrowserTest : public InProcessBrowserTest { SharesheetClient::CloseCallback close_callback) { EXPECT_EQ(text, expected_text); EXPECT_EQ(title, expected_title); + EXPECT_EQ(file_paths.size(), content_types.size()); + EXPECT_EQ(content_types, expected_content_types); std::move(close_callback) - .Run(sharesheet::SharesheetResult::kCancel); + .Run(sharesheet::SharesheetResult::kSuccess); })); content::WebContents* const contents = browser()->tab_strip_model()->GetActiveWebContents(); - EXPECT_EQ("share failed: AbortError: Share canceled", - content::EvalJs(contents, script)); + EXPECT_EQ("share succeeded", content::EvalJs(contents, script)); } private: @@ -179,24 +182,45 @@ IN_PROC_BROWSER_TEST_F(SharesheetClientBrowserTest, CancelledShare) { content::EvalJs(contents, script)); } +IN_PROC_BROWSER_TEST_F(SharesheetClientBrowserTest, Text) { + ASSERT_TRUE(embedded_test_server()->Start()); + ui_test_utils::NavigateToURL(browser(), GetAppUrl()); + ConfirmShareText("share_title()", + /*expected_text=*/"", + /*expected_title=*/"Subject", /*expected_content_types=*/{}); + ConfirmShareText("share_title_url()", + /*expected_text=*/"https://example.com/", + /*expected_title=*/"Subject", /*expected_content_types=*/{}); + ConfirmShareText("share_text()", + /*expected_text=*/"Message", + /*expected_title=*/"", /*expected_content_types=*/{}); + ConfirmShareText("share_text_url()", + /*expected_text=*/"Message https://example.com/", + /*expected_title=*/"", /*expected_content_types=*/{}); + ConfirmShareText("share_url()", + /*expected_text=*/"https://example.com/", + /*expected_title=*/"", /*expected_content_types=*/{}); +} + IN_PROC_BROWSER_TEST_F(SharesheetClientBrowserTest, TextWithFile) { ASSERT_TRUE(embedded_test_server()->Start()); ui_test_utils::NavigateToURL(browser(), GetAppUrl()); + const std::vector<std::string> expected_content_types{"image/webp"}; ConfirmShareText("share_file_title()", /*expected_text=*/"", - /*expected_title=*/"Subject"); + /*expected_title=*/"Subject", expected_content_types); ConfirmShareText("share_file_title_url()", /*expected_text=*/"https://example.com/", - /*expected_title=*/"Subject"); + /*expected_title=*/"Subject", expected_content_types); ConfirmShareText("share_file_text()", /*expected_text=*/"Message", - /*expected_title=*/""); + /*expected_title=*/"", expected_content_types); ConfirmShareText("share_file_text_url()", /*expected_text=*/"Message https://example.com/", - /*expected_title=*/""); + /*expected_title=*/"", expected_content_types); ConfirmShareText("share_file_url()", /*expected_text=*/"https://example.com/", - /*expected_title=*/""); + /*expected_title=*/"", expected_content_types); } } // namespace webshare diff --git a/chrome/browser/webshare/share_service_browsertest.cc b/chrome/browser/webshare/share_service_browsertest.cc index 5d41efa6be36f..0aeffc4bb2f93 100644 --- a/chrome/browser/webshare/share_service_browsertest.cc +++ b/chrome/browser/webshare/share_service_browsertest.cc @@ -13,6 +13,10 @@ #include "content/public/test/browser_test_utils.h" #include "net/test/embedded_test_server/embedded_test_server.h" +#if defined(OS_CHROMEOS) +#include "chrome/browser/sharesheet/sharesheet_types.h" +#include "chrome/browser/webshare/chromeos/sharesheet_client.h" +#endif #if defined(OS_WIN) #include "chrome/browser/webshare/win/scoped_share_operation_fake_components.h" #endif @@ -23,13 +27,28 @@ class ShareServiceBrowserTest : public InProcessBrowserTest { feature_list_.InitAndEnableFeature(features::kWebShare); } -#if defined(OS_WIN) void SetUpOnMainThread() override { InProcessBrowserTest::SetUpOnMainThread(); +#if defined(OS_CHROMEOS) + webshare::SharesheetClient::SetSharesheetCallbackForTesting( + base::BindRepeating(&ShareServiceBrowserTest::AcceptShareRequest)); +#endif +#if defined(OS_WIN) if (!IsSupportedEnvironment()) return; ASSERT_NO_FATAL_FAILURE(scoped_fake_components_.SetUp()); +#endif + } + +#if defined(OS_CHROMEOS) + static void AcceptShareRequest(content::WebContents* web_contents, + const std::vector<base::FilePath>& file_paths, + const std::vector<std::string>& content_types, + const std::string& text, + const std::string& title, + sharesheet::CloseCallback close_callback) { + std::move(close_callback).Run(sharesheet::SharesheetResult::kSuccess); } #endif @@ -63,10 +82,5 @@ IN_PROC_BROWSER_TEST_F(ShareServiceBrowserTest, Text) { const std::string script = "share_text('hello')"; const content::EvalJsResult result = content::EvalJs(contents, script); -#if defined(OS_CHROMEOS) - // ChromeOS currently only supports file sharing. - EXPECT_EQ("share failed: AbortError: Share canceled", result); -#else EXPECT_EQ("share succeeded", result); -#endif } diff --git a/chrome/test/data/webshare/index.html b/chrome/test/data/webshare/index.html index 33d82da9a0ba5..5be015a244d3b 100644 --- a/chrome/test/data/webshare/index.html +++ b/chrome/test/data/webshare/index.html @@ -41,6 +41,53 @@ } } + async function share_title() { + try { + await navigator.share({title: "Subject"}); + return 'share succeeded'; + } catch(error) { + return ('share failed: ' + error); + } + } + + async function share_title_url() { + try { + await navigator.share({title: "Subject", + url: "https://example.com/"}); + return 'share succeeded'; + } catch(error) { + return ('share failed: ' + error); + } + } + + async function share_text() { + try { + await navigator.share({text: "Message"}); + return 'share succeeded'; + } catch(error) { + return ('share failed: ' + error); + } + } + + async function share_text_url() { + try { + await navigator.share({text: "Message", + url: "https://example.com/"}); + return 'share succeeded'; + } catch(error) { + return ('share failed: ' + error); + } + } + + async function share_url() { + try { + await navigator.share({url: "https://example.com/"}); + return 'share succeeded'; + } catch(error) { + return ('share failed: ' + error); + } + } + async function share_file_title() { try { const single_file = create_file('sample.webp', 'image/webp', 12);