Commit e0eac774 authored by Adam Rice's avatar Adam Rice Committed by Commit Bot

Always use backpressure for fetch

Previously, backpressure would only be applied to fetch responses if the
Cache-Control: no-store header was set. This was to avoid blocking other
resource loads that might have to wait for the lock on the http disk
cache that was held by the resource load to which backpressure was being
applied.

As of https://chromium-review.googlesource.com/684615 the disk cache
supports multiple concurrent writers and so this protection is no longer
needed.

Remove support for the non-backpressure mode and always apply
backpressure.

The fact that the body is no longer implicitly read is visible
to tests that observe the result of the fetch() via a side
channel, specifically inspector and browser tests. Fix such tests
to explicitly read the body to completion.

Additionally, in order to satisfy the presubmit check, make
SharedMemoryDataConsumerHandle::Context::on_reader_detached_ a
OnceClosure.

The implementation already implicitly ran on_reader_detached_ at most
once, because is_on_reader_detached_valid_ would be set to false by
ResetOnReaderDetached immediately after PostTask was called. Now this
has been made explicit by using OnceClosure.

on_reader_detached_ is only reset on the writer_task_runner_
thread. When the closure is not run this is implemented by the logic in
ResetOnReaderDetached(), the same as before. When the closure is run the
behaviour has changed slightly: the OnceClosure is moved into the task
that is posted to the writer_task_runner_ thread, where it will be
destroyed automatically after running. There's no nead for a separate
reset in this case.

BUG=535793

Change-Id: I9d2b58e183b84640afc153ac99de08fdc2368240
Reviewed-on: https://chromium-review.googlesource.com/861695
Commit-Queue: Adam Rice <ricea@chromium.org>
Reviewed-by: default avatarYutaka Hirano <yhirano@chromium.org>
Cr-Commit-Position: refs/heads/master@{#530070}
parent baee31aa
......@@ -22,10 +22,11 @@ function send_fetch() {
// Pretend like auth succeeded by hiding the login and signup forms.
document.getElementById("testform").style.display = "none";
document.getElementById("signup_testform").style.display = "none";
// Delay upload so that handler in PasswordAutofillAgent can be run
// first. This will happen immediately after JS execution ends, so
// this shouldn't introduce any timing dependent flakes.
setTimeout(delayedUpload, 0);
// Finish loading the body of the response and then give
// PasswordAutofillAgent a chance to run before upload. It will run as
// soon as JS execution ends, so this shouldn't introduce any timing
// dependent flakes.
response.arrayBuffer().then(() => setTimeout(delayedUpload, 0));
}
}
)
......
......@@ -54,12 +54,12 @@ using Result = blink::WebDataConsumerHandle::Result;
class SharedMemoryDataConsumerHandle::Context final
: public base::RefCountedThreadSafe<Context> {
public:
explicit Context(const base::Closure& on_reader_detached)
explicit Context(base::OnceClosure on_reader_detached)
: result_(kOk),
first_offset_(0),
client_(nullptr),
writer_task_runner_(base::ThreadTaskRunnerHandle::Get()),
on_reader_detached_(on_reader_detached),
on_reader_detached_(std::move(on_reader_detached)),
is_on_reader_detached_valid_(!on_reader_detached_.is_null()),
is_handle_active_(true),
is_two_phase_read_in_progress_(false) {}
......@@ -76,7 +76,9 @@ class SharedMemoryDataConsumerHandle::Context final
// We post a task even in the writer thread in order to avoid a
// reentrance problem as calling |on_reader_detached_| may manipulate
// the context synchronously.
writer_task_runner_->PostTask(FROM_HERE, on_reader_detached_);
is_on_reader_detached_valid_ = false;
writer_task_runner_->PostTask(FROM_HERE,
std::move(on_reader_detached_));
}
Clear();
}
......@@ -250,7 +252,7 @@ class SharedMemoryDataConsumerHandle::Context final
Client* client_;
scoped_refptr<base::SingleThreadTaskRunner> notification_task_runner_;
scoped_refptr<base::SingleThreadTaskRunner> writer_task_runner_;
base::Closure on_reader_detached_;
base::OnceClosure on_reader_detached_;
// We need this boolean variable to remember if |on_reader_detached_| is
// callable because we need to reset |on_reader_detached_| only on the writer
// thread and hence |on_reader_detached_.is_null()| is untrustworthy on
......@@ -263,10 +265,8 @@ class SharedMemoryDataConsumerHandle::Context final
};
SharedMemoryDataConsumerHandle::Writer::Writer(
const scoped_refptr<Context>& context,
BackpressureMode mode)
: context_(context), mode_(mode) {
}
const scoped_refptr<Context>& context)
: context_(context) {}
SharedMemoryDataConsumerHandle::Writer::~Writer() {
Close();
......@@ -290,14 +290,8 @@ void SharedMemoryDataConsumerHandle::Writer::AddData(
}
needs_notification = context_->IsEmpty();
std::unique_ptr<RequestPeer::ThreadSafeReceivedData> data_to_pass;
if (mode_ == kApplyBackpressure) {
data_to_pass =
std::make_unique<DelegateThreadSafeReceivedData>(std::move(data));
} else {
data_to_pass = std::make_unique<FixedReceivedData>(data.get());
}
context_->Push(std::move(data_to_pass));
context_->Push(
std::make_unique<DelegateThreadSafeReceivedData>(std::move(data)));
}
if (needs_notification) {
......@@ -436,16 +430,14 @@ Result SharedMemoryDataConsumerHandle::ReaderImpl::EndRead(size_t read_size) {
}
SharedMemoryDataConsumerHandle::SharedMemoryDataConsumerHandle(
BackpressureMode mode,
std::unique_ptr<Writer>* writer)
: SharedMemoryDataConsumerHandle(mode, base::Closure(), writer) {}
: SharedMemoryDataConsumerHandle(base::OnceClosure(), writer) {}
SharedMemoryDataConsumerHandle::SharedMemoryDataConsumerHandle(
BackpressureMode mode,
const base::Closure& on_reader_detached,
base::OnceClosure on_reader_detached,
std::unique_ptr<Writer>* writer)
: context_(new Context(on_reader_detached)) {
writer->reset(new Writer(context_, mode));
: context_(new Context(std::move(on_reader_detached))) {
writer->reset(new Writer(context_));
}
SharedMemoryDataConsumerHandle::~SharedMemoryDataConsumerHandle() {
......
......@@ -25,14 +25,9 @@ class CONTENT_EXPORT SharedMemoryDataConsumerHandle final
class Context;
public:
enum BackpressureMode {
kApplyBackpressure,
kDoNotApplyBackpressure,
};
class CONTENT_EXPORT Writer final {
public:
Writer(const scoped_refptr<Context>& context, BackpressureMode mode);
explicit Writer(const scoped_refptr<Context>& context);
~Writer();
// Note: Writer assumes |AddData| is not called in a client's didGetReadable
// callback. There isn't such assumption for |Close| and |Fail|.
......@@ -43,7 +38,6 @@ class CONTENT_EXPORT SharedMemoryDataConsumerHandle final
private:
scoped_refptr<Context> context_;
BackpressureMode mode_;
DISALLOW_COPY_AND_ASSIGN(Writer);
};
......@@ -69,15 +63,13 @@ class CONTENT_EXPORT SharedMemoryDataConsumerHandle final
// Creates a handle and a writer associated with the handle. The created
// writer should be used on the calling thread.
SharedMemoryDataConsumerHandle(BackpressureMode mode,
std::unique_ptr<Writer>* writer);
explicit SharedMemoryDataConsumerHandle(std::unique_ptr<Writer>* writer);
// |on_reader_detached| will be called aynchronously on the calling thread
// when the reader (including the handle) is detached (i.e. both the handle
// and the reader are destructed). The callback will be reset in the internal
// context when the writer is detached, i.e. |Close| or |Fail| is called,
// and the callback will never be called.
SharedMemoryDataConsumerHandle(BackpressureMode mode,
const base::Closure& on_reader_detached,
SharedMemoryDataConsumerHandle(base::OnceClosure on_reader_detached,
std::unique_ptr<Writer>* writer);
~SharedMemoryDataConsumerHandle() override;
......
......@@ -34,11 +34,6 @@ namespace {
using blink::WebDataConsumerHandle;
using Result = WebDataConsumerHandle::Result;
using Writer = SharedMemoryDataConsumerHandle::Writer;
using BackpressureMode = SharedMemoryDataConsumerHandle::BackpressureMode;
const BackpressureMode kApplyBackpressure =
SharedMemoryDataConsumerHandle::kApplyBackpressure;
const BackpressureMode kDoNotApplyBackpressure =
SharedMemoryDataConsumerHandle::kDoNotApplyBackpressure;
const WebDataConsumerHandle::Flags kNone = WebDataConsumerHandle::kFlagNone;
const Result kOk = WebDataConsumerHandle::kOk;
......@@ -181,8 +176,7 @@ class ThreadedSharedMemoryDataConsumerHandleTest : public ::testing::Test {
};
void SetUp() override {
handle_.reset(
new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer_));
handle_.reset(new SharedMemoryDataConsumerHandle(&writer_));
}
StrictMock<MockClient> client_;
......@@ -191,11 +185,10 @@ class ThreadedSharedMemoryDataConsumerHandleTest : public ::testing::Test {
base::MessageLoop loop_;
};
class SharedMemoryDataConsumerHandleTest
: public ::testing::TestWithParam<BackpressureMode> {
class SharedMemoryDataConsumerHandleTest : public ::testing::Test {
protected:
void SetUp() override {
handle_.reset(new SharedMemoryDataConsumerHandle(GetParam(), &writer_));
handle_.reset(new SharedMemoryDataConsumerHandle(&writer_));
}
std::unique_ptr<FixedReceivedData> NewFixedData(const char* s) {
return std::make_unique<FixedReceivedData>(s, strlen(s));
......@@ -214,7 +207,7 @@ void RunPostedTasks() {
run_loop.Run();
}
TEST_P(SharedMemoryDataConsumerHandleTest, ReadFromEmpty) {
TEST_F(SharedMemoryDataConsumerHandleTest, ReadFromEmpty) {
char buffer[4];
size_t read = 88;
auto reader = handle_->ObtainReader(nullptr);
......@@ -224,7 +217,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, ReadFromEmpty) {
EXPECT_EQ(0u, read);
}
TEST_P(SharedMemoryDataConsumerHandleTest, AutoClose) {
TEST_F(SharedMemoryDataConsumerHandleTest, AutoClose) {
char buffer[4];
size_t read = 88;
......@@ -236,7 +229,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, AutoClose) {
EXPECT_EQ(0u, read);
}
TEST_P(SharedMemoryDataConsumerHandleTest, ReadSimple) {
TEST_F(SharedMemoryDataConsumerHandleTest, ReadSimple) {
writer_->AddData(NewFixedData("hello"));
char buffer[4] = {};
......@@ -264,7 +257,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, ReadSimple) {
EXPECT_EQ(0u, read);
}
TEST_P(SharedMemoryDataConsumerHandleTest, ReadAfterHandleIsGone) {
TEST_F(SharedMemoryDataConsumerHandleTest, ReadAfterHandleIsGone) {
writer_->AddData(NewFixedData("hello"));
char buffer[8] = {};
......@@ -290,7 +283,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, ReadAfterHandleIsGone) {
EXPECT_EQ(0u, read);
}
TEST_P(SharedMemoryDataConsumerHandleTest, ReObtainReader) {
TEST_F(SharedMemoryDataConsumerHandleTest, ReObtainReader) {
writer_->AddData(NewFixedData("hello"));
char buffer[4] = {};
......@@ -321,7 +314,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, ReObtainReader) {
EXPECT_EQ(0u, read);
}
TEST_P(SharedMemoryDataConsumerHandleTest, CloseBeforeReading) {
TEST_F(SharedMemoryDataConsumerHandleTest, CloseBeforeReading) {
writer_->AddData(NewFixedData("hello"));
writer_->Close();
......@@ -339,7 +332,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, CloseBeforeReading) {
EXPECT_EQ(0u, read);
}
TEST_P(SharedMemoryDataConsumerHandleTest, CloseWithDataBeforeZeroRead) {
TEST_F(SharedMemoryDataConsumerHandleTest, CloseWithDataBeforeZeroRead) {
writer_->AddData(NewFixedData("hello"));
writer_->Close();
......@@ -351,7 +344,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, CloseWithDataBeforeZeroRead) {
EXPECT_EQ(0u, read);
}
TEST_P(SharedMemoryDataConsumerHandleTest, CloseWithoutDataBeforeZeroRead) {
TEST_F(SharedMemoryDataConsumerHandleTest, CloseWithoutDataBeforeZeroRead) {
writer_->Close();
size_t read = 88;
......@@ -361,7 +354,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, CloseWithoutDataBeforeZeroRead) {
EXPECT_EQ(kDone, result);
}
TEST_P(SharedMemoryDataConsumerHandleTest, AddMultipleData) {
TEST_F(SharedMemoryDataConsumerHandleTest, AddMultipleData) {
writer_->AddData(NewFixedData("Once "));
writer_->AddData(NewFixedData("upon "));
writer_->AddData(NewFixedData("a "));
......@@ -411,7 +404,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, AddMultipleData) {
EXPECT_EQ(0u, read);
}
TEST_P(SharedMemoryDataConsumerHandleTest, AddMultipleDataInteractively) {
TEST_F(SharedMemoryDataConsumerHandleTest, AddMultipleDataInteractively) {
writer_->AddData(NewFixedData("Once "));
writer_->AddData(NewFixedData("upon "));
......@@ -469,7 +462,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, AddMultipleDataInteractively) {
EXPECT_EQ(0u, read);
}
TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClient) {
TEST_F(SharedMemoryDataConsumerHandleTest, RegisterClient) {
Checkpoint checkpoint;
InSequence s;
......@@ -491,7 +484,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClient) {
checkpoint.Call(4);
}
TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClientWhenDataExists) {
TEST_F(SharedMemoryDataConsumerHandleTest, RegisterClientWhenDataExists) {
Checkpoint checkpoint;
InSequence s;
......@@ -510,7 +503,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClientWhenDataExists) {
checkpoint.Call(3);
}
TEST_P(SharedMemoryDataConsumerHandleTest, AddDataWhenClientIsRegistered) {
TEST_F(SharedMemoryDataConsumerHandleTest, AddDataWhenClientIsRegistered) {
Checkpoint checkpoint;
char buffer[20];
Result result;
......@@ -541,7 +534,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, AddDataWhenClientIsRegistered) {
checkpoint.Call(5);
}
TEST_P(SharedMemoryDataConsumerHandleTest, CloseWithClientAndData) {
TEST_F(SharedMemoryDataConsumerHandleTest, CloseWithClientAndData) {
Checkpoint checkpoint;
InSequence s;
......@@ -560,7 +553,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, CloseWithClientAndData) {
checkpoint.Call(3);
}
TEST_P(SharedMemoryDataConsumerHandleTest, ReleaseReader) {
TEST_F(SharedMemoryDataConsumerHandleTest, ReleaseReader) {
Checkpoint checkpoint;
InSequence s;
......@@ -576,7 +569,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, ReleaseReader) {
checkpoint.Call(2);
}
TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadShouldWait) {
TEST_F(SharedMemoryDataConsumerHandleTest, TwoPhaseReadShouldWait) {
Result result;
const void* buffer = &result;
size_t size = 99;
......@@ -588,7 +581,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadShouldWait) {
EXPECT_EQ(0u, size);
}
TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadSimple) {
TEST_F(SharedMemoryDataConsumerHandleTest, TwoPhaseReadSimple) {
writer_->AddData(NewFixedData("Once "));
Result result;
......@@ -623,7 +616,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadSimple) {
EXPECT_EQ(nullptr, buffer);
}
TEST_P(SharedMemoryDataConsumerHandleTest, CallOnClearWhenDestructed1) {
TEST_F(SharedMemoryDataConsumerHandleTest, CallOnClearWhenDestructed1) {
// Call |on_clear| when the handle is gone and if there is no reader.
Checkpoint checkpoint;
scoped_refptr<DestructionTrackingFunction> on_clear(
......@@ -638,7 +631,6 @@ TEST_P(SharedMemoryDataConsumerHandleTest, CallOnClearWhenDestructed1) {
checkpoint.Call(0);
handle_.reset(new SharedMemoryDataConsumerHandle(
kApplyBackpressure,
base::Bind(&DestructionTrackingFunction::Call, on_clear), &writer_));
handle_.reset();
on_clear = nullptr;
......@@ -647,7 +639,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, CallOnClearWhenDestructed1) {
checkpoint.Call(2);
}
TEST_P(SharedMemoryDataConsumerHandleTest, CallOnClearWhenDestructed2) {
TEST_F(SharedMemoryDataConsumerHandleTest, CallOnClearWhenDestructed2) {
// Call |on_clear| when the reader is gone if the handle is alredy gone.
Checkpoint checkpoint;
scoped_refptr<DestructionTrackingFunction> on_clear(
......@@ -664,7 +656,6 @@ TEST_P(SharedMemoryDataConsumerHandleTest, CallOnClearWhenDestructed2) {
checkpoint.Call(0);
handle_.reset(new SharedMemoryDataConsumerHandle(
kApplyBackpressure,
base::Bind(&DestructionTrackingFunction::Call, on_clear), &writer_));
auto reader = handle_->ObtainReader(nullptr);
handle_.reset();
......@@ -678,7 +669,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, CallOnClearWhenDestructed2) {
checkpoint.Call(4);
}
TEST_P(SharedMemoryDataConsumerHandleTest, DoNotCallOnClearWhenDone) {
TEST_F(SharedMemoryDataConsumerHandleTest, DoNotCallOnClearWhenDone) {
Checkpoint checkpoint;
scoped_refptr<DestructionTrackingFunction> on_clear(
new StrictMock<DestructionTrackingFunction>);
......@@ -693,7 +684,6 @@ TEST_P(SharedMemoryDataConsumerHandleTest, DoNotCallOnClearWhenDone) {
checkpoint.Call(0);
handle_.reset(new SharedMemoryDataConsumerHandle(
kApplyBackpressure,
base::Bind(&DestructionTrackingFunction::Call, on_clear), &writer_));
on_clear = nullptr;
checkpoint.Call(1);
......@@ -705,7 +695,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, DoNotCallOnClearWhenDone) {
checkpoint.Call(4);
}
TEST_P(SharedMemoryDataConsumerHandleTest, DoNotCallOnClearWhenErrored) {
TEST_F(SharedMemoryDataConsumerHandleTest, DoNotCallOnClearWhenErrored) {
Checkpoint checkpoint;
scoped_refptr<DestructionTrackingFunction> on_clear(
new StrictMock<DestructionTrackingFunction>);
......@@ -720,7 +710,6 @@ TEST_P(SharedMemoryDataConsumerHandleTest, DoNotCallOnClearWhenErrored) {
checkpoint.Call(0);
handle_.reset(new SharedMemoryDataConsumerHandle(
kApplyBackpressure,
base::Bind(&DestructionTrackingFunction::Call, on_clear), &writer_));
on_clear = nullptr;
checkpoint.Call(1);
......@@ -732,7 +721,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, DoNotCallOnClearWhenErrored) {
checkpoint.Call(4);
}
TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadWithMultipleData) {
TEST_F(SharedMemoryDataConsumerHandleTest, TwoPhaseReadWithMultipleData) {
writer_->AddData(NewFixedData("Once "));
writer_->AddData(NewFixedData("upon "));
......@@ -775,7 +764,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadWithMultipleData) {
EXPECT_EQ(nullptr, buffer);
}
TEST_P(SharedMemoryDataConsumerHandleTest, ErrorRead) {
TEST_F(SharedMemoryDataConsumerHandleTest, ErrorRead) {
Checkpoint checkpoint;
Result result;
char buffer[20] = {};
......@@ -789,7 +778,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, ErrorRead) {
EXPECT_EQ(0u, read);
}
TEST_P(SharedMemoryDataConsumerHandleTest, ErrorTwoPhaseRead) {
TEST_F(SharedMemoryDataConsumerHandleTest, ErrorTwoPhaseRead) {
Result result;
const void* pointer = &result;
size_t size = 99;
......@@ -803,7 +792,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, ErrorTwoPhaseRead) {
EXPECT_EQ(0u, size);
}
TEST_P(SharedMemoryDataConsumerHandleTest, FailWhileTwoPhaseReadIsInProgress) {
TEST_F(SharedMemoryDataConsumerHandleTest, FailWhileTwoPhaseReadIsInProgress) {
Result result;
const void* pointer = nullptr;
size_t size = 0;
......@@ -832,7 +821,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, FailWhileTwoPhaseReadIsInProgress) {
EXPECT_EQ(kUnexpectedError, reader->BeginRead(&pointer, kNone, &size));
}
TEST_P(SharedMemoryDataConsumerHandleTest, FailWithClient) {
TEST_F(SharedMemoryDataConsumerHandleTest, FailWithClient) {
Checkpoint checkpoint;
InSequence s;
......@@ -851,7 +840,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, FailWithClient) {
checkpoint.Call(3);
}
TEST_P(SharedMemoryDataConsumerHandleTest, FailWithClientAndData) {
TEST_F(SharedMemoryDataConsumerHandleTest, FailWithClientAndData) {
Checkpoint checkpoint;
InSequence s;
......@@ -874,7 +863,7 @@ TEST_P(SharedMemoryDataConsumerHandleTest, FailWithClientAndData) {
checkpoint.Call(4);
}
TEST_P(SharedMemoryDataConsumerHandleTest, RecursiveErrorNotification) {
TEST_F(SharedMemoryDataConsumerHandleTest, RecursiveErrorNotification) {
Checkpoint checkpoint;
InSequence s;
......@@ -902,8 +891,7 @@ TEST(SharedMemoryDataConsumerHandleBackpressureTest, Read) {
size_t size;
std::unique_ptr<Writer> writer;
auto handle = std::make_unique<SharedMemoryDataConsumerHandle>(
kApplyBackpressure, &writer);
auto handle = std::make_unique<SharedMemoryDataConsumerHandle>(&writer);
scoped_refptr<Logger> logger(new Logger);
writer->AddData(
std::make_unique<LoggingFixedReceivedData>("data1", "Once ", logger));
......@@ -947,8 +935,7 @@ TEST(SharedMemoryDataConsumerHandleBackpressureTest, CloseAndReset) {
size_t size;
std::unique_ptr<Writer> writer;
auto handle = std::make_unique<SharedMemoryDataConsumerHandle>(
kApplyBackpressure, &writer);
auto handle = std::make_unique<SharedMemoryDataConsumerHandle>(&writer);
scoped_refptr<Logger> logger(new Logger);
writer->AddData(
std::make_unique<LoggingFixedReceivedData>("data1", "Once ", logger));
......@@ -987,30 +974,6 @@ TEST(SharedMemoryDataConsumerHandleBackpressureTest, CloseAndReset) {
EXPECT_EQ(destruction_entries[2], "data3 is destructed.");
}
TEST(SharedMemoryDataConsumerHandleWithoutBackpressureTest, AddData) {
base::MessageLoop loop;
std::unique_ptr<Writer> writer;
auto handle = std::make_unique<SharedMemoryDataConsumerHandle>(
kDoNotApplyBackpressure, &writer);
scoped_refptr<Logger> logger(new Logger);
logger->Add("1");
writer->AddData(
std::make_unique<LoggingFixedReceivedData>("data1", "Once ", logger));
logger->Add("2");
writer->AddData(
std::make_unique<LoggingFixedReceivedData>("data2", "upon ", logger));
logger->Add("3");
EXPECT_EQ(
"1\n"
"data1 is destructed.\n"
"2\n"
"data2 is destructed.\n"
"3\n",
logger->log());
}
TEST_F(ThreadedSharedMemoryDataConsumerHandleTest, Read) {
base::RunLoop run_loop;
auto operation = std::make_unique<ReadDataOperation>(
......@@ -1053,10 +1016,6 @@ TEST_F(ThreadedSharedMemoryDataConsumerHandleTest, Read) {
logger->log());
}
INSTANTIATE_TEST_CASE_P(SharedMemoryDataConsumerHandleTest,
SharedMemoryDataConsumerHandleTest,
::testing::Values(kApplyBackpressure,
kDoNotApplyBackpressure));
} // namespace
} // namespace content
......@@ -849,15 +849,8 @@ void WebURLLoaderImpl::Context::OnReceivedResponse(
}
if (use_stream_on_response_) {
SharedMemoryDataConsumerHandle::BackpressureMode mode =
SharedMemoryDataConsumerHandle::kDoNotApplyBackpressure;
if (info.headers &&
info.headers->HasHeaderValue("Cache-Control", "no-store")) {
mode = SharedMemoryDataConsumerHandle::kApplyBackpressure;
}
auto read_handle = std::make_unique<SharedMemoryDataConsumerHandle>(
mode, base::Bind(&Context::CancelBodyStreaming, this),
base::BindOnce(&Context::CancelBodyStreaming, this),
&body_stream_writer_);
// Here |body_stream_writer_| has an indirect reference to |this| and that
......
......@@ -10,7 +10,8 @@ p { font-family: 'test'; }
<img src="missing-image.png">
<script>
function doXHR() {
return fetch('extensions-network.html');
return fetch('extensions-network.html')
.then(response => response.arrayBuffer());
}
</script>
<p>some text.</p>
......
......@@ -11,7 +11,8 @@
async function logResponse(url, encoding, quality, sizeOnly) {
testRunner.log(`\nResults for ${url} encoding=${encoding} q=${quality} sizeOnly=${sizeOnly}`);
session.evaluate(`fetch(${JSON.stringify(url)})`);
session.evaluate(`fetch(${JSON.stringify(url)})
.then(response => response.arrayBuffer())`);
const requestId = (await dp.Network.onceResponseReceived()).params.requestId;
const result = (await dp.Audits.getEncodedResponse({requestId, encoding, quality, sizeOnly})).result;
......
......@@ -10,7 +10,9 @@
var pendingRequests = 0;
function sendRequest(url) {
dp.Runtime.evaluate({expression: `fetch('${url}')`});
dp.Runtime.evaluate({expression: `
fetch('${url}')
.then(response => response.arrayBuffer())`});
pendingRequests++;
}
......
......@@ -5,7 +5,8 @@
await dp.Network.enable();
async function logResponseBody(url) {
session.evaluate(`fetch(${JSON.stringify(url)});`);
session.evaluate(`fetch(${JSON.stringify(url)})
.then(response => response.arrayBuffer())`);
var requestWillBeSent = (await dp.Network.onceRequestWillBeSent()).params;
testRunner.log(`Request for ${requestWillBeSent.request.url}`);
......
......@@ -5,7 +5,8 @@
dp.Network.enable();
await dp.Network.setExtraHTTPHeaders({headers: {'ReFeReR': 'https://127.0.0.1:8000/'}});
session.evaluate(`fetch('${testRunner.url('./resources/echo-headers.php?headers=HTTP_REFERER')}')`);
session.evaluate(`fetch('${testRunner.url('./resources/echo-headers.php?headers=HTTP_REFERER')}')
.then(response => response.arrayBuffer())`);
var response = (await dp.Network.onceLoadingFinished()).params;
var content = await dp.Network.getResponseBody({requestId: response.requestId});
......
......@@ -18,7 +18,8 @@
]});
testRunner.log('Request interception patterns sent.');
session.evaluate(`fetch('${testRunner.url('../resources/redirect1.php')}')`);
session.evaluate(`fetch('${testRunner.url('../resources/redirect1.php')}')
.then(response => response.arrayBuffer())`);
// Should be redirect1.php as request.
var interceptionEvent = await waitForInterceptionEvent();
......
......@@ -65,7 +65,8 @@
await new Promise(resolve => {
session.protocol.Network.onResponseReceived(resolve);
session.evaluate(`
fetch('${testRunner.url('../resources/ping-redirect.php')}');
fetch('${testRunner.url('../resources/ping-redirect.php')}')
.then(response => response.arrayBuffer());
`);
});
......
......@@ -71,11 +71,14 @@
* @return {!Promise}
*/
async function testUrls() {
session.evaluate(`fetch('../network/resources/small-test-1.txt')`);
session.evaluate(`fetch('../network/resources/small-test-1.txt')
.then(response => response.arrayBuffer())`);
await new Promise(resolve => responseWasReceivedCallback = resolve);
session.evaluate(`fetch('../network/resources/small-test-2.txt')`);
session.evaluate(`fetch('../network/resources/small-test-2.txt')
.then(response => response.arrayBuffer())`);
await new Promise(resolve => responseWasReceivedCallback = resolve);
session.evaluate(`fetch('../resources/test-page.html')`);
session.evaluate(`fetch('../resources/test-page.html')
.then(response => response.arrayBuffer())`);
await new Promise(resolve => responseWasReceivedCallback = resolve);
testRunner.log('');
}
......
......@@ -4,7 +4,8 @@
await dp.Network.enable();
var url = testRunner.url('./resources/final.js');
session.evaluate(`fetch("${url}");`);
session.evaluate(`fetch("${url}")
.then(response => response.arrayBuffer());`);
var requestWillBeSent = (await dp.Network.onceRequestWillBeSent()).params;
testRunner.log(`Request for ${requestWillBeSent.request.url}`);
......
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