diff --git a/cef.gyp b/cef.gyp index bd248d202..f2d887a08 100644 --- a/cef.gyp +++ b/cef.gyp @@ -318,6 +318,7 @@ 'tests/unittests/stream_unittest.cc', 'tests/unittests/string_unittest.cc', 'tests/unittests/storage_unittest.cc', + 'tests/unittests/test_handler.cc', 'tests/unittests/test_handler.h', 'tests/unittests/test_suite.cc', 'tests/unittests/test_suite.h', diff --git a/tests/unittests/scheme_handler_unittest.cc b/tests/unittests/scheme_handler_unittest.cc index f229d6224..4a1fbf660 100644 --- a/tests/unittests/scheme_handler_unittest.cc +++ b/tests/unittests/scheme_handler_unittest.cc @@ -3,6 +3,7 @@ // can be found in the LICENSE file. #include "include/cef_origin_whitelist.h" +#include "include/cef_runnable.h" #include "include/cef_scheme.h" #include "test_handler.h" diff --git a/tests/unittests/test_handler.cc b/tests/unittests/test_handler.cc new file mode 100644 index 000000000..33a99174f --- /dev/null +++ b/tests/unittests/test_handler.cc @@ -0,0 +1,129 @@ +// Copyright (c) 2011 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. + +#include "test_handler.h" +#include "include/cef_runnable.h" + +namespace { + +void NotifyEvent(base::WaitableEvent* event) +{ + event->Signal(); +} + +} // namespace + + +// TestHandler + +TestHandler::TestHandler() + : browser_hwnd_(NULL), completion_event_(true, false) +{ +} + +TestHandler::~TestHandler() +{ +} + +void TestHandler::OnAfterCreated(CefRefPtr browser) +{ + AutoLock lock_scope(this); + if(!browser->IsPopup()) + { + // Keep the main child window, but not popup windows + browser_ = browser; + browser_hwnd_ = browser->GetWindowHandle(); + } +} + +void TestHandler::OnBeforeClose(CefRefPtr browser) +{ + AutoLock lock_scope(this); + if(browser_hwnd_ == browser->GetWindowHandle()) + { + // Free the browser pointer so that the browser can be destroyed + browser_ = NULL; + browser_hwnd_ = NULL; + + // Signal that the test is now complete. + completion_event_.Signal(); + } +} + +bool TestHandler::OnBeforeResourceLoad(CefRefPtr browser, + CefRefPtr request, + CefString& redirectUrl, + CefRefPtr& resourceStream, + CefRefPtr response, + int loadFlags) +{ + AutoLock lock_scope(this); + if(resource_map_.size() > 0) { + CefString url = request->GetURL(); + ResourceMap::const_iterator it = resource_map_.find(url); + if(it != resource_map_.end()) { + // Return the previously mapped resource + resourceStream = CefStreamReader::CreateForData( + (void*)it->second.first.c_str(), it->second.first.length()); + response->SetMimeType(it->second.second); + response->SetStatus(200); + } + } + + return false; +} + +void TestHandler::ExecuteTest() +{ + // Run the test + RunTest(); + + // Wait for the test to complete + completion_event_.Wait(); + + // Reset the event so the same test can be executed again. + completion_event_.Reset(); +} + +void TestHandler::DestroyTest() +{ + Lock(); +#if defined(OS_WIN) + if(browser_hwnd_ != NULL) + PostMessage(browser_hwnd_, WM_CLOSE, 0, 0); +#endif + Unlock(); +} + +void TestHandler::CreateBrowser(const CefString& url) +{ + CefWindowInfo windowInfo; + CefBrowserSettings settings; +#if defined(OS_WIN) + windowInfo.SetAsPopup(NULL, "CefUnitTest"); + windowInfo.m_dwStyle |= WS_VISIBLE; +#endif + CefBrowser::CreateBrowser(windowInfo, this, url, settings); +} + +void TestHandler::AddResource(const CefString& key, const std::string& value, + const CefString& mimeType) +{ + resource_map_.insert(std::make_pair(key, std::make_pair(value, mimeType))); +} + +void TestHandler::ClearResources() +{ + resource_map_.clear(); +} + + +// global functions + +void WaitForThread(CefThreadId thread_id) +{ + base::WaitableEvent event(true, false); + CefPostTask(thread_id, NewCefRunnableFunction(&NotifyEvent, &event)); + event.Wait(); +} diff --git a/tests/unittests/test_handler.h b/tests/unittests/test_handler.h index 19f4d740c..2bf435636 100644 --- a/tests/unittests/test_handler.h +++ b/tests/unittests/test_handler.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Embedded Framework Authors. All rights +// Copyright (c) 2011 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. @@ -6,9 +6,9 @@ #define _TEST_HANDLER_H #include "include/cef_browser.h" -#include "include/cef_frame.h" #include "include/cef_client.h" -#include "include/cef_runnable.h" +#include "include/cef_frame.h" +#include "include/cef_task.h" #include "base/synchronization/waitable_event.h" #include "testing/gtest/include/gtest/gtest.h" @@ -34,13 +34,8 @@ class TestHandler : public CefClient, public CefV8ContextHandler { public: - TestHandler() : browser_hwnd_(NULL), completion_event_(true, false) - { - } - - virtual ~TestHandler() - { - } + TestHandler(); + virtual ~TestHandler(); // Implement this method to run the test virtual void RunTest() =0; @@ -58,116 +53,35 @@ public: { return this; } // CefLifeSpanHandler methods - - virtual void OnAfterCreated(CefRefPtr browser) OVERRIDE - { - AutoLock lock_scope(this); - if(!browser->IsPopup()) - { - // Keep the main child window, but not popup windows - browser_ = browser; - browser_hwnd_ = browser->GetWindowHandle(); - } - } - - virtual void OnBeforeClose(CefRefPtr browser) OVERRIDE - { - AutoLock lock_scope(this); - if(browser_hwnd_ == browser->GetWindowHandle()) - { - // Free the browser pointer so that the browser can be destroyed - browser_ = NULL; - browser_hwnd_ = NULL; - - // Signal that the test is now complete. - completion_event_.Signal(); - } - } + virtual void OnAfterCreated(CefRefPtr browser) OVERRIDE; + virtual void OnBeforeClose(CefRefPtr browser) OVERRIDE; // CefRequestHandler methods - virtual bool OnBeforeResourceLoad(CefRefPtr browser, CefRefPtr request, CefString& redirectUrl, CefRefPtr& resourceStream, CefRefPtr response, - int loadFlags) OVERRIDE - { - AutoLock lock_scope(this); - if(resource_map_.size() > 0) { - CefString url = request->GetURL(); - ResourceMap::const_iterator it = resource_map_.find(url); - if(it != resource_map_.end()) { - // Return the previously mapped resource - resourceStream = CefStreamReader::CreateForData( - (void*)it->second.first.c_str(), it->second.first.length()); - response->SetMimeType(it->second.second); - response->SetStatus(200); - } - } + int loadFlags) OVERRIDE; - return false; - } - - CefRefPtr GetBrowser() - { - return browser_; - } - - CefWindowHandle GetBrowserHwnd() - { - return browser_hwnd_; - } + CefRefPtr GetBrowser() { return browser_; } + CefWindowHandle GetBrowserHwnd() { return browser_hwnd_; } // Called by the test function to execute the test. This method blocks until // the test is complete. Do not reference the object after this method // returns. - void ExecuteTest() - { - // Run the test - RunTest(); - - // Wait for the test to complete - completion_event_.Wait(); - - // Reset the event so the same test can be executed again. - completion_event_.Reset(); - } + void ExecuteTest(); protected: // Destroy the browser window. Once the window is destroyed test completion // will be signaled. - void DestroyTest() - { - Lock(); -#if defined(OS_WIN) - if(browser_hwnd_ != NULL) - PostMessage(browser_hwnd_, WM_CLOSE, 0, 0); -#endif - Unlock(); - } + void DestroyTest(); - void CreateBrowser(const CefString& url) - { - CefWindowInfo windowInfo; - CefBrowserSettings settings; -#if defined(OS_WIN) - windowInfo.SetAsPopup(NULL, "CefUnitTest"); - windowInfo.m_dwStyle |= WS_VISIBLE; -#endif - CefBrowser::CreateBrowser(windowInfo, this, url, settings); - } + void CreateBrowser(const CefString& url); void AddResource(const CefString& key, const std::string& value, - const CefString& mimeType) - { - resource_map_.insert(std::make_pair(key, std::make_pair(value, mimeType))); - } - - void ClearResources() - { - resource_map_.clear(); - } + const CefString& mimeType); + void ClearResources(); private: // The child browser window @@ -190,19 +104,9 @@ private: }; -static void NotifyEvent(base::WaitableEvent* event) -{ - event->Signal(); -} - // Post a task to the specified thread and wait for the task to execute as // indication that all previously pending tasks on that thread have completed. -static void WaitForThread(CefThreadId thread_id) -{ - base::WaitableEvent event(true, false); - CefPostTask(thread_id, NewCefRunnableFunction(&NotifyEvent, &event)); - event.Wait(); -} +void WaitForThread(CefThreadId thread_id); #define WaitForIOThread() WaitForThread(TID_IO) #define WaitForUIThread() WaitForThread(TID_UI) diff --git a/tests/unittests/v8_unittest.cc b/tests/unittests/v8_unittest.cc index 8515d6c25..a347a5a17 100644 --- a/tests/unittests/v8_unittest.cc +++ b/tests/unittests/v8_unittest.cc @@ -2,6 +2,7 @@ // reserved. Use of this source code is governed by a BSD-style license that // can be found in the LICENSE file. +#include "include/cef_runnable.h" #include "include/cef_v8.h" #include "testing/gtest/include/gtest/gtest.h" #include "test_handler.h"