Commit 4098fded authored by Andrey Lushnikov's avatar Andrey Lushnikov Committed by Commit Bot

Revert "Always use backpressure for fetch"

This reverts commit e0eac774.

Reason for revert: this patch breaks DevTools protocol, see crbug.com/807483

Original change's description:
> 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: Yutaka Hirano <yhirano@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#530070}

TBR=ricea@chromium.org,yhirano@chromium.org

# Not skipping CQ checks because original CL landed > 1 day ago.

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