Commit e3e3ec32 authored by kinuko's avatar kinuko Committed by Commit bot

ServiceWorker: Reset idle timer when we dispatch message event

BUG=498121
TEST=ServiceWorkerVersionTest.IdleTimeout

Review URL: https://codereview.chromium.org/1179453002

Cr-Commit-Position: refs/heads/master@{#333742}
parent 3c96b599
......@@ -7,8 +7,11 @@
#include <map>
#include <string>
#include "base/atomic_sequence_num.h"
#include "base/bind.h"
#include "base/memory/scoped_vector.h"
#include "base/thread_task_runner_handle.h"
#include "content/browser/message_port_message_filter.h"
#include "content/browser/service_worker/embedded_worker_instance.h"
#include "content/browser/service_worker/embedded_worker_registry.h"
#include "content/browser/service_worker/service_worker_context_core.h"
......@@ -19,6 +22,24 @@
namespace content {
class MockMessagePortMessageFilter : public MessagePortMessageFilter {
public:
MockMessagePortMessageFilter()
: MessagePortMessageFilter(
base::Bind(&base::AtomicSequenceNumber::GetNext,
base::Unretained(&next_routing_id_))) {}
bool Send(IPC::Message* message) override {
message_queue_.push_back(message);
return true;
}
private:
~MockMessagePortMessageFilter() override {}
base::AtomicSequenceNumber next_routing_id_;
ScopedVector<IPC::Message> message_queue_;
};
EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper(
const base::FilePath& user_data_directory,
int mock_render_process_id)
......@@ -35,7 +56,8 @@ EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper(
NULL,
NULL);
wrapper_->process_manager()->SetProcessIdForTest(mock_render_process_id);
registry()->AddChildProcessSender(mock_render_process_id, this, nullptr);
registry()->AddChildProcessSender(mock_render_process_id, this,
NewMessagePortMessageFilter());
}
EmbeddedWorkerTestHelper::~EmbeddedWorkerTestHelper() {
......@@ -46,7 +68,8 @@ EmbeddedWorkerTestHelper::~EmbeddedWorkerTestHelper() {
void EmbeddedWorkerTestHelper::SimulateAddProcessToPattern(
const GURL& pattern,
int process_id) {
registry()->AddChildProcessSender(process_id, this, nullptr);
registry()->AddChildProcessSender(process_id, this,
NewMessagePortMessageFilter());
wrapper_->process_manager()->AddProcessReferenceToPattern(
pattern, process_id);
}
......@@ -330,4 +353,12 @@ EmbeddedWorkerRegistry* EmbeddedWorkerTestHelper::registry() {
return context()->embedded_worker_registry();
}
MessagePortMessageFilter*
EmbeddedWorkerTestHelper::NewMessagePortMessageFilter() {
scoped_refptr<MessagePortMessageFilter> filter(
new MockMessagePortMessageFilter);
message_port_message_filters_.push_back(filter);
return filter.get();
}
} // namespace content
......@@ -21,6 +21,7 @@ namespace content {
class EmbeddedWorkerRegistry;
class EmbeddedWorkerTestHelper;
class MessagePortMessageFilter;
class ServiceWorkerContextCore;
class ServiceWorkerContextWrapper;
struct ServiceWorkerFetchRequest;
......@@ -124,6 +125,8 @@ class EmbeddedWorkerTestHelper : public IPC::Sender,
void OnFetchEventStub(int request_id,
const ServiceWorkerFetchRequest& request);
MessagePortMessageFilter* NewMessagePortMessageFilter();
scoped_refptr<ServiceWorkerContextWrapper> wrapper_;
IPC::TestSink sink_;
......@@ -137,6 +140,9 @@ class EmbeddedWorkerTestHelper : public IPC::Sender,
// Updated each time MessageToWorker message is received.
int current_embedded_worker_id_;
std::vector<scoped_refptr<MessagePortMessageFilter>>
message_port_message_filters_;
base::WeakPtrFactory<EmbeddedWorkerTestHelper> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerTestHelper);
......
......@@ -645,6 +645,10 @@ void ServiceWorkerVersion::DispatchMessageEventInternal(
return;
}
// TODO(kinuko): Cleanup this (and corresponding unit test) when message
// event becomes extendable, round-trip event. (crbug.com/498596)
RestartTick(&idle_time_);
MessagePortMessageFilter* filter =
embedded_worker_->message_port_message_filter();
std::vector<int> new_routing_ids;
......
......@@ -4,6 +4,7 @@
#include "base/basictypes.h"
#include "base/run_loop.h"
#include "content/browser/message_port_service.h"
#include "content/browser/service_worker/embedded_worker_registry.h"
#include "content/browser/service_worker/embedded_worker_test_helper.h"
#include "content/browser/service_worker/service_worker_context_core.h"
......@@ -117,6 +118,15 @@ class MessageReceiverFromWorker : public EmbeddedWorkerInstance::Listener {
DISALLOW_COPY_AND_ASSIGN(MessageReceiverFromWorker);
};
void SetUpDummyMessagePort(std::vector<TransferredMessagePort>* ports) {
int port_id = -1;
MessagePortService::GetInstance()->Create(MSG_ROUTING_NONE, nullptr,
&port_id);
TransferredMessagePort dummy_port;
dummy_port.id = port_id;
ports->push_back(dummy_port);
}
} // namespace
class ServiceWorkerVersionTest : public testing::Test {
......@@ -478,6 +488,20 @@ TEST_F(ServiceWorkerVersionTest, IdleTimeout) {
EXPECT_EQ(SERVICE_WORKER_OK, status);
EXPECT_LT(idle_time, version_->idle_time_);
// Dispatching a message event resets the idle time.
std::vector<TransferredMessagePort> ports;
SetUpDummyMessagePort(&ports);
status = SERVICE_WORKER_ERROR_FAILED;
version_->idle_time_ -= kOneSecond;
idle_time = version_->idle_time_;
version_->DispatchMessageEvent(base::string16(), ports,
CreateReceiverOnCurrentThread(&status));
base::RunLoop().RunUntilIdle();
MessagePortService::GetInstance()->Destroy(ports[0].id);
EXPECT_EQ(SERVICE_WORKER_OK, status);
EXPECT_LT(idle_time, version_->idle_time_);
}
TEST_F(ServiceWorkerVersionTest, SetDevToolsAttached) {
......
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