| Index: content/renderer/scheduler_proxy_task_runner.h
 | 
| diff --git a/content/renderer/scheduler_proxy_task_runner.h b/content/renderer/scheduler_proxy_task_runner.h
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..c4ccb2a8fedfac2ec64705ec199922fb80c20096
 | 
| --- /dev/null
 | 
| +++ b/content/renderer/scheduler_proxy_task_runner.h
 | 
| @@ -0,0 +1,87 @@
 | 
| +// Copyright 2014 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#ifndef CONTENT_RENDERER_SCHEDULER_PROXY_TASK_RUNNER_H_
 | 
| +#define CONTENT_RENDERER_SCHEDULER_PROXY_TASK_RUNNER_H_
 | 
| +
 | 
| +#include "base/debug/task_annotator.h"
 | 
| +#include "base/pending_task.h"
 | 
| +#include "content/renderer/render_thread_impl.h"
 | 
| +#include "third_party/WebKit/public/platform/WebSchedulerProxy.h"
 | 
| +#include "third_party/WebKit/public/platform/WebTraceLocation.h"
 | 
| +
 | 
| +namespace content {
 | 
| +
 | 
| +// Helper for forwarding posted tasks into different WebSchedulerProxy queues.
 | 
| +template <void (blink::WebSchedulerProxy::*ProxyFunction)(
 | 
| +    const blink::WebTraceLocation& location,
 | 
| +    blink::WebThread::Task* task)>
 | 
| +class SchedulerProxyTaskRunner : public base::SingleThreadTaskRunner {
 | 
| + public:
 | 
| +  SchedulerProxyTaskRunner()
 | 
| +      : main_thread_id_(base::PlatformThread::CurrentId()),
 | 
| +        scheduler_proxy_(blink::WebSchedulerProxy::create()),
 | 
| +        next_sequence_num_(0) {}
 | 
| +
 | 
| +  // base::SingleThreadTaskRunner implementation:
 | 
| +  virtual bool RunsTasksOnCurrentThread() const OVERRIDE {
 | 
| +    return base::PlatformThread::CurrentId() == main_thread_id_;
 | 
| +  }
 | 
| +
 | 
| +  virtual bool PostDelayedTask(const tracked_objects::Location& from_here,
 | 
| +                               const base::Closure& task,
 | 
| +                               base::TimeDelta delay) OVERRIDE {
 | 
| +    DCHECK(delay == base::TimeDelta());
 | 
| +    base::PendingTask pending_task(from_here, task);
 | 
| +    pending_task.sequence_num = ++next_sequence_num_;
 | 
| +    task_annotator_.DidQueueTask("SchedulerProxyTaskRunner::PostDelayedTask",
 | 
| +                                 pending_task);
 | 
| +    blink::WebTraceLocation location(from_here.function_name(),
 | 
| +                                     from_here.file_name());
 | 
| +    TaskAdapter* task_adapter = new TaskAdapter(&task_annotator_, pending_task);
 | 
| +    (scheduler_proxy_.*ProxyFunction)(location, task_adapter);
 | 
| +    return true;
 | 
| +  }
 | 
| +
 | 
| +  virtual bool PostNonNestableDelayedTask(
 | 
| +      const tracked_objects::Location& from_here,
 | 
| +      const base::Closure& task,
 | 
| +      base::TimeDelta delay) OVERRIDE {
 | 
| +    NOTREACHED();
 | 
| +    return false;
 | 
| +  }
 | 
| +
 | 
| + protected:
 | 
| +  virtual ~SchedulerProxyTaskRunner() {}
 | 
| +
 | 
| + private:
 | 
| +  class TaskAdapter : public blink::WebThread::Task {
 | 
| +   public:
 | 
| +    explicit TaskAdapter(base::debug::TaskAnnotator* task_annotator,
 | 
| +                         const base::PendingTask& pending_task)
 | 
| +        : task_annotator_(task_annotator), pending_task_(pending_task) {}
 | 
| +    virtual ~TaskAdapter() {}
 | 
| +
 | 
| +    virtual void run() {
 | 
| +      task_annotator_->RunTask("SchedulerProxyTaskRunner::PostDelayedTask",
 | 
| +                               "SchedulerProxyTaskRunner::RunTask",
 | 
| +                               pending_task_);
 | 
| +    }
 | 
| +
 | 
| +   private:
 | 
| +    base::debug::TaskAnnotator* task_annotator_;
 | 
| +    base::PendingTask pending_task_;
 | 
| +  };
 | 
| +
 | 
| +  const base::PlatformThreadId main_thread_id_;
 | 
| +  blink::WebSchedulerProxy scheduler_proxy_;
 | 
| +  base::debug::TaskAnnotator task_annotator_;
 | 
| +  int next_sequence_num_;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(SchedulerProxyTaskRunner);
 | 
| +};
 | 
| +
 | 
| +}  // namespace content
 | 
| +
 | 
| +#endif  // CONTENT_RENDERER_SCHEDULER_PROXY_TASK_RUNNER_H_
 | 
| 
 |