Skip to content

Commit

Permalink
Remove b1 format support from WebBundleBuilder
Browse files Browse the repository at this point in the history
This removes the ability to create WebBundles in (obsolete) b1 format
from WebBundleBuilder, and cleans up the WebBundleBuilder interface.

This has no user-visible changes, because WebBundleBuilder is used only
by tests and WebBundleBuilder which already uses the b2 format.

Bug: 1309384
Change-Id: Ia5b758d086f8cf559707588b39f6bd04507be56e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3573799
Reviewed-by: Hayato Ito <hayato@chromium.org>
Reviewed-by: Robert Sesek <rsesek@chromium.org>
Reviewed-by: Reilly Grant <reillyg@chromium.org>
Commit-Queue: Kunihiko Sakamoto <ksakamoto@chromium.org>
Cr-Commit-Position: refs/heads/main@{#991325}
  • Loading branch information
irori authored and Chromium LUCI CQ committed Apr 12, 2022
1 parent 5164a0f commit aa3ebfb
Show file tree
Hide file tree
Showing 13 changed files with 146 additions and 260 deletions.
Expand Up @@ -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<uint8_t> bundle = builder.CreateBundle();
web_bundle = std::string(bundle.begin(), bundle.end());

Expand Down Expand Up @@ -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<uint8_t> bundle = builder.CreateBundle();
web_bundle = std::string(bundle.begin(), bundle.end());

Expand Down Expand Up @@ -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<uint8_t> bundle = builder.CreateBundle();
web_bundle = std::string(bundle.begin(), bundle.end());

Expand Down Expand Up @@ -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"}},
Expand Down
70 changes: 32 additions & 38 deletions chrome/browser/extensions/api/web_request/web_request_apitest.cc
Expand Up @@ -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<uint8_t> bundle = builder.CreateBundle();
web_bundle = std::string(bundle.begin(), bundle.end());

Expand Down Expand Up @@ -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<uint8_t> bundle = builder.CreateBundle();
web_bundle = std::string(bundle.begin(), bundle.end());

Expand Down Expand Up @@ -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<uint8_t> bundle = builder.CreateBundle();
web_bundle = std::string(bundle.begin(), bundle.end());

Expand Down Expand Up @@ -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<uint8_t> bundle = builder.CreateBundle();
web_bundle = std::string(bundle.begin(), bundle.end());

Expand Down Expand Up @@ -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<uint8_t> bundle = builder.CreateBundle();
web_bundle = std::string(bundle.begin(), bundle.end());

Expand Down Expand Up @@ -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"}},
Expand Down
9 changes: 4 additions & 5 deletions chrome/browser/extensions/content_script_apitest.cc
Expand Up @@ -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"}},
"<script>console.error('hoge');</script>");
builder.AddIndexEntry(uuid_html_url, "", {html_location});
web_package::WebBundleBuilder builder;
builder.AddExchange(uuid_html_url,
{{":status", "200"}, {"content-type", "text/html"}},
"<script>console.error('hoge');</script>");
std::vector<uint8_t> bundle = builder.CreateBundle();
const std::string web_bundle = std::string(bundle.begin(), bundle.end());

Expand Down
51 changes: 15 additions & 36 deletions components/web_package/web_bundle_builder.cc
Expand Up @@ -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;

Expand All @@ -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(
Expand All @@ -86,15 +80,8 @@ WebBundleBuilder::ResponseLocation WebBundleBuilder::AddResponse(

void WebBundleBuilder::AddIndexEntry(
base::StringPiece url,
base::StringPiece variants_value,
std::vector<ResponseLocation> 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) {
Expand All @@ -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<uint8_t> 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
Expand All @@ -119,15 +110,10 @@ std::vector<uint8_t> 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)});
}
Expand Down Expand Up @@ -171,14 +157,7 @@ std::vector<uint8_t> 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.
Expand Down

0 comments on commit aa3ebfb

Please sign in to comment.