Commit 80620b3a authored by Eric Willigers's avatar Eric Willigers Committed by Commit Bot

WebShare: Browser test for stub implementation

Builds on https://chromium-review.googlesource.com/c/chromium/src/+/2378144

Adds README.md and OWNERS files

Adds a browser test for ShareServiceImpl, verifying that share()
requests fail gracefully.

ShareServiceImpl now implements content::WebContentsObserver, and
overrides RenderFrameDeleted() to clear the render_frame_host_ member.

ShareServiceImpl now builds for Chrome OS in addition to Windows.



Bug: 1035527
Change-Id: Ic1ba0560468a69fb6ab0d3c141937e5439f656e4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2383228
Commit-Queue: Eric Willigers <ericwilligers@chromium.org>
Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Auto-Submit: Eric Willigers <ericwilligers@chromium.org>
Cr-Commit-Position: refs/heads/master@{#803397}
parent 651615d8
...@@ -4222,8 +4222,6 @@ static_library("browser") { ...@@ -4222,8 +4222,6 @@ static_library("browser") {
"themes/theme_helper_win.cc", "themes/theme_helper_win.cc",
"themes/theme_helper_win.h", "themes/theme_helper_win.h",
"upgrade_detector/get_installed_version_win.cc", "upgrade_detector/get_installed_version_win.cc",
"webshare/share_service_impl.cc",
"webshare/share_service_impl.h",
"win/app_icon.cc", "win/app_icon.cc",
"win/app_icon.h", "win/app_icon.h",
"win/automation_controller.cc", "win/automation_controller.cc",
...@@ -4591,6 +4589,13 @@ static_library("browser") { ...@@ -4591,6 +4589,13 @@ static_library("browser") {
] ]
} }
if (is_win || is_chromeos) {
sources += [
"webshare/share_service_impl.cc",
"webshare/share_service_impl.h",
]
}
if (is_win || is_mac || is_desktop_linux) { if (is_win || is_mac || is_desktop_linux) {
sources += [ sources += [
"browser_switcher/alternative_browser_driver.h", "browser_switcher/alternative_browser_driver.h",
......
...@@ -184,8 +184,8 @@ ...@@ -184,8 +184,8 @@
#include "media/capture/video/chromeos/mojom/camera_app.mojom.h" #include "media/capture/video/chromeos/mojom/camera_app.mojom.h"
#endif #endif
#if defined(OS_WIN) || defined(OS_ANDROID) #if defined(OS_WIN) || defined(OS_CHROMEOS) || defined(OS_ANDROID)
#if defined(OS_WIN) #if defined(OS_WIN) || defined(OS_CHROMEOS)
#include "chrome/browser/webshare/share_service_impl.h" #include "chrome/browser/webshare/share_service_impl.h"
#endif #endif
#include "third_party/blink/public/mojom/webshare/webshare.mojom.h" #include "third_party/blink/public/mojom/webshare/webshare.mojom.h"
...@@ -481,7 +481,7 @@ void PopulateChromeFrameBinders( ...@@ -481,7 +481,7 @@ void PopulateChromeFrameBinders(
base::BindRepeating(&payments::CreatePaymentCredential)); base::BindRepeating(&payments::CreatePaymentCredential));
#endif #endif
#if defined(OS_WIN) #if defined(OS_WIN) || defined(OS_CHROMEOS)
if (base::FeatureList::IsEnabled(features::kWebShare)) { if (base::FeatureList::IsEnabled(features::kWebShare)) {
map->Add<blink::mojom::ShareService>( map->Add<blink::mojom::ShareService>(
base::BindRepeating(&ShareServiceImpl::Create)); base::BindRepeating(&ShareServiceImpl::Create));
......
ericwilligers@chromium.org
mgiuca@chromium.org
This directory implements the browser side of the [Web Share
API](https://www.w3.org/TR/web-share/) for desktop platforms
(initially Windows and Chrome OS).
Note that for Android, the browser side is implemented in
components/browser_ui/webshare/
// Copyright 2020 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 "base/test/scoped_feature_list.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_features.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
class ShareServiceBrowserTest : public InProcessBrowserTest {
public:
ShareServiceBrowserTest() {
feature_list_.InitAndEnableFeature(features::kWebShare);
}
private:
base::test::ScopedFeatureList feature_list_;
};
IN_PROC_BROWSER_TEST_F(ShareServiceBrowserTest, Cancellation) {
ASSERT_TRUE(embedded_test_server()->Start());
ui_test_utils::NavigateToURL(
browser(), embedded_test_server()->GetURL("/webshare/index.html"));
content::WebContents* const contents =
browser()->tab_strip_model()->GetActiveWebContents();
const std::string script = "share_text('hello')";
EXPECT_EQ("share failed: AbortError: Share canceled",
content::EvalJs(contents, script));
}
...@@ -4,17 +4,23 @@ ...@@ -4,17 +4,23 @@
#include "chrome/browser/webshare/share_service_impl.h" #include "chrome/browser/webshare/share_service_impl.h"
#include "content/public/browser/web_contents.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h"
ShareServiceImpl::ShareServiceImpl() = default; ShareServiceImpl::ShareServiceImpl(content::RenderFrameHost& render_frame_host)
: content::WebContentsObserver(
content::WebContents::FromRenderFrameHost(&render_frame_host)),
render_frame_host_(&render_frame_host) {}
ShareServiceImpl::~ShareServiceImpl() = default; ShareServiceImpl::~ShareServiceImpl() = default;
// static // static
void ShareServiceImpl::Create( void ShareServiceImpl::Create(
content::RenderFrameHost* render_frame_host, content::RenderFrameHost* render_frame_host,
mojo::PendingReceiver<blink::mojom::ShareService> receiver) { mojo::PendingReceiver<blink::mojom::ShareService> receiver) {
mojo::MakeSelfOwnedReceiver(std::make_unique<ShareServiceImpl>(), mojo::MakeSelfOwnedReceiver(
std::move(receiver)); std::make_unique<ShareServiceImpl>(*render_frame_host),
std::move(receiver));
} }
void ShareServiceImpl::Share(const std::string& title, void ShareServiceImpl::Share(const std::string& title,
...@@ -22,7 +28,14 @@ void ShareServiceImpl::Share(const std::string& title, ...@@ -22,7 +28,14 @@ void ShareServiceImpl::Share(const std::string& title,
const GURL& share_url, const GURL& share_url,
std::vector<blink::mojom::SharedFilePtr> files, std::vector<blink::mojom::SharedFilePtr> files,
ShareCallback callback) { ShareCallback callback) {
// TODO(crbug.com/1035527): Add implementation for WIN_OS // TODO(crbug.com/1035527): Add implementation for OS_WIN
// TODO(crbug.com/1110119): Add implementation for OS_CHROMEOS
NOTIMPLEMENTED(); NOTIMPLEMENTED();
std::move(callback).Run(blink::mojom::ShareError::CANCELED); std::move(callback).Run(blink::mojom::ShareError::CANCELED);
} }
void ShareServiceImpl::RenderFrameDeleted(
content::RenderFrameHost* render_frame_host) {
if (render_frame_host == render_frame_host_)
render_frame_host_ = nullptr;
}
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "content/public/browser/web_contents_observer.h"
#include "third_party/blink/public/mojom/webshare/webshare.mojom.h" #include "third_party/blink/public/mojom/webshare/webshare.mojom.h"
class GURL; class GURL;
...@@ -16,9 +17,10 @@ namespace content { ...@@ -16,9 +17,10 @@ namespace content {
class RenderFrameHost; class RenderFrameHost;
} }
class ShareServiceImpl : public blink::mojom::ShareService { class ShareServiceImpl : public blink::mojom::ShareService,
public content::WebContentsObserver {
public: public:
ShareServiceImpl(); explicit ShareServiceImpl(content::RenderFrameHost& render_frame_host);
ShareServiceImpl(const ShareServiceImpl&) = delete; ShareServiceImpl(const ShareServiceImpl&) = delete;
ShareServiceImpl& operator=(const ShareServiceImpl&) = delete; ShareServiceImpl& operator=(const ShareServiceImpl&) = delete;
~ShareServiceImpl() override; ~ShareServiceImpl() override;
...@@ -33,6 +35,12 @@ class ShareServiceImpl : public blink::mojom::ShareService { ...@@ -33,6 +35,12 @@ class ShareServiceImpl : public blink::mojom::ShareService {
const GURL& share_url, const GURL& share_url,
std::vector<blink::mojom::SharedFilePtr> files, std::vector<blink::mojom::SharedFilePtr> files,
ShareCallback callback) override; ShareCallback callback) override;
// content::WebContentsObserver:
void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
private:
content::RenderFrameHost* render_frame_host_;
}; };
#endif // CHROME_BROWSER_WEBSHARE_SHARE_SERVICE_IMPL_H_ #endif // CHROME_BROWSER_WEBSHARE_SHARE_SERVICE_IMPL_H_
...@@ -1666,6 +1666,10 @@ if (!is_android) { ...@@ -1666,6 +1666,10 @@ if (!is_android) {
] ]
} }
if (is_win || is_chromeos) {
sources += [ "../browser/webshare/share_service_browsertest.cc" ]
}
if (enable_dice_support) { if (enable_dice_support) {
sources += [ sources += [
"../browser/policy/cloud/user_policy_signin_service_browsertest.cc", "../browser/policy/cloud/user_policy_signin_service_browsertest.cc",
......
<!DOCTYPE html>
<html>
<head>
<script>
'use strict';
async function share_text(text) {
try {
await navigator.share({text: text});
return 'share succeeded';
} catch(error) {
return ('share failed: ' + error);
}
}
</script>
</head>
<body>
</body>
</html>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment