Chromium Code Reviews| Index: content/child/resource_scheduling_filter.cc |
| diff --git a/content/child/resource_scheduling_filter.cc b/content/child/resource_scheduling_filter.cc |
| index 843cd8713f4c58047c2a4699a9a88875d51e5acf..71b760d51dc2b4d2fccde0dba6361e29af80b972 100644 |
| --- a/content/child/resource_scheduling_filter.cc |
| +++ b/content/child/resource_scheduling_filter.cc |
| @@ -9,9 +9,32 @@ |
| #include "content/child/resource_dispatcher.h" |
| #include "ipc/ipc_message.h" |
| #include "ipc/ipc_message_start.h" |
| +#include "third_party/WebKit/public/platform/WebTaskRunner.h" |
| +#include "third_party/WebKit/public/platform/WebTraceLocation.h" |
| namespace content { |
| +namespace { |
| +class DispatchMessageTask : public blink::WebTaskRunner::Task { |
| + public: |
| + DispatchMessageTask( |
| + base::WeakPtr<ResourceSchedulingFilter> resource_scheduling_filter, |
| + const IPC::Message& message) |
| + : resource_scheduling_filter_(resource_scheduling_filter), |
| + message_(message) {} |
| + |
| + void run() override { |
| + if (!resource_scheduling_filter_.get()) |
| + return; |
| + resource_scheduling_filter_->DispatchMessage(message_); |
| + } |
| + |
| + private: |
| + base::WeakPtr<ResourceSchedulingFilter> resource_scheduling_filter_; |
| + const IPC::Message message_; |
| +}; |
| +} // namespace |
| + |
| ResourceSchedulingFilter::ResourceSchedulingFilter( |
| const scoped_refptr<base::SingleThreadTaskRunner>& main_thread_task_runner, |
| ResourceDispatcher* resource_dispatcher) |
| @@ -26,12 +49,41 @@ ResourceSchedulingFilter::~ResourceSchedulingFilter() { |
| } |
| bool ResourceSchedulingFilter::OnMessageReceived(const IPC::Message& message) { |
| - main_thread_task_runner_->PostTask( |
| - FROM_HERE, base::Bind(&ResourceSchedulingFilter::DispatchMessage, |
| - weak_ptr_factory_.GetWeakPtr(), message)); |
| + base::AutoLock lock(request_id_to_task_runner_map_lock_); |
| + int request_id; |
| + |
| + base::PickleIterator pickle_iterator(message); |
| + if (!pickle_iterator.ReadInt(&request_id)) { |
| + NOTREACHED() << "malformed resource message"; |
| + return true; |
| + } |
| + // Dispatch the message on the request id specific task runner, if there is |
| + // one, or on the general main_thread_task_runner if there isn't. |
| + RequestIdToTaskRunnerMap::const_iterator iter = |
| + request_id_to_task_runner_map_.find(request_id); |
| + if (iter != request_id_to_task_runner_map_.end()) { |
| + iter->second->postTask( |
| + blink::WebTraceLocation(__FUNCTION__, __FILE__), |
|
Sami
2015/09/29 11:22:46
Is this because we can't use the FROM_HERE from Bl
alex clarke (OOO till 29th)
2015/09/29 16:10:36
Done.
|
| + new DispatchMessageTask(weak_ptr_factory_.GetWeakPtr(), message)); |
| + } else { |
| + main_thread_task_runner_->PostTask( |
| + FROM_HERE, base::Bind(&ResourceSchedulingFilter::DispatchMessage, |
| + weak_ptr_factory_.GetWeakPtr(), message)); |
| + } |
| return true; |
| } |
| +void ResourceSchedulingFilter::SetRequestIdTaskRunner( |
| + int id, blink::WebTaskRunner* web_task_runner) { |
| + base::AutoLock lock(request_id_to_task_runner_map_lock_); |
| + request_id_to_task_runner_map_[id].reset(web_task_runner); |
| +} |
| + |
| +void ResourceSchedulingFilter::ClearRequestIdTaskRunner(int id) { |
| + base::AutoLock lock(request_id_to_task_runner_map_lock_); |
| + request_id_to_task_runner_map_.erase(id); |
| +} |
| + |
| bool ResourceSchedulingFilter::GetSupportedMessageClasses( |
| std::vector<uint32>* supported_message_classes) const { |
| supported_message_classes->push_back(ResourceMsgStart); |