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") {
"themes/theme_helper_win.cc",
"themes/theme_helper_win.h",
"upgrade_detector/get_installed_version_win.cc",
"webshare/share_service_impl.cc",
"webshare/share_service_impl.h",
"win/app_icon.cc",
"win/app_icon.h",
"win/automation_controller.cc",
......@@ -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) {
sources += [
"browser_switcher/alternative_browser_driver.h",
......
......@@ -184,8 +184,8 @@
#include "media/capture/video/chromeos/mojom/camera_app.mojom.h"
#endif
#if defined(OS_WIN) || defined(OS_ANDROID)
#if defined(OS_WIN)
#if defined(OS_WIN) || defined(OS_CHROMEOS) || defined(OS_ANDROID)
#if defined(OS_WIN) || defined(OS_CHROMEOS)
#include "chrome/browser/webshare/share_service_impl.h"
#endif
#include "third_party/blink/public/mojom/webshare/webshare.mojom.h"
......@@ -481,7 +481,7 @@ void PopulateChromeFrameBinders(
base::BindRepeating(&payments::CreatePaymentCredential));
#endif
#if defined(OS_WIN)
#if defined(OS_WIN) || defined(OS_CHROMEOS)
if (base::FeatureList::IsEnabled(features::kWebShare)) {
map->Add<blink::mojom::ShareService>(
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 @@
#include "chrome/browser/webshare/share_service_impl.h"
#include "content/public/browser/web_contents.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;
// static
void ShareServiceImpl::Create(
content::RenderFrameHost* render_frame_host,
mojo::PendingReceiver<blink::mojom::ShareService> receiver) {
mojo::MakeSelfOwnedReceiver(std::make_unique<ShareServiceImpl>(),
std::move(receiver));
mojo::MakeSelfOwnedReceiver(
std::make_unique<ShareServiceImpl>(*render_frame_host),
std::move(receiver));
}
void ShareServiceImpl::Share(const std::string& title,
......@@ -22,7 +28,14 @@ void ShareServiceImpl::Share(const std::string& title,
const GURL& share_url,
std::vector<blink::mojom::SharedFilePtr> files,
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();
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 @@
#include <string>
#include <vector>
#include "content/public/browser/web_contents_observer.h"
#include "third_party/blink/public/mojom/webshare/webshare.mojom.h"
class GURL;
......@@ -16,9 +17,10 @@ namespace content {
class RenderFrameHost;
}
class ShareServiceImpl : public blink::mojom::ShareService {
class ShareServiceImpl : public blink::mojom::ShareService,
public content::WebContentsObserver {
public:
ShareServiceImpl();
explicit ShareServiceImpl(content::RenderFrameHost& render_frame_host);
ShareServiceImpl(const ShareServiceImpl&) = delete;
ShareServiceImpl& operator=(const ShareServiceImpl&) = delete;
~ShareServiceImpl() override;
......@@ -33,6 +35,12 @@ class ShareServiceImpl : public blink::mojom::ShareService {
const GURL& share_url,
std::vector<blink::mojom::SharedFilePtr> files,
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_
......@@ -1666,6 +1666,10 @@ if (!is_android) {
]
}
if (is_win || is_chromeos) {
sources += [ "../browser/webshare/share_service_browsertest.cc" ]
}
if (enable_dice_support) {
sources += [
"../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