Commit 18a428ba authored by Hajime Hoshi's avatar Hajime Hoshi Committed by Commit Bot

Add EventQueueImpl::target_

This CL is a continuation of
https://chromium-review.googlesource.com/c/chromium/src/+/1088356.

This CL gives an event target to EventQueueImpl and use it instead of
event->target() so that we can have EventQueueImpl and
MediaElementEventQueue with the same structure.

Design Doc: https://docs.google.com/document/d/1BBtBPTarOF4NeVKSWZe3XaDHo4yTGhdlqYm35yVzPs4/edit#

Bug: 846618
Change-Id: I394e3b1c01df3a2af671bb6d72fe9d32ac9ea94e
Reviewed-on: https://chromium-review.googlesource.com/1098736Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarAlexander Timin <altimin@chromium.org>
Commit-Queue: Hajime Hoshi <hajimehoshi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#567220}
parent 5e4214a4
...@@ -34,19 +34,21 @@ ...@@ -34,19 +34,21 @@
namespace blink { namespace blink {
EventQueueImpl* EventQueueImpl::Create(ExecutionContext* context, EventQueueImpl* EventQueueImpl::Create(EventTarget* target,
TaskType task_type) { TaskType task_type) {
return new EventQueueImpl(context, task_type); return new EventQueueImpl(target, task_type);
} }
EventQueueImpl::EventQueueImpl(ExecutionContext* context, TaskType task_type) EventQueueImpl::EventQueueImpl(EventTarget* target, TaskType task_type)
: ContextLifecycleObserver(context), : ContextLifecycleObserver(target->GetExecutionContext()),
task_type_(task_type), task_type_(task_type),
target_(target),
is_closed_(false) {} is_closed_(false) {}
EventQueueImpl::~EventQueueImpl() = default; EventQueueImpl::~EventQueueImpl() = default;
void EventQueueImpl::Trace(blink::Visitor* visitor) { void EventQueueImpl::Trace(blink::Visitor* visitor) {
visitor->Trace(target_);
visitor->Trace(queued_events_); visitor->Trace(queued_events_);
EventQueue::Trace(visitor); EventQueue::Trace(visitor);
ContextLifecycleObserver::Trace(visitor); ContextLifecycleObserver::Trace(visitor);
...@@ -99,14 +101,10 @@ void EventQueueImpl::DispatchEvent(Event* event) { ...@@ -99,14 +101,10 @@ void EventQueueImpl::DispatchEvent(Event* event) {
DCHECK(GetExecutionContext()); DCHECK(GetExecutionContext());
probe::AsyncTask async_task(GetExecutionContext(), event); probe::AsyncTask async_task(GetExecutionContext(), event);
// TODO(hajimehoshi): Don't use |event->target()| here. Assuming the taget if (LocalDOMWindow* window = target_->ToLocalDOMWindow())
// exists here is weird since event target is set later at
// |EventTarget::DispatchEvent|.
EventTarget* event_target = event->target();
if (LocalDOMWindow* window = event_target->ToLocalDOMWindow())
window->DispatchEvent(event, nullptr); window->DispatchEvent(event, nullptr);
else else
event_target->DispatchEvent(event); target_->DispatchEvent(event);
} }
void EventQueueImpl::ContextDestroyed(ExecutionContext* context) { void EventQueueImpl::ContextDestroyed(ExecutionContext* context) {
......
...@@ -44,7 +44,7 @@ class CORE_EXPORT EventQueueImpl final : public EventQueue, ...@@ -44,7 +44,7 @@ class CORE_EXPORT EventQueueImpl final : public EventQueue,
public: public:
// TODO(hajimehoshi): TaskType should be determined based on an event instead // TODO(hajimehoshi): TaskType should be determined based on an event instead
// of specifying here. // of specifying here.
static EventQueueImpl* Create(ExecutionContext*, TaskType); static EventQueueImpl* Create(EventTarget*, TaskType);
~EventQueueImpl() override; ~EventQueueImpl() override;
// EventQueue // EventQueue
...@@ -53,7 +53,7 @@ class CORE_EXPORT EventQueueImpl final : public EventQueue, ...@@ -53,7 +53,7 @@ class CORE_EXPORT EventQueueImpl final : public EventQueue,
void CancelAllEvents() override; void CancelAllEvents() override;
private: private:
EventQueueImpl(ExecutionContext*, TaskType); EventQueueImpl(EventTarget*, TaskType);
bool RemoveEvent(Event*); bool RemoveEvent(Event*);
void DispatchEvent(Event*); void DispatchEvent(Event*);
...@@ -63,6 +63,7 @@ class CORE_EXPORT EventQueueImpl final : public EventQueue, ...@@ -63,6 +63,7 @@ class CORE_EXPORT EventQueueImpl final : public EventQueue,
void DoCancelAllEvents(ExecutionContext*); void DoCancelAllEvents(ExecutionContext*);
const TaskType task_type_; const TaskType task_type_;
Member<EventTarget> target_;
HeapLinkedHashSet<Member<Event>> queued_events_; HeapLinkedHashSet<Member<Event>> queued_events_;
bool is_closed_; bool is_closed_;
}; };
......
...@@ -457,7 +457,6 @@ void WebPluginContainerImpl::DispatchProgressEvent(const WebString& type, ...@@ -457,7 +457,6 @@ void WebPluginContainerImpl::DispatchProgressEvent(const WebString& type,
void WebPluginContainerImpl::EnqueueMessageEvent( void WebPluginContainerImpl::EnqueueMessageEvent(
const WebDOMMessageEvent& event) { const WebDOMMessageEvent& event) {
static_cast<Event*>(event)->SetTarget(element_);
if (!element_->GetExecutionContext()) if (!element_->GetExecutionContext())
return; return;
event_queue_->EnqueueEvent(FROM_HERE, event); event_queue_->EnqueueEvent(FROM_HERE, event);
...@@ -738,8 +737,7 @@ WebPluginContainerImpl::WebPluginContainerImpl(HTMLPlugInElement& element, ...@@ -738,8 +737,7 @@ WebPluginContainerImpl::WebPluginContainerImpl(HTMLPlugInElement& element,
: ContextClient(element.GetDocument().GetFrame()), : ContextClient(element.GetDocument().GetFrame()),
element_(element), element_(element),
event_queue_( event_queue_(
EventQueueImpl::Create(element.GetDocument().GetExecutionContext(), EventQueueImpl::Create(&element, TaskType::kInternalDefault)),
TaskType::kInternalDefault)),
web_plugin_(web_plugin), web_plugin_(web_plugin),
layer_(nullptr), layer_(nullptr),
touch_event_request_type_(kTouchEventRequestTypeNone), touch_event_request_type_(kTouchEventRequestTypeNone),
......
...@@ -101,7 +101,6 @@ void BroadcastChannel::OnMessage(BlinkCloneableMessage message) { ...@@ -101,7 +101,6 @@ void BroadcastChannel::OnMessage(BlinkCloneableMessage message) {
MessageEvent* event = MessageEvent::Create( MessageEvent* event = MessageEvent::Create(
nullptr, std::move(message.message), nullptr, std::move(message.message),
GetExecutionContext()->GetSecurityOrigin()->ToString()); GetExecutionContext()->GetSecurityOrigin()->ToString());
event->SetTarget(this);
bool success = event_queue_->EnqueueEvent(FROM_HERE, event); bool success = event_queue_->EnqueueEvent(FROM_HERE, event);
DCHECK(success); DCHECK(success);
ALLOW_UNUSED_LOCAL(success); ALLOW_UNUSED_LOCAL(success);
...@@ -115,8 +114,7 @@ BroadcastChannel::BroadcastChannel(ExecutionContext* execution_context, ...@@ -115,8 +114,7 @@ BroadcastChannel::BroadcastChannel(ExecutionContext* execution_context,
const String& name) const String& name)
: ContextLifecycleObserver(execution_context), : ContextLifecycleObserver(execution_context),
origin_(execution_context->GetSecurityOrigin()), origin_(execution_context->GetSecurityOrigin()),
event_queue_( event_queue_(EventQueueImpl::Create(this, TaskType::kInternalMedia)),
EventQueueImpl::Create(execution_context, TaskType::kInternalMedia)),
name_(name), name_(name),
binding_(this) { binding_(this) {
mojom::blink::BroadcastChannelProviderPtr& provider = mojom::blink::BroadcastChannelProviderPtr& provider =
......
...@@ -108,8 +108,7 @@ IDBDatabase::IDBDatabase(ExecutionContext* context, ...@@ -108,8 +108,7 @@ IDBDatabase::IDBDatabase(ExecutionContext* context,
v8::Isolate* isolate) v8::Isolate* isolate)
: ContextLifecycleObserver(context), : ContextLifecycleObserver(context),
backend_(std::move(backend)), backend_(std::move(backend)),
event_queue_( event_queue_(EventQueueImpl::Create(this, TaskType::kInternalIndexedDB)),
EventQueueImpl::Create(context, TaskType::kInternalIndexedDB)),
database_callbacks_(callbacks), database_callbacks_(callbacks),
isolate_(isolate) { isolate_(isolate) {
database_callbacks_->Connect(this); database_callbacks_->Connect(this);
...@@ -500,7 +499,6 @@ void IDBDatabase::OnVersionChange(int64_t old_version, int64_t new_version) { ...@@ -500,7 +499,6 @@ void IDBDatabase::OnVersionChange(int64_t old_version, int64_t new_version) {
void IDBDatabase::EnqueueEvent(Event* event) { void IDBDatabase::EnqueueEvent(Event* event) {
DCHECK(GetExecutionContext()); DCHECK(GetExecutionContext());
event->SetTarget(this);
event_queue_->EnqueueEvent(FROM_HERE, event); event_queue_->EnqueueEvent(FROM_HERE, event);
} }
......
...@@ -138,8 +138,8 @@ IDBRequest::IDBRequest(ScriptState* script_state, ...@@ -138,8 +138,8 @@ IDBRequest::IDBRequest(ScriptState* script_state,
isolate_(script_state->GetIsolate()), isolate_(script_state->GetIsolate()),
metrics_(std::move(metrics)), metrics_(std::move(metrics)),
source_(source), source_(source),
event_queue_(EventQueueImpl::Create(ExecutionContext::From(script_state), event_queue_(EventQueueImpl::Create(this, TaskType::kInternalIndexedDB)) {
TaskType::kInternalIndexedDB)) {} }
IDBRequest::~IDBRequest() { IDBRequest::~IDBRequest() {
DCHECK((ready_state_ == DONE && metrics_.IsEmpty()) || DCHECK((ready_state_ == DONE && metrics_.IsEmpty()) ||
...@@ -638,7 +638,8 @@ DispatchEventResult IDBRequest::DispatchEventInternal(Event* event) { ...@@ -638,7 +638,8 @@ DispatchEventResult IDBRequest::DispatchEventInternal(Event* event) {
return DispatchEventResult::kCanceledBeforeDispatch; return DispatchEventResult::kCanceledBeforeDispatch;
DCHECK_EQ(ready_state_, PENDING); DCHECK_EQ(ready_state_, PENDING);
DCHECK(has_pending_activity_); DCHECK(has_pending_activity_);
DCHECK_EQ(event->target(), this); event->SetTarget(this);
event->SetCurrentTarget(this);
if (event->type() != EventTypeNames::blocked) if (event->type() != EventTypeNames::blocked)
ready_state_ = DONE; ready_state_ = DONE;
...@@ -760,8 +761,6 @@ void IDBRequest::EnqueueEvent(Event* event) { ...@@ -760,8 +761,6 @@ void IDBRequest::EnqueueEvent(Event* event) {
<< "When queueing event " << event->type() << ", ready_state_ was " << "When queueing event " << event->type() << ", ready_state_ was "
<< ready_state_; << ready_state_;
event->SetTarget(this);
event_queue_->EnqueueEvent(FROM_HERE, event); event_queue_->EnqueueEvent(FROM_HERE, event);
} }
......
...@@ -90,8 +90,7 @@ IDBTransaction::IDBTransaction(ExecutionContext* execution_context, ...@@ -90,8 +90,7 @@ IDBTransaction::IDBTransaction(ExecutionContext* execution_context,
mode_(kWebIDBTransactionModeReadOnly), mode_(kWebIDBTransactionModeReadOnly),
scope_(scope), scope_(scope),
state_(kActive), state_(kActive),
event_queue_(EventQueueImpl::Create(execution_context, event_queue_(EventQueueImpl::Create(this, TaskType::kInternalIndexedDB)) {
TaskType::kInternalIndexedDB)) {
DCHECK(database_); DCHECK(database_);
DCHECK(!scope_.IsEmpty()) << "Observer transactions must operate " DCHECK(!scope_.IsEmpty()) << "Observer transactions must operate "
"on a well-defined set of stores"; "on a well-defined set of stores";
...@@ -108,8 +107,7 @@ IDBTransaction::IDBTransaction(ScriptState* script_state, ...@@ -108,8 +107,7 @@ IDBTransaction::IDBTransaction(ScriptState* script_state,
database_(db), database_(db),
mode_(mode), mode_(mode),
scope_(scope), scope_(scope),
event_queue_(EventQueueImpl::Create(ExecutionContext::From(script_state), event_queue_(EventQueueImpl::Create(this, TaskType::kInternalIndexedDB)) {
TaskType::kInternalIndexedDB)) {
DCHECK(database_); DCHECK(database_);
DCHECK(!scope_.IsEmpty()) << "Non-versionchange transactions must operate " DCHECK(!scope_.IsEmpty()) << "Non-versionchange transactions must operate "
"on a well-defined set of stores"; "on a well-defined set of stores";
...@@ -137,8 +135,7 @@ IDBTransaction::IDBTransaction(ExecutionContext* execution_context, ...@@ -137,8 +135,7 @@ IDBTransaction::IDBTransaction(ExecutionContext* execution_context,
mode_(kWebIDBTransactionModeVersionChange), mode_(kWebIDBTransactionModeVersionChange),
state_(kInactive), state_(kInactive),
old_database_metadata_(old_metadata), old_database_metadata_(old_metadata),
event_queue_(EventQueueImpl::Create(execution_context, event_queue_(EventQueueImpl::Create(this, TaskType::kInternalIndexedDB)) {
TaskType::kInternalIndexedDB)) {
DCHECK(database_); DCHECK(database_);
DCHECK(open_db_request_); DCHECK(open_db_request_);
DCHECK(scope_.IsEmpty()); DCHECK(scope_.IsEmpty());
...@@ -526,7 +523,8 @@ DispatchEventResult IDBTransaction::DispatchEventInternal(Event* event) { ...@@ -526,7 +523,8 @@ DispatchEventResult IDBTransaction::DispatchEventInternal(Event* event) {
DCHECK_NE(state_, kFinished); DCHECK_NE(state_, kFinished);
DCHECK(has_pending_activity_); DCHECK(has_pending_activity_);
DCHECK(GetExecutionContext()); DCHECK(GetExecutionContext());
DCHECK_EQ(event->target(), this); event->SetTarget(this);
event->SetCurrentTarget(this);
state_ = kFinished; state_ = kFinished;
HeapVector<Member<EventTarget>> targets; HeapVector<Member<EventTarget>> targets;
...@@ -556,7 +554,6 @@ void IDBTransaction::EnqueueEvent(Event* event) { ...@@ -556,7 +554,6 @@ void IDBTransaction::EnqueueEvent(Event* event) {
if (!GetExecutionContext()) if (!GetExecutionContext())
return; return;
event->SetTarget(this);
event_queue_->EnqueueEvent(FROM_HERE, event); event_queue_->EnqueueEvent(FROM_HERE, event);
} }
......
...@@ -186,6 +186,8 @@ TEST_F(IDBTransactionTest, ContextDestroyedAfterDone) { ...@@ -186,6 +186,8 @@ TEST_F(IDBTransactionTest, ContextDestroyedAfterDone) {
// event, so that the transaction can go away. // event, so that the transaction can go away.
EXPECT_EQ(1U, live_transactions.size()); EXPECT_EQ(1U, live_transactions.size());
// Dispatch all the enqueued events.
base::RunLoop().RunUntilIdle();
ThreadState::Current()->CollectAllGarbage(); ThreadState::Current()->CollectAllGarbage();
EXPECT_EQ(0U, live_transactions.size()); EXPECT_EQ(0U, live_transactions.size());
} }
......
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