Commit 16fb68f1 authored by Kamila Hasanbega's avatar Kamila Hasanbega Committed by Commit Bot

Revert "[Fuchsia] Implement Frame/SetPermissionState()"

This reverts commit 5a7d3fed.

Reason for revert: [Sheriff] Reverting for now, as I suspect the cl is causing failures in https://ci.chromium.org/p/chromium/builders/ci/Fuchsia%20x64/b8886078290056207296

Original change's description:
> [Fuchsia] Implement Frame/SetPermissionState()
> 
> Now WebEngine implements SetPermissionState() which allows to grant
> permissions for web features.
> 
> Bug: 922833
> Change-Id: I356e54646ad870bb7882a5b9a95bc87deccba453
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2058086
> Commit-Queue: Mounir Lamouri <mlamouri@chromium.org>
> Reviewed-by: Mounir Lamouri <mlamouri@chromium.org>
> Reviewed-by: David Dorwin <ddorwin@chromium.org>
> Auto-Submit: Sergey Ulanov <sergeyu@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#749428}

TBR=ddorwin@chromium.org,wez@chromium.org,mlamouri@chromium.org,sergeyu@chromium.org

Change-Id: Ib7f824e173044474d281705b865ba8072becd8e0
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 922833
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2098787Reviewed-by: default avatarKamila Hasanbega <hkamila@google.com>
Commit-Queue: Kamila Hasanbega <hkamila@google.com>
Cr-Commit-Position: refs/heads/master@{#749608}
parent fee13e40
......@@ -134,8 +134,6 @@ component("web_engine_core") {
"browser/frame_impl.h",
"browser/frame_layout_manager.cc",
"browser/frame_layout_manager.h",
"browser/frame_permission_controller.cc",
"browser/frame_permission_controller.h",
"browser/media_resource_provider_service.cc",
"browser/media_resource_provider_service.h",
"browser/navigation_controller_impl.cc",
......@@ -156,8 +154,8 @@ component("web_engine_core") {
"browser/web_engine_devtools_controller.h",
"browser/web_engine_net_log_observer.cc",
"browser/web_engine_net_log_observer.h",
"browser/web_engine_permission_delegate.cc",
"browser/web_engine_permission_delegate.h",
"browser/web_engine_permission_manager.cc",
"browser/web_engine_permission_manager.h",
"common/web_engine_content_client.cc",
"common/web_engine_content_client.h",
"common/web_engine_url_loader_throttle.cc",
......
......@@ -12,7 +12,6 @@ include_rules = [
"+third_party/blink/public/common/logging",
"+third_party/blink/public/common/messaging",
"+third_party/blink/public/mojom/messaging",
"+third_party/blink/public/mojom/permissions",
"+third_party/widevine/cdm",
"+ui/accessibility",
"+ui/aura",
......
......@@ -201,38 +201,6 @@ FrameImplMap& WebContentsToFrameImplMap() {
return *frame_impl_map;
}
content::PermissionType FidlPermissionTypeToContentPermissionType(
fuchsia::web::PermissionType fidl_type) {
switch (fidl_type) {
case fuchsia::web::PermissionType::MICROPHONE:
return content::PermissionType::AUDIO_CAPTURE;
case fuchsia::web::PermissionType::CAMERA:
return content::PermissionType::VIDEO_CAPTURE;
case fuchsia::web::PermissionType::PROTECTED_MEDIA_IDENTIFIER:
return content::PermissionType::PROTECTED_MEDIA_IDENTIFIER;
case fuchsia::web::PermissionType::PERSISTENT_STORAGE:
return content::PermissionType::DURABLE_STORAGE;
}
}
base::Optional<url::Origin> ParseAndValidateWebOrigin(
const std::string& origin_str) {
GURL origin_url(origin_str);
if (!origin_url.username().empty() || !origin_url.password().empty() ||
!origin_url.query().empty() || !origin_url.ref().empty()) {
return base::nullopt;
}
if (!origin_url.path().empty() && origin_url.path() != "/")
return base::nullopt;
auto origin = url::Origin::Create(origin_url);
if (origin.opaque())
return base::nullopt;
return origin;
}
} // namespace
// static
......@@ -812,36 +780,6 @@ void FrameImpl::ForceContentDimensions(
layout_manager_->ForceContentDimensions(web_dips_converted);
}
void FrameImpl::SetPermissionState(
fuchsia::web::PermissionDescriptor fidl_permission,
std::string web_origin_string,
fuchsia::web::PermissionState fidl_state) {
if (!fidl_permission.has_type()) {
LOG(ERROR) << "PermissionDescriptor.type is not specified in "
"SetPermissionState().";
CloseAndDestroyFrame(ZX_ERR_INVALID_ARGS);
return;
}
auto web_origin = ParseAndValidateWebOrigin(web_origin_string);
if (!web_origin) {
LOG(ERROR) << "SetPermissionState() called with invalid web_origin: "
<< web_origin_string;
CloseAndDestroyFrame(ZX_ERR_INVALID_ARGS);
return;
}
content::PermissionType type =
FidlPermissionTypeToContentPermissionType(fidl_permission.type());
blink::mojom::PermissionStatus state =
(fidl_state == fuchsia::web::PermissionState::GRANTED)
? blink::mojom::PermissionStatus::GRANTED
: blink::mojom::PermissionStatus::DENIED;
permission_controller_.SetPermissionState(type, web_origin.value(), state);
}
void FrameImpl::CloseContents(content::WebContents* source) {
DCHECK_EQ(source, web_contents_.get());
context_->DestroyFrame(this);
......@@ -892,9 +830,8 @@ void FrameImpl::ReadyToCommitNavigation(
return;
if (!navigation_handle->IsInMainFrame() ||
navigation_handle->IsSameDocument() || navigation_handle->IsErrorPage()) {
navigation_handle->IsSameDocument() || navigation_handle->IsErrorPage())
return;
}
mojo::AssociatedRemote<mojom::OnLoadScriptInjector>
before_load_script_injector;
......
......@@ -22,7 +22,6 @@
#include "content/public/browser/web_contents_observer.h"
#include "fuchsia/engine/browser/accessibility_bridge.h"
#include "fuchsia/engine/browser/discarding_event_filter.h"
#include "fuchsia/engine/browser/frame_permission_controller.h"
#include "fuchsia/engine/browser/navigation_controller_impl.h"
#include "fuchsia/engine/browser/url_request_rewrite_rules_manager.h"
#include "fuchsia/engine/on_load_script_injector.mojom.h"
......@@ -58,10 +57,6 @@ class FrameImpl : public fuchsia::web::Frame,
uint64_t media_session_id() const { return media_session_id_; }
FramePermissionController* permission_controller() {
return &permission_controller_;
}
zx::unowned_channel GetBindingChannelForTest() const;
content::WebContents* web_contents_for_test() const {
return web_contents_.get();
......@@ -172,9 +167,6 @@ class FrameImpl : public fuchsia::web::Frame,
void SetMediaSessionId(uint64_t session_id) override;
void ForceContentDimensions(
std::unique_ptr<fuchsia::ui::gfx::vec2> web_dips) override;
void SetPermissionState(fuchsia::web::PermissionDescriptor permission,
std::string web_origin,
fuchsia::web::PermissionState state) override;
// content::WebContentsDelegate implementation.
void CloseContents(content::WebContents* source) override;
......@@ -229,7 +221,6 @@ class FrameImpl : public fuchsia::web::Frame,
std::vector<uint64_t> before_load_scripts_order_;
base::RepeatingCallback<void(base::StringPiece)> console_log_message_hook_;
UrlRequestRewriteRulesManager url_request_rewrite_rules_manager_;
FramePermissionController permission_controller_;
// Session ID to use for fuchsia.media.AudioConsumer. Set with
// SetMediaSessionId().
......
// 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 "fuchsia/engine/browser/frame_permission_controller.h"
#include "base/logging.h"
#include "url/origin.h"
using PermissionState = blink::mojom::PermissionStatus;
using PermissionType = content::PermissionType;
namespace {
size_t GetPermissionIndex(PermissionType type) {
size_t index = static_cast<size_t>(type);
DCHECK_LT(index, static_cast<size_t>(PermissionType::NUM));
return index;
}
} // namespace
FramePermissionController::PermissionSet::PermissionSet() {
for (auto& permission : permission_state) {
permission = PermissionState::DENIED;
}
}
FramePermissionController::FramePermissionController() = default;
FramePermissionController::~FramePermissionController() = default;
void FramePermissionController::SetPermissionState(PermissionType permission,
const url::Origin& origin,
PermissionState state) {
auto it = per_origin_permissions_.find(origin);
if (it == per_origin_permissions_.end()) {
// All permissions are denied by default.
if (state == PermissionState::DENIED)
return;
it = per_origin_permissions_.insert(std::make_pair(origin, PermissionSet()))
.first;
}
it->second.permission_state[GetPermissionIndex(permission)] = state;
}
PermissionState FramePermissionController::GetPermissionState(
PermissionType permission,
const url::Origin& origin) {
auto it = per_origin_permissions_.find(origin);
if (it == per_origin_permissions_.end()) {
return PermissionState::DENIED;
}
return it->second.permission_state[GetPermissionIndex(permission)];
}
void FramePermissionController::RequestPermissions(
const std::vector<PermissionType>& permissions,
const url::Origin& origin,
bool user_gesture,
base::OnceCallback<void(const std::vector<PermissionState>&)> callback) {
std::vector<PermissionState> result;
auto it = per_origin_permissions_.find(origin);
if (it == per_origin_permissions_.end()) {
result.resize(permissions.size(), PermissionState::DENIED);
} else {
result.reserve(permissions.size());
for (auto& permission : permissions) {
result.push_back(
it->second.permission_state[GetPermissionIndex(permission)]);
}
}
std::move(callback).Run(result);
}
// 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.
#ifndef FUCHSIA_ENGINE_BROWSER_FRAME_PERMISSION_CONTROLLER_H_
#define FUCHSIA_ENGINE_BROWSER_FRAME_PERMISSION_CONTROLLER_H_
#include <map>
#include <vector>
#include "base/callback_forward.h"
#include "content/public/browser/permission_type.h"
#include "third_party/blink/public/mojom/permissions/permission_status.mojom.h"
namespace url {
class Origin;
}
// FramePermissionController is responsible for web permissions state for a
// fuchsia.web.Frame instance.
class FramePermissionController {
public:
FramePermissionController();
~FramePermissionController();
FramePermissionController(FramePermissionController&) = delete;
FramePermissionController& operator=(FramePermissionController&) = delete;
// Sets the |state| for the specified |permission| and |origin|.
void SetPermissionState(content::PermissionType permission,
const url::Origin& origin,
blink::mojom::PermissionStatus state);
// Returns current permission state of the specified |permission| and
// |origin|.
blink::mojom::PermissionStatus GetPermissionState(
content::PermissionType permission,
const url::Origin& origin);
// Requests permission state for the specified |permissions|. When the request
// is resolved, the |callback| is called with a list of status values, one for
// each value in |permissions|, in the same order.
//
// TODO(crbug.com/922833): Current implementation doesn't actually prompt the
// user: all permissions in the PROMPT state are denied silently. Define
// fuchsia.web.PermissionManager protocol and use it to request permissions.
void RequestPermissions(
const std::vector<content::PermissionType>& permissions,
const url::Origin& origin,
bool user_gesture,
base::OnceCallback<
void(const std::vector<blink::mojom::PermissionStatus>&)> callback);
private:
struct PermissionSet {
PermissionSet();
blink::mojom::PermissionStatus
permission_state[static_cast<int>(content::PermissionType::NUM)];
};
std::map<url::Origin, PermissionSet> per_origin_permissions_;
};
#endif // FUCHSIA_ENGINE_BROWSER_FRAME_PERMISSION_CONTROLLER_H_
\ No newline at end of file
......@@ -18,7 +18,7 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/resource_context.h"
#include "fuchsia/engine/browser/web_engine_net_log_observer.h"
#include "fuchsia/engine/browser/web_engine_permission_delegate.h"
#include "fuchsia/engine/browser/web_engine_permission_manager.h"
#include "services/network/public/cpp/network_switches.h"
class WebEngineBrowserContext::ResourceContext
......@@ -123,9 +123,9 @@ WebEngineBrowserContext::GetSSLHostStateDelegate() {
content::PermissionControllerDelegate*
WebEngineBrowserContext::GetPermissionControllerDelegate() {
if (!permission_delegate_)
permission_delegate_ = std::make_unique<WebEnginePermissionDelegate>();
return permission_delegate_.get();
if (!permission_manager_)
permission_manager_ = std::make_unique<WebEnginePermissionManager>();
return permission_manager_.get();
}
content::ClientHintsControllerDelegate*
......
......@@ -13,7 +13,7 @@
#include "content/public/browser/browser_context.h"
class WebEngineNetLogObserver;
class WebEnginePermissionDelegate;
class WebEnginePermissionManager;
class WebEngineBrowserContext : public content::BrowserContext {
public:
......@@ -52,7 +52,7 @@ class WebEngineBrowserContext : public content::BrowserContext {
std::unique_ptr<WebEngineNetLogObserver> net_log_observer_;
std::unique_ptr<SimpleFactoryKey> simple_factory_key_;
std::unique_ptr<ResourceContext> resource_context_;
std::unique_ptr<WebEnginePermissionDelegate> permission_delegate_;
std::unique_ptr<WebEnginePermissionManager> permission_manager_;
DISALLOW_COPY_AND_ASSIGN(WebEngineBrowserContext);
};
......
......@@ -2,96 +2,85 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "fuchsia/engine/browser/web_engine_permission_delegate.h"
#include "fuchsia/engine/browser/web_engine_permission_manager.h"
#include "base/callback.h"
#include "base/logging.h"
#include "content/public/browser/permission_controller.h"
#include "content/public/browser/permission_type.h"
#include "fuchsia/engine/browser/frame_impl.h"
#include "url/origin.h"
WebEnginePermissionDelegate::WebEnginePermissionDelegate() = default;
WebEnginePermissionDelegate::~WebEnginePermissionDelegate() = default;
namespace {
blink::mojom::PermissionStatus CheckPermissionStatus(
content::PermissionType permission_type) {
// TODO(crbug/922833): Temporary grant permission of
// PROTECTED_MEDIA_IDENTIFIER to unblock EME development.
return permission_type == content::PermissionType::PROTECTED_MEDIA_IDENTIFIER
? blink::mojom::PermissionStatus::GRANTED
: blink::mojom::PermissionStatus::DENIED;
}
} // namespace
WebEnginePermissionManager::WebEnginePermissionManager() = default;
int WebEnginePermissionDelegate::RequestPermission(
WebEnginePermissionManager::~WebEnginePermissionManager() = default;
int WebEnginePermissionManager::RequestPermission(
content::PermissionType permission,
content::RenderFrameHost* render_frame_host,
const GURL& origin,
bool user_gesture,
base::OnceCallback<void(blink::mojom::PermissionStatus)> callback) {
std::vector<content::PermissionType> permissions{permission};
RequestPermissions(
permissions, render_frame_host, origin, user_gesture,
base::BindOnce(
[](base::OnceCallback<void(blink::mojom::PermissionStatus)> callback,
const std::vector<blink::mojom::PermissionStatus>& state) {
DCHECK_EQ(state.size(), 1U);
std::move(callback).Run(state[0]);
},
base::Passed(std::move(callback))));
std::move(callback).Run(CheckPermissionStatus(permission));
return content::PermissionController::kNoPendingOperation;
}
int WebEnginePermissionDelegate::RequestPermissions(
int WebEnginePermissionManager::RequestPermissions(
const std::vector<content::PermissionType>& permissions,
content::RenderFrameHost* render_frame_host,
const GURL& requesting_origin,
bool user_gesture,
base::OnceCallback<void(const std::vector<blink::mojom::PermissionStatus>&)>
callback) {
FrameImpl* frame = FrameImpl::FromRenderFrameHost(render_frame_host);
DCHECK(frame);
frame->permission_controller()->RequestPermissions(
permissions, url::Origin::Create(requesting_origin), user_gesture,
std::move(callback));
std::vector<blink::mojom::PermissionStatus> statuses;
for (auto permission : permissions)
statuses.push_back(CheckPermissionStatus(permission));
std::move(callback).Run(statuses);
return content::PermissionController::kNoPendingOperation;
}
void WebEnginePermissionDelegate::ResetPermission(
void WebEnginePermissionManager::ResetPermission(
content::PermissionType permission,
const GURL& requesting_origin,
const GURL& embedding_origin) {
// TODO(crbug.com/922833): Update PermissionControllerDelegate to pass
// RenderFrameHost.
NOTIMPLEMENTED() << ": " << static_cast<int>(permission);
}
blink::mojom::PermissionStatus WebEnginePermissionDelegate::GetPermissionStatus(
blink::mojom::PermissionStatus WebEnginePermissionManager::GetPermissionStatus(
content::PermissionType permission,
const GURL& requesting_origin,
const GURL& embedding_origin) {
// GetPermissionStatus() is deprecated and it's not expected to be called in
// WebEngine.
NOTREACHED();
return blink::mojom::PermissionStatus::DENIED;
return CheckPermissionStatus(permission);
}
blink::mojom::PermissionStatus
WebEnginePermissionDelegate::GetPermissionStatusForFrame(
WebEnginePermissionManager::GetPermissionStatusForFrame(
content::PermissionType permission,
content::RenderFrameHost* render_frame_host,
const GURL& requesting_origin) {
FrameImpl* frame = FrameImpl::FromRenderFrameHost(render_frame_host);
DCHECK(frame);
return frame->permission_controller()->GetPermissionState(
permission, url::Origin::Create(requesting_origin));
return CheckPermissionStatus(permission);
}
int WebEnginePermissionDelegate::SubscribePermissionStatusChange(
int WebEnginePermissionManager::SubscribePermissionStatusChange(
content::PermissionType permission,
content::RenderFrameHost* render_frame_host,
const GURL& requesting_origin,
base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) {
// TODO(crbug.com/922833): Implement permission status subscription. It's
// used in blink to emit PermissionStatus.onchange notifications.
NOTIMPLEMENTED() << ": " << static_cast<int>(permission);
return content::PermissionController::kNoPendingOperation;
}
void WebEnginePermissionDelegate::UnsubscribePermissionStatusChange(
void WebEnginePermissionManager::UnsubscribePermissionStatusChange(
int subscription_id) {
NOTREACHED();
NOTIMPLEMENTED();
}
......@@ -2,22 +2,17 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FUCHSIA_ENGINE_BROWSER_WEB_ENGINE_PERMISSION_DELEGATE_H_
#define FUCHSIA_ENGINE_BROWSER_WEB_ENGINE_PERMISSION_DELEGATE_H_
#ifndef FUCHSIA_ENGINE_BROWSER_WEB_ENGINE_PERMISSION_MANAGER_H_
#define FUCHSIA_ENGINE_BROWSER_WEB_ENGINE_PERMISSION_MANAGER_H_
#include "base/macros.h"
#include "content/public/browser/permission_controller_delegate.h"
// PermissionControllerDelegate implementation for WebEngine. It redirects
// permission redirects all calls to the appropriate FramePermissionController
// instance.
class WebEnginePermissionDelegate
class WebEnginePermissionManager
: public content::PermissionControllerDelegate {
public:
WebEnginePermissionDelegate();
~WebEnginePermissionDelegate() override;
WebEnginePermissionDelegate(WebEnginePermissionDelegate&) = delete;
WebEnginePermissionDelegate& operator=(WebEnginePermissionDelegate&) = delete;
WebEnginePermissionManager();
~WebEnginePermissionManager() override;
// content::PermissionControllerDelegate implementation:
int RequestPermission(content::PermissionType permission,
......@@ -52,6 +47,9 @@ class WebEnginePermissionDelegate
base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback)
override;
void UnsubscribePermissionStatusChange(int subscription_id) override;
private:
DISALLOW_COPY_AND_ASSIGN(WebEnginePermissionManager);
};
#endif // FUCHSIA_ENGINE_BROWSER_WEB_ENGINE_PERMISSION_DELEGATE_H_
#endif // FUCHSIA_ENGINE_BROWSER_WEB_ENGINE_PERMISSION_MANAGER_H_
<html>
<body>
<video></video>
<script>
window.onload = () => {
navigator.permissions.query({name: 'microphone'}).then(r => {
document.title = r.state;
});
}
</script>
</body>
</html>
......@@ -129,8 +129,6 @@ class WebEngineIntegrationTest : public testing::Test {
}
protected:
void RunPermissionTest(bool grant);
const base::test::TaskEnvironment task_environment_;
fidl::InterfaceHandle<fuchsia::sys::ComponentController>
......@@ -400,38 +398,3 @@ TEST_F(WebEngineIntegrationTest, PlayAudio) {
frame_->SetNavigationEventListener(listener_binding.NewBinding());
navigation_listener.RunUntilTitleEquals("ended");
}
void WebEngineIntegrationTest::RunPermissionTest(bool grant) {
StartWebEngine();
fuchsia::web::CreateContextParams create_params =
DefaultContextParamsWithTestData();
CreateContextAndFrame(std::move(create_params));
if (grant) {
// Grant microphone permission.
fuchsia::web::PermissionDescriptor mic_permission;
mic_permission.set_type(fuchsia::web::PermissionType::MICROPHONE);
frame_->SetPermissionState(std::move(mic_permission),
"fuchsia-dir://testdata/",
fuchsia::web::PermissionState::GRANTED);
}
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
navigation_controller_.get(), fuchsia::web::LoadUrlParams(),
"fuchsia-dir://testdata/check_mic_permission.html"));
cr_fuchsia::TestNavigationListener navigation_listener;
fidl::Binding<fuchsia::web::NavigationEventListener> listener_binding(
&navigation_listener);
frame_->SetNavigationEventListener(listener_binding.NewBinding());
navigation_listener.RunUntilTitleEquals(grant ? "granted" : "denied");
}
TEST_F(WebEngineIntegrationTest, PermissionDenied) {
RunPermissionTest(false);
}
TEST_F(WebEngineIntegrationTest, PermissionGranted) {
RunPermissionTest(true);
}
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