--- /dev/null
+// Copyright (c) 2015 The Chromium Embedded Framework 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 CEF_TESTS_CEFCLIENT_BROWSER_MAIN_MESSAGE_LOOP_MULTITHREADED_WIN_H_
+#define CEF_TESTS_CEFCLIENT_BROWSER_MAIN_MESSAGE_LOOP_MULTITHREADED_WIN_H_
+#pragma once
+
+#include <windows.h>
+#include <queue>
+
+#include "include/base/cef_lock.h"
+#include "include/base/cef_platform_thread.h"
+#include "tests/shared/browser/main_message_loop.h"
+
+namespace client {
+
+// Represents the main message loop in the browser process when using multi-
+// threaded message loop mode on Windows. In this mode there is no Chromium
+// message loop running on the main application thread. Instead, this
+// implementation utilizes a hidden message window for running tasks.
+class MainMessageLoopMultithreadedWin : public MainMessageLoop {
+ public:
+ MainMessageLoopMultithreadedWin();
+ ~MainMessageLoopMultithreadedWin();
+
+ // MainMessageLoop methods.
+ int Run() OVERRIDE;
+ void Quit() OVERRIDE;
+ void PostTask(CefRefPtr<CefTask> task) OVERRIDE;
+ bool RunsTasksOnCurrentThread() const OVERRIDE;
+ void SetCurrentModelessDialog(HWND hWndDialog) OVERRIDE;
+
+ private:
+ // Create the message window.
+ static HWND CreateMessageWindow(HINSTANCE hInstance);
+
+ // Window procedure for the message window.
+ static LRESULT CALLBACK MessageWndProc(HWND hWnd, UINT message, WPARAM wParam,
+ LPARAM lParam);
+
+ void PostTaskInternal(CefRefPtr<CefTask> task);
+
+ base::PlatformThreadId thread_id_;
+ UINT task_message_id_;
+
+ // Only accessed on the main thread.
+ HWND dialog_hwnd_;
+
+ base::Lock lock_;
+
+ // Must be protected by |lock_|.
+ HWND message_hwnd_;
+ std::queue<CefRefPtr<CefTask> > queued_tasks_;
+
+ DISALLOW_COPY_AND_ASSIGN(MainMessageLoopMultithreadedWin);
+};
+
+} // namespace client
+
+#endif // CEF_TESTS_CEFCLIENT_BROWSER_MAIN_MESSAGE_LOOP_MULTITHREADED_WIN_H_