diff --git a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc index f94ebd9a9a7c99..308725aef8a100 100644 --- a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc +++ b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc @@ -5542,18 +5542,14 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestSubresourceWebBundlesBrowserTest, embedded_test_server()->GetURL("/pass.js").spec(); std::string cancel_js_url_str = embedded_test_server()->GetURL("/cancel.js").spec(); - // Currently the web bundle format requires a valid GURL for the fallback URL - // of a web bundle. So we use |pass_js_url_str| for the fallback URL. - // TODO(crbug.com/966753): Stop using |pass_js_url_str| when - // https://github.com/WICG/webpackage/issues/590 is resolved. - web_package::WebBundleBuilder builder(pass_js_url_str, ""); - auto pass_js_location = builder.AddResponse( + web_package::WebBundleBuilder builder; + builder.AddExchange( + pass_js_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title = 'script loaded';"); - auto cancel_js_location = builder.AddResponse( + builder.AddExchange( + cancel_js_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, ""); - builder.AddIndexEntry(pass_js_url_str, "", {pass_js_location}); - builder.AddIndexEntry(cancel_js_url_str, "", {cancel_js_location}); std::vector bundle = builder.CreateBundle(); web_bundle = std::string(bundle.begin(), bundle.end()); @@ -5618,19 +5614,14 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestSubresourceWebBundlesBrowserTest, RegisterRequestHandler("/test.html", "text/html", page_html); ASSERT_TRUE(embedded_test_server()->Start()); - // Create a web bundle. - // Currently the web bundle format requires a valid GURL for the fallback - // URL of a web bundle. So we use |pass_js_url_str| for the fallback URL. - // TODO(crbug.com/966753): Stop using |pass_js_url_str| when - // https://github.com/WICG/webpackage/issues/590 is resolved. - web_package::WebBundleBuilder builder(pass_js_url, ""); - auto pass_js_location = builder.AddResponse( + web_package::WebBundleBuilder builder; + builder.AddExchange( + pass_js_url, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title = 'script loaded';"); - auto cancel_js_location = builder.AddResponse( + builder.AddExchange( + cancel_js_url, {{":status", "200"}, {"content-type", "application/javascript"}}, ""); - builder.AddIndexEntry(pass_js_url, "", {pass_js_location}); - builder.AddIndexEntry(cancel_js_url, "", {cancel_js_location}); std::vector bundle = builder.CreateBundle(); web_bundle = std::string(bundle.begin(), bundle.end()); @@ -5700,34 +5691,28 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestSubresourceWebBundlesBrowserTest, embedded_test_server()->GetURL("/redirected_to_unlisted.js").spec(); std::string redirect_to_server_js_url_str = embedded_test_server()->GetURL("/redirect_to_server.js").spec(); - // Currently the web bundle format requires a valid GURL for the fallback URL - // of a web bundle. So we use |redirect_js_url_str| for the fallback URL. - // TODO(crbug.com/966753): Stop using |redirect_js_url_str| when - // https://github.com/WICG/webpackage/issues/590 is resolved. - web_package::WebBundleBuilder builder(redirect_js_url_str, ""); - auto redirect_js_location = builder.AddResponse( + web_package::WebBundleBuilder builder; + builder.AddExchange( + redirect_js_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title = 'redirect';"); - auto redirected_js_location = builder.AddResponse( + builder.AddExchange( + redirected_js_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title = 'redirected';"); - auto redirect_to_unlisted_location = builder.AddResponse( + builder.AddExchange( + redirect_to_unlisted_js_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title = 'redirect_to_unlisted';"); - auto redirected_to_unlisted_js_location = builder.AddResponse( + builder.AddExchange( + redirected_to_unlisted_js_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title = 'redirected_to_unlisted';"); - auto redirect_to_server_js_location = builder.AddResponse( + builder.AddExchange( + redirect_to_server_js_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title = 'redirect_to_server';"); - builder.AddIndexEntry(redirect_js_url_str, "", {redirect_js_location}); - builder.AddIndexEntry(redirected_js_url_str, "", {redirected_js_location}); - builder.AddIndexEntry(redirect_to_unlisted_js_url_str, "", - {redirect_to_unlisted_location}); - builder.AddIndexEntry(redirected_to_unlisted_js_url_str, "", - {redirected_to_unlisted_js_location}); - builder.AddIndexEntry(redirect_to_server_js_url_str, "", - {redirect_to_server_js_location}); + std::vector bundle = builder.CreateBundle(); web_bundle = std::string(bundle.begin(), bundle.end()); @@ -5794,7 +5779,7 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestSubresourceWebBundlesBrowserTest, // Create a web bundle. std::string js_url_str = embedded_test_server()->GetURL("/script.js").spec(); - web_package::WebBundleBuilder builder(js_url_str, ""); + web_package::WebBundleBuilder builder; builder.AddExchange( js_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc index 41cd947732aa32..5976f4f1ef4e7a 100644 --- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc +++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc @@ -3588,16 +3588,15 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest, // Create a web bundle. std::string script_url_str = embedded_test_server()->GetURL("/test.js").spec(); - web_package::WebBundleBuilder builder("", ""); - auto script_location = builder.AddResponse( + web_package::WebBundleBuilder builder; + builder.AddExchange( + script_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title = 'ScriptDone';"); - auto uuid_in_package_script_location = builder.AddResponse( + builder.AddExchange( + uuid_in_package_script_url, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title += ':UUIDInPackageScriptDone';"); - builder.AddIndexEntry(script_url_str, "", {script_location}); - builder.AddIndexEntry(uuid_in_package_script_url, "", - {uuid_in_package_script_location}); std::vector bundle = builder.CreateBundle(); web_bundle = std::string(bundle.begin(), bundle.end()); @@ -3715,23 +3714,21 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest, embedded_test_server()->GetURL("/pass.js").spec(); std::string cancel_js_url_str = embedded_test_server()->GetURL("/cancel.js").spec(); - web_package::WebBundleBuilder builder(pass_js_url_str, ""); - auto pass_js_location = builder.AddResponse( + web_package::WebBundleBuilder builder; + builder.AddExchange( + pass_js_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title = 'script loaded';"); - auto cancel_js_location = builder.AddResponse( + builder.AddExchange( + cancel_js_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, ""); - auto uuid_in_package_pass_js_location = builder.AddResponse( + builder.AddExchange( + pass_uuid_in_package_js_url, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title = 'uuid-in-package script loaded';"); - auto uuid_in_package_cancel_js_location = builder.AddResponse( + builder.AddExchange( + cancel_uuid_in_package_js_url, {{":status", "200"}, {"content-type", "application/javascript"}}, ""); - builder.AddIndexEntry(pass_js_url_str, "", {pass_js_location}); - builder.AddIndexEntry(cancel_js_url_str, "", {cancel_js_location}); - builder.AddIndexEntry(pass_uuid_in_package_js_url, "", - {uuid_in_package_pass_js_location}); - builder.AddIndexEntry(cancel_uuid_in_package_js_url, "", - {uuid_in_package_cancel_js_location}); std::vector bundle = builder.CreateBundle(); web_bundle = std::string(bundle.begin(), bundle.end()); @@ -3842,11 +3839,11 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest, ChangeHeader) { // Create a web bundle. std::string target_txt_url_str = embedded_test_server()->GetURL("/target.txt").spec(); - web_package::WebBundleBuilder builder(target_txt_url_str, ""); - auto target_txt_location = builder.AddResponse( + web_package::WebBundleBuilder builder; + builder.AddExchange( + target_txt_url_str, {{":status", "200"}, {"content-type", "text/plain"}, {"foo", "bar"}}, "Hello world"); - builder.AddIndexEntry(target_txt_url_str, "", {target_txt_location}); std::vector bundle = builder.CreateBundle(); web_bundle = std::string(bundle.begin(), bundle.end()); @@ -3946,11 +3943,11 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest, ASSERT_TRUE(StartEmbeddedTestServer()); // Create a web bundle. - web_package::WebBundleBuilder builder(uuid_url, ""); - auto uuid_script = builder.AddResponse( + web_package::WebBundleBuilder builder; + builder.AddExchange( + uuid_url, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title = 'loaded';"); - builder.AddIndexEntry(uuid_url, "", {uuid_script}); std::vector bundle = builder.CreateBundle(); web_bundle = std::string(bundle.begin(), bundle.end()); @@ -4060,30 +4057,27 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest, embedded_test_server()->GetURL("/redirected_to_unlisted.js").spec(); std::string redirect_to_server_js_url_str = embedded_test_server()->GetURL("/redirect_to_server.js").spec(); - web_package::WebBundleBuilder builder(redirect_js_url_str, ""); - auto redirect_js_location = builder.AddResponse( + web_package::WebBundleBuilder builder; + builder.AddExchange( + redirect_js_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title = 'redirect';"); - auto redirected_js_location = builder.AddResponse( + builder.AddExchange( + redirected_js_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title = 'redirected';"); - auto redirect_to_unlisted_location = builder.AddResponse( + builder.AddExchange( + redirect_to_unlisted_js_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title = 'redirect_to_unlisted';"); - auto redirected_to_unlisted_js_location = builder.AddResponse( + builder.AddExchange( + redirected_to_unlisted_js_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title = 'redirected_to_unlisted';"); - auto redirect_to_server_js_location = builder.AddResponse( + builder.AddExchange( + redirect_to_server_js_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, "document.title = 'redirect_to_server';"); - builder.AddIndexEntry(redirect_js_url_str, "", {redirect_js_location}); - builder.AddIndexEntry(redirected_js_url_str, "", {redirected_js_location}); - builder.AddIndexEntry(redirect_to_unlisted_js_url_str, "", - {redirect_to_unlisted_location}); - builder.AddIndexEntry(redirected_to_unlisted_js_url_str, "", - {redirected_to_unlisted_js_location}); - builder.AddIndexEntry(redirect_to_server_js_url_str, "", - {redirect_to_server_js_location}); std::vector bundle = builder.CreateBundle(); web_bundle = std::string(bundle.begin(), bundle.end()); @@ -4156,7 +4150,7 @@ IN_PROC_BROWSER_TEST_P(SubresourceWebBundlesWebRequestApiTest, // Create a web bundle. std::string js_url_str = embedded_test_server()->GetURL("/script.js").spec(); - web_package::WebBundleBuilder builder(js_url_str, ""); + web_package::WebBundleBuilder builder; builder.AddExchange( js_url_str, {{":status", "200"}, {"content-type", "application/javascript"}}, diff --git a/chrome/browser/extensions/content_script_apitest.cc b/chrome/browser/extensions/content_script_apitest.cc index 9ffe8abf7c8060..9144a005afcc92 100644 --- a/chrome/browser/extensions/content_script_apitest.cc +++ b/chrome/browser/extensions/content_script_apitest.cc @@ -2107,11 +2107,10 @@ IN_PROC_BROWSER_TEST_F(SubresourceWebBundlesContentScriptApiTest, const std::string uuid_html_url = "uuid-in-package:65c6f241-f6b5-4302-9f95-9a826c4dda1c"; - web_package::WebBundleBuilder builder("", ""); - auto html_location = - builder.AddResponse({{":status", "200"}, {"content-type", "text/html"}}, - ""); - builder.AddIndexEntry(uuid_html_url, "", {html_location}); + web_package::WebBundleBuilder builder; + builder.AddExchange(uuid_html_url, + {{":status", "200"}, {"content-type", "text/html"}}, + ""); std::vector bundle = builder.CreateBundle(); const std::string web_bundle = std::string(bundle.begin(), bundle.end()); diff --git a/components/web_package/web_bundle_builder.cc b/components/web_package/web_bundle_builder.cc index b9f46750a9fee7..efce846e4bc29f 100644 --- a/components/web_package/web_bundle_builder.cc +++ b/components/web_package/web_bundle_builder.cc @@ -41,19 +41,13 @@ uint64_t GetNumUintBytes(uint64_t value) { } // namespace -WebBundleBuilder::WebBundleBuilder(const std::string& fallback_url, - const std::string& manifest_url, - BundleVersion version, +WebBundleBuilder::WebBundleBuilder(BundleVersion version, bool allow_invalid_utf8_strings_for_testing) - : fallback_url_(fallback_url), version_(version) { + : version_(version) { + // Currently the only supported bundle format is b2. + DCHECK_EQ(version_, BundleVersion::kB2); writer_config_.allow_invalid_utf8_for_testing = allow_invalid_utf8_strings_for_testing; - if (!manifest_url.empty() && version == BundleVersion::kB1) { - AddSection("manifest", GetCborValueOfURL(manifest_url)); - } - if (version == BundleVersion::kB2 && !fallback_url_.empty()) { - AddSection("primary", GetCborValueOfURL(fallback_url_)); - } } WebBundleBuilder::~WebBundleBuilder() = default; @@ -67,7 +61,7 @@ cbor::Value WebBundleBuilder::GetCborValueOfURL(base::StringPiece url) { void WebBundleBuilder::AddExchange(base::StringPiece url, const Headers& response_headers, base::StringPiece payload) { - AddIndexEntry(url, "", {AddResponse(response_headers, payload)}); + AddIndexEntry(url, AddResponse(response_headers, payload)); } WebBundleBuilder::ResponseLocation WebBundleBuilder::AddResponse( @@ -86,15 +80,8 @@ WebBundleBuilder::ResponseLocation WebBundleBuilder::AddResponse( void WebBundleBuilder::AddIndexEntry( base::StringPiece url, - base::StringPiece variants_value, - std::vector response_locations) { - // 'b2' version does not include |variants_value| in the response array. - if (version_ != BundleVersion::kB1) { - DCHECK_LE(response_locations.size(), 1u); - } - delayed_index_.insert( - {std::string(url), std::make_pair(std::string(variants_value), - std::move(response_locations))}); + const ResponseLocation& response_location) { + delayed_index_.insert({std::string{url}, response_location}); } void WebBundleBuilder::AddSection(base::StringPiece name, cbor::Value section) { @@ -111,6 +98,10 @@ void WebBundleBuilder::AddVouchedSubset(cbor::Value::MapValue vouched_subset) { vouched_subsets_.emplace_back(std::move(vouched_subset)); } +void WebBundleBuilder::AddPrimaryURL(base::StringPiece url) { + AddSection("primary", GetCborValueOfURL(url)); +} + std::vector WebBundleBuilder::CreateBundle() { // Now that we know how many responses will be in the bundle, // we want to shift all the offsets by the bytes required @@ -119,15 +110,10 @@ std::vector WebBundleBuilder::CreateBundle() { int64_t initial_offset = 1 + GetNumUintBytes(responses_.size()); cbor::Value::MapValue index; for (auto& entry : delayed_index_) { - auto& index_entry = entry.second; + const ResponseLocation& location = entry.second; cbor::Value::ArrayValue index_value_array; - if (version_ == BundleVersion::kB1) { - index_value_array.emplace_back(CreateByteString(index_entry.first)); - } - for (auto& location : index_entry.second) { - index_value_array.emplace_back(location.offset + initial_offset); - index_value_array.emplace_back(location.length); - } + index_value_array.emplace_back(location.offset + initial_offset); + index_value_array.emplace_back(location.length); index.insert( {GetCborValueOfURL(entry.first), cbor::Value(index_value_array)}); } @@ -171,14 +157,7 @@ std::vector WebBundleBuilder::CreateTopLevel() { cbor::Value::ArrayValue toplevel_array; toplevel_array.emplace_back( CreateByteString(u8"\U0001F310\U0001F4E6")); // "🌐📦" - if (version_ == BundleVersion::kB1) { - toplevel_array.emplace_back( - CreateByteString(base::StringPiece("b1\0\0", 4))); - toplevel_array.emplace_back(GetCborValueOfURL(fallback_url_)); - } else { - toplevel_array.emplace_back( - CreateByteString(base::StringPiece("b2\0\0", 4))); - } + toplevel_array.emplace_back(CreateByteString(base::StringPiece("b2\0\0", 4))); toplevel_array.emplace_back(Encode(cbor::Value(section_lengths_))); toplevel_array.emplace_back(sections_); // Put a dummy 8-byte bytestring. diff --git a/components/web_package/web_bundle_builder.h b/components/web_package/web_bundle_builder.h index b0bbe0875a5e3f..b6cbf494d9ae3a 100644 --- a/components/web_package/web_bundle_builder.h +++ b/components/web_package/web_bundle_builder.h @@ -16,7 +16,6 @@ namespace web_package { enum class BundleVersion { - kB1, kB2, }; @@ -30,10 +29,9 @@ class WebBundleBuilder { int64_t length; }; - WebBundleBuilder(const std::string& fallback_url, - const std::string& manifest_url, - BundleVersion version = BundleVersion::kB2, - bool allow_invalid_utf8_strings_for_testing = false); + explicit WebBundleBuilder( + BundleVersion version = BundleVersion::kB2, + bool allow_invalid_utf8_strings_for_testing = false); ~WebBundleBuilder(); @@ -45,11 +43,11 @@ class WebBundleBuilder { base::StringPiece payload); void AddIndexEntry(base::StringPiece url, - base::StringPiece variants_value, - std::vector response_locations); + const ResponseLocation& response_location); void AddSection(base::StringPiece name, cbor::Value section); void AddAuthority(cbor::Value::MapValue authority); void AddVouchedSubset(cbor::Value::MapValue vouched_subset); + void AddPrimaryURL(base::StringPiece url); std::vector CreateBundle(); @@ -71,11 +69,9 @@ class WebBundleBuilder { int64_t EncodedLength(const cbor::Value& value); cbor::Writer::Config writer_config_; - std::string fallback_url_; cbor::Value::ArrayValue section_lengths_; cbor::Value::ArrayValue sections_; - std::map>> - delayed_index_; + std::map delayed_index_; cbor::Value::ArrayValue responses_; cbor::Value::ArrayValue authorities_; cbor::Value::ArrayValue vouched_subsets_; diff --git a/components/web_package/web_bundle_builder_unittest.cc b/components/web_package/web_bundle_builder_unittest.cc index 034b361f25cb32..44491fd67d5ca8 100644 --- a/components/web_package/web_bundle_builder_unittest.cc +++ b/components/web_package/web_bundle_builder_unittest.cc @@ -42,7 +42,7 @@ class WebBundleBuilderTest : public testing::Test { }; TEST_F(WebBundleBuilderTest, CorrectWebBundleSizeIsWritten) { - WebBundleBuilder builder(kFallbackUrl, ""); + WebBundleBuilder builder; builder.AddExchange("https://test.example.com/", {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); @@ -55,7 +55,7 @@ TEST_F(WebBundleBuilderTest, CorrectWebBundleSizeIsWritten) { } TEST_F(WebBundleBuilderTest, ByteByByteComparison) { - WebBundleBuilder builder("", ""); + WebBundleBuilder builder; builder.AddExchange( "https://test.example.org/", {{":status", "200"}, {"content-type", "text/html; charset=UTF-8"}}, @@ -71,7 +71,7 @@ TEST_F(WebBundleBuilderTest, ByteByByteComparison) { } TEST_F(WebBundleBuilderTest, MoreThan23ResponsesInABundle) { - WebBundleBuilder builder("", ""); + WebBundleBuilder builder; for (int i = 0; i < 24; ++i) { builder.AddExchange("https://test.example.org/" + base::NumberToString(i), {{":status", "200"}, {"content-type", "text/html;"}}, diff --git a/components/web_package/web_bundle_parser_unittest.cc b/components/web_package/web_bundle_parser_unittest.cc index 53b23be3ca9079..4095159bf2a6fa 100644 --- a/components/web_package/web_bundle_parser_unittest.cc +++ b/components/web_package/web_bundle_parser_unittest.cc @@ -19,8 +19,7 @@ namespace web_package { namespace { -constexpr char kFallbackUrl[] = "https://test.example.com/"; -constexpr char kManifestUrl[] = "https://test.example.com/manifest"; +constexpr char kPrimaryUrl[] = "https://test.example.com/"; constexpr char kValidityUrl[] = "https://test.example.org/resource.validity.msg"; const uint64_t kSignatureDate = 1564272000; // 2019-07-28T00:00:00Z @@ -152,8 +151,8 @@ std::string AsString(const std::vector& data) { } std::vector CreateSmallBundle() { - web_package::WebBundleBuilder builder(kFallbackUrl, "" /* manifest_url */); - builder.AddExchange(kFallbackUrl, + web_package::WebBundleBuilder builder; + builder.AddExchange(kPrimaryUrl, {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); return builder.CreateBundle(); @@ -167,7 +166,7 @@ class WebBundleParserTest : public testing::Test { }; TEST_F(WebBundleParserTest, WrongMagic) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; std::vector bundle = builder.CreateBundle(); bundle[3] ^= 1; TestDataSource data_source(bundle); @@ -178,9 +177,9 @@ TEST_F(WebBundleParserTest, WrongMagic) { } TEST_F(WebBundleParserTest, UnknownVersion) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; std::vector bundle = builder.CreateBundle(); - // Modify the version string from "b1\0\0" to "q1\0\0". + // Modify the version string from "b2\0\0" to "q2\0\0". ASSERT_EQ(bundle[11], 'b'); bundle[11] = 'q'; TestDataSource data_source(bundle); @@ -191,7 +190,7 @@ TEST_F(WebBundleParserTest, UnknownVersion) { } TEST_F(WebBundleParserTest, SectionLengthsTooLarge) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; std::string too_long_section_name(8192, 'x'); builder.AddSection(too_long_section_name, cbor::Value(0)); TestDataSource data_source(builder.CreateBundle()); @@ -200,7 +199,7 @@ TEST_F(WebBundleParserTest, SectionLengthsTooLarge) { } TEST_F(WebBundleParserTest, DuplicateSectionName) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddSection("foo", cbor::Value(0)); builder.AddSection("foo", cbor::Value(0)); TestDataSource data_source(builder.CreateBundle()); @@ -209,7 +208,7 @@ TEST_F(WebBundleParserTest, DuplicateSectionName) { } TEST_F(WebBundleParserTest, InvalidRequestURL) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange("", {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); TestDataSource data_source(builder.CreateBundle()); @@ -218,8 +217,8 @@ TEST_F(WebBundleParserTest, InvalidRequestURL) { } TEST_F(WebBundleParserTest, RequestURLIsNotUTF8) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl, BundleVersion::kB1, - true); + WebBundleBuilder builder(BundleVersion::kB2, + /*allow_invalid_utf8_strings_for_testing*/ true); builder.AddExchange("https://test.example.com/\xcc", {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); @@ -229,7 +228,7 @@ TEST_F(WebBundleParserTest, RequestURLIsNotUTF8) { } TEST_F(WebBundleParserTest, RequestURLHasBadScheme) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange("file:///tmp/foo", {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); @@ -239,7 +238,7 @@ TEST_F(WebBundleParserTest, RequestURLHasBadScheme) { } TEST_F(WebBundleParserTest, RequestURLHasCredentials) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange("https://user:passwd@test.example.com/", {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); @@ -249,7 +248,7 @@ TEST_F(WebBundleParserTest, RequestURLHasCredentials) { } TEST_F(WebBundleParserTest, RequestURLHasFragment) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange("https://test.example.com/#fragment", {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); @@ -261,7 +260,7 @@ TEST_F(WebBundleParserTest, RequestURLHasFragment) { TEST_F(WebBundleParserTest, RequestURLIsValidUuidInPackage) { const char uuid_in_package[] = "uuid-in-package:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"; - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange(uuid_in_package, {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); @@ -276,7 +275,7 @@ TEST_F(WebBundleParserTest, RequestURLIsValidUuidInPackage) { TEST_F(WebBundleParserTest, RequestURLIsInvalidUuidInPackage) { const char uuid_in_package[] = "uuid-in-package:invalid"; - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange(uuid_in_package, {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); @@ -286,7 +285,7 @@ TEST_F(WebBundleParserTest, RequestURLIsInvalidUuidInPackage) { } TEST_F(WebBundleParserTest, NoStatusInResponseHeaders) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange("https://test.example.com/", {{"content-type", "text/plain"}}, "payload"); // ":status" is missing. @@ -300,7 +299,7 @@ TEST_F(WebBundleParserTest, NoStatusInResponseHeaders) { } TEST_F(WebBundleParserTest, InvalidResponseStatus) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange("https://test.example.com/", {{":status", "0200"}, {"content-type", "text/plain"}}, "payload"); @@ -314,7 +313,7 @@ TEST_F(WebBundleParserTest, InvalidResponseStatus) { } TEST_F(WebBundleParserTest, ExtraPseudoInResponseHeaders) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange( "https://test.example.com/", {{":status", "200"}, {":foo", ""}, {"content-type", "text/plain"}}, @@ -329,7 +328,7 @@ TEST_F(WebBundleParserTest, ExtraPseudoInResponseHeaders) { } TEST_F(WebBundleParserTest, UpperCaseCharacterInHeaderName) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange("https://test.example.com/", {{":status", "200"}, {"Content-Type", "text/plain"}}, "payload"); @@ -343,7 +342,7 @@ TEST_F(WebBundleParserTest, UpperCaseCharacterInHeaderName) { } TEST_F(WebBundleParserTest, InvalidHeaderValue) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange("https://test.example.com/", {{":status", "200"}, {"content-type", "\n"}}, "payload"); TestDataSource data_source(builder.CreateBundle()); @@ -356,7 +355,7 @@ TEST_F(WebBundleParserTest, InvalidHeaderValue) { } TEST_F(WebBundleParserTest, NoContentTypeWithNonEmptyContent) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange("https://test.example.com/", {{":status", "200"}}, "payload"); TestDataSource data_source(builder.CreateBundle()); @@ -369,7 +368,7 @@ TEST_F(WebBundleParserTest, NoContentTypeWithNonEmptyContent) { } TEST_F(WebBundleParserTest, NoContentTypeWithEmptyContent) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange("https://test.example.com/", {{":status", "301"}}, ""); TestDataSource data_source(builder.CreateBundle()); @@ -380,16 +379,8 @@ TEST_F(WebBundleParserTest, NoContentTypeWithEmptyContent) { ASSERT_TRUE(ParseResponse(&data_source, location)); } -TEST_F(WebBundleParserTest, EmptyIndexEntry) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); - builder.AddIndexEntry("https://test.example.com/", "", {}); - TestDataSource data_source(builder.CreateBundle()); - - ExpectFormatError(ParseBundle(&data_source)); -} - TEST_F(WebBundleParserTest, AllKnownSectionInCritical) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange("https://test.example.com/", {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); @@ -405,7 +396,7 @@ TEST_F(WebBundleParserTest, AllKnownSectionInCritical) { } TEST_F(WebBundleParserTest, UnknownSectionInCritical) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange("https://test.example.com/", {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); @@ -418,7 +409,7 @@ TEST_F(WebBundleParserTest, UnknownSectionInCritical) { } TEST_F(WebBundleParserTest, EmptySignaturesSection) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange("https://test.example.com/", {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); @@ -438,7 +429,7 @@ TEST_F(WebBundleParserTest, EmptySignaturesSection) { } TEST_F(WebBundleParserTest, SignaturesSection) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange("https://test.example.com/", {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); @@ -497,7 +488,7 @@ TEST_F(WebBundleParserTest, SignaturesSection) { } TEST_F(WebBundleParserTest, MultipleSignatures) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; builder.AddExchange("https://test.example.com/", {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); @@ -559,36 +550,6 @@ TEST_F(WebBundleParserTest, MultipleSignatures) { TEST_F(WebBundleParserTest, ParseGoldenFile) { TestDataSource data_source(base::FilePath(FILE_PATH_LITERAL("hello_b2.wbn"))); - mojom::BundleMetadataPtr metadata = ParseBundle(&data_source).first; - ASSERT_TRUE(metadata); - ASSERT_EQ(metadata->requests.size(), 4u); - - std::map responses; - for (const auto& item : metadata->requests) { - auto location = FindResponse(metadata, item.first); - ASSERT_TRUE(location); - auto resp = ParseResponse(&data_source, location); - ASSERT_TRUE(resp); - responses[item.first.spec()] = std::move(resp); - } - - ASSERT_TRUE(responses["https://test.example.org/"]); - EXPECT_EQ(responses["https://test.example.org/"]->response_code, 200); - EXPECT_EQ( - responses["https://test.example.org/"]->response_headers["content-type"], - "text/html; charset=utf-8"); - EXPECT_EQ(data_source.GetPayload(responses["https://test.example.org/"]), - GetTestFileContents( - base::FilePath(FILE_PATH_LITERAL("hello/index.html")))); - - EXPECT_TRUE(responses["https://test.example.org/index.html"]); - EXPECT_TRUE(responses["https://test.example.org/manifest.webmanifest"]); - EXPECT_TRUE(responses["https://test.example.org/script.js"]); -} - -TEST_F(WebBundleParserTest, ParseGoldenFileB2Version) { - TestDataSource data_source(base::FilePath(FILE_PATH_LITERAL("hello_b2.wbn"))); - mojom::BundleMetadataPtr metadata = ParseBundle(&data_source).first; ASSERT_TRUE(metadata); ASSERT_EQ(metadata->requests.size(), 4u); @@ -643,7 +604,8 @@ TEST_F(WebBundleParserTest, ParseSignedFile) { } TEST_F(WebBundleParserTest, SingleEntry) { - WebBundleBuilder builder(kFallbackUrl, kManifestUrl); + WebBundleBuilder builder; + builder.AddPrimaryURL(kPrimaryUrl); builder.AddExchange("https://test.example.com/", {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); @@ -661,11 +623,11 @@ TEST_F(WebBundleParserTest, SingleEntry) { EXPECT_EQ(response->response_headers.size(), 1u); EXPECT_EQ(response->response_headers["content-type"], "text/plain"); EXPECT_EQ(data_source.GetPayload(response), "payload"); - EXPECT_EQ(metadata->primary_url, kFallbackUrl); + EXPECT_EQ(metadata->primary_url, kPrimaryUrl); } -TEST_F(WebBundleParserTest, B2BundleNoPrimaryUrlSingleEntry) { - WebBundleBuilder builder("", kManifestUrl, BundleVersion::kB2); +TEST_F(WebBundleParserTest, NoPrimaryUrlSingleEntry) { + WebBundleBuilder builder; builder.AddExchange("https://test.example.com/", {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); @@ -686,8 +648,8 @@ TEST_F(WebBundleParserTest, B2BundleNoPrimaryUrlSingleEntry) { } TEST_F(WebBundleParserTest, RelativeURL) { - WebBundleBuilder builder("path/to/primary_url", "path/to/manifest", - BundleVersion::kB2); + WebBundleBuilder builder; + builder.AddPrimaryURL("path/to/primary_url"); builder.AddExchange("path/to/file.txt", {{":status", "200"}, {"content-type", "text/plain"}}, "payload"); diff --git a/content/browser/web_package/web_bundle_browsertest_base.cc b/content/browser/web_package/web_bundle_browsertest_base.cc index 90b8b0b5f255aa..0f109b8ed1c6f2 100644 --- a/content/browser/web_package/web_bundle_browsertest_base.cc +++ b/content/browser/web_package/web_bundle_browsertest_base.cc @@ -345,7 +345,8 @@ FrameTreeNode* GetFirstChild(WebContents* web_contents) { } std::string CreateSimpleWebBundle(const GURL& primary_url) { - web_package::WebBundleBuilder builder(primary_url.spec(), ""); + web_package::WebBundleBuilder builder; + builder.AddPrimaryURL(primary_url.spec()); builder.AddExchange(primary_url.spec(), {{":status", "200"}, {"content-type", "text/html"}}, "Ready"); @@ -374,8 +375,8 @@ void AddScriptFile(web_package::WebBundleBuilder* builder, std::string CreatePathTestWebBundle(const GURL& base_url) { const std::string primary_url_path = "/web_bundle/path_test/in_scope/"; - web_package::WebBundleBuilder builder( - base_url.Resolve(primary_url_path).spec(), ""); + web_package::WebBundleBuilder builder; + builder.AddPrimaryURL(base_url.Resolve(primary_url_path).spec()); AddHtmlFile(&builder, base_url, primary_url_path, "Ready"); AddHtmlFile( &builder, base_url, "/web_bundle/path_test/in_scope/page.html", @@ -453,8 +454,8 @@ void SetUpSubPageTest(net::EmbeddedTestServer* primary_server, *primary_url_origin = primary_server->GetURL("/"); *third_party_origin = third_party_server->GetURL("/"); - web_package::WebBundleBuilder builder( - primary_url_origin->Resolve("/top").spec(), ""); + web_package::WebBundleBuilder builder; + builder.AddPrimaryURL(primary_url_origin->Resolve("/top").spec()); AddHtmlFile(&builder, *primary_url_origin, "/top", R"( "); @@ -230,7 +231,8 @@ IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, const GURL primary_url = embedded_test_server()->GetURL(primary_url_path); const GURL inner_url = embedded_test_server()->GetURL("/web_bundle/inner.html"); - web_package::WebBundleBuilder builder(primary_url.spec(), ""); + web_package::WebBundleBuilder builder; + builder.AddPrimaryURL(primary_url.spec()); builder.AddExchange(inner_url.spec(), {{":status", "200"}, {"content-type", "text/html"}}, "Ready"); @@ -248,7 +250,7 @@ IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, PrimaryURLNotFound) { const GURL wbn_url = embedded_test_server()->GetURL(wbn_path); const GURL inner_url = embedded_test_server()->GetURL("/web_bundle/inner.html"); - web_package::WebBundleBuilder builder("", ""); + web_package::WebBundleBuilder builder; builder.AddExchange(inner_url.spec(), {{":status", "200"}, {"content-type", "text/html"}}, "Ready"); @@ -715,8 +717,8 @@ IN_PROC_BROWSER_TEST_F(WebBundleNetworkBrowserTest, OutScopeSubPage) { embedded_test_server(), ""); ASSERT_TRUE(embedded_test_server()->Start()); const GURL origin = embedded_test_server()->GetURL("/"); - web_package::WebBundleBuilder builder(origin.Resolve(primary_url_path).spec(), - ""); + web_package::WebBundleBuilder builder; + builder.AddPrimaryURL(origin.Resolve(primary_url_path).spec()); web_bundle_browsertest_utils::AddHtmlFile(&builder, origin, primary_url_path, R"(