const base::span<const uint8_t> as_span() const { return bytes_; }
Thought you would want to avoid this per Adam's suggestions?
bool CopyTo(scoped_refptr<net::GrowableIOBuffer> decoded_buffer) const;
Maybe DecodeTo()?
if (base::checked_cast<size_t>(decoded_buffer->capacity()) <
So I wound expect the only reason to use a GrowableIOBuffer in the API (as opposed to a span<>) would be to actually grow it as needed? Otherwise span<> would be a better type to use in the interface.
if (decoding_stream->MayHaveMoreBytes()) {
Ditto re growing the buffer on demand.
CHECK(message->second->CopyTo(decoded_buffer));
Looking at the code, it doesn't look like we can CHECK() here.
int Read(net::IOBuffer* dest_buffer,
Move overrides to private?
nit: there's no need in putting it into a separate file as long there's just one client. Unless you'd like to write a unit test for it that is ;-)
auto source_span = msg_->as_span();
Looks like you don't really need the entire message? Perhaps pass just the span?
bytes_read_ += consume;
Once you start storing and not the message (`span<const uint8_t> remaining_bytes_`), you can just do `remaining_bytes_.remove_prefix(consume);` here to simplify all the math (and ditch `bytes_read_`)
!response_->client_side_content_decoding_types.empty()) {
Ditch this check perhaps for simplicity?
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio=
Maybe to atob() on the output so it's more evident it's correct?
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
const base::span<const uint8_t> as_span() const { return bytes_; }
Thought you would want to avoid this per Adam's suggestions?
Done
bool CopyTo(scoped_refptr<net::GrowableIOBuffer> decoded_buffer) const;
Alex N. JoseMaybe DecodeTo()?
Marked as resolved, renamed back to `Retrieve`
if (base::checked_cast<size_t>(decoded_buffer->capacity()) <
So I wound expect the only reason to use a GrowableIOBuffer in the API (as opposed to a span<>) would be to actually grow it as needed? Otherwise span<> would be a better type to use in the interface.
Done
Ditto re growing the buffer on demand.
Done
Looking at the code, it doesn't look like we can CHECK() here.
Done
int Read(net::IOBuffer* dest_buffer,
Move overrides to private?
They seem to be public methods per net/filter/source_stream.h
nit: there's no need in putting it into a separate file as long there's just one client. Unless you'd like to write a unit test for it that is ;-)
Done
Looks like you don't really need the entire message? Perhaps pass just the span?
Done
bytes_read_ += consume;
Once you start storing and not the message (`span<const uint8_t> remaining_bytes_`), you can just do `remaining_bytes_.remove_prefix(consume);` here to simplify all the math (and ditch `bytes_read_`)
That API isn't available in base::span.
!response_->client_side_content_decoding_types.empty()) {
Ditch this check perhaps for simplicity?
Done
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio=
Maybe to atob() on the output so it's more evident it's correct?
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
@ca...@chromium.org, @ri...@chromium.org,
This CL follows up on the base implementation, to add decoding on retrieval. Could I get your review of this CL?
Thanks!
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
Looks mostly good to me!
size_t byte_size() const { return bytes_.size(); }
Does this one still make sense?
size_t bytes_read_ = 0;
Can we ditch this and just do `encoded_bytes_ = encoded_bytes_.subspan(bytes_read)` as we go? Basically, at any moment the encoded_bytes_ keeps the remaining bytes to be read.
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
size_t byte_size() const { return bytes_.size(); }
Does this one still make sense?
It's used in tests only. Perhaps make this `_for_testing`?
Can we ditch this and just do `encoded_bytes_ = encoded_bytes_.subspan(bytes_read)` as we go? Basically, at any moment the encoded_bytes_ keeps the remaining bytes to be read.
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
Code-Review | +1 |
size_t byte_size() const { return bytes_.size(); }
Alex N. JoseDoes this one still make sense?
It's used in tests only. Perhaps make this `_for_testing`?
sgtm!
encoded_bytes_ = encoded_bytes_.subspan(consume);
nit: [`base::span::split_at()`](https://source.chromium.org/chromium/chromium/src/+/main:base/containers/span.h;l=763) may be useful here.
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
size_t byte_size() const { return bytes_.size(); }
Alex N. JoseDoes this one still make sense?
It's used in tests only. Perhaps make this `_for_testing`?
Done
nit: [`base::span::split_at()`](https://source.chromium.org/chromium/chromium/src/+/main:base/containers/span.h;l=763) may be useful here.
Done
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
Adding an additional network service owner to spread the review load.
reillyg@, could I get your review of the network service changes in this CL?
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
std::vector<net::SourceStreamType> GetClientDecodingTypesForTesting() {
```suggestion
const std::vector<net::SourceStreamType>& GetClientDecodingTypesForTesting() {
```
int compressed_size = compressed.size();
ASSERT_EQ(accounting_delegate.size(), compressed_size);
ASSERT_EQ(durable_message.encoded_byte_size(),
static_cast<size_t>(compressed_size));
ASSERT_EQ(durable_message.byte_size_for_testing(),
static_cast<size_t>(compressed_size));
Why are conversions necessary here? `compressed.size()` is already `size_t`.
```suggestion
size_t compressed_size = compressed.size();
ASSERT_EQ(accounting_delegate.size(), compressed_size);
ASSERT_EQ(durable_message.encoded_byte_size(), compressed_size);
ASSERT_EQ(durable_message.byte_size_for_testing(), compressed_size);
```
ASSERT_EQ(accounting_delegate.size(),
static_cast<int64_t>(kGzippedBodyLength));
Why are conversions necessary here? Both values are already `size_t`.
```suggestion
ASSERT_EQ(accounting_delegate.size(), kGzippedBodyLength);
```
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
std::vector<net::SourceStreamType> GetClientDecodingTypesForTesting() {
```suggestion
const std::vector<net::SourceStreamType>& GetClientDecodingTypesForTesting() {
```
Done
int compressed_size = compressed.size();
ASSERT_EQ(accounting_delegate.size(), compressed_size);
ASSERT_EQ(durable_message.encoded_byte_size(),
static_cast<size_t>(compressed_size));
ASSERT_EQ(durable_message.byte_size_for_testing(),
static_cast<size_t>(compressed_size));
Why are conversions necessary here? `compressed.size()` is already `size_t`.
```suggestion
size_t compressed_size = compressed.size();
ASSERT_EQ(accounting_delegate.size(), compressed_size);
ASSERT_EQ(durable_message.encoded_byte_size(), compressed_size);
ASSERT_EQ(durable_message.byte_size_for_testing(), compressed_size);
```
I've switched the cast to `accounting_delegate.size()` given the majority of comparisons operate over `size_t`.
ASSERT_EQ(accounting_delegate.size(),
static_cast<int64_t>(kGzippedBodyLength));
Why are conversions necessary here? Both values are already `size_t`.
```suggestion
ASSERT_EQ(accounting_delegate.size(), kGzippedBodyLength);
```
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
ASSERT_EQ(accounting_delegate.size(),
static_cast<int64_t>(kGzippedBodyLength));
Alex N. JoseWhy are conversions necessary here? Both values are already `size_t`.
```suggestion
ASSERT_EQ(accounting_delegate.size(), kGzippedBodyLength);
```
`accounting_delegate.size()` is `int64_t`.
For additional context, `MockDurableMessageAccountingDelegate` keeps the size counter variable as `int64_t`, so it can effectively catch potential accounting errors.
Code-Review | +1 |
ASSERT_EQ(accounting_delegate.size(),
static_cast<int64_t>(kGzippedBodyLength));
Alex N. JoseWhy are conversions necessary here? Both values are already `size_t`.
```suggestion
ASSERT_EQ(accounting_delegate.size(), kGzippedBodyLength);
```
`accounting_delegate.size()` is `int64_t`.
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
Commit-Queue | +2 |
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
16 is the latest approved patch-set.
The change was submitted with unreviewed changes in the following files:
```
The name of the file: third_party/blink/web_tests/http/tests/inspector-protocol/network/get-durable-response-gzip-body.js
Insertions: 1, Deletions: 3.
@@ -9,7 +9,7 @@
session.evaluate(`fetch("${resourceUrl}").then(r => r.text());`);
const requestWillBeSent = (await dp.Network.onceRequestWillBeSent()).params;
testRunner.log(`Request for ${requestWillBeSent.request.url}`);
- await dp.Network.onceResponseReceived();
+ await dp.Network.onceLoadingFinished();
const resourceRequestId = requestWillBeSent.requestId;
testRunner.log('-- Test Page.navigate() to a cross origin URL --');
@@ -20,5 +20,3 @@
testRunner.completeTest();
})
-
-
```
Decode collected Durable Messages on retrieval
This is a follow up CL to crrev.com/c/6876126.
This CL implements DurableMessageEncodedSourceStream to decode response
bodies on retrieval, if they were marked for client side decoding by
the network service.
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |
Code-Review | +1 |
void SetClientDecodingTypes(std::vector<net::SourceStreamType> types) {
Nit: `set_client_decoding_types` would be a more natural name for this, as it is trivial and inline.
#include "mojo/public/cpp/base/big_buffer.h"
Nit: you could predeclare `mojo_base::BigBuffer` as it is only used as a return type.
if (consume <= 0) {
Nit: `consume` is a `size_t`. It cannot be < 0, so this condition should be `(consume == 0)`.
auto split_buffer = encoded_bytes_.split_at(consume);
dest_buffer->span().copy_prefix_from(split_buffer.first);
encoded_bytes_ = split_buffer.second;
I think it's always good to use structured binding with `split_at`.
```suggestion
auto [used_portion, unused_portion] = encoded_bytes_.split_at(consume);
dest_buffer->span().copy_prefix_from(used_portion);
encoded_bytes_ = unused_portion;
```
break;
You should add
```
CHECK_NE(result, ERR_IO_PENDING);
```
so that if someone makes a `FilterSourceStream` that decompresses asynchronously (on another thread, for example), then it will crash noisily.
size_t kGzippedBodyLength = 60;
Constants should be `static constexpr`.
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. |