Commit 58f3680d authored by Sergey Ulanov's avatar Sergey Ulanov Committed by Commit Bot

[Fuchsia] Register fuchsia-dir URL scheme in runners

Previously fuchsia-dir was registered as a standard URL scheme only in
WebEngine, but not in runners. As result fuchsia-dir:// URLs were not
always handled correctly, particularly because GURL::GetOrigin()
returns an empty string when called for an URL with a non-standard
scheme. When trying to start an app from a custom content directory
cast_runner was getting empty string from GetOrigin() and passing that
empty string to Frame::SetPermissionState(). As result WebEngine would
terminate the Frame.

Added RegisterFuchsiaDirScheme() helper that's now used in runners to
register fuchsia-dir scheme. This ensures that GURL::GetOrigin() works
properly for fuchsia-dir URLs.

Bug: 1062120
Change-Id: Ibe28f07e4a6b08cf62526c5f7ee81e2783c6d667
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2106748
Commit-Queue: Sergey Ulanov <sergeyu@chromium.org>
Reviewed-by: default avatarDavid Dorwin <ddorwin@chromium.org>
Reviewed-by: default avatarKevin Marshall <kmarshall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#751096}
parent 8eae6475
......@@ -13,6 +13,7 @@ import("//testing/test.gni")
source_set("base") {
sources = [
"config_reader.cc",
"fuchsia_dir_scheme.cc",
"init_logging.cc",
"mem_buffer_util.cc",
"scoped_pseudo_file_publisher.cc",
......@@ -20,6 +21,7 @@ source_set("base") {
]
public = [
"config_reader.h",
"fuchsia_dir_scheme.h",
"init_logging.h",
"mem_buffer_util.h",
"scoped_pseudo_file_publisher.h",
......@@ -28,6 +30,7 @@ source_set("base") {
deps = [
"//base",
"//third_party/fuchsia-sdk/sdk/fidl/fuchsia.mem",
"//url",
]
}
......
// 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/base/fuchsia_dir_scheme.h"
#include "url/url_util.h"
namespace cr_fuchsia {
const char kFuchsiaDirScheme[] = "fuchsia-dir";
void RegisterFuchsiaDirScheme() {
url::AddStandardScheme(kFuchsiaDirScheme, url::SCHEME_WITH_HOST);
url::AddLocalScheme(kFuchsiaDirScheme);
}
} // namespace cr_fuchsia
// 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_BASE_FUCHSIA_DIR_SCHEME_H_
#define FUCHSIA_BASE_FUCHSIA_DIR_SCHEME_H_
namespace cr_fuchsia {
// URL scheme used to access content directories.
extern const char kFuchsiaDirScheme[];
// Registers kFuchsiaDirScheme as a standard URL scheme.
void RegisterFuchsiaDirScheme();
} // namespace cr_fuchsia
#endif // FUCHSIA_BASE_FUCHSIA_DIR_SCHEME_H_
......@@ -23,6 +23,7 @@
#include "base/task/post_task.h"
#include "base/task/task_traits.h"
#include "base/task/thread_pool.h"
#include "fuchsia/base/fuchsia_dir_scheme.h"
#include "fuchsia/engine/common/web_engine_content_client.h"
#include "fuchsia/engine/switches.h"
#include "mojo/public/cpp/bindings/remote.h"
......@@ -382,8 +383,7 @@ void ContentDirectoryLoaderFactory::CreateLoaderAndStart(
const network::ResourceRequest& request,
mojo::PendingRemote<network::mojom::URLLoaderClient> client,
const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
if (!request.url.SchemeIs(
WebEngineContentClient::kFuchsiaContentDirectoryScheme) ||
if (!request.url.SchemeIs(cr_fuchsia::kFuchsiaDirScheme) ||
!request.url.is_valid()) {
mojo::Remote<network::mojom::URLLoaderClient>(std::move(client))
->OnComplete(network::URLLoaderCompletionStatus(net::ERR_INVALID_URL));
......
......@@ -15,6 +15,7 @@
#include "content/public/browser/network_service_instance.h"
#include "content/public/common/user_agent.h"
#include "content/public/common/web_preferences.h"
#include "fuchsia/base/fuchsia_dir_scheme.h"
#include "fuchsia/engine/browser/url_request_rewrite_rules_manager.h"
#include "fuchsia/engine/browser/web_engine_browser_context.h"
#include "fuchsia/engine/browser/web_engine_browser_interface_binders.h"
......@@ -123,7 +124,7 @@ void WebEngineContentBrowserClient::
NonNetworkURLLoaderFactoryMap* factories) {
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kContentDirectories)) {
(*factories)[WebEngineContentClient::kFuchsiaContentDirectoryScheme] =
(*factories)[cr_fuchsia::kFuchsiaDirScheme] =
std::make_unique<ContentDirectoryLoaderFactory>();
}
}
......@@ -135,7 +136,7 @@ void WebEngineContentBrowserClient::
NonNetworkURLLoaderFactoryMap* factories) {
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kContentDirectories)) {
(*factories)[WebEngineContentClient::kFuchsiaContentDirectoryScheme] =
(*factories)[cr_fuchsia::kFuchsiaDirScheme] =
std::make_unique<ContentDirectoryLoaderFactory>();
}
}
......
......@@ -5,13 +5,11 @@
#include "fuchsia/engine/common/web_engine_content_client.h"
#include "base/command_line.h"
#include "fuchsia/base/fuchsia_dir_scheme.h"
#include "fuchsia/engine/switches.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
const char WebEngineContentClient::kFuchsiaContentDirectoryScheme[] =
"fuchsia-dir";
WebEngineContentClient::WebEngineContentClient() = default;
WebEngineContentClient::~WebEngineContentClient() = default;
......@@ -44,6 +42,7 @@ blink::OriginTrialPolicy* WebEngineContentClient::GetOriginTrialPolicy() {
void WebEngineContentClient::AddAdditionalSchemes(Schemes* schemes) {
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kContentDirectories))
schemes->standard_schemes.push_back(kFuchsiaContentDirectoryScheme);
switches::kContentDirectories)) {
schemes->standard_schemes.push_back(cr_fuchsia::kFuchsiaDirScheme);
}
}
......@@ -10,9 +10,6 @@
class WebEngineContentClient : public content::ContentClient {
public:
// URL scheme used to access content directories.
static const char kFuchsiaContentDirectoryScheme[];
WebEngineContentClient();
~WebEngineContentClient() override;
......
......@@ -24,6 +24,7 @@
#include "fuchsia/base/fake_component_context.h"
#include "fuchsia/base/fit_adapter.h"
#include "fuchsia/base/frame_test_util.h"
#include "fuchsia/base/fuchsia_dir_scheme.h"
#include "fuchsia/base/mem_buffer_util.h"
#include "fuchsia/base/result_receiver.h"
#include "fuchsia/base/string_util.h"
......@@ -59,6 +60,21 @@ void ComponentErrorHandler(zx_status_t status) {
ADD_FAILURE();
}
// Helper used to ensure that cr_fuchsia::RegisterFuchsiaDirScheme() is called
// once per process to register fuchsia-dir scheme. In cast_runner this function
// is called in main.cc, but that code is not executed in
// cast_runner_integration_tests.
//
// TODO(crbug.com/1062351): Update the tests to start cast_runner component
// instead of creating CastRunner in process. Then remove this function.
void EnsureFuchsiaDirSchemeInitialized() {
class SchemeInitializer {
public:
SchemeInitializer() { cr_fuchsia::RegisterFuchsiaDirScheme(); }
};
static SchemeInitializer initializer;
}
class FakeUrlRequestRewriteRulesProvider
: public chromium::cast::UrlRequestRewriteRulesProvider {
public:
......@@ -198,6 +214,8 @@ class CastRunnerIntegrationTest : public testing::Test {
protected:
explicit CastRunnerIntegrationTest(
fuchsia::web::ContextFeatureFlags feature_flags) {
EnsureFuchsiaDirSchemeInitialized();
// Create the CastRunner, published into |outgoing_directory_|.
fuchsia::web::CreateContextParams create_context_params;
create_context_params.set_features(feature_flags);
......
......@@ -23,6 +23,13 @@ chromium::cast::ApplicationConfig FakeApplicationConfigManager::CreateConfig(
app_config.set_display_name("Dummy test app");
app_config.set_web_url(url.spec());
app_config.set_agent_url(kAgentComponentUrl);
// Add a PROTECTED_MEDIA_IDENTIFIER permission. This is consistent with the
// real ApplicationConfigManager.
fuchsia::web::PermissionDescriptor permission;
permission.set_type(fuchsia::web::PermissionType::PROTECTED_MEDIA_IDENTIFIER);
app_config.mutable_permissions()->push_back(std::move(permission));
return app_config;
}
......
......@@ -14,6 +14,7 @@
#include "base/values.h"
#include "build/buildflag.h"
#include "fuchsia/base/config_reader.h"
#include "fuchsia/base/fuchsia_dir_scheme.h"
#include "fuchsia/base/init_logging.h"
#include "fuchsia/runners/buildflags.h"
#include "fuchsia/runners/cast/cast_runner.h"
......@@ -43,6 +44,8 @@ int main(int argc, char** argv) {
*base::CommandLine::ForCurrentProcess()))
<< "Failed to initialize logging.";
cr_fuchsia::RegisterFuchsiaDirScheme();
fuchsia::web::ContextFeatureFlags features =
fuchsia::web::ContextFeatureFlags::NETWORK |
fuchsia::web::ContextFeatureFlags::AUDIO |
......
......@@ -10,6 +10,7 @@
#include "base/message_loop/message_pump_type.h"
#include "base/run_loop.h"
#include "base/task/single_thread_task_executor.h"
#include "fuchsia/base/fuchsia_dir_scheme.h"
#include "fuchsia/base/init_logging.h"
#include "fuchsia/runners/buildflags.h"
#include "fuchsia/runners/common/web_content_runner.h"
......@@ -23,6 +24,8 @@ int main(int argc, char** argv) {
*base::CommandLine::ForCurrentProcess()))
<< "Failed to initialize logging.";
cr_fuchsia::RegisterFuchsiaDirScheme();
fuchsia::web::CreateContextParams create_context_params;
create_context_params.set_features(
fuchsia::web::ContextFeatureFlags::NETWORK |
......
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