From 23f5ee3f8b0c9f854c080db48b1f97603576d865 Mon Sep 17 00:00:00 2001
From: "stoyan@chromium.org"
 <stoyan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>
Date: Tue, 5 Oct 2010 23:38:55 +0000
Subject: Initial skeleton for refactored ChromeFrameAutomationClient and
 AutomationProxy for the needs of ChromeFrame. CFProxy is ready to some
 extent, while CFAC is mostly structure-only.

Review URL: http://codereview.chromium.org/3528004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61583 0039d316-1c4b-4281-b951-d872f2087c98
---
 chrome_frame/task_marshaller.h | 63 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 63 insertions(+)
 create mode 100644 chrome_frame/task_marshaller.h

(limited to 'chrome_frame/task_marshaller.h')

diff --git a/chrome_frame/task_marshaller.h b/chrome_frame/task_marshaller.h
new file mode 100644
index 0000000..b3f87b8
--- /dev/null
+++ b/chrome_frame/task_marshaller.h
@@ -0,0 +1,63 @@
+// Copyright (c) 2010 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 CHROME_FRAME_TASK_MARSHALLER_H_
+#define CHROME_FRAME_TASK_MARSHALLER_H_
+#pragma once
+
+#include <windows.h>
+#include <deque>
+#include <queue>
+#include "base/lock.h"
+#include "base/non_thread_safe.h"
+#include "base/time.h"
+class Task;
+namespace tracked_objects {
+  class Location;
+}
+
+// TaskMarshallerThroughMessageQueue is similar to base::MessageLoopForUI
+// in cases where we do not control the thread lifetime and message retrieval
+// and dispatching. It uses a HWND to ::PostMessage to it as a signal that
+// the task queue is not empty.
+class TaskMarshallerThroughMessageQueue : public NonThreadSafe {
+ public:
+  TaskMarshallerThroughMessageQueue();
+  ~TaskMarshallerThroughMessageQueue();
+
+  void SetWindow(HWND wnd, UINT msg) {
+    wnd_ = wnd;
+    msg_ = msg;
+  }
+
+  virtual void PostTask(const tracked_objects::Location& from_here,
+                        Task* task);
+  virtual void PostDelayedTask(const tracked_objects::Location& source,
+                               Task* task,
+                               base::TimeDelta& delay);
+ private:
+  void DeleteAll();
+  inline Task* PopTask();
+  inline void ExecuteQueuedTasks();
+  void ExecuteDelayedTasks();
+  void RunTask(Task* task);
+
+  struct DelayedTask {
+    DelayedTask(Task* task, base::Time at) : run_at(at), task(task), seq(0) {}
+    base::Time run_at;
+    Task* task;
+    int seq;
+    // To support sorting based on time in priority_queue.
+    bool operator<(const DelayedTask& other) const;
+  };
+
+  std::priority_queue<DelayedTask> delayed_tasks_;
+  std::queue<Task*> pending_tasks_;
+  Lock lock_;
+  HWND wnd_;
+  UINT msg_;
+  int invoke_task_;
+};
+
+#endif  // CHROME_FRAME_TASK_MARSHALLER_H_
-- 
cgit v1.1