From b8cbcdc4b541058bbcfc7d9db9f28640d3c2def2 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 13 Aug 2012 09:46:11 -0700 Subject: [PATCH] Remove unused files --- atom.gyp | 4 - tests/cefclient/binding_test.cpp | 104 - tests/cefclient/binding_test.h | 24 - tests/cefclient/cefclient.cpp | 1 - tests/cefclient/cefclient_mac.mm | 2 - tests/cefclient/client_handler.cpp | 2 - tests/cefclient/dom_test.cpp | 139 - tests/cefclient/dom_test.h | 28 - tests/cefclient/res/binding.html | 27 - tests/cefclient/res/dialogs.html | 45 - tests/cefclient/res/domaccess.html | 13 - tests/cefclient/res/localstorage.html | 24 - tests/cefclient/res/logo.png | Bin 19879 -> 0 bytes tests/cefclient/res/logoball.png | Bin 7181 -> 0 bytes tests/cefclient/res/xmlhttprequest.html | 19 - tests/cefclient/resource.h | 69 - tests/cefclient/resource_util.h | 32 - tests/cefclient/resource_util_linux.cpp | 67 - tests/cefclient/resource_util_mac.mm | 97 - tests/cefclient/resource_util_win.cpp | 64 - tests/cefclient/scheme_test.cpp | 182 -- tests/cefclient/scheme_test.h | 29 - tests/cefclient/string_util.cpp | 8 - tests/cefclient/string_util.h | 14 - tests/unittests/client_app_delegates.cc | 48 - tests/unittests/command_line_unittest.cc | 118 - tests/unittests/cookie_unittest.cc | 962 ------ tests/unittests/dom_unittest.cc | 332 -- tests/unittests/jsdialog_unittest.cc | 413 --- .../mac/English.lproj/InfoPlist.strings | 3 - .../unittests/mac/English.lproj/MainMenu.xib | 2880 ----------------- tests/unittests/mac/Info.plist | 28 - tests/unittests/mac/unittests.icns | Bin 55080 -> 0 bytes tests/unittests/navigation_unittest.cc | 605 ---- tests/unittests/process_message_unittest.cc | 184 -- tests/unittests/request_unittest.cc | 192 -- tests/unittests/run_all_unittests.cc | 119 - tests/unittests/run_all_unittests_mac.mm | 45 - tests/unittests/scheme_handler_unittest.cc | 960 ------ tests/unittests/stream_unittest.cc | 363 --- tests/unittests/string_unittest.cc | 340 -- tests/unittests/test_handler.cc | 144 - tests/unittests/test_handler.h | 125 - tests/unittests/test_suite.cc | 112 - tests/unittests/test_suite.h | 37 - tests/unittests/test_util.cc | 227 -- tests/unittests/test_util.h | 59 - tests/unittests/url_unittest.cc | 183 -- tests/unittests/urlrequest_unittest.cc | 1030 ------ tests/unittests/v8_unittest.cc | 1615 --------- tests/unittests/values_unittest.cc | 734 ----- tests/unittests/xml_reader_unittest.cc | 642 ---- tests/unittests/zip_reader_unittest.cc | 253 -- 53 files changed, 13747 deletions(-) delete mode 100644 tests/cefclient/binding_test.cpp delete mode 100644 tests/cefclient/binding_test.h delete mode 100644 tests/cefclient/dom_test.cpp delete mode 100644 tests/cefclient/dom_test.h delete mode 100644 tests/cefclient/res/binding.html delete mode 100644 tests/cefclient/res/dialogs.html delete mode 100644 tests/cefclient/res/domaccess.html delete mode 100644 tests/cefclient/res/localstorage.html delete mode 100644 tests/cefclient/res/logo.png delete mode 100644 tests/cefclient/res/logoball.png delete mode 100644 tests/cefclient/res/xmlhttprequest.html delete mode 100644 tests/cefclient/resource.h delete mode 100644 tests/cefclient/resource_util.h delete mode 100644 tests/cefclient/resource_util_linux.cpp delete mode 100644 tests/cefclient/resource_util_mac.mm delete mode 100644 tests/cefclient/resource_util_win.cpp delete mode 100644 tests/cefclient/scheme_test.cpp delete mode 100644 tests/cefclient/scheme_test.h delete mode 100644 tests/cefclient/string_util.cpp delete mode 100644 tests/cefclient/string_util.h delete mode 100644 tests/unittests/client_app_delegates.cc delete mode 100644 tests/unittests/command_line_unittest.cc delete mode 100644 tests/unittests/cookie_unittest.cc delete mode 100644 tests/unittests/dom_unittest.cc delete mode 100644 tests/unittests/jsdialog_unittest.cc delete mode 100644 tests/unittests/mac/English.lproj/InfoPlist.strings delete mode 100644 tests/unittests/mac/English.lproj/MainMenu.xib delete mode 100644 tests/unittests/mac/Info.plist delete mode 100644 tests/unittests/mac/unittests.icns delete mode 100644 tests/unittests/navigation_unittest.cc delete mode 100644 tests/unittests/process_message_unittest.cc delete mode 100644 tests/unittests/request_unittest.cc delete mode 100644 tests/unittests/run_all_unittests.cc delete mode 100644 tests/unittests/run_all_unittests_mac.mm delete mode 100644 tests/unittests/scheme_handler_unittest.cc delete mode 100644 tests/unittests/stream_unittest.cc delete mode 100644 tests/unittests/string_unittest.cc delete mode 100644 tests/unittests/test_handler.cc delete mode 100644 tests/unittests/test_handler.h delete mode 100644 tests/unittests/test_suite.cc delete mode 100644 tests/unittests/test_suite.h delete mode 100644 tests/unittests/test_util.cc delete mode 100644 tests/unittests/test_util.h delete mode 100644 tests/unittests/url_unittest.cc delete mode 100644 tests/unittests/urlrequest_unittest.cc delete mode 100644 tests/unittests/v8_unittest.cc delete mode 100644 tests/unittests/values_unittest.cc delete mode 100644 tests/unittests/xml_reader_unittest.cc delete mode 100644 tests/unittests/zip_reader_unittest.cc diff --git a/atom.gyp b/atom.gyp index 55be4abe9..4ee328c29 100644 --- a/atom.gyp +++ b/atom.gyp @@ -57,7 +57,6 @@ 'tests/cefclient/client_renderer.h', 'tests/cefclient/client_switches.cpp', 'tests/cefclient/client_switches.h', - 'tests/cefclient/resource_util.h', 'tests/cefclient/util.h', ], 'mac_bundle_resources': [ @@ -193,7 +192,6 @@ 'include/internal/cef_types_mac.h', 'tests/cefclient/cefclient_mac.mm', 'tests/cefclient/client_handler_mac.mm', - 'tests/cefclient/resource_util_mac.mm', ], }], [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', { @@ -282,8 +280,6 @@ 'tests/cefclient/client_switches.cpp', 'tests/cefclient/client_switches.h', 'tests/cefclient/process_helper_mac.cpp', - 'tests/cefclient/resource_util.h', - 'tests/cefclient/resource_util_mac.mm', 'tests/cefclient/util.h', ], # TODO(mark): Come up with a fancier way to do this. It should only diff --git a/tests/cefclient/binding_test.cpp b/tests/cefclient/binding_test.cpp deleted file mode 100644 index e3efa23f2..000000000 --- a/tests/cefclient/binding_test.cpp +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) 2012 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 "cefclient/binding_test.h" - -#include -#include - -#include "include/wrapper/cef_stream_resource_handler.h" -#include "cefclient/resource_util.h" - -namespace binding_test { - -namespace { - -const char* kTestUrl = "http://tests/binding"; -const char* kMessageName = "binding_test"; - -// Handle messages in the browser process. -class ProcessMessageDelegate : public ClientHandler::ProcessMessageDelegate { - public: - ProcessMessageDelegate() { - } - - // From ClientHandler::ProcessMessageDelegate. - virtual bool OnProcessMessageReceived( - CefRefPtr handler, - CefRefPtr browser, - CefProcessId source_process, - CefRefPtr message) OVERRIDE { - std::string message_name = message->GetName(); - if (message_name == kMessageName) { - // Handle the message. - std::string result; - - CefRefPtr args = message->GetArgumentList(); - if (args->GetSize() > 0 && args->GetType(0) == VTYPE_STRING) { - // Our result is a reverse of the original message. - result = args->GetString(0); - std::reverse(result.begin(), result.end()); - } else { - result = "Invalid request"; - } - - // Send the result back to the render process. - CefRefPtr response = - CefProcessMessage::Create(kMessageName); - response->GetArgumentList()->SetString(0, result); - browser->SendProcessMessage(PID_RENDERER, response); - - return true; - } - - return false; - } - - IMPLEMENT_REFCOUNTING(ProcessMessageDelegate); -}; - -// Handle resource loading in the browser process. -class RequestDelegate: public ClientHandler::RequestDelegate { - public: - RequestDelegate() { - } - - // From ClientHandler::RequestDelegate. - virtual CefRefPtr GetResourceHandler( - CefRefPtr handler, - CefRefPtr browser, - CefRefPtr frame, - CefRefPtr request) OVERRIDE { - std::string url = request->GetURL(); - if (url == kTestUrl) { - // Show the binding contents - CefRefPtr stream = - GetBinaryResourceReader("binding.html"); - ASSERT(stream.get()); - return new CefStreamResourceHandler("text/html", stream); - } - - return NULL; - } - - IMPLEMENT_REFCOUNTING(RequestDelegate); -}; - -} // namespace - -void CreateProcessMessageDelegates( - ClientHandler::ProcessMessageDelegateSet& delegates) { - delegates.insert(new ProcessMessageDelegate); -} - -void CreateRequestDelegates(ClientHandler::RequestDelegateSet& delegates) { - delegates.insert(new RequestDelegate); -} - -void RunTest(CefRefPtr browser) { - // Load the test URL. - browser->GetMainFrame()->LoadURL(kTestUrl); -} - -} // namespace binding_test diff --git a/tests/cefclient/binding_test.h b/tests/cefclient/binding_test.h deleted file mode 100644 index 3412fa2a1..000000000 --- a/tests/cefclient/binding_test.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2012 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_BINDING_TEST_H_ -#define CEF_TESTS_CEFCLIENT_BINDING_TEST_H_ -#pragma once - -#include "cefclient/client_app.h" -#include "cefclient/client_handler.h" - -namespace binding_test { - -// Delegate creation. Called from ClientApp and ClientHandler. -void CreateProcessMessageDelegates( - ClientHandler::ProcessMessageDelegateSet& delegates); -void CreateRequestDelegates(ClientHandler::RequestDelegateSet& delegates); - -// Run the test. -void RunTest(CefRefPtr browser); - -} // namespace binding_test - -#endif // CEF_TESTS_CEFCLIENT_BINDING_TEST_H_ diff --git a/tests/cefclient/cefclient.cpp b/tests/cefclient/cefclient.cpp index 43df24def..09c412657 100644 --- a/tests/cefclient/cefclient.cpp +++ b/tests/cefclient/cefclient.cpp @@ -15,7 +15,6 @@ #include "include/cef_web_plugin.h" #include "cefclient/client_handler.h" #include "cefclient/client_switches.h" -#include "cefclient/string_util.h" #include "cefclient/util.h" CefRefPtr g_handler; diff --git a/tests/cefclient/cefclient_mac.mm b/tests/cefclient/cefclient_mac.mm index 27d495206..13a7d055b 100644 --- a/tests/cefclient/cefclient_mac.mm +++ b/tests/cefclient/cefclient_mac.mm @@ -12,8 +12,6 @@ #include "include/cef_frame.h" #include "include/cef_runnable.h" #include "cefclient/client_handler.h" -#include "cefclient/resource_util.h" -#include "cefclient/string_util.h" // The global ClientHandler reference. extern CefRefPtr g_handler; diff --git a/tests/cefclient/client_handler.cpp b/tests/cefclient/client_handler.cpp index 5c94a6a17..a9247eb33 100644 --- a/tests/cefclient/client_handler.cpp +++ b/tests/cefclient/client_handler.cpp @@ -16,8 +16,6 @@ #include "cefclient/cefclient.h" #include "cefclient/client_renderer.h" #include "cefclient/client_switches.h" -#include "cefclient/resource_util.h" -#include "cefclient/string_util.h" // Custom menu command Ids. diff --git a/tests/cefclient/dom_test.cpp b/tests/cefclient/dom_test.cpp deleted file mode 100644 index 5002d6394..000000000 --- a/tests/cefclient/dom_test.cpp +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright (c) 2012 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 "cefclient/dom_test.h" - -#include -#include - -#include "include/cef_dom.h" -#include "cefclient/util.h" - -namespace dom_test { - -const char kTestUrl[] = "http://tests/domaccess"; - -namespace { - -const char* kMessageName = "DOMTest.Message"; - -class ClientDOMEventListener : public CefDOMEventListener { - public: - ClientDOMEventListener() { - } - - virtual void HandleEvent(CefRefPtr event) OVERRIDE { - CefRefPtr document = event->GetDocument(); - ASSERT(document.get()); - - std::stringstream ss; - - CefRefPtr button = event->GetTarget(); - ASSERT(button.get()); - std::string buttonValue = button->GetElementAttribute("value"); - ss << "You clicked the " << buttonValue.c_str() << " button. "; - - if (document->HasSelection()) { - std::string startName, endName; - - // Determine the start name by first trying to locate the "id" attribute - // and then defaulting to the tag name. - { - CefRefPtr node = document->GetSelectionStartNode(); - if (!node->IsElement()) - node = node->GetParent(); - if (node->IsElement() && node->HasElementAttribute("id")) - startName = node->GetElementAttribute("id"); - else - startName = node->GetName(); - } - - // Determine the end name by first trying to locate the "id" attribute - // and then defaulting to the tag name. - { - CefRefPtr node = document->GetSelectionEndNode(); - if (!node->IsElement()) - node = node->GetParent(); - if (node->IsElement() && node->HasElementAttribute("id")) - endName = node->GetElementAttribute("id"); - else - endName = node->GetName(); - } - - ss << "The selection is from " << - startName.c_str() << ":" << document->GetSelectionStartOffset() << - " to " << - endName.c_str() << ":" << document->GetSelectionEndOffset(); - } else { - ss << "Nothing is selected."; - } - - // Update the description. - CefRefPtr desc = document->GetElementById("description"); - ASSERT(desc.get()); - CefRefPtr text = desc->GetFirstChild(); - ASSERT(text.get()); - ASSERT(text->IsText()); - text->SetValue(ss.str()); - } - - IMPLEMENT_REFCOUNTING(ClientDOMEventListener); -}; - -class ClientDOMVisitor : public CefDOMVisitor { - public: - ClientDOMVisitor() { - } - - virtual void Visit(CefRefPtr document) OVERRIDE { - // Register a click listener for the button. - CefRefPtr button = document->GetElementById("button"); - ASSERT(button.get()); - button->AddEventListener("click", new ClientDOMEventListener(), false); - } - - IMPLEMENT_REFCOUNTING(ClientDOMVisitor); -}; - -class DOMRenderDelegate : public ClientApp::RenderDelegate { - public: - DOMRenderDelegate() { - } - - virtual bool OnProcessMessageReceived( - CefRefPtr app, - CefRefPtr browser, - CefProcessId source_process, - CefRefPtr message) OVERRIDE { - if (message->GetName() == kMessageName) { - // Visit the DOM to attach the event listener. - browser->GetMainFrame()->VisitDOM(new ClientDOMVisitor); - return true; - } - - return false; - } - - private: - IMPLEMENT_REFCOUNTING(DOMRenderDelegate); -}; - -} // namespace - -void CreateRenderDelegates(ClientApp::RenderDelegateSet& delegates) { - delegates.insert(new DOMRenderDelegate); -} - -void RunTest(CefRefPtr browser) { - // Load the test URL. - browser->GetMainFrame()->LoadURL(kTestUrl); -} - -void OnLoadEnd(CefRefPtr browser) { - // Send a message to the render process to continue the test setup. - browser->SendProcessMessage(PID_RENDERER, - CefProcessMessage::Create(kMessageName)); -} - -} // namespace dom_test diff --git a/tests/cefclient/dom_test.h b/tests/cefclient/dom_test.h deleted file mode 100644 index 0bcee1749..000000000 --- a/tests/cefclient/dom_test.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2012 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_DOM_TEST_H_ -#define CEF_TESTS_CEFCLIENT_DOM_TEST_H_ -#pragma once - -#include "include/cef_base.h" -#include "cefclient/client_app.h" - -namespace dom_test { - -// The DOM test URL. -extern const char kTestUrl[]; - -// Create the render delegate. -void CreateRenderDelegates(ClientApp::RenderDelegateSet& delegates); - -// Run the test. -void RunTest(CefRefPtr browser); - -// Continue the test after the page has loaded. -void OnLoadEnd(CefRefPtr browser); - -} // namespace dom_test - -#endif // CEF_TESTS_CEFCLIENT_DOM_TEST_H_ diff --git a/tests/cefclient/res/binding.html b/tests/cefclient/res/binding.html deleted file mode 100644 index edb1f4a00..000000000 --- a/tests/cefclient/res/binding.html +++ /dev/null @@ -1,27 +0,0 @@ - - -Binding Test - - - - -
-Message: -
-
You should see the reverse of your message below: -
-
- - diff --git a/tests/cefclient/res/dialogs.html b/tests/cefclient/res/dialogs.html deleted file mode 100644 index 1bce8e475..000000000 --- a/tests/cefclient/res/dialogs.html +++ /dev/null @@ -1,45 +0,0 @@ - - -Dialog Test - - - -
-Click a button to show the associated dialog type. -
-
-
-

-
- - diff --git a/tests/cefclient/res/domaccess.html b/tests/cefclient/res/domaccess.html deleted file mode 100644 index 68ff69647..000000000 --- a/tests/cefclient/res/domaccess.html +++ /dev/null @@ -1,13 +0,0 @@ - - -

Select some portion of the below page content and click the "Describe Selection" button. The selected region will then be described below.

-

This is p1

-

This is p2

-

This is p3

-

This is p4

-
- -

The description will appear here.

-
- - diff --git a/tests/cefclient/res/localstorage.html b/tests/cefclient/res/localstorage.html deleted file mode 100644 index a794305b7..000000000 --- a/tests/cefclient/res/localstorage.html +++ /dev/null @@ -1,24 +0,0 @@ - - - -Click the "Add Line" button to add a line or the "Clear" button to clear.
-This data will persist across sessions if a cache path was specified.
- - -
- - - diff --git a/tests/cefclient/res/logo.png b/tests/cefclient/res/logo.png deleted file mode 100644 index 41dd728df08295acf843dce12d9d19a342922df7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19879 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 - - -
-URL: -
-
-
- - diff --git a/tests/cefclient/resource.h b/tests/cefclient/resource.h deleted file mode 100644 index dd6988e3b..000000000 --- a/tests/cefclient/resource.h +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2010 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. - -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by cefclient.rc -// -#define BINARY 256 -#define IDC_MYICON 2 -#define IDD_CEFCLIENT_DIALOG 102 -#define IDS_APP_TITLE 103 -#define IDD_ABOUTBOX 103 -#define IDM_ABOUT 104 -#define IDM_EXIT 105 -#define IDI_CEFCLIENT 107 -#define IDI_SMALL 108 -#define IDC_CEFCLIENT 109 -#define IDR_MAINFRAME 128 -#define IDC_NAV_BACK 200 -#define IDC_NAV_FORWARD 201 -#define IDC_NAV_RELOAD 202 -#define IDC_NAV_STOP 203 -#define ID_WARN_CONSOLEMESSAGE 32000 -#define ID_WARN_DOWNLOADCOMPLETE 32001 -#define ID_WARN_DOWNLOADERROR 32002 -#define ID_TESTS_GETSOURCE 32760 -#define ID_TESTS_GETTEXT 32761 -#define ID_TESTS_POPUP 32762 -#define ID_TESTS_REQUEST 32763 -#define ID_TESTS_SCHEME_HANDLER 32764 -#define ID_TESTS_LOCALSTORAGE 32765 -#define ID_TESTS_ACCELERATED2DCANVAS 32766 -#define ID_TESTS_ACCELERATEDLAYERS 32767 -#define ID_TESTS_WEBGL 32768 -#define ID_TESTS_HTML5VIDEO 32769 -#define ID_TESTS_XMLHTTPREQUEST 32770 -#define ID_TESTS_DRAGDROP 32771 -#define ID_TESTS_GEOLOCATION 32772 -#define ID_TESTS_BINDING 32773 -#define ID_TESTS_DIALOGS 32774 -#define ID_TESTS_PLUGIN_INFO 32775 -#define ID_TESTS_DOM_ACCESS 32776 -#define ID_TESTS_ZOOM_IN 32777 -#define ID_TESTS_ZOOM_OUT 32778 -#define ID_TESTS_ZOOM_RESET 32779 -#define IDC_STATIC -1 -#define IDS_BINDING 1000 -#define IDS_DIALOGS 1001 -#define IDS_LOGO 1002 -#define IDS_LOGOBALL 1003 -#define IDS_LOCALSTORAGE 1004 -#define IDS_XMLHTTPREQUEST 1005 -#define IDS_DOMACCESS 1006 - -// Avoid files associated with MacOS -#define _X86_ - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NO_MFC 1 -#define _APS_NEXT_RESOURCE_VALUE 130 -#define _APS_NEXT_COMMAND_VALUE 32774 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 110 -#endif -#endif diff --git a/tests/cefclient/resource_util.h b/tests/cefclient/resource_util.h deleted file mode 100644 index c382196f4..000000000 --- a/tests/cefclient/resource_util.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2009 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_RESOURCE_UTIL_H_ -#define CEF_TESTS_CEFCLIENT_RESOURCE_UTIL_H_ -#pragma once - -#include "include/cef_base.h" - -class CefStreamReader; - -#if defined(OS_WIN) - -#include "cefclient/resource.h" - -// Load a resource of type BINARY -bool LoadBinaryResource(int binaryId, DWORD &dwSize, LPBYTE &pBytes); -CefRefPtr GetBinaryResourceReader(int binaryId); - -#elif defined(OS_MACOSX) || defined(OS_POSIX) - -#include // NOLINT(build/include_order) - -// Load the resource with the specified name. -bool LoadBinaryResource(const char* resource_name, std::string& resource_data); - -#endif - -CefRefPtr GetBinaryResourceReader(const char* resource_name); - -#endif // CEF_TESTS_CEFCLIENT_RESOURCE_UTIL_H_ diff --git a/tests/cefclient/resource_util_linux.cpp b/tests/cefclient/resource_util_linux.cpp deleted file mode 100644 index 66b46267d..000000000 --- a/tests/cefclient/resource_util_linux.cpp +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2011 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. - -#include "cefclient/resource_util.h" -#include -#include -#include "include/cef_stream.h" -#include "cefclient/util.h" - -bool GetResourceDir(std::string& dir) { - char buff[1024]; - - // Retrieve the executable path. - ssize_t len = readlink("/proc/self/exe", buff, sizeof(buff)-1); - if (len == -1) - return false; - - buff[len] = 0; - - // Remove the executable name from the path. - char* pos = strrchr(buff, '/'); - if (!pos) - return false; - - // Add "files" to the path. - strcpy(pos+1, "files"); // NOLINT(runtime/printf) - dir = std::string(buff); - return true; -} - -bool LoadBinaryResource(const char* resource_name, std::string& resource_data) { - std::string path; - if (!GetResourceDir(path)) - return false; - - path.append("/"); - path.append(resource_name); - - FILE* f = fopen(path.c_str(), "rb"); - if (!f) - return false; - - size_t bytes_read; - char buff[1024*8]; - - do { - bytes_read = fread(buff, 1, sizeof(buff)-1, f); - if (bytes_read > 0) - resource_data.append(buff, bytes_read); - } while (bytes_read > 0); - - fclose(f); - return true; -} - -CefRefPtr GetBinaryResourceReader(const char* resource_name) { - std::string path; - if (!GetResourceDir(path)) - return NULL; - - path.append("/"); - path.append(resource_name); - - return CefStreamReader::CreateForFile(path); -} diff --git a/tests/cefclient/resource_util_mac.mm b/tests/cefclient/resource_util_mac.mm deleted file mode 100644 index 98cfd8605..000000000 --- a/tests/cefclient/resource_util_mac.mm +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2011 The Chromium Embedded Framework Authors. -// Portions copyright (c) 2011 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. - -#import -#include -#include -#include "cefclient/resource_util.h" -#include "include/cef_stream.h" -#include "cefclient/util.h" - -namespace { - -bool AmIBundled() { - // Implementation adapted from Chromium's base/mac/foundation_util.mm - ProcessSerialNumber psn = {0, kCurrentProcess}; - - FSRef fsref; - OSStatus pbErr; - if ((pbErr = GetProcessBundleLocation(&psn, &fsref)) != noErr) { - ASSERT(false); - return false; - } - - FSCatalogInfo info; - OSErr fsErr; - if ((fsErr = FSGetCatalogInfo(&fsref, kFSCatInfoNodeFlags, &info, - NULL, NULL, NULL)) != noErr) { - ASSERT(false); - return false; - } - - return (info.nodeFlags & kFSNodeIsDirectoryMask); -} - -bool GetResourceDir(std::string& dir) { - // Implementation adapted from Chromium's base/base_path_mac.mm - if (AmIBundled()) { - // Retrieve the executable directory. - uint32_t pathSize = 0; - _NSGetExecutablePath(NULL, &pathSize); - if (pathSize > 0) { - dir.resize(pathSize); - _NSGetExecutablePath(const_cast(dir.c_str()), &pathSize); - } - - // Trim executable name up to the last separator - std::string::size_type last_separator = dir.find_last_of("/"); - dir.resize(last_separator); - dir.append("/../Resources"); - return true; - } else { - // TODO: Provide unbundled path - ASSERT(false); - return false; - } -} - -bool ReadFileToString(const char* path, std::string& data) { - // Implementation adapted from base/file_util.cc - FILE* file = fopen(path, "rb"); - if (!file) - return false; - - char buf[1 << 16]; - size_t len; - while ((len = fread(buf, 1, sizeof(buf), file)) > 0) - data.append(buf, len); - fclose(file); - - return true; -} - -} // namespace - -bool LoadBinaryResource(const char* resource_name, std::string& resource_data) { - std::string path; - if (!GetResourceDir(path)) - return false; - - path.append("/"); - path.append(resource_name); - - return ReadFileToString(path.c_str(), resource_data); -} - -CefRefPtr GetBinaryResourceReader(const char* resource_name) { - std::string path; - if (!GetResourceDir(path)) - return NULL; - - path.append("/"); - path.append(resource_name); - - return CefStreamReader::CreateForFile(path); -} diff --git a/tests/cefclient/resource_util_win.cpp b/tests/cefclient/resource_util_win.cpp deleted file mode 100644 index 8482ac954..000000000 --- a/tests/cefclient/resource_util_win.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2008-2009 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 "cefclient/resource_util.h" -#include "include/cef_stream.h" -#include "include/wrapper/cef_byte_read_handler.h" -#include "cefclient/util.h" - -#if defined(OS_WIN) - -bool LoadBinaryResource(int binaryId, DWORD &dwSize, LPBYTE &pBytes) { - extern HINSTANCE hInst; - HRSRC hRes = FindResource(hInst, MAKEINTRESOURCE(binaryId), - MAKEINTRESOURCE(256)); - if (hRes) { - HGLOBAL hGlob = LoadResource(hInst, hRes); - if (hGlob) { - dwSize = SizeofResource(hInst, hRes); - pBytes = (LPBYTE)LockResource(hGlob); - if (dwSize > 0 && pBytes) - return true; - } - } - - return false; -} - -CefRefPtr GetBinaryResourceReader(int binaryId) { - DWORD dwSize; - LPBYTE pBytes; - - if (LoadBinaryResource(binaryId, dwSize, pBytes)) { - return CefStreamReader::CreateForHandler( - new CefByteReadHandler(pBytes, dwSize, NULL)); - } - - ASSERT(FALSE); // The resource should be found. - return NULL; -} - -CefRefPtr GetBinaryResourceReader(const char* resource_name) { - // Map of resource labels to BINARY id values. - static struct _resource_map { - char* name; - int id; - } resource_map[] = { - {"binding.html", IDS_BINDING}, - {"dialogs.html", IDS_DIALOGS}, - {"domaccess.html", IDS_DOMACCESS}, - {"localstorage.html", IDS_LOCALSTORAGE}, - {"xmlhttprequest.html", IDS_XMLHTTPREQUEST}, - }; - - for (int i = 0; i < sizeof(resource_map)/sizeof(_resource_map); ++i) { - if (!strcmp(resource_map[i].name, resource_name)) - return GetBinaryResourceReader(resource_map[i].id); - } - - ASSERT(FALSE); // The resource should be found. - return NULL; -} - -#endif // OS_WIN diff --git a/tests/cefclient/scheme_test.cpp b/tests/cefclient/scheme_test.cpp deleted file mode 100644 index ee33a4389..000000000 --- a/tests/cefclient/scheme_test.cpp +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright (c) 2012 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 "cefclient/scheme_test.h" -#include -#include -#include "include/cef_browser.h" -#include "include/cef_callback.h" -#include "include/cef_frame.h" -#include "include/cef_resource_handler.h" -#include "include/cef_response.h" -#include "include/cef_request.h" -#include "include/cef_scheme.h" -#include "cefclient/resource_util.h" -#include "cefclient/string_util.h" -#include "cefclient/util.h" - -#if defined(OS_WIN) -#include "cefclient/resource.h" -#endif - -namespace scheme_test { - -namespace { - -// Implementation of the schema handler for client:// requests. -class ClientSchemeHandler : public CefResourceHandler { - public: - ClientSchemeHandler() : offset_(0) {} - - virtual bool ProcessRequest(CefRefPtr request, - CefRefPtr callback) - OVERRIDE { - REQUIRE_IO_THREAD(); - - bool handled = false; - - AutoLock lock_scope(this); - - std::string url = request->GetURL(); - if (strstr(url.c_str(), "handler.html") != NULL) { - // Build the response html - data_ = "Client Scheme Handler" - "This contents of this page page are served by the " - "ClientSchemeHandler class handling the client:// protocol." - "
You should see an image:" - "
";
-
-      // Output a string representation of the request
-      std::string dump;
-      DumpRequestContents(request, dump);
-      data_.append(dump);
-
-      data_.append("

Try the test form:" - "
" - "" - "" - "" - "
"); - - handled = true; - - // Set the resulting mime type - mime_type_ = "text/html"; - } else if (strstr(url.c_str(), "client.png") != NULL) { - // Load the response image -#if defined(OS_WIN) - DWORD dwSize; - LPBYTE pBytes; - if (LoadBinaryResource(IDS_LOGO, dwSize, pBytes)) { - data_ = std::string(reinterpret_cast(pBytes), dwSize); - handled = true; - // Set the resulting mime type - mime_type_ = "image/jpg"; - } -#elif defined(OS_MACOSX) || defined(OS_LINUX) - if (LoadBinaryResource("logo.png", data_)) { - handled = true; - // Set the resulting mime type - mime_type_ = "image/png"; - } -#else -#error "Unsupported platform" -#endif - } - - if (handled) { - // Indicate the headers are available. - callback->Continue(); - return true; - } - - return false; - } - - virtual void GetResponseHeaders(CefRefPtr response, - int64& response_length, - CefString& redirectUrl) OVERRIDE { - REQUIRE_IO_THREAD(); - - ASSERT(!data_.empty()); - - response->SetMimeType(mime_type_); - response->SetStatus(200); - - // Set the resulting response length - response_length = data_.length(); - } - - virtual void Cancel() OVERRIDE { - REQUIRE_IO_THREAD(); - } - - virtual bool ReadResponse(void* data_out, - int bytes_to_read, - int& bytes_read, - CefRefPtr callback) - OVERRIDE { - REQUIRE_IO_THREAD(); - - bool has_data = false; - bytes_read = 0; - - AutoLock lock_scope(this); - - if (offset_ < data_.length()) { - // Copy the next block of data into the buffer. - int transfer_size = - std::min(bytes_to_read, static_cast(data_.length() - offset_)); - memcpy(data_out, data_.c_str() + offset_, transfer_size); - offset_ += transfer_size; - - bytes_read = transfer_size; - has_data = true; - } - - return has_data; - } - - private: - std::string data_; - std::string mime_type_; - size_t offset_; - - IMPLEMENT_REFCOUNTING(ClientSchemeHandler); - IMPLEMENT_LOCKING(ClientSchemeHandler); -}; - -// Implementation of the factory for for creating schema handlers. -class ClientSchemeHandlerFactory : public CefSchemeHandlerFactory { - public: - // Return a new scheme handler instance to handle the request. - virtual CefRefPtr Create(CefRefPtr browser, - CefRefPtr frame, - const CefString& scheme_name, - CefRefPtr request) - OVERRIDE { - REQUIRE_IO_THREAD(); - return new ClientSchemeHandler(); - } - - IMPLEMENT_REFCOUNTING(ClientSchemeHandlerFactory); -}; - -} // namespace - -void RegisterCustomSchemes(CefRefPtr registrar, - std::vector& cookiable_schemes) { - registrar->AddCustomScheme("client", true, false, false); -} - -void InitTest() { - CefRegisterSchemeHandlerFactory("client", "tests", - new ClientSchemeHandlerFactory()); -} - -void RunTest(CefRefPtr browser) { - browser->GetMainFrame()->LoadURL("client://tests/handler.html"); -} - -} // namespace scheme_test diff --git a/tests/cefclient/scheme_test.h b/tests/cefclient/scheme_test.h deleted file mode 100644 index 724843a92..000000000 --- a/tests/cefclient/scheme_test.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2009 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_SCHEME_TEST_H_ -#define CEF_TESTS_CEFCLIENT_SCHEME_TEST_H_ -#pragma once - -#include -#include "include/cef_base.h" - -class CefBrowser; -class CefSchemeRegistrar; - -namespace scheme_test { - -// Register the scheme. -void RegisterCustomSchemes(CefRefPtr registrar, - std::vector& cookiable_schemes); - -// Create the scheme handler. -void InitTest(); - -// Run the test. -void RunTest(CefRefPtr browser); - -} // namespace scheme_test - -#endif // CEF_TESTS_CEFCLIENT_SCHEME_TEST_H_ diff --git a/tests/cefclient/string_util.cpp b/tests/cefclient/string_util.cpp deleted file mode 100644 index 35bf2ec19..000000000 --- a/tests/cefclient/string_util.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2010 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 "cefclient/string_util.h" -#include -#include -#include "include/cef_request.h" diff --git a/tests/cefclient/string_util.h b/tests/cefclient/string_util.h deleted file mode 100644 index 6e679f812..000000000 --- a/tests/cefclient/string_util.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) 2010 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_STRING_UTIL_H_ -#define CEF_TESTS_CEFCLIENT_STRING_UTIL_H_ -#pragma once - -#include -#include "include/cef_base.h" - -class CefRequest; - -#endif // CEF_TESTS_CEFCLIENT_STRING_UTIL_H_ diff --git a/tests/unittests/client_app_delegates.cc b/tests/unittests/client_app_delegates.cc deleted file mode 100644 index e47e97698..000000000 --- a/tests/unittests/client_app_delegates.cc +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2012 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 "tests/cefclient/client_app.h" - -// static -void ClientApp::CreateRenderDelegates(RenderDelegateSet& delegates) { - // Bring in the process message tests. - extern void CreateProcessMessageRendererTests( - ClientApp::RenderDelegateSet& delegates); - CreateProcessMessageRendererTests(delegates); - - // Bring in the V8 tests. - extern void CreateV8RendererTests(RenderDelegateSet& delegates); - CreateV8RendererTests(delegates); - - // Bring in the DOM tests. - extern void CreateDOMRendererTests(RenderDelegateSet& delegates); - CreateDOMRendererTests(delegates); - - // Bring in the URLRequest tests. - extern void CreateURLRequestRendererTests(RenderDelegateSet& delegates); - CreateURLRequestRendererTests(delegates); -} - -// static -void ClientApp::RegisterCustomSchemes( - CefRefPtr registrar, - std::vector& cookiable_schemes) { - // Bring in the scheme handler tests. - extern void RegisterSchemeHandlerCustomSchemes( - CefRefPtr registrar, - std::vector& cookiable_schemes); - RegisterSchemeHandlerCustomSchemes(registrar, cookiable_schemes); - - // Bring in the cookie tests. - extern void RegisterCookieCustomSchemes( - CefRefPtr registrar, - std::vector& cookiable_schemes); - RegisterCookieCustomSchemes(registrar, cookiable_schemes); - - // Bring in the URLRequest tests. - extern void RegisterURLRequestCustomSchemes( - CefRefPtr registrar, - std::vector& cookiable_schemes); - RegisterURLRequestCustomSchemes(registrar, cookiable_schemes); -} diff --git a/tests/unittests/command_line_unittest.cc b/tests/unittests/command_line_unittest.cc deleted file mode 100644 index 19c4b47b6..000000000 --- a/tests/unittests/command_line_unittest.cc +++ /dev/null @@ -1,118 +0,0 @@ -// 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 "include/cef_command_line.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -void VerifyCommandLine(CefRefPtr command_line) { - std::string program = command_line->GetProgram(); - EXPECT_EQ("test.exe", program); - - EXPECT_TRUE(command_line->HasSwitches()); - - EXPECT_TRUE(command_line->HasSwitch("switch1")); - std::string switch1 = command_line->GetSwitchValue("switch1"); - EXPECT_EQ("", switch1); - EXPECT_TRUE(command_line->HasSwitch("switch2")); - std::string switch2 = command_line->GetSwitchValue("switch2"); - EXPECT_EQ("val2", switch2); - EXPECT_TRUE(command_line->HasSwitch("switch3")); - std::string switch3 = command_line->GetSwitchValue("switch3"); - EXPECT_EQ("val3", switch3); - EXPECT_TRUE(command_line->HasSwitch("switch4")); - std::string switch4 = command_line->GetSwitchValue("switch4"); - EXPECT_EQ("val 4", switch4); - EXPECT_FALSE(command_line->HasSwitch("switchnoexist")); - - CefCommandLine::SwitchMap switches; - command_line->GetSwitches(switches); - EXPECT_EQ((size_t)4, switches.size()); - - bool has1 = false, has2 = false, has3 = false, has4 = false; - - CefCommandLine::SwitchMap::const_iterator it = switches.begin(); - for (; it != switches.end(); ++it) { - std::string name = it->first; - std::string val = it->second; - - if (name == "switch1") { - has1 = true; - EXPECT_EQ("", val); - } else if (name == "switch2") { - has2 = true; - EXPECT_EQ("val2", val); - } else if (name == "switch3") { - has3 = true; - EXPECT_EQ("val3", val); - } else if (name == "switch4") { - has4 = true; - EXPECT_EQ("val 4", val); - } - } - - EXPECT_TRUE(has1); - EXPECT_TRUE(has2); - EXPECT_TRUE(has3); - EXPECT_TRUE(has4); - - EXPECT_TRUE(command_line->HasArguments()); - - CefCommandLine::ArgumentList args; - command_line->GetArguments(args); - EXPECT_EQ((size_t)2, args.size()); - std::string arg0 = args[0]; - EXPECT_EQ("arg1", arg0); - std::string arg1 = args[1]; - EXPECT_EQ("arg 2", arg1); - - command_line->Reset(); - EXPECT_FALSE(command_line->HasSwitches()); - EXPECT_FALSE(command_line->HasArguments()); - std::string cur_program = command_line->GetProgram(); - EXPECT_EQ(program, cur_program); -} - -} // namespace - -// Test creating a command line from argc/argv or string. -TEST(CommandLineTest, Init) { - CefRefPtr command_line = CefCommandLine::CreateCommandLine(); - EXPECT_TRUE(command_line.get() != NULL); - -#if defined(OS_WIN) - command_line->InitFromString("test.exe --switch1 -switch2=val2 /switch3=val3 " - "-switch4=\"val 4\" arg1 \"arg 2\""); -#else - const char* args[] = { - "test.exe", - "--switch1", - "-switch2=val2", - "-switch3=val3", - "-switch4=val 4", - "arg1", - "arg 2" - }; - command_line->InitFromArgv(sizeof(args) / sizeof(char*), args); -#endif - - VerifyCommandLine(command_line); -} - -// Test creating a command line using set and append methods. -TEST(CommandLineTest, Manual) { - CefRefPtr command_line = CefCommandLine::CreateCommandLine(); - EXPECT_TRUE(command_line.get() != NULL); - - command_line->SetProgram("test.exe"); - command_line->AppendSwitch("switch1"); - command_line->AppendSwitchWithValue("switch2", "val2"); - command_line->AppendSwitchWithValue("switch3", "val3"); - command_line->AppendSwitchWithValue("switch4", "val 4"); - command_line->AppendArgument("arg1"); - command_line->AppendArgument("arg 2"); - - VerifyCommandLine(command_line); -} diff --git a/tests/unittests/cookie_unittest.cc b/tests/unittests/cookie_unittest.cc deleted file mode 100644 index 9b2ca26f5..000000000 --- a/tests/unittests/cookie_unittest.cc +++ /dev/null @@ -1,962 +0,0 @@ -// Copyright (c) 2012 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 -#include "include/cef_cookie.h" -#include "include/cef_runnable.h" -#include "include/cef_scheme.h" -#include "tests/unittests/test_handler.h" -#include "tests/unittests/test_suite.h" -#include "base/scoped_temp_dir.h" -#include "base/synchronization/waitable_event.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -const char* kTestUrl = "http://www.test.com/path/to/cookietest/foo.html"; -const char* kTestDomain = "www.test.com"; -const char* kTestPath = "/path/to/cookietest"; - -typedef std::vector CookieVector; - -void IOT_Set(CefRefPtr manager, - const CefString& url, CookieVector* cookies, - base::WaitableEvent* event) { - CookieVector::const_iterator it = cookies->begin(); - for (; it != cookies->end(); ++it) - EXPECT_TRUE(manager->SetCookie(url, *it)); - event->Signal(); -} - -void IOT_Delete(CefRefPtr manager, - const CefString& url, const CefString& cookie_name, - base::WaitableEvent* event) { - EXPECT_TRUE(manager->DeleteCookies(url, cookie_name)); - event->Signal(); -} - -class TestVisitor : public CefCookieVisitor { - public: - TestVisitor(CookieVector* cookies, bool deleteCookies, - base::WaitableEvent* event) - : cookies_(cookies), - delete_cookies_(deleteCookies), - event_(event) { - } - virtual ~TestVisitor() { - event_->Signal(); - } - - virtual bool Visit(const CefCookie& cookie, int count, int total, - bool& deleteCookie) { - cookies_->push_back(cookie); - if (delete_cookies_) - deleteCookie = true; - return true; - } - - CookieVector* cookies_; - bool delete_cookies_; - base::WaitableEvent* event_; - - IMPLEMENT_REFCOUNTING(TestVisitor); -}; - -// Set the cookies. -void SetCookies(CefRefPtr manager, - const CefString& url, CookieVector& cookies, - base::WaitableEvent& event) { - CefPostTask(TID_IO, NewCefRunnableFunction(IOT_Set, manager, url, - &cookies, &event)); - event.Wait(); -} - -// Delete the cookie. -void DeleteCookies(CefRefPtr manager, - const CefString& url, const CefString& cookie_name, - base::WaitableEvent& event) { - CefPostTask(TID_IO, NewCefRunnableFunction(IOT_Delete, manager, url, - cookie_name, &event)); - event.Wait(); -} - -// Create a test cookie. If |withDomain| is true a domain cookie will be -// created, otherwise a host cookie will be created. -void CreateCookie(CefRefPtr manager, - CefCookie& cookie, bool withDomain, - base::WaitableEvent& event) { - CefString(&cookie.name).FromASCII("my_cookie"); - CefString(&cookie.value).FromASCII("My Value"); - if (withDomain) - CefString(&cookie.domain).FromASCII(kTestDomain); - CefString(&cookie.path).FromASCII(kTestPath); - cookie.has_expires = true; - cookie.expires.year = 2200; - cookie.expires.month = 4; - cookie.expires.day_of_week = 5; - cookie.expires.day_of_month = 11; - - CookieVector cookies; - cookies.push_back(cookie); - - SetCookies(manager, kTestUrl, cookies, event); -} - -// Retrieve the test cookie. If |withDomain| is true check that the cookie -// is a domain cookie, otherwise a host cookie. if |deleteCookies| is true -// the cookie will be deleted when it's retrieved. -void GetCookie(CefRefPtr manager, - const CefCookie& cookie, bool withDomain, - base::WaitableEvent& event, bool deleteCookies) { - CookieVector cookies; - - // Get the cookie and delete it. - EXPECT_TRUE(manager->VisitUrlCookies(kTestUrl, false, - new TestVisitor(&cookies, deleteCookies, &event))); - event.Wait(); - - EXPECT_EQ((CookieVector::size_type)1, cookies.size()); - - const CefCookie& cookie_read = cookies[0]; - EXPECT_EQ(CefString(&cookie_read.name), "my_cookie"); - EXPECT_EQ(CefString(&cookie_read.value), "My Value"); - if (withDomain) - EXPECT_EQ(CefString(&cookie_read.domain), ".www.test.com"); - else - EXPECT_EQ(CefString(&cookie_read.domain), kTestDomain); - EXPECT_EQ(CefString(&cookie_read.path), kTestPath); - EXPECT_TRUE(cookie_read.has_expires); - EXPECT_EQ(cookie.expires.year, cookie_read.expires.year); - EXPECT_EQ(cookie.expires.month, cookie_read.expires.month); - EXPECT_EQ(cookie.expires.day_of_week, cookie_read.expires.day_of_week); - EXPECT_EQ(cookie.expires.day_of_month, cookie_read.expires.day_of_month); - EXPECT_EQ(cookie.expires.hour, cookie_read.expires.hour); - EXPECT_EQ(cookie.expires.minute, cookie_read.expires.minute); - EXPECT_EQ(cookie.expires.second, cookie_read.expires.second); - EXPECT_EQ(cookie.expires.millisecond, cookie_read.expires.millisecond); -} - -// Visit URL cookies. -void VisitUrlCookies(CefRefPtr manager, - const CefString& url, - bool includeHttpOnly, - CookieVector& cookies, - bool deleteCookies, - base::WaitableEvent& event) { - EXPECT_TRUE(manager->VisitUrlCookies(url, includeHttpOnly, - new TestVisitor(&cookies, deleteCookies, &event))); - event.Wait(); -} - -// Visit all cookies. -void VisitAllCookies(CefRefPtr manager, - CookieVector& cookies, - bool deleteCookies, - base::WaitableEvent& event) { - EXPECT_TRUE(manager->VisitAllCookies( - new TestVisitor(&cookies, deleteCookies, &event))); - event.Wait(); -} - -// Verify that no cookies exist. If |withUrl| is true it will only check for -// cookies matching the URL. -void VerifyNoCookies(CefRefPtr manager, - base::WaitableEvent& event, bool withUrl) { - CookieVector cookies; - - // Verify that the cookie has been deleted. - if (withUrl) { - EXPECT_TRUE(manager->VisitUrlCookies(kTestUrl, false, - new TestVisitor(&cookies, false, &event))); - } else { - EXPECT_TRUE(manager->VisitAllCookies( - new TestVisitor(&cookies, false, &event))); - } - event.Wait(); - - EXPECT_EQ((CookieVector::size_type)0, cookies.size()); -} - -// Delete all system cookies. -void DeleteAllCookies(CefRefPtr manager, - base::WaitableEvent& event) { - CefPostTask(TID_IO, NewCefRunnableFunction(IOT_Delete, manager, CefString(), - CefString(), &event)); - event.Wait(); -} - -void TestDomainCookie(CefRefPtr manager) { - base::WaitableEvent event(false, false); - CefCookie cookie; - - // Create a domain cookie. - CreateCookie(manager, cookie, true, event); - - // Retrieve, verify and delete the domain cookie. - GetCookie(manager, cookie, true, event, true); - - // Verify that the cookie was deleted. - VerifyNoCookies(manager, event, true); -} - -void TestHostCookie(CefRefPtr manager) { - base::WaitableEvent event(false, false); - CefCookie cookie; - - // Create a host cookie. - CreateCookie(manager, cookie, false, event); - - // Retrieve, verify and delete the host cookie. - GetCookie(manager, cookie, false, event, true); - - // Verify that the cookie was deleted. - VerifyNoCookies(manager, event, true); -} - -void TestMultipleCookies(CefRefPtr manager) { - base::WaitableEvent event(false, false); - std::stringstream ss; - int i; - - CookieVector cookies; - - const int kNumCookies = 4; - - // Create the cookies. - for (i = 0; i < kNumCookies; i++) { - CefCookie cookie; - - ss << "my_cookie" << i; - CefString(&cookie.name).FromASCII(ss.str().c_str()); - ss.str(""); - ss << "My Value " << i; - CefString(&cookie.value).FromASCII(ss.str().c_str()); - ss.str(""); - - cookies.push_back(cookie); - } - - // Set the cookies. - SetCookies(manager, kTestUrl, cookies, event); - cookies.clear(); - - // Get the cookies without deleting them. - VisitUrlCookies(manager, kTestUrl, false, cookies, false, event); - - EXPECT_EQ((CookieVector::size_type)kNumCookies, cookies.size()); - - CookieVector::const_iterator it = cookies.begin(); - for (i = 0; it != cookies.end(); ++it, ++i) { - const CefCookie& cookie = *it; - - ss << "my_cookie" << i; - EXPECT_EQ(CefString(&cookie.name), ss.str()); - ss.str(""); - ss << "My Value " << i; - EXPECT_EQ(CefString(&cookie.value), ss.str()); - ss.str(""); - } - - cookies.clear(); - - // Delete the 2nd cookie. - DeleteCookies(manager, kTestUrl, CefString("my_cookie1"), event); - - // Verify that the cookie has been deleted. - VisitUrlCookies(manager, kTestUrl, false, cookies, false, event); - - EXPECT_EQ((CookieVector::size_type)3, cookies.size()); - EXPECT_EQ(CefString(&cookies[0].name), "my_cookie0"); - EXPECT_EQ(CefString(&cookies[1].name), "my_cookie2"); - EXPECT_EQ(CefString(&cookies[2].name), "my_cookie3"); - - cookies.clear(); - - // Delete the rest of the cookies. - DeleteCookies(manager, kTestUrl, CefString(), event); - - // Verify that the cookies have been deleted. - VisitUrlCookies(manager, kTestUrl, false, cookies, false, event); - - EXPECT_EQ((CookieVector::size_type)0, cookies.size()); - - // Create the cookies. - for (i = 0; i < kNumCookies; i++) { - CefCookie cookie; - - ss << "my_cookie" << i; - CefString(&cookie.name).FromASCII(ss.str().c_str()); - ss.str(""); - ss << "My Value " << i; - CefString(&cookie.value).FromASCII(ss.str().c_str()); - ss.str(""); - - cookies.push_back(cookie); - } - - // Delete all of the cookies using the visitor. - VisitUrlCookies(manager, kTestUrl, false, cookies, true, event); - - cookies.clear(); - - // Verify that the cookies have been deleted. - VisitUrlCookies(manager, kTestUrl, false, cookies, false, event); - - EXPECT_EQ((CookieVector::size_type)0, cookies.size()); -} - -void TestAllCookies(CefRefPtr manager) { - base::WaitableEvent event(false, false); - CookieVector cookies; - - // Delete all system cookies just in case something is left over from a - // different test. - DeleteCookies(manager, CefString(), CefString(), event); - - // Verify that all system cookies have been deleted. - VisitAllCookies(manager, cookies, false, event); - - EXPECT_EQ((CookieVector::size_type)0, cookies.size()); - - // Create cookies with 2 separate hosts. - CefCookie cookie1; - const char* kUrl1 = "http://www.foo.com"; - CefString(&cookie1.name).FromASCII("my_cookie1"); - CefString(&cookie1.value).FromASCII("My Value 1"); - - cookies.push_back(cookie1); - SetCookies(manager, kUrl1, cookies, event); - cookies.clear(); - - CefCookie cookie2; - const char* kUrl2 = "http://www.bar.com"; - CefString(&cookie2.name).FromASCII("my_cookie2"); - CefString(&cookie2.value).FromASCII("My Value 2"); - - cookies.push_back(cookie2); - SetCookies(manager, kUrl2, cookies, event); - cookies.clear(); - - // Verify that all system cookies can be retrieved. - VisitAllCookies(manager, cookies, false, event); - - EXPECT_EQ((CookieVector::size_type)2, cookies.size()); - EXPECT_EQ(CefString(&cookies[0].name), "my_cookie1"); - EXPECT_EQ(CefString(&cookies[0].value), "My Value 1"); - EXPECT_EQ(CefString(&cookies[0].domain), "www.foo.com"); - EXPECT_EQ(CefString(&cookies[1].name), "my_cookie2"); - EXPECT_EQ(CefString(&cookies[1].value), "My Value 2"); - EXPECT_EQ(CefString(&cookies[1].domain), "www.bar.com"); - cookies.clear(); - - // Verify that the cookies can be retrieved separately. - VisitUrlCookies(manager, kUrl1, false, cookies, false, event); - - EXPECT_EQ((CookieVector::size_type)1, cookies.size()); - EXPECT_EQ(CefString(&cookies[0].name), "my_cookie1"); - EXPECT_EQ(CefString(&cookies[0].value), "My Value 1"); - EXPECT_EQ(CefString(&cookies[0].domain), "www.foo.com"); - cookies.clear(); - - VisitUrlCookies(manager, kUrl2, false, cookies, false, event); - - EXPECT_EQ((CookieVector::size_type)1, cookies.size()); - EXPECT_EQ(CefString(&cookies[0].name), "my_cookie2"); - EXPECT_EQ(CefString(&cookies[0].value), "My Value 2"); - EXPECT_EQ(CefString(&cookies[0].domain), "www.bar.com"); - cookies.clear(); - - // Delete all of the system cookies. - DeleteAllCookies(manager, event); - - // Verify that all system cookies have been deleted. - VerifyNoCookies(manager, event, false); -} - -void TestChangeDirectory(CefRefPtr manager, - const CefString& original_dir) { - base::WaitableEvent event(false, false); - CefCookie cookie; - - ScopedTempDir temp_dir; - - // Create a new temporary directory. - EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); - - // Delete all of the system cookies. - DeleteAllCookies(manager, event); - - // Set the new temporary directory as the storage location. - EXPECT_TRUE(manager->SetStoragePath(temp_dir.path().value())); - - // Wait for the storage location change to complete on the IO thread. - WaitForIOThread(); - - // Verify that no cookies exist. - VerifyNoCookies(manager, event, true); - - // Create a domain cookie. - CreateCookie(manager, cookie, true, event); - - // Retrieve and verify the domain cookie. - GetCookie(manager, cookie, true, event, false); - - // Restore the original storage location. - EXPECT_TRUE(manager->SetStoragePath(original_dir)); - - // Wait for the storage location change to complete on the IO thread. - WaitForIOThread(); - - // Verify that no cookies exist. - VerifyNoCookies(manager, event, true); - - // Set the new temporary directory as the storage location. - EXPECT_TRUE(manager->SetStoragePath(temp_dir.path().value())); - - // Wait for the storage location change to complete on the IO thread. - WaitForIOThread(); - - // Retrieve and verify the domain cookie that was set previously. - GetCookie(manager, cookie, true, event, false); - - // Restore the original storage location. - EXPECT_TRUE(manager->SetStoragePath(original_dir)); - - // Wait for the storage location change to complete on the IO thread. - WaitForIOThread(); -} - -} // namespace - -// Test creation of a domain cookie. -TEST(CookieTest, DomainCookieGlobal) { - CefRefPtr manager = CefCookieManager::GetGlobalManager(); - EXPECT_TRUE(manager.get()); - - TestDomainCookie(manager); -} - -// Test creation of a domain cookie. -TEST(CookieTest, DomainCookieInMemory) { - CefRefPtr manager = - CefCookieManager::CreateManager(CefString()); - EXPECT_TRUE(manager.get()); - - TestDomainCookie(manager); -} - -// Test creation of a domain cookie. -TEST(CookieTest, DomainCookieOnDisk) { - ScopedTempDir temp_dir; - - // Create a new temporary directory. - EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); - - CefRefPtr manager = - CefCookieManager::CreateManager(temp_dir.path().value()); - EXPECT_TRUE(manager.get()); - - TestDomainCookie(manager); -} - -// Test creation of a host cookie. -TEST(CookieTest, HostCookieGlobal) { - CefRefPtr manager = CefCookieManager::GetGlobalManager(); - EXPECT_TRUE(manager.get()); - - TestHostCookie(manager); -} - -// Test creation of a host cookie. -TEST(CookieTest, HostCookieInMemory) { - CefRefPtr manager = - CefCookieManager::CreateManager(CefString()); - EXPECT_TRUE(manager.get()); - - TestHostCookie(manager); -} - -// Test creation of a host cookie. -TEST(CookieTest, HostCookieOnDisk) { - ScopedTempDir temp_dir; - - // Create a new temporary directory. - EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); - - CefRefPtr manager = - CefCookieManager::CreateManager(temp_dir.path().value()); - EXPECT_TRUE(manager.get()); - - TestHostCookie(manager); -} - -// Test creation of multiple cookies. -TEST(CookieTest, MultipleCookiesGlobal) { - CefRefPtr manager = CefCookieManager::GetGlobalManager(); - EXPECT_TRUE(manager.get()); - - TestMultipleCookies(manager); -} - -// Test creation of multiple cookies. -TEST(CookieTest, MultipleCookiesInMemory) { - CefRefPtr manager = - CefCookieManager::CreateManager(CefString()); - EXPECT_TRUE(manager.get()); - - TestMultipleCookies(manager); -} - -// Test creation of multiple cookies. -TEST(CookieTest, MultipleCookiesOnDisk) { - ScopedTempDir temp_dir; - - // Create a new temporary directory. - EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); - - CefRefPtr manager = - CefCookieManager::CreateManager(temp_dir.path().value()); - EXPECT_TRUE(manager.get()); - - TestMultipleCookies(manager); -} - -TEST(CookieTest, AllCookiesGlobal) { - CefRefPtr manager = CefCookieManager::GetGlobalManager(); - EXPECT_TRUE(manager.get()); - - TestAllCookies(manager); -} - -TEST(CookieTest, AllCookiesInMemory) { - CefRefPtr manager = - CefCookieManager::CreateManager(CefString()); - EXPECT_TRUE(manager.get()); - - TestAllCookies(manager); -} - -TEST(CookieTest, AllCookiesOnDisk) { - ScopedTempDir temp_dir; - - // Create a new temporary directory. - EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); - - CefRefPtr manager = - CefCookieManager::CreateManager(temp_dir.path().value()); - EXPECT_TRUE(manager.get()); - - TestAllCookies(manager); -} - -TEST(CookieTest, ChangeDirectoryGlobal) { - CefRefPtr manager = CefCookieManager::GetGlobalManager(); - EXPECT_TRUE(manager.get()); - - std::string cache_path; - CefTestSuite::GetCachePath(cache_path); - - TestChangeDirectory(manager, cache_path); -} - -TEST(CookieTest, ChangeDirectoryCreated) { - CefRefPtr manager = - CefCookieManager::CreateManager(CefString()); - EXPECT_TRUE(manager.get()); - - TestChangeDirectory(manager, CefString()); -} - - -namespace { - -const char* kCookieJSUrl1 = "http://tests/cookie1.html"; -const char* kCookieJSUrl2 = "http://tests/cookie2.html"; - -class CookieTestJSHandler : public TestHandler { - public: - CookieTestJSHandler() {} - - virtual void RunTest() OVERRIDE { - // Create =new in-memory managers. - manager1_ = CefCookieManager::CreateManager(CefString()); - manager2_ = CefCookieManager::CreateManager(CefString()); - - std::string page = - "" - "" - "COOKIE TEST1"; - AddResource(kCookieJSUrl1, page, "text/html"); - - page = - "" - "" - "COOKIE TEST2"; - AddResource(kCookieJSUrl2, page, "text/html"); - - // Create the browser - CreateBrowser(kCookieJSUrl1); - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE { - std::string url = frame->GetURL(); - if (url == kCookieJSUrl1) { - got_load_end1_.yes(); - VerifyCookie(manager1_, url, "name1", "value1", got_cookie1_); - - // Go to the next URL - frame->LoadURL(kCookieJSUrl2); - } else { - got_load_end2_.yes(); - VerifyCookie(manager2_, url, "name2", "value2", got_cookie2_); - - DestroyTest(); - } - } - - virtual CefRefPtr GetCookieManager( - CefRefPtr browser, - const CefString& main_url) OVERRIDE { - if (main_url == kCookieJSUrl1) { - // Return the first cookie manager. - got_cookie_manager1_.yes(); - return manager1_; - } else { - // Return the second cookie manager. - got_cookie_manager2_.yes(); - return manager2_; - } - } - - // Verify that the cookie was set successfully. - void VerifyCookie(CefRefPtr manager, - const std::string& url, - const std::string& name, - const std::string& value, - TrackCallback& callback) { - base::WaitableEvent event(false, false); - CookieVector cookies; - - // Get the cookie. - VisitUrlCookies(manager, url, false, cookies, false, event); - - if (cookies.size() == 1 && CefString(&cookies[0].name) == name && - CefString(&cookies[0].value) == value) { - callback.yes(); - } - } - - CefRefPtr manager1_; - CefRefPtr manager2_; - - TrackCallback got_cookie_manager1_; - TrackCallback got_cookie_manager2_; - TrackCallback got_load_end1_; - TrackCallback got_load_end2_; - TrackCallback got_cookie1_; - TrackCallback got_cookie2_; -}; - -} // namespace - -// Verify use of multiple cookie managers vis JS. -TEST(CookieTest, GetCookieManagerJS) { - CefRefPtr handler = new CookieTestJSHandler(); - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_cookie_manager1_); - EXPECT_TRUE(handler->got_cookie_manager2_); - EXPECT_TRUE(handler->got_load_end1_); - EXPECT_TRUE(handler->got_load_end2_); - EXPECT_TRUE(handler->got_cookie1_); - EXPECT_TRUE(handler->got_cookie2_); -} - - -namespace { - -class CookieTestSchemeHandler : public TestHandler { - public: - class SchemeHandler : public CefResourceHandler { - public: - explicit SchemeHandler(CookieTestSchemeHandler* handler) - : handler_(handler), - offset_(0) {} - - virtual bool ProcessRequest(CefRefPtr request, - CefRefPtr callback) - OVERRIDE { - std::string url = request->GetURL(); - if (url == handler_->url1_) { - content_ = "COOKIE TEST1"; - cookie_ = "name1=value1"; - handler_->got_process_request1_.yes(); - } else if (url == handler_->url2_) { - content_ = "COOKIE TEST2"; - cookie_ = "name2=value2"; - handler_->got_process_request2_.yes(); - } else if (url == handler_->url3_) { - content_ = "COOKIE TEST3"; - handler_->got_process_request3_.yes(); - - // Verify that the cookie was passed in. - CefRequest::HeaderMap headerMap; - request->GetHeaderMap(headerMap); - CefRequest::HeaderMap::iterator it = headerMap.find("Cookie"); - if (it != headerMap.end() && it->second == "name2=value2") - handler_->got_process_request_cookie_.yes(); - - } - callback->Continue(); - return true; - } - - virtual void GetResponseHeaders(CefRefPtr response, - int64& response_length, - CefString& redirectUrl) OVERRIDE { - response_length = content_.size(); - - response->SetStatus(200); - response->SetMimeType("text/html"); - - if (!cookie_.empty()) { - CefResponse::HeaderMap headerMap; - response->GetHeaderMap(headerMap); - headerMap.insert(std::make_pair("Set-Cookie", cookie_)); - response->SetHeaderMap(headerMap); - } - } - - virtual bool ReadResponse(void* data_out, - int bytes_to_read, - int& bytes_read, - CefRefPtr callback) - OVERRIDE { - bool has_data = false; - bytes_read = 0; - - size_t size = content_.size(); - if (offset_ < size) { - int transfer_size = - std::min(bytes_to_read, static_cast(size - offset_)); - memcpy(data_out, content_.c_str() + offset_, transfer_size); - offset_ += transfer_size; - - bytes_read = transfer_size; - has_data = true; - } - - return has_data; - } - - virtual void Cancel() OVERRIDE { - } - - private: - CookieTestSchemeHandler* handler_; - std::string content_; - size_t offset_; - std::string cookie_; - - IMPLEMENT_REFCOUNTING(SchemeHandler); - }; - - class SchemeHandlerFactory : public CefSchemeHandlerFactory { - public: - explicit SchemeHandlerFactory(CookieTestSchemeHandler* handler) - : handler_(handler) {} - - virtual CefRefPtr Create( - CefRefPtr browser, - CefRefPtr frame, - const CefString& scheme_name, - CefRefPtr request) OVERRIDE { - std::string url = request->GetURL(); - if (url == handler_->url3_) { - // Verify that the cookie was not passed in. - CefRequest::HeaderMap headerMap; - request->GetHeaderMap(headerMap); - CefRequest::HeaderMap::iterator it = headerMap.find("Cookie"); - if (it != headerMap.end() && it->second == "name2=value2") - handler_->got_create_cookie_.yes(); - } - - return new SchemeHandler(handler_); - } - - private: - CookieTestSchemeHandler* handler_; - - IMPLEMENT_REFCOUNTING(SchemeHandlerFactory); - }; - - CookieTestSchemeHandler(const std::string& scheme) : scheme_(scheme) { - url1_ = scheme + "://cookie-tests/cookie1.html"; - url2_ = scheme + "://cookie-tests/cookie2.html"; - url3_ = scheme + "://cookie-tests/cookie3.html"; - } - - virtual void RunTest() OVERRIDE { - // Create new in-memory managers. - manager1_ = CefCookieManager::CreateManager(CefString()); - manager2_ = CefCookieManager::CreateManager(CefString()); - - if (scheme_ != "http") { - std::vector schemes; - schemes.push_back("http"); - schemes.push_back("https"); - schemes.push_back(scheme_); - - manager1_->SetSupportedSchemes(schemes); - manager2_->SetSupportedSchemes(schemes); - } - - // Register the scheme handler. - CefRegisterSchemeHandlerFactory(scheme_, "cookie-tests", - new SchemeHandlerFactory(this)); - - // Create the browser - CreateBrowser(url1_); - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE { - std::string url = frame->GetURL(); - if (url == url1_) { - got_load_end1_.yes(); - VerifyCookie(manager1_, url, "name1", "value1", got_cookie1_); - - // Go to the next URL - frame->LoadURL(url2_); - } else if (url == url2_) { - got_load_end2_.yes(); - VerifyCookie(manager2_, url, "name2", "value2", got_cookie2_); - - // Go to the next URL - frame->LoadURL(url3_); - } else { - got_load_end3_.yes(); - VerifyCookie(manager2_, url, "name2", "value2", got_cookie3_); - - // Unregister the scheme handler. - CefRegisterSchemeHandlerFactory(scheme_, "cookie-tests", NULL); - - DestroyTest(); - } - } - - virtual CefRefPtr GetCookieManager( - CefRefPtr browser, - const CefString& main_url) OVERRIDE { - if (main_url == url1_) { - // Return the first cookie manager. - got_cookie_manager1_.yes(); - return manager1_; - } else { - // Return the second cookie manager. - got_cookie_manager2_.yes(); - return manager2_; - } - } - - // Verify that the cookie was set successfully. - void VerifyCookie(CefRefPtr manager, - const std::string& url, - const std::string& name, - const std::string& value, - TrackCallback& callback) { - base::WaitableEvent event(false, false); - CookieVector cookies; - - // Get the cookie. - VisitUrlCookies(manager, url, false, cookies, false, event); - - if (cookies.size() == 1 && CefString(&cookies[0].name) == name && - CefString(&cookies[0].value) == value) { - callback.yes(); - } - } - - std::string scheme_; - std::string url1_; - std::string url2_; - std::string url3_; - - CefRefPtr manager1_; - CefRefPtr manager2_; - - TrackCallback got_process_request1_; - TrackCallback got_process_request2_; - TrackCallback got_process_request3_; - TrackCallback got_create_cookie_; - TrackCallback got_process_request_cookie_; - TrackCallback got_cookie_manager1_; - TrackCallback got_cookie_manager2_; - TrackCallback got_load_end1_; - TrackCallback got_load_end2_; - TrackCallback got_load_end3_; - TrackCallback got_cookie1_; - TrackCallback got_cookie2_; - TrackCallback got_cookie3_; -}; - -} // namespace - -// Verify use of multiple cookie managers via HTTP. -TEST(CookieTest, GetCookieManagerHttp) { - CefRefPtr handler = - new CookieTestSchemeHandler("http"); - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_process_request1_); - EXPECT_TRUE(handler->got_process_request2_); - EXPECT_TRUE(handler->got_process_request3_); - EXPECT_FALSE(handler->got_create_cookie_); - EXPECT_TRUE(handler->got_process_request_cookie_); - EXPECT_TRUE(handler->got_cookie_manager1_); - EXPECT_TRUE(handler->got_cookie_manager2_); - EXPECT_TRUE(handler->got_load_end1_); - EXPECT_TRUE(handler->got_load_end2_); - EXPECT_TRUE(handler->got_load_end3_); - EXPECT_TRUE(handler->got_cookie1_); - EXPECT_TRUE(handler->got_cookie2_); - EXPECT_TRUE(handler->got_cookie3_); -} - -// Verify use of multiple cookie managers via a custom scheme. -TEST(CookieTest, GetCookieManagerCustom) { - CefRefPtr handler = - new CookieTestSchemeHandler("ccustom"); - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_process_request1_); - EXPECT_TRUE(handler->got_process_request2_); - EXPECT_TRUE(handler->got_process_request3_); - EXPECT_FALSE(handler->got_create_cookie_); - EXPECT_TRUE(handler->got_process_request_cookie_); - EXPECT_TRUE(handler->got_cookie_manager1_); - EXPECT_TRUE(handler->got_cookie_manager2_); - EXPECT_TRUE(handler->got_load_end1_); - EXPECT_TRUE(handler->got_load_end2_); - EXPECT_TRUE(handler->got_load_end3_); - EXPECT_TRUE(handler->got_cookie1_); - EXPECT_TRUE(handler->got_cookie2_); - EXPECT_TRUE(handler->got_cookie3_); -} - -// Entry point for registering custom schemes. -// Called from client_app_delegates.cc. -void RegisterCookieCustomSchemes( - CefRefPtr registrar, - std::vector& cookiable_schemes) { - // Used by GetCookieManagerCustom test. - registrar->AddCustomScheme("ccustom", true, false, false); -} diff --git a/tests/unittests/dom_unittest.cc b/tests/unittests/dom_unittest.cc deleted file mode 100644 index 26ba0d453..000000000 --- a/tests/unittests/dom_unittest.cc +++ /dev/null @@ -1,332 +0,0 @@ -// Copyright (c) 2012 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 "include/cef_dom.h" -#include "tests/cefclient/client_app.h" -#include "tests/unittests/test_handler.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -const char* kTestUrl = "http://tests/DOMTest.Test"; -const char* kTestMessage = "DOMTest.Message"; - -enum DOMTestType { - DOM_TEST_STRUCTURE, - DOM_TEST_MODIFY, -}; - -class TestDOMVisitor : public CefDOMVisitor { - public: - explicit TestDOMVisitor(CefRefPtr browser, DOMTestType test_type) - : browser_(browser), - test_type_(test_type) { - } - - void TestHeadNodeStructure(CefRefPtr headNode) { - EXPECT_TRUE(headNode.get()); - EXPECT_TRUE(headNode->IsElement()); - EXPECT_FALSE(headNode->IsText()); - EXPECT_EQ(headNode->GetName(), "HEAD"); - EXPECT_EQ(headNode->GetElementTagName(), "HEAD"); - - EXPECT_TRUE(headNode->HasChildren()); - EXPECT_FALSE(headNode->HasElementAttributes()); - - CefRefPtr titleNode = headNode->GetFirstChild(); - EXPECT_TRUE(titleNode.get()); - EXPECT_TRUE(titleNode->IsElement()); - EXPECT_FALSE(titleNode->IsText()); - EXPECT_EQ(titleNode->GetName(), "TITLE"); - EXPECT_EQ(titleNode->GetElementTagName(), "TITLE"); - EXPECT_TRUE(titleNode->GetParent()->IsSame(headNode)); - - EXPECT_FALSE(titleNode->GetNextSibling().get()); - EXPECT_FALSE(titleNode->GetPreviousSibling().get()); - EXPECT_TRUE(titleNode->HasChildren()); - EXPECT_FALSE(titleNode->HasElementAttributes()); - - CefRefPtr textNode = titleNode->GetFirstChild(); - EXPECT_TRUE(textNode.get()); - EXPECT_FALSE(textNode->IsElement()); - EXPECT_TRUE(textNode->IsText()); - EXPECT_EQ(textNode->GetValue(), "The Title"); - EXPECT_TRUE(textNode->GetParent()->IsSame(titleNode)); - - EXPECT_FALSE(textNode->GetNextSibling().get()); - EXPECT_FALSE(textNode->GetPreviousSibling().get()); - EXPECT_FALSE(textNode->HasChildren()); - } - - void TestBodyNodeStructure(CefRefPtr bodyNode) { - EXPECT_TRUE(bodyNode.get()); - EXPECT_TRUE(bodyNode->IsElement()); - EXPECT_FALSE(bodyNode->IsText()); - EXPECT_EQ(bodyNode->GetName(), "BODY"); - EXPECT_EQ(bodyNode->GetElementTagName(), "BODY"); - - EXPECT_TRUE(bodyNode->HasChildren()); - EXPECT_FALSE(bodyNode->HasElementAttributes()); - - CefRefPtr h1Node = bodyNode->GetFirstChild(); - EXPECT_TRUE(h1Node.get()); - EXPECT_TRUE(h1Node->IsElement()); - EXPECT_FALSE(h1Node->IsText()); - EXPECT_EQ(h1Node->GetName(), "H1"); - EXPECT_EQ(h1Node->GetElementTagName(), "H1"); - - EXPECT_FALSE(h1Node->GetNextSibling().get()); - EXPECT_FALSE(h1Node->GetPreviousSibling().get()); - EXPECT_TRUE(h1Node->HasChildren()); - EXPECT_FALSE(h1Node->HasElementAttributes()); - - CefRefPtr textNode = h1Node->GetFirstChild(); - EXPECT_TRUE(textNode.get()); - EXPECT_FALSE(textNode->IsElement()); - EXPECT_TRUE(textNode->IsText()); - EXPECT_EQ(textNode->GetValue(), "Hello From"); - - EXPECT_FALSE(textNode->GetPreviousSibling().get()); - EXPECT_FALSE(textNode->HasChildren()); - - CefRefPtr brNode = textNode->GetNextSibling(); - EXPECT_TRUE(brNode.get()); - EXPECT_TRUE(brNode->IsElement()); - EXPECT_FALSE(brNode->IsText()); - EXPECT_EQ(brNode->GetName(), "BR"); - EXPECT_EQ(brNode->GetElementTagName(), "BR"); - - EXPECT_FALSE(brNode->HasChildren()); - - EXPECT_TRUE(brNode->HasElementAttributes()); - EXPECT_TRUE(brNode->HasElementAttribute("class")); - EXPECT_EQ(brNode->GetElementAttribute("class"), "some_class"); - EXPECT_TRUE(brNode->HasElementAttribute("id")); - EXPECT_EQ(brNode->GetElementAttribute("id"), "some_id"); - EXPECT_FALSE(brNode->HasElementAttribute("no_existing")); - - CefDOMNode::AttributeMap map; - brNode->GetElementAttributes(map); - ASSERT_EQ(map.size(), (size_t)2); - EXPECT_EQ(map["class"], "some_class"); - EXPECT_EQ(map["id"], "some_id"); - - // Can also retrieve by ID. - brNode = bodyNode->GetDocument()->GetElementById("some_id"); - EXPECT_TRUE(brNode.get()); - EXPECT_TRUE(brNode->IsElement()); - EXPECT_FALSE(brNode->IsText()); - EXPECT_EQ(brNode->GetName(), "BR"); - EXPECT_EQ(brNode->GetElementTagName(), "BR"); - - textNode = brNode->GetNextSibling(); - EXPECT_TRUE(textNode.get()); - EXPECT_FALSE(textNode->IsElement()); - EXPECT_TRUE(textNode->IsText()); - EXPECT_EQ(textNode->GetValue(), "Main Frame"); - - EXPECT_FALSE(textNode->GetNextSibling().get()); - EXPECT_FALSE(textNode->HasChildren()); - } - - // Test document structure by iterating through the DOM tree. - void TestStructure(CefRefPtr document) { - EXPECT_EQ(document->GetTitle(), "The Title"); - EXPECT_EQ(document->GetBaseURL(), kTestUrl); - EXPECT_EQ(document->GetCompleteURL("foo.html"), "http://tests/foo.html"); - - // Navigate the complete document structure. - CefRefPtr docNode = document->GetDocument(); - EXPECT_TRUE(docNode.get()); - EXPECT_FALSE(docNode->IsElement()); - EXPECT_FALSE(docNode->IsText()); - - CefRefPtr htmlNode = docNode->GetFirstChild(); - EXPECT_TRUE(htmlNode.get()); - EXPECT_TRUE(htmlNode->IsElement()); - EXPECT_FALSE(htmlNode->IsText()); - EXPECT_EQ(htmlNode->GetName(), "HTML"); - EXPECT_EQ(htmlNode->GetElementTagName(), "HTML"); - - EXPECT_TRUE(htmlNode->HasChildren()); - EXPECT_FALSE(htmlNode->HasElementAttributes()); - - CefRefPtr headNode = htmlNode->GetFirstChild(); - TestHeadNodeStructure(headNode); - - CefRefPtr bodyNode = headNode->GetNextSibling(); - TestBodyNodeStructure(bodyNode); - - // Retrieve the head node directly. - headNode = document->GetHead(); - TestHeadNodeStructure(headNode); - - // Retrieve the body node directly. - bodyNode = document->GetBody(); - TestBodyNodeStructure(bodyNode); - } - - // Test document modification by changing the H1 tag. - void TestModify(CefRefPtr document) { - CefRefPtr bodyNode = document->GetBody(); - CefRefPtr h1Node = bodyNode->GetFirstChild(); - - ASSERT_EQ(h1Node->GetAsMarkup(), - "

Hello From
" - "Main Frame

"); - - CefRefPtr textNode = h1Node->GetFirstChild(); - ASSERT_EQ(textNode->GetValue(), "Hello From"); - ASSERT_TRUE(textNode->SetValue("A Different Message From")); - ASSERT_EQ(textNode->GetValue(), "A Different Message From"); - - CefRefPtr brNode = textNode->GetNextSibling(); - EXPECT_EQ(brNode->GetElementAttribute("class"), "some_class"); - EXPECT_TRUE(brNode->SetElementAttribute("class", "a_different_class")); - EXPECT_EQ(brNode->GetElementAttribute("class"), "a_different_class"); - - ASSERT_EQ(h1Node->GetAsMarkup(), - "

A Different Message From
Main Frame

"); - - ASSERT_FALSE(h1Node->SetValue("Something Different")); - } - - virtual void Visit(CefRefPtr document) OVERRIDE { - if (test_type_ == DOM_TEST_STRUCTURE) - TestStructure(document); - else if (test_type_ == DOM_TEST_MODIFY) - TestModify(document); - - DestroyTest(); - } - - protected: - // Return from the test. - void DestroyTest() { - // Check if the test has failed. - bool result = !TestFailed(); - - // Return the result to the browser process. - CefRefPtr return_msg = - CefProcessMessage::Create(kTestMessage); - EXPECT_TRUE(return_msg->GetArgumentList()->SetBool(0, result)); - EXPECT_TRUE(browser_->SendProcessMessage(PID_BROWSER, return_msg)); - } - - CefRefPtr browser_; - DOMTestType test_type_; - - IMPLEMENT_REFCOUNTING(TestDOMVisitor); -}; - -// Used in the render process. -class DOMRendererTest : public ClientApp::RenderDelegate { - public: - DOMRendererTest() { - } - - virtual bool OnProcessMessageReceived( - CefRefPtr app, - CefRefPtr browser, - CefProcessId source_process, - CefRefPtr message) OVERRIDE { - if (message->GetName() == kTestMessage) { - EXPECT_EQ(message->GetArgumentList()->GetSize(), (size_t)1); - int test_type = message->GetArgumentList()->GetInt(0); - - browser->GetMainFrame()->VisitDOM( - new TestDOMVisitor(browser, static_cast(test_type))); - return true; - } - return false; - } - - private: - IMPLEMENT_REFCOUNTING(DOMRendererTest); -}; - -// Used in the browser process. -class TestDOMHandler : public TestHandler { - public: - explicit TestDOMHandler(DOMTestType test) - : test_type_(test) { - } - - virtual void RunTest() OVERRIDE { - std::stringstream mainHtml; - mainHtml << - "" - "The Title" - "" - "

Hello From
" - "Main Frame

" - "" - ""; - - AddResource(kTestUrl, mainHtml.str(), "text/html"); - CreateBrowser(kTestUrl); - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE { - if (frame->IsMain()) { - // Start the test in the render process. - CefRefPtr message( - CefProcessMessage::Create(kTestMessage)); - message->GetArgumentList()->SetInt(0, test_type_); - EXPECT_TRUE(browser->SendProcessMessage(PID_RENDERER, message)); - } - } - - virtual bool OnProcessMessageReceived( - CefRefPtr browser, - CefProcessId source_process, - CefRefPtr message) OVERRIDE { - EXPECT_STREQ(message->GetName().ToString().c_str(), kTestMessage); - - got_message_.yes(); - - if (message->GetArgumentList()->GetBool(0)) - got_success_.yes(); - - // Test is complete. - DestroyTest(); - - return true; - } - - DOMTestType test_type_; - TrackCallback got_message_; - TrackCallback got_success_; -}; - -} // namespace - -// Test DOM structure reading. -TEST(DOMTest, Read) { - CefRefPtr handler = - new TestDOMHandler(DOM_TEST_STRUCTURE); - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_message_); - EXPECT_TRUE(handler->got_success_); -} - -// Test DOM modifications. -TEST(DOMTest, Modify) { - CefRefPtr handler = - new TestDOMHandler(DOM_TEST_MODIFY); - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_message_); - EXPECT_TRUE(handler->got_success_); -} - -// Entry point for creating DOM renderer test objects. -// Called from client_app_delegates.cc. -void CreateDOMRendererTests(ClientApp::RenderDelegateSet& delegates) { - delegates.insert(new DOMRendererTest); -} diff --git a/tests/unittests/jsdialog_unittest.cc b/tests/unittests/jsdialog_unittest.cc deleted file mode 100644 index df5312152..000000000 --- a/tests/unittests/jsdialog_unittest.cc +++ /dev/null @@ -1,413 +0,0 @@ -// Copyright (c) 2012 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 "include/cef_runnable.h" -#include "tests/unittests/test_handler.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -const char* kStartUrl = "http://tests/JSDialogTestHandler.Start"; -const char* kEndUrl = "http://tests/JSDialogTestHandler.End?r="; - -class JSDialogTestHandler : public TestHandler { - public: - enum TestType { - TYPE_ALERT, - TYPE_CONFIRM, - TYPE_PROMPT, - TYPE_ONBEFOREUNLOAD, - }; - enum TestMode { - MODE_SUPPRESS, - MODE_RUN_IMMEDIATE, - MODE_RUN_DELAYED, - }; - - JSDialogTestHandler(TestType type, - TestMode mode, - bool success, - const std::string& user_input, - const std::string& result) - : type_(type), - mode_(mode), - success_(success), - user_input_(user_input), - result_(result) { - } - - virtual void RunTest() OVERRIDE { - std::string content = "START"; - - AddResource(kStartUrl, content, "text/html"); - AddResource(kEndUrl, "END", "text/html"); - - // Create the browser - CreateBrowser(kStartUrl); - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE { - if (!frame->IsMain()) - return; - - std::string url = frame->GetURL(); - if (url.find(kEndUrl) == 0) { - got_onloadend_.yes(); - - std::string result = url.substr(strlen(kEndUrl)); - EXPECT_STREQ(result_.c_str(), result.c_str()); - - DestroyTest(); - } else if (type_ == TYPE_ONBEFOREUNLOAD) { - // Trigger the onunload handler. - frame->LoadURL(kEndUrl); - } - } - - virtual void Continue(CefRefPtr callback) { - callback->Continue(success_, user_input_); - } - - virtual bool OnJSDialog(CefRefPtr browser, - const CefString& origin_url, - const CefString& accept_lang, - JSDialogType dialog_type, - const CefString& message_text, - const CefString& default_prompt_text, - CefRefPtr callback, - bool& suppress_message) OVERRIDE { - got_onjsdialog_.yes(); - - EXPECT_STREQ("http://tests/", origin_url.ToString().c_str()); - EXPECT_TRUE(accept_lang.empty()); - - if (type_ == TYPE_ALERT) { - EXPECT_EQ(JSDIALOGTYPE_ALERT, dialog_type); - EXPECT_STREQ("My alert message", message_text.ToString().c_str()); - EXPECT_TRUE(default_prompt_text.empty()); - } else if (type_ == TYPE_CONFIRM) { - EXPECT_EQ(JSDIALOGTYPE_CONFIRM, dialog_type); - EXPECT_STREQ("My confirm message", message_text.ToString().c_str()); - EXPECT_TRUE(default_prompt_text.empty()); - } else if (type_ == TYPE_PROMPT) { - EXPECT_EQ(JSDIALOGTYPE_PROMPT, dialog_type); - EXPECT_STREQ("My prompt message", message_text.ToString().c_str()); - EXPECT_STREQ("my default", default_prompt_text.ToString().c_str()); - } - - EXPECT_FALSE(suppress_message); - - if (mode_ == MODE_SUPPRESS) { - // Suppress the dialog. - suppress_message = true; - return false; - } else if (mode_ == MODE_RUN_IMMEDIATE) { - // Continue immediately. - callback->Continue(success_, user_input_); - } else if (mode_ == MODE_RUN_DELAYED) { - // Continue asynchronously. - CefPostTask(TID_UI, - NewCefRunnableMethod(this, &JSDialogTestHandler::Continue, callback)); - } - - return true; - } - - virtual bool OnBeforeUnloadDialog(CefRefPtr browser, - const CefString& message_text, - bool is_reload, - CefRefPtr callback) - OVERRIDE { - got_onbeforeunloaddialog_.yes(); - - if (type_ == TYPE_ONBEFOREUNLOAD) { - EXPECT_STREQ("My unload message", message_text.ToString().c_str()); - EXPECT_FALSE(is_reload); - } - - if (mode_ == MODE_RUN_IMMEDIATE) { - // Continue immediately. - callback->Continue(success_, user_input_); - } else if (mode_ == MODE_RUN_DELAYED) { - // Continue asynchronously. - CefPostTask(TID_UI, - NewCefRunnableMethod(this, &JSDialogTestHandler::Continue, callback)); - } - - return true; - } - - virtual void OnResetDialogState(CefRefPtr browser) OVERRIDE { - got_onresetdialogstate_.yes(); - } - - TestType type_; - TestMode mode_; - bool success_; - std::string user_input_; - std::string result_; - - TrackCallback got_onjsdialog_; - TrackCallback got_onbeforeunloaddialog_; - TrackCallback got_onresetdialogstate_; - TrackCallback got_onloadend_; -}; - -} // namespace - -// Alert dialog with suppression. -TEST(JSDialogTest, AlertSuppress) { - CefRefPtr handler = - new JSDialogTestHandler(JSDialogTestHandler::TYPE_ALERT, - JSDialogTestHandler::MODE_SUPPRESS, - true, // success - "", // user_input - ""); // result - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_onjsdialog_); - EXPECT_FALSE(handler->got_onbeforeunloaddialog_); - EXPECT_TRUE(handler->got_onresetdialogstate_); - EXPECT_TRUE(handler->got_onloadend_); -} - -// Alert dialog with immediate callback. -TEST(JSDialogTest, AlertRunImmediate) { - CefRefPtr handler = - new JSDialogTestHandler(JSDialogTestHandler::TYPE_ALERT, - JSDialogTestHandler::MODE_RUN_IMMEDIATE, - true, // success - "", // user_input - ""); // result - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_onjsdialog_); - EXPECT_FALSE(handler->got_onbeforeunloaddialog_); - EXPECT_TRUE(handler->got_onresetdialogstate_); - EXPECT_TRUE(handler->got_onloadend_); -} - -// Alert dialog with delayed callback. -TEST(JSDialogTest, AlertRunDelayed) { - CefRefPtr handler = - new JSDialogTestHandler(JSDialogTestHandler::TYPE_ALERT, - JSDialogTestHandler::MODE_RUN_DELAYED, - true, // success - "", // user_input - ""); // result - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_onjsdialog_); - EXPECT_FALSE(handler->got_onbeforeunloaddialog_); - EXPECT_TRUE(handler->got_onresetdialogstate_); - EXPECT_TRUE(handler->got_onloadend_); -} - -// Confirm dialog with suppression. -TEST(JSDialogTest, ConfirmSuppress) { - CefRefPtr handler = - new JSDialogTestHandler(JSDialogTestHandler::TYPE_CONFIRM, - JSDialogTestHandler::MODE_SUPPRESS, - true, // success - "", // user_input - "cancel"); // result - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_onjsdialog_); - EXPECT_FALSE(handler->got_onbeforeunloaddialog_); - EXPECT_TRUE(handler->got_onresetdialogstate_); - EXPECT_TRUE(handler->got_onloadend_); -} - -// Confirm dialog run immediately return OK. -TEST(JSDialogTest, ConfirmRunImmediateOk) { - CefRefPtr handler = - new JSDialogTestHandler(JSDialogTestHandler::TYPE_CONFIRM, - JSDialogTestHandler::MODE_RUN_IMMEDIATE, - true, // success - "", // user_input - "ok"); // result - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_onjsdialog_); - EXPECT_FALSE(handler->got_onbeforeunloaddialog_); - EXPECT_TRUE(handler->got_onresetdialogstate_); - EXPECT_TRUE(handler->got_onloadend_); -} - -// Confirm dialog run immediately return Cancel. -TEST(JSDialogTest, ConfirmRunImmediateCancel) { - CefRefPtr handler = - new JSDialogTestHandler(JSDialogTestHandler::TYPE_CONFIRM, - JSDialogTestHandler::MODE_RUN_IMMEDIATE, - false, // success - "", // user_input - "cancel"); // result - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_onjsdialog_); - EXPECT_FALSE(handler->got_onbeforeunloaddialog_); - EXPECT_TRUE(handler->got_onresetdialogstate_); - EXPECT_TRUE(handler->got_onloadend_); -} - -// Confirm dialog run delayed return OK. -TEST(JSDialogTest, ConfirmRunDelayedOk) { - CefRefPtr handler = - new JSDialogTestHandler(JSDialogTestHandler::TYPE_CONFIRM, - JSDialogTestHandler::MODE_RUN_DELAYED, - true, // success - "", // user_input - "ok"); // result - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_onjsdialog_); - EXPECT_FALSE(handler->got_onbeforeunloaddialog_); - EXPECT_TRUE(handler->got_onresetdialogstate_); - EXPECT_TRUE(handler->got_onloadend_); -} - -// Confirm dialog run delayed return Cancel. -TEST(JSDialogTest, ConfirmRunDelayedCancel) { - CefRefPtr handler = - new JSDialogTestHandler(JSDialogTestHandler::TYPE_CONFIRM, - JSDialogTestHandler::MODE_RUN_DELAYED, - false, // success - "", // user_input - "cancel"); // result - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_onjsdialog_); - EXPECT_FALSE(handler->got_onbeforeunloaddialog_); - EXPECT_TRUE(handler->got_onresetdialogstate_); - EXPECT_TRUE(handler->got_onloadend_); -} - -// Prompt dialog with suppression. -TEST(JSDialogTest, PromptSuppress) { - CefRefPtr handler = - new JSDialogTestHandler(JSDialogTestHandler::TYPE_PROMPT, - JSDialogTestHandler::MODE_SUPPRESS, - true, // success - "some_value", // user_input - "null"); // result - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_onjsdialog_); - EXPECT_FALSE(handler->got_onbeforeunloaddialog_); - EXPECT_TRUE(handler->got_onresetdialogstate_); - EXPECT_TRUE(handler->got_onloadend_); -} - -// Prompt dialog run immediately return OK. -TEST(JSDialogTest, PromptRunImmediateOk) { - CefRefPtr handler = - new JSDialogTestHandler(JSDialogTestHandler::TYPE_PROMPT, - JSDialogTestHandler::MODE_RUN_IMMEDIATE, - true, // success - "some_value", // user_input - "some_value"); // result - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_onjsdialog_); - EXPECT_FALSE(handler->got_onbeforeunloaddialog_); - EXPECT_TRUE(handler->got_onresetdialogstate_); - EXPECT_TRUE(handler->got_onloadend_); -} - -// Prompt dialog run immediately return Cancel. -TEST(JSDialogTest, PromptRunImmediateCancel) { - CefRefPtr handler = - new JSDialogTestHandler(JSDialogTestHandler::TYPE_PROMPT, - JSDialogTestHandler::MODE_RUN_IMMEDIATE, - false, // success - "some_value", // user_input - "null"); // result - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_onjsdialog_); - EXPECT_FALSE(handler->got_onbeforeunloaddialog_); - EXPECT_TRUE(handler->got_onresetdialogstate_); - EXPECT_TRUE(handler->got_onloadend_); -} - -// Prompt dialog run delayed return OK. -TEST(JSDialogTest, PromptRunDelayedOk) { - CefRefPtr handler = - new JSDialogTestHandler(JSDialogTestHandler::TYPE_PROMPT, - JSDialogTestHandler::MODE_RUN_DELAYED, - true, // success - "some_value", // user_input - "some_value"); // result - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_onjsdialog_); - EXPECT_FALSE(handler->got_onbeforeunloaddialog_); - EXPECT_TRUE(handler->got_onresetdialogstate_); - EXPECT_TRUE(handler->got_onloadend_); -} - -// Prompt dialog run delayed return Cancel. -TEST(JSDialogTest, PromptRunDelayedCancel) { - CefRefPtr handler = - new JSDialogTestHandler(JSDialogTestHandler::TYPE_PROMPT, - JSDialogTestHandler::MODE_RUN_DELAYED, - false, // success - "some_value", // user_input - "null"); // result - handler->ExecuteTest(); - - EXPECT_TRUE(handler->got_onjsdialog_); - EXPECT_FALSE(handler->got_onbeforeunloaddialog_); - EXPECT_TRUE(handler->got_onresetdialogstate_); - EXPECT_TRUE(handler->got_onloadend_); -} - -// OnBeforeUnload dialog with immediate callback. -TEST(JSDialogTest, OnBeforeUnloadRunImmediate) { - CefRefPtr handler = - new JSDialogTestHandler(JSDialogTestHandler::TYPE_ONBEFOREUNLOAD, - JSDialogTestHandler::MODE_RUN_IMMEDIATE, - true, // success - "", // user_input - ""); // result - handler->ExecuteTest(); - - EXPECT_FALSE(handler->got_onjsdialog_); - EXPECT_TRUE(handler->got_onbeforeunloaddialog_); - EXPECT_TRUE(handler->got_onresetdialogstate_); - EXPECT_TRUE(handler->got_onloadend_); -} - -// OnBeforeUnload dialog with delayed callback. -TEST(JSDialogTest, OnBeforeUnloadRunDelayed) { - CefRefPtr handler = - new JSDialogTestHandler(JSDialogTestHandler::TYPE_ONBEFOREUNLOAD, - JSDialogTestHandler::MODE_RUN_DELAYED, - true, // success - "", // user_input - ""); // result - handler->ExecuteTest(); - - EXPECT_FALSE(handler->got_onjsdialog_); - EXPECT_TRUE(handler->got_onbeforeunloaddialog_); - EXPECT_TRUE(handler->got_onresetdialogstate_); - EXPECT_TRUE(handler->got_onloadend_); -} diff --git a/tests/unittests/mac/English.lproj/InfoPlist.strings b/tests/unittests/mac/English.lproj/InfoPlist.strings deleted file mode 100644 index fe2abe11b..000000000 --- a/tests/unittests/mac/English.lproj/InfoPlist.strings +++ /dev/null @@ -1,3 +0,0 @@ -/* Localized versions of Info.plist keys */ - -NSHumanReadableCopyright = "© Chromium Embedded Framework Authors, 2010"; diff --git a/tests/unittests/mac/English.lproj/MainMenu.xib b/tests/unittests/mac/English.lproj/MainMenu.xib deleted file mode 100644 index e4f7c1fc3..000000000 --- a/tests/unittests/mac/English.lproj/MainMenu.xib +++ /dev/null @@ -1,2880 +0,0 @@ - - - - 1050 - 10F569 - 820 - 1038.29 - 461.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 820 - - - YES - - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - YES - - NSApplication - - - FirstResponder - - - NSApplication - - - AMainMenu - - YES - - - cefclient - - 1048576 - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - TestShell - - YES - - - About cefclient - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Services - - 1048576 - 2147483647 - - - submenuAction: - - Services - - YES - - _NSServicesMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Hide cefclient - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Quit cefclient - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 1048576 - 2147483647 - - - submenuAction: - - File - - YES - - - New - n - 1048576 - 2147483647 - - - - - - Open… - o - 1048576 - 2147483647 - - - - - - Open Recent - - 1048576 - 2147483647 - - - submenuAction: - - Open Recent - - YES - - - Clear Menu - - 1048576 - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save - s - 1048576 - 2147483647 - - - - - - Save As… - S - 1179648 - 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - Print… - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 1048576 - 2147483647 - - - submenuAction: - - Edit - - YES - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Delete - - 1048576 - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Find - - 1048576 - 2147483647 - - - submenuAction: - - Find - - YES - - - Find… - f - 1048576 - 2147483647 - - - 1 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1179648 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - - - - - - Spelling and Grammar - - 1048576 - 2147483647 - - - submenuAction: - - Spelling and Grammar - - YES - - - Show Spelling… - : - 1048576 - 2147483647 - - - - - - Check Spelling - ; - 1048576 - 2147483647 - - - - - - Check Spelling While Typing - - 1048576 - 2147483647 - - - - - - Check Grammar With Spelling - - 1048576 - 2147483647 - - - - - - - - - Substitutions - - 1048576 - 2147483647 - - - submenuAction: - - Substitutions - - YES - - - Smart Copy/Paste - f - 1048576 - 2147483647 - - - 1 - - - - Smart Quotes - g - 1048576 - 2147483647 - - - 2 - - - - Smart Links - G - 1179648 - 2147483647 - - - 3 - - - - - - - Speech - - 1048576 - 2147483647 - - - submenuAction: - - Speech - - YES - - - Start Speaking - - 1048576 - 2147483647 - - - - - - Stop Speaking - - 1048576 - 2147483647 - - - - - - - - - - - - Format - - 1048576 - 2147483647 - - - submenuAction: - - Format - - YES - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Show Colors - C - 1179648 - 2147483647 - - - - - - - - - View - - 1048576 - 2147483647 - - - submenuAction: - - View - - YES - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Customize Toolbar… - - 1048576 - 2147483647 - - - - - - - - - Window - - 1048576 - 2147483647 - - - submenuAction: - - Window - - YES - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Bring All to Front - - 1048576 - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 1048576 - 2147483647 - - - submenuAction: - - Help - - YES - - - cefclient Help - ? - 1048576 - 2147483647 - - - - - - - - _NSMainMenu - - - YES - - - - - YES - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - print: - - - - 86 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - performClose: - - - - 193 - - - - toggleContinuousSpellChecking: - - - - 222 - - - - undo: - - - - 223 - - - - copy: - - - - 224 - - - - checkSpelling: - - - - 225 - - - - paste: - - - - 226 - - - - stopSpeaking: - - - - 227 - - - - cut: - - - - 228 - - - - showGuessPanel: - - - - 230 - - - - redo: - - - - 231 - - - - selectAll: - - - - 232 - - - - startSpeaking: - - - - 233 - - - - delete: - - - - 235 - - - - performZoom: - - - - 240 - - - - performFindPanelAction: - - - - 241 - - - - centerSelectionInVisibleArea: - - - - 245 - - - - toggleGrammarChecking: - - - - 347 - - - - toggleSmartInsertDelete: - - - - 355 - - - - toggleAutomaticQuoteSubstitution: - - - - 356 - - - - toggleAutomaticLinkDetection: - - - - 357 - - - - showHelp: - - - - 360 - - - - orderFrontColorPanel: - - - - 361 - - - - saveDocument: - - - - 362 - - - - saveDocumentAs: - - - - 363 - - - - revertDocumentToSaved: - - - - 364 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - terminate: - - - - 369 - - - - unhideAllApplications: - - - - 370 - - - - newDocument: - - - - 373 - - - - openDocument: - - - - 374 - - - - - YES - - 0 - - YES - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - YES - - - - - - - - - - MainMenu - - - 19 - - - YES - - - - - - 56 - - - YES - - - - - - 103 - - - YES - - - - 1 - - - 217 - - - YES - - - - - - 83 - - - YES - - - - - - 81 - - - YES - - - - - - - - - - - - - - - - 75 - - - 3 - - - 80 - - - 8 - - - 78 - - - 6 - - - 72 - - - - - 82 - - - 9 - - - 124 - - - YES - - - - - - 77 - - - 5 - - - 73 - - - 1 - - - 79 - - - 7 - - - 112 - - - 10 - - - 74 - - - 2 - - - 125 - - - YES - - - - - - 126 - - - - - 205 - - - YES - - - - - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 214 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 218 - - - YES - - - - - - 216 - - - YES - - - - - - 200 - - - YES - - - - - - - - - 219 - - - - - 201 - - - - - 204 - - - - - 220 - - - YES - - - - - - - - - - 213 - - - - - 210 - - - - - 221 - - - - - 208 - - - - - 209 - - - - - 106 - - - YES - - - - 2 - - - 111 - - - - - 57 - - - YES - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - 1111 - - - 144 - - - - - 129 - - - 121 - - - 143 - - - - - 236 - - - - - 131 - - - YES - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 24 - - - YES - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - YES - - - - - - 296 - - - YES - - - - - - - 297 - - - - - 298 - - - - - 299 - - - YES - - - - - - 300 - - - YES - - - - - - - 344 - - - - - 345 - - - - - 211 - - - YES - - - - - - 212 - - - YES - - - - - - - 195 - - - - - 196 - - - - - 346 - - - - - 348 - - - YES - - - - - - 349 - - - YES - - - - - - - - 350 - - - - - 351 - - - - - 354 - - - - - 389 - - - - - - - YES - - YES - -3.IBPluginDependency - 103.IBPluginDependency - 103.ImportedFromIB2 - 106.IBEditorWindowLastContentRect - 106.IBPluginDependency - 106.ImportedFromIB2 - 106.editorWindowContentRectSynchronizationRect - 111.IBPluginDependency - 111.ImportedFromIB2 - 112.IBPluginDependency - 112.ImportedFromIB2 - 124.IBPluginDependency - 124.ImportedFromIB2 - 125.IBPluginDependency - 125.ImportedFromIB2 - 125.editorWindowContentRectSynchronizationRect - 126.IBPluginDependency - 126.ImportedFromIB2 - 129.IBPluginDependency - 129.ImportedFromIB2 - 130.IBPluginDependency - 130.ImportedFromIB2 - 130.editorWindowContentRectSynchronizationRect - 131.IBPluginDependency - 131.ImportedFromIB2 - 134.IBPluginDependency - 134.ImportedFromIB2 - 136.IBPluginDependency - 136.ImportedFromIB2 - 143.IBPluginDependency - 143.ImportedFromIB2 - 144.IBPluginDependency - 144.ImportedFromIB2 - 145.IBPluginDependency - 145.ImportedFromIB2 - 149.IBPluginDependency - 149.ImportedFromIB2 - 150.IBPluginDependency - 150.ImportedFromIB2 - 19.IBPluginDependency - 19.ImportedFromIB2 - 195.IBPluginDependency - 195.ImportedFromIB2 - 196.IBPluginDependency - 196.ImportedFromIB2 - 197.IBPluginDependency - 197.ImportedFromIB2 - 198.IBPluginDependency - 198.ImportedFromIB2 - 199.IBPluginDependency - 199.ImportedFromIB2 - 200.IBEditorWindowLastContentRect - 200.IBPluginDependency - 200.ImportedFromIB2 - 200.editorWindowContentRectSynchronizationRect - 201.IBPluginDependency - 201.ImportedFromIB2 - 202.IBPluginDependency - 202.ImportedFromIB2 - 203.IBPluginDependency - 203.ImportedFromIB2 - 204.IBPluginDependency - 204.ImportedFromIB2 - 205.IBEditorWindowLastContentRect - 205.IBPluginDependency - 205.ImportedFromIB2 - 205.editorWindowContentRectSynchronizationRect - 206.IBPluginDependency - 206.ImportedFromIB2 - 207.IBPluginDependency - 207.ImportedFromIB2 - 208.IBPluginDependency - 208.ImportedFromIB2 - 209.IBPluginDependency - 209.ImportedFromIB2 - 210.IBPluginDependency - 210.ImportedFromIB2 - 211.IBPluginDependency - 211.ImportedFromIB2 - 212.IBEditorWindowLastContentRect - 212.IBPluginDependency - 212.ImportedFromIB2 - 212.editorWindowContentRectSynchronizationRect - 213.IBPluginDependency - 213.ImportedFromIB2 - 214.IBPluginDependency - 214.ImportedFromIB2 - 215.IBPluginDependency - 215.ImportedFromIB2 - 216.IBPluginDependency - 216.ImportedFromIB2 - 217.IBPluginDependency - 217.ImportedFromIB2 - 218.IBPluginDependency - 218.ImportedFromIB2 - 219.IBPluginDependency - 219.ImportedFromIB2 - 220.IBEditorWindowLastContentRect - 220.IBPluginDependency - 220.ImportedFromIB2 - 220.editorWindowContentRectSynchronizationRect - 221.IBPluginDependency - 221.ImportedFromIB2 - 23.IBPluginDependency - 23.ImportedFromIB2 - 236.IBPluginDependency - 236.ImportedFromIB2 - 239.IBPluginDependency - 239.ImportedFromIB2 - 24.IBEditorWindowLastContentRect - 24.IBPluginDependency - 24.ImportedFromIB2 - 24.editorWindowContentRectSynchronizationRect - 29.IBEditorWindowLastContentRect - 29.IBPluginDependency - 29.ImportedFromIB2 - 29.WindowOrigin - 29.editorWindowContentRectSynchronizationRect - 295.IBPluginDependency - 296.IBEditorWindowLastContentRect - 296.IBPluginDependency - 296.editorWindowContentRectSynchronizationRect - 297.IBPluginDependency - 298.IBPluginDependency - 299.IBPluginDependency - 300.IBEditorWindowLastContentRect - 300.IBPluginDependency - 300.editorWindowContentRectSynchronizationRect - 344.IBPluginDependency - 345.IBPluginDependency - 346.IBPluginDependency - 346.ImportedFromIB2 - 348.IBPluginDependency - 348.ImportedFromIB2 - 349.IBEditorWindowLastContentRect - 349.IBPluginDependency - 349.ImportedFromIB2 - 349.editorWindowContentRectSynchronizationRect - 350.IBPluginDependency - 350.ImportedFromIB2 - 351.IBPluginDependency - 351.ImportedFromIB2 - 354.IBPluginDependency - 354.ImportedFromIB2 - 389.IBPluginDependency - 5.IBPluginDependency - 5.ImportedFromIB2 - 56.IBPluginDependency - 56.ImportedFromIB2 - 57.IBEditorWindowLastContentRect - 57.IBPluginDependency - 57.ImportedFromIB2 - 57.editorWindowContentRectSynchronizationRect - 58.IBPluginDependency - 58.ImportedFromIB2 - 72.IBPluginDependency - 72.ImportedFromIB2 - 73.IBPluginDependency - 73.ImportedFromIB2 - 74.IBPluginDependency - 74.ImportedFromIB2 - 75.IBPluginDependency - 75.ImportedFromIB2 - 77.IBPluginDependency - 77.ImportedFromIB2 - 78.IBPluginDependency - 78.ImportedFromIB2 - 79.IBPluginDependency - 79.ImportedFromIB2 - 80.IBPluginDependency - 80.ImportedFromIB2 - 81.IBEditorWindowLastContentRect - 81.IBPluginDependency - 81.ImportedFromIB2 - 81.editorWindowContentRectSynchronizationRect - 82.IBPluginDependency - 82.ImportedFromIB2 - 83.IBPluginDependency - 83.ImportedFromIB2 - 92.IBPluginDependency - 92.ImportedFromIB2 - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - {{906, 713}, {164, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{375, 955}, {171, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{522, 812}, {146, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{436, 809}, {64, 6}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{915, 473}, {272, 83}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {275, 83}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{675, 493}, {240, 243}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{144, 735}, {243, 243}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{915, 473}, {164, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {167, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{915, 473}, {238, 103}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {241, 103}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{835, 663}, {194, 73}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{304, 905}, {197, 73}} - {{541, 736}, {426, 20}} - com.apple.InterfaceBuilder.CocoaPlugin - - {74, 862} - {{6, 836}, {430, 20}} - com.apple.InterfaceBuilder.CocoaPlugin - {{785, 693}, {231, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - {{254, 935}, {234, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{719, 693}, {173, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - {{188, 935}, {176, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{915, 473}, {212, 63}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {215, 63}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{553, 553}, {193, 183}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{18, 653}, {200, 183}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{633, 533}, {196, 203}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{102, 775}, {199, 203}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - - - - YES - - - YES - - - - - YES - - - YES - - - - 439 - - - - YES - - NSApplication - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSApplication.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSApplicationScripting.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSColorPanel.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSHelpManager.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSPageLayout.h - - - - NSBrowser - NSControl - - IBFrameworkSource - AppKit.framework/Headers/NSBrowser.h - - - - NSControl - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSControl.h - - - - NSController - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSController.h - - - - NSDocument - NSObject - - YES - - YES - printDocument: - revertDocumentToSaved: - runPageLayout: - saveDocument: - saveDocumentAs: - saveDocumentTo: - - - YES - id - id - id - id - id - id - - - - YES - - YES - printDocument: - revertDocumentToSaved: - runPageLayout: - saveDocument: - saveDocumentAs: - saveDocumentTo: - - - YES - - printDocument: - id - - - revertDocumentToSaved: - id - - - runPageLayout: - id - - - saveDocument: - id - - - saveDocumentAs: - id - - - saveDocumentTo: - id - - - - - IBFrameworkSource - AppKit.framework/Headers/NSDocument.h - - - - NSDocument - - IBFrameworkSource - AppKit.framework/Headers/NSDocumentScripting.h - - - - NSDocumentController - NSObject - - YES - - YES - clearRecentDocuments: - newDocument: - openDocument: - saveAllDocuments: - - - YES - id - id - id - id - - - - YES - - YES - clearRecentDocuments: - newDocument: - openDocument: - saveAllDocuments: - - - YES - - clearRecentDocuments: - id - - - newDocument: - id - - - openDocument: - id - - - saveAllDocuments: - id - - - - - IBFrameworkSource - AppKit.framework/Headers/NSDocumentController.h - - - - NSFormatter - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFormatter.h - - - - NSMatrix - NSControl - - IBFrameworkSource - AppKit.framework/Headers/NSMatrix.h - - - - NSMenu - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSMenu.h - - - - NSMenuItem - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSMenuItem.h - - - - NSMovieView - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSMovieView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSAccessibility.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSAlert.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSAnimation.h - - - - NSObject - - - - NSObject - - - - NSObject - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSComboBox.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSComboBoxCell.h - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDatePickerCell.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDictionaryController.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDragging.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDrawer.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSFontManager.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSFontPanel.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSImage.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSKeyValueBinding.h - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSNibLoading.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSOutlineView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSPasteboard.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSRuleEditor.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSavePanel.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSound.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSpeechRecognizer.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSpeechSynthesizer.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSplitView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTabView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTableView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSText.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTextStorage.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTextView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTokenField.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTokenFieldCell.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSToolbar.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSToolbarItem.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSWindow.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSClassDescription.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSConnection.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSMetadata.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSNetServices.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObjectScripting.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSPort.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSPortCoder.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptClassDescription.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptObjectSpecifiers.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptWhoseTests.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSSpellServer.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSStream.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLDownload.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSXMLParser.h - - - - NSObject - - IBFrameworkSource - Print.framework/Headers/PDEPluginInterface.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CIImageProvider.h - - - - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSInterfaceStyle.h - - - - NSResponder - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSResponder.h - - - - NSTableView - NSControl - - - - NSText - NSView - - - - NSUserDefaultsController - NSController - - IBFrameworkSource - AppKit.framework/Headers/NSUserDefaultsController.h - - - - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSClipView.h - - - - NSView - - - - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSRulerView.h - - - - NSView - NSResponder - - - - NSWindow - - - - NSWindow - NSResponder - - - - NSWindow - - IBFrameworkSource - AppKit.framework/Headers/NSWindowScripting.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - ../../../../cef.xcodeproj - 3 - - YES - - YES - NSMenuCheckmark - NSMenuMixedState - - - YES - {9, 8} - {7, 2} - - - - diff --git a/tests/unittests/mac/Info.plist b/tests/unittests/mac/Info.plist deleted file mode 100644 index 3d5f27c20..000000000 --- a/tests/unittests/mac/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - unittests.icns - CFBundleIdentifier - org.cef.unittests - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - 1.0 - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff --git a/tests/unittests/mac/unittests.icns b/tests/unittests/mac/unittests.icns deleted file mode 100644 index f36742de2572421b1eaa5569f64ab34e450ddb67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55080 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%0Ac$%Pvh#VA!uK`rp4)7 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 OV{TRe000a^@Bjd~o7PtV diff --git a/tests/unittests/navigation_unittest.cc b/tests/unittests/navigation_unittest.cc deleted file mode 100644 index a830314ff..000000000 --- a/tests/unittests/navigation_unittest.cc +++ /dev/null @@ -1,605 +0,0 @@ -// 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 "include/cef_callback.h" -#include "include/cef_scheme.h" -#include "tests/unittests/test_handler.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -static const char* kNav1 = "http://tests/nav1.html"; -static const char* kNav2 = "http://tests/nav2.html"; -static const char* kNav3 = "http://tests/nav3.html"; -static const char* kNav4 = "http://tests/nav4.html"; - -enum NavAction { - NA_LOAD = 1, - NA_BACK, - NA_FORWARD, - NA_CLEAR -}; - -typedef struct { - NavAction action; // What to do - const char* target; // Where to be after navigation - bool can_go_back; // After navigation, can go back? - bool can_go_forward; // After navigation, can go forward? -} NavListItem; - -// Array of navigation actions: X = current page, . = history exists -static NavListItem kNavList[] = { - // kNav1 | kNav2 | kNav3 - {NA_LOAD, kNav1, false, false}, // X - {NA_LOAD, kNav2, true, false}, // . X - {NA_BACK, kNav1, false, true}, // X . - {NA_FORWARD, kNav2, true, false}, // . X - {NA_LOAD, kNav3, true, false}, // . . X - {NA_BACK, kNav2, true, true}, // . X . - // TODO(cef): Enable once ClearHistory is implemented - // {NA_CLEAR, kNav2, false, false}, // X -}; - -#define NAV_LIST_SIZE() (sizeof(kNavList) / sizeof(NavListItem)) - -class HistoryNavTestHandler : public TestHandler { - public: - HistoryNavTestHandler() : nav_(0) {} - - virtual void RunTest() OVERRIDE { - // Add the resources that we will navigate to/from. - AddResource(kNav1, "Nav1", "text/html"); - AddResource(kNav2, "Nav2", "text/html"); - AddResource(kNav3, "Nav3", "text/html"); - - // Create the browser. - CreateBrowser(CefString()); - } - - void RunNav(CefRefPtr browser) { - if (nav_ == NAV_LIST_SIZE()) { - // End of the nav list. - DestroyTest(); - return; - } - - const NavListItem& item = kNavList[nav_]; - - // Perform the action. - switch (item.action) { - case NA_LOAD: - browser->GetMainFrame()->LoadURL(item.target); - break; - case NA_BACK: - browser->GoBack(); - break; - case NA_FORWARD: - browser->GoForward(); - break; - case NA_CLEAR: - // TODO(cef): Enable once ClearHistory is implemented - // browser->GetHost()->ClearHistory(); - // Not really a navigation action so go to the next one. - nav_++; - RunNav(browser); - break; - default: - break; - } - } - - virtual void OnAfterCreated(CefRefPtr browser) OVERRIDE { - TestHandler::OnAfterCreated(browser); - - RunNav(browser); - } - - virtual bool OnBeforeResourceLoad(CefRefPtr browser, - CefRefPtr frame, - CefRefPtr request) OVERRIDE { - const NavListItem& item = kNavList[nav_]; - - got_before_resource_load_[nav_].yes(); - - std::string url = request->GetURL(); - if (url == item.target) - got_correct_target_[nav_].yes(); - - return false; - } - - virtual void OnLoadingStateChange(CefRefPtr browser, - bool isLoading, - bool canGoBack, - bool canGoForward) OVERRIDE { - const NavListItem& item = kNavList[nav_]; - - got_loading_state_change_[nav_].yes(); - - if (item.can_go_back == canGoBack) - got_correct_can_go_back_[nav_].yes(); - if (item.can_go_forward == canGoForward) - got_correct_can_go_forward_[nav_].yes(); - } - - virtual void OnLoadStart(CefRefPtr browser, - CefRefPtr frame) OVERRIDE { - if(browser->IsPopup() || !frame->IsMain()) - return; - - const NavListItem& item = kNavList[nav_]; - - got_load_start_[nav_].yes(); - - std::string url1 = browser->GetMainFrame()->GetURL(); - std::string url2 = frame->GetURL(); - if (url1 == item.target && url2 == item.target) - got_correct_load_start_url_[nav_].yes(); - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE { - if (browser->IsPopup() || !frame->IsMain()) - return; - - const NavListItem& item = kNavList[nav_]; - - got_load_end_[nav_].yes(); - - std::string url1 = browser->GetMainFrame()->GetURL(); - std::string url2 = frame->GetURL(); - if (url1 == item.target && url2 == item.target) - got_correct_load_end_url_[nav_].yes(); - - if (item.can_go_back == browser->CanGoBack()) - got_correct_can_go_back2_[nav_].yes(); - if (item.can_go_forward == browser->CanGoForward()) - got_correct_can_go_forward2_[nav_].yes(); - - nav_++; - RunNav(browser); - } - - int nav_; - - TrackCallback got_before_resource_load_[NAV_LIST_SIZE()]; - TrackCallback got_correct_target_[NAV_LIST_SIZE()]; - TrackCallback got_loading_state_change_[NAV_LIST_SIZE()]; - TrackCallback got_correct_can_go_back_[NAV_LIST_SIZE()]; - TrackCallback got_correct_can_go_forward_[NAV_LIST_SIZE()]; - TrackCallback got_load_start_[NAV_LIST_SIZE()]; - TrackCallback got_correct_load_start_url_[NAV_LIST_SIZE()]; - TrackCallback got_load_end_[NAV_LIST_SIZE()]; - TrackCallback got_correct_load_end_url_[NAV_LIST_SIZE()]; - TrackCallback got_correct_can_go_back2_[NAV_LIST_SIZE()]; - TrackCallback got_correct_can_go_forward2_[NAV_LIST_SIZE()]; -}; - -} // namespace - -// Verify history navigation. -TEST(NavigationTest, History) { - CefRefPtr handler = - new HistoryNavTestHandler(); - handler->ExecuteTest(); - - for (size_t i = 0; i < NAV_LIST_SIZE(); ++i) { - if (kNavList[i].action != NA_CLEAR) { - ASSERT_TRUE(handler->got_before_resource_load_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_correct_target_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_load_start_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_correct_load_start_url_[i]) << "i = " << i; - } - - ASSERT_TRUE(handler->got_loading_state_change_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_correct_can_go_back_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_correct_can_go_forward_[i]) << "i = " << i; - - if (kNavList[i].action != NA_CLEAR) { - ASSERT_TRUE(handler->got_load_end_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_correct_load_end_url_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_correct_can_go_back2_[i]) << "i = " << i; - ASSERT_TRUE(handler->got_correct_can_go_forward2_[i]) << "i = " << i; - } - } -} - - -namespace { - -class FrameNameIdentNavTestHandler : public TestHandler { - public: - FrameNameIdentNavTestHandler() : browse_ct_(0) {} - - virtual void RunTest() OVERRIDE { - // Add the frame resources. - std::stringstream ss; - - // Page with named frame - ss << "Nav1" - "", "text/html"); - AddResource(kV8ContextChildTestUrl, "CHILD", - "text/html"); - CreateBrowser(kV8ContextParentTestUrl); - } else { - EXPECT_TRUE(test_url_ != NULL); - AddResource(test_url_, "TEST", "text/html"); - CreateBrowser(test_url_); - } - } - - CefRefPtr CreateTestMessage() { - CefRefPtr msg = CefProcessMessage::Create(kV8TestMsg); - EXPECT_TRUE(msg->GetArgumentList()->SetInt(0, test_mode_)); - return msg; - } - - virtual void OnLoadEnd(CefRefPtr browser, - CefRefPtr frame, - int httpStatusCode) OVERRIDE { - if (frame->IsMain()) { - // Send the message to the renderer process to run the test. - EXPECT_TRUE(browser->SendProcessMessage(PID_RENDERER, - CreateTestMessage())); - } - } - - virtual bool OnProcessMessageReceived( - CefRefPtr browser, - CefProcessId source_process, - CefRefPtr message) OVERRIDE { - EXPECT_TRUE(browser.get()); - EXPECT_EQ(PID_RENDERER, source_process); - EXPECT_TRUE(message.get()); - EXPECT_TRUE(message->IsReadOnly()); - - got_message_.yes(); - - if (message->GetArgumentList()->GetBool(0)) - got_success_.yes(); - - // Test is complete. - DestroyTest(); - - return true; - } - - V8TestMode test_mode_; - const char* test_url_; - TrackCallback got_message_; - TrackCallback got_success_; -}; - -} // namespace - - -// Entry point for creating V8 renderer test objects. -// Called from client_app_delegates.cc. -void CreateV8RendererTests(ClientApp::RenderDelegateSet& delegates) { - delegates.insert(new V8RendererTest); -} - - -// Helpers for defining V8 tests. -#define V8_TEST_EX(name, test_mode, test_url) \ - TEST(V8Test, name) { \ - CefRefPtr handler = \ - new V8TestHandler(test_mode, test_url); \ - handler->ExecuteTest(); \ - EXPECT_TRUE(handler->got_message_); \ - EXPECT_TRUE(handler->got_success_); \ - } - -#define V8_TEST(name, test_mode) \ - V8_TEST_EX(name, test_mode, kV8TestUrl) - - -// Define the tests. -V8_TEST(NullCreate, V8TEST_NULL_CREATE); -V8_TEST(BoolCreate, V8TEST_BOOL_CREATE); -V8_TEST(IntCreate, V8TEST_INT_CREATE); -V8_TEST(UIntCreate, V8TEST_UINT_CREATE); -V8_TEST(DoubleCreate, V8TEST_DOUBLE_CREATE); -V8_TEST(DateCreate, V8TEST_DATE_CREATE); -V8_TEST(StringCreate, V8TEST_STRING_CREATE); -V8_TEST(ArrayCreate, V8TEST_ARRAY_CREATE); -V8_TEST(ArrayValue, V8TEST_ARRAY_VALUE); -V8_TEST(ObjectCreate, V8TEST_OBJECT_CREATE); -V8_TEST(ObjectUserData, V8TEST_OBJECT_USERDATA); -V8_TEST(ObjectAccessor, V8TEST_OBJECT_ACCESSOR); -V8_TEST(ObjectAccessorException, V8TEST_OBJECT_ACCESSOR_EXCEPTION); -V8_TEST(ObjectAccessorFail, V8TEST_OBJECT_ACCESSOR_FAIL); -V8_TEST(ObjectAccessorReadOnly, V8TEST_OBJECT_ACCESSOR_READONLY); -V8_TEST(ObjectValue, V8TEST_OBJECT_VALUE); -V8_TEST(ObjectValueReadOnly, V8TEST_OBJECT_VALUE_READONLY); -V8_TEST(ObjectValueEnum, V8TEST_OBJECT_VALUE_ENUM); -V8_TEST(ObjectValueDontEnum, V8TEST_OBJECT_VALUE_DONTENUM); -V8_TEST(ObjectValueDelete, V8TEST_OBJECT_VALUE_DELETE); -V8_TEST(ObjectValueDontDelete, V8TEST_OBJECT_VALUE_DONTDELETE); -V8_TEST(FunctionCreate, V8TEST_FUNCTION_CREATE); -V8_TEST(FunctionHandler, V8TEST_FUNCTION_HANDLER); -V8_TEST(FunctionHandlerException, V8TEST_FUNCTION_HANDLER_EXCEPTION); -V8_TEST(FunctionHandlerFail, V8TEST_FUNCTION_HANDLER_FAIL); -V8_TEST(FunctionHandlerNoObject, V8TEST_FUNCTION_HANDLER_NO_OBJECT); -V8_TEST(FunctionHandlerWithContext, V8TEST_FUNCTION_HANDLER_WITH_CONTEXT); -V8_TEST(ContextEval, V8TEST_CONTEXT_EVAL); -V8_TEST(ContextEvalException, V8TEST_CONTEXT_EVAL_EXCEPTION); -V8_TEST_EX(ContextEntered, V8TEST_CONTEXT_ENTERED, NULL); -V8_TEST_EX(Binding, V8TEST_BINDING, kV8BindingTestUrl); diff --git a/tests/unittests/values_unittest.cc b/tests/unittests/values_unittest.cc deleted file mode 100644 index 3e3cb83ad..000000000 --- a/tests/unittests/values_unittest.cc +++ /dev/null @@ -1,734 +0,0 @@ -// Copyright (c) 2012 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 "include/cef_task.h" -#include "include/cef_values.h" -#include "tests/unittests/test_handler.h" -#include "tests/unittests/test_util.h" -#include "testing/gtest/include/gtest/gtest.h" - - -namespace { - -// Dictionary test keys. -const char* kNullKey = "null_key"; -const char* kBoolKey = "bool_key"; -const char* kIntKey = "int_key"; -const char* kDoubleKey = "double_key"; -const char* kStringKey = "string_key"; -const char* kBinaryKey = "binary_key"; -const char* kDictionaryKey = "dict_key"; -const char* kListKey = "list_key"; - -// List test indexes. -enum { - kNullIndex = 0, - kBoolIndex, - kIntIndex, - kDoubleIndex, - kStringIndex, - kBinaryIndex, - kDictionaryIndex, - kListIndex, -}; - -// Dictionary/list test values. -const bool kBoolValue = true; -const int kIntValue = 12; -const double kDoubleValue = 4.5432; -const char* kStringValue = "My string value"; - - -// BINARY TEST HELPERS - -// Test a binary value. -void TestBinary(CefRefPtr value, char* data, size_t data_size) { - // Testing requires strings longer than 15 characters. - EXPECT_GT(data_size, (size_t)15); - - EXPECT_EQ(data_size, value->GetSize()); - - char* buff = new char[data_size+1]; - char old_char; - - // Test full read. - memset(buff, 0, data_size+1); - EXPECT_EQ(data_size, value->GetData(buff, data_size, 0)); - EXPECT_TRUE(!strcmp(buff, data)); - - // Test partial read with offset. - memset(buff, 0, data_size+1); - old_char = data[15]; - data[15] = 0; - EXPECT_EQ((size_t)10, value->GetData(buff, 10, 5)); - EXPECT_TRUE(!strcmp(buff, data+5)); - data[15] = old_char; - - // Test that changes to the original data have no effect. - memset(buff, 0, data_size+1); - old_char = data[0]; - data[0] = '.'; - EXPECT_EQ((size_t)1, value->GetData(buff, 1, 0)); - EXPECT_EQ(old_char, buff[0]); - data[0] = old_char; - - // Test copy. - CefRefPtr copy = value->Copy(); - TestBinaryEqual(copy, value); - - delete [] buff; -} - -// Used to test access of binary data on a different thread. -class BinaryTask : public CefTask { - public: - BinaryTask(CefRefPtr value, char* data, size_t data_size) - : value_(value), - data_(data), - data_size_(data_size) {} - - virtual void Execute(CefThreadId threadId) OVERRIDE { - TestBinary(value_, data_, data_size_); - } - - private: - CefRefPtr value_; - char* data_; - size_t data_size_; - - IMPLEMENT_REFCOUNTING(BinaryTask); -}; - - -// DICTIONARY TEST HELPERS - -// Test dictionary null value. -void TestDictionaryNull(CefRefPtr value) { - EXPECT_FALSE(value->HasKey(kNullKey)); - EXPECT_TRUE(value->SetNull(kNullKey)); - EXPECT_TRUE(value->HasKey(kNullKey)); - EXPECT_EQ(VTYPE_NULL, value->GetType(kNullKey)); -} - -// Test dictionary bool value. -void TestDictionaryBool(CefRefPtr value) { - EXPECT_FALSE(value->HasKey(kBoolKey)); - EXPECT_TRUE(value->SetBool(kBoolKey, kBoolValue)); - EXPECT_TRUE(value->HasKey(kBoolKey)); - EXPECT_EQ(VTYPE_BOOL, value->GetType(kBoolKey)); - EXPECT_EQ(kBoolValue, value->GetBool(kBoolKey)); -} - -// Test dictionary int value. -void TestDictionaryInt(CefRefPtr value) { - EXPECT_FALSE(value->HasKey(kIntKey)); - EXPECT_TRUE(value->SetInt(kIntKey, kIntValue)); - EXPECT_TRUE(value->HasKey(kIntKey)); - EXPECT_EQ(VTYPE_INT, value->GetType(kIntKey)); - EXPECT_EQ(kIntValue, value->GetInt(kIntKey)); -} - -// Test dictionary double value. -void TestDictionaryDouble(CefRefPtr value) { - EXPECT_FALSE(value->HasKey(kDoubleKey)); - EXPECT_TRUE(value->SetDouble(kDoubleKey, kDoubleValue)); - EXPECT_TRUE(value->HasKey(kDoubleKey)); - EXPECT_EQ(VTYPE_DOUBLE, value->GetType(kDoubleKey)); - EXPECT_EQ(kDoubleValue, value->GetDouble(kDoubleKey)); -} - -// Test dictionary string value. -void TestDictionaryString(CefRefPtr value) { - EXPECT_FALSE(value->HasKey(kStringKey)); - EXPECT_TRUE(value->SetString(kStringKey, kStringValue)); - EXPECT_TRUE(value->HasKey(kStringKey)); - EXPECT_EQ(VTYPE_STRING, value->GetType(kStringKey)); - EXPECT_EQ(kStringValue, value->GetString(kStringKey).ToString()); -} - -// Test dictionary binary value. -void TestDictionaryBinary(CefRefPtr value, - char* binary_data, size_t binary_data_size, - CefRefPtr& binary_value) { - binary_value = CefBinaryValue::Create(binary_data, binary_data_size); - EXPECT_TRUE(binary_value.get()); - EXPECT_TRUE(binary_value->IsValid()); - EXPECT_FALSE(binary_value->IsOwned()); - EXPECT_FALSE(value->HasKey(kBinaryKey)); - EXPECT_TRUE(value->SetBinary(kBinaryKey, binary_value)); - EXPECT_FALSE(binary_value->IsValid()); // Value should be detached - EXPECT_TRUE(value->HasKey(kBinaryKey)); - EXPECT_EQ(VTYPE_BINARY, value->GetType(kBinaryKey)); - binary_value = value->GetBinary(kBinaryKey); - EXPECT_TRUE(binary_value.get()); - EXPECT_TRUE(binary_value->IsValid()); - EXPECT_TRUE(binary_value->IsOwned()); - TestBinary(binary_value, binary_data, binary_data_size); -} - -// Test dictionary dictionary value. -void TestDictionaryDictionary(CefRefPtr value, - CefRefPtr& dictionary_value) { - dictionary_value = CefDictionaryValue::Create(); - EXPECT_TRUE(dictionary_value.get()); - EXPECT_TRUE(dictionary_value->IsValid()); - EXPECT_FALSE(dictionary_value->IsOwned()); - EXPECT_FALSE(dictionary_value->IsReadOnly()); - EXPECT_TRUE(dictionary_value->SetInt(kIntKey, kIntValue)); - EXPECT_EQ((size_t)1, dictionary_value->GetSize()); - EXPECT_FALSE(value->HasKey(kDictionaryKey)); - EXPECT_TRUE(value->SetDictionary(kDictionaryKey, dictionary_value)); - EXPECT_FALSE(dictionary_value->IsValid()); // Value should be detached - EXPECT_TRUE(value->HasKey(kDictionaryKey)); - EXPECT_EQ(VTYPE_DICTIONARY, value->GetType(kDictionaryKey)); - dictionary_value = value->GetDictionary(kDictionaryKey); - EXPECT_TRUE(dictionary_value.get()); - EXPECT_TRUE(dictionary_value->IsValid()); - EXPECT_TRUE(dictionary_value->IsOwned()); - EXPECT_FALSE(dictionary_value->IsReadOnly()); - EXPECT_EQ((size_t)1, dictionary_value->GetSize()); - EXPECT_EQ(kIntValue, dictionary_value->GetInt(kIntKey)); -} - -// Test dictionary list value. -void TestDictionaryList(CefRefPtr value, - CefRefPtr& list_value) { - list_value = CefListValue::Create(); - EXPECT_TRUE(list_value.get()); - EXPECT_TRUE(list_value->IsValid()); - EXPECT_FALSE(list_value->IsOwned()); - EXPECT_FALSE(list_value->IsReadOnly()); - EXPECT_TRUE(list_value->SetInt(0, kIntValue)); - EXPECT_EQ((size_t)1, list_value->GetSize()); - EXPECT_FALSE(value->HasKey(kListKey)); - EXPECT_TRUE(value->SetList(kListKey, list_value)); - EXPECT_FALSE(list_value->IsValid()); // Value should be detached - EXPECT_TRUE(value->HasKey(kListKey)); - EXPECT_EQ(VTYPE_LIST, value->GetType(kListKey)); - list_value = value->GetList(kListKey); - EXPECT_TRUE(list_value.get()); - EXPECT_TRUE(list_value->IsValid()); - EXPECT_TRUE(list_value->IsOwned()); - EXPECT_FALSE(list_value->IsReadOnly()); - EXPECT_EQ((size_t)1, list_value->GetSize()); - EXPECT_EQ(kIntValue, list_value->GetInt(0)); -} - -// Test dictionary value. -void TestDictionary(CefRefPtr value, - char* binary_data, size_t binary_data_size) { - CefRefPtr binary_value; - CefRefPtr dictionary_value; - CefRefPtr list_value; - - // Test the size. - EXPECT_EQ((size_t)0, value->GetSize()); - - TestDictionaryNull(value); - TestDictionaryBool(value); - TestDictionaryInt(value); - TestDictionaryDouble(value); - TestDictionaryString(value); - TestDictionaryBinary(value, binary_data, binary_data_size, binary_value); - TestDictionaryDictionary(value, dictionary_value); - TestDictionaryList(value, list_value); - - // Test the size. - EXPECT_EQ((size_t)8, value->GetSize()); - - // Test copy. - CefRefPtr copy = value->Copy(false); - TestDictionaryEqual(value, copy); - - // Test removal. - EXPECT_TRUE(value->Remove(kNullKey)); - EXPECT_FALSE(value->HasKey(kNullKey)); - - EXPECT_TRUE(value->Remove(kBoolKey)); - EXPECT_FALSE(value->HasKey(kBoolKey)); - - EXPECT_TRUE(value->Remove(kIntKey)); - EXPECT_FALSE(value->HasKey(kIntKey)); - - EXPECT_TRUE(value->Remove(kDoubleKey)); - EXPECT_FALSE(value->HasKey(kDoubleKey)); - - EXPECT_TRUE(value->Remove(kStringKey)); - EXPECT_FALSE(value->HasKey(kStringKey)); - - EXPECT_TRUE(value->Remove(kBinaryKey)); - EXPECT_FALSE(value->HasKey(kBinaryKey)); - EXPECT_FALSE(binary_value->IsValid()); // Value should be detached - - EXPECT_TRUE(value->Remove(kDictionaryKey)); - EXPECT_FALSE(value->HasKey(kDictionaryKey)); - EXPECT_FALSE(dictionary_value->IsValid()); // Value should be detached - - EXPECT_TRUE(value->Remove(kListKey)); - EXPECT_FALSE(value->HasKey(kListKey)); - EXPECT_FALSE(list_value->IsValid()); // Value should be detached - - // Test the size. - EXPECT_EQ((size_t)0, value->GetSize()); - - // Re-add some values. - TestDictionaryNull(value); - TestDictionaryBool(value); - TestDictionaryDictionary(value, dictionary_value); - - // Test the size. - EXPECT_EQ((size_t)3, value->GetSize()); - - // Clear the values. - EXPECT_TRUE(value->Clear()); - EXPECT_EQ((size_t)0, value->GetSize()); - EXPECT_FALSE(dictionary_value->IsValid()); // Value should be detached -} - -// Used to test access of dictionary data on a different thread. -class DictionaryTask : public CefTask { - public: - DictionaryTask(CefRefPtr value, char* binary_data, - size_t binary_data_size) - : value_(value), - binary_data_(binary_data), - binary_data_size_(binary_data_size) {} - - virtual void Execute(CefThreadId threadId) OVERRIDE { - TestDictionary(value_, binary_data_, binary_data_size_); - } - - private: - CefRefPtr value_; - char* binary_data_; - size_t binary_data_size_; - - IMPLEMENT_REFCOUNTING(DictionaryTask); -}; - - -// LIST TEST HELPERS - -// Test list null value. -void TestListNull(CefRefPtr value, int index) { - CefValueType type = value->GetType(index); - EXPECT_TRUE(type == VTYPE_INVALID || type == VTYPE_NULL); - - EXPECT_TRUE(value->SetNull(index)); - EXPECT_EQ(VTYPE_NULL, value->GetType(index)); -} - -// Test list bool value. -void TestListBool(CefRefPtr value, int index) { - CefValueType type = value->GetType(index); - EXPECT_TRUE(type == VTYPE_INVALID || type == VTYPE_NULL); - - EXPECT_TRUE(value->SetBool(index, kBoolValue)); - EXPECT_EQ(VTYPE_BOOL, value->GetType(index)); - EXPECT_EQ(kBoolValue, value->GetBool(index)); -} - -// Test list int value. -void TestListInt(CefRefPtr value, int index) { - CefValueType type = value->GetType(index); - EXPECT_TRUE(type == VTYPE_INVALID || type == VTYPE_NULL); - - EXPECT_TRUE(value->SetInt(index, kIntValue)); - EXPECT_EQ(VTYPE_INT, value->GetType(index)); - EXPECT_EQ(kIntValue, value->GetInt(index)); -} - -// Test list double value. -void TestListDouble(CefRefPtr value, int index) { - CefValueType type = value->GetType(index); - EXPECT_TRUE(type == VTYPE_INVALID || type == VTYPE_NULL); - - EXPECT_TRUE(value->SetDouble(index, kDoubleValue)); - EXPECT_EQ(VTYPE_DOUBLE, value->GetType(index)); - EXPECT_EQ(kDoubleValue, value->GetDouble(index)); -} - -// Test list string value. -void TestListString(CefRefPtr value, int index) { - CefValueType type = value->GetType(index); - EXPECT_TRUE(type == VTYPE_INVALID || type == VTYPE_NULL); - - EXPECT_TRUE(value->SetString(index, kStringValue)); - EXPECT_EQ(VTYPE_STRING, value->GetType(index)); - EXPECT_EQ(kStringValue, value->GetString(index).ToString()); -} - -// Test list binary value. -void TestListBinary(CefRefPtr value, int index, - char* binary_data, size_t binary_data_size, - CefRefPtr& binary_value) { - binary_value = CefBinaryValue::Create(binary_data, binary_data_size); - EXPECT_TRUE(binary_value.get()); - EXPECT_TRUE(binary_value->IsValid()); - EXPECT_FALSE(binary_value->IsOwned()); - - CefValueType type = value->GetType(index); - EXPECT_TRUE(type == VTYPE_INVALID || type == VTYPE_NULL); - - EXPECT_TRUE(value->SetBinary(index, binary_value)); - EXPECT_FALSE(binary_value->IsValid()); // Value should be detached - EXPECT_EQ(VTYPE_BINARY, value->GetType(index)); - binary_value = value->GetBinary(index); - EXPECT_TRUE(binary_value.get()); - EXPECT_TRUE(binary_value->IsValid()); - EXPECT_TRUE(binary_value->IsOwned()); - TestBinary(binary_value, binary_data, binary_data_size); -} - -// Test list dictionary value. -void TestListDictionary(CefRefPtr value, int index, - CefRefPtr& dictionary_value) { - dictionary_value = CefDictionaryValue::Create(); - EXPECT_TRUE(dictionary_value.get()); - EXPECT_TRUE(dictionary_value->IsValid()); - EXPECT_FALSE(dictionary_value->IsOwned()); - EXPECT_FALSE(dictionary_value->IsReadOnly()); - EXPECT_TRUE(dictionary_value->SetInt(kIntKey, kIntValue)); - EXPECT_EQ((size_t)1, dictionary_value->GetSize()); - - CefValueType type = value->GetType(index); - EXPECT_TRUE(type == VTYPE_INVALID || type == VTYPE_NULL); - - EXPECT_TRUE(value->SetDictionary(index, dictionary_value)); - EXPECT_FALSE(dictionary_value->IsValid()); // Value should be detached - EXPECT_EQ(VTYPE_DICTIONARY, value->GetType(index)); - dictionary_value = value->GetDictionary(index); - EXPECT_TRUE(dictionary_value.get()); - EXPECT_TRUE(dictionary_value->IsValid()); - EXPECT_TRUE(dictionary_value->IsOwned()); - EXPECT_FALSE(dictionary_value->IsReadOnly()); - EXPECT_EQ((size_t)1, dictionary_value->GetSize()); - EXPECT_EQ(kIntValue, dictionary_value->GetInt(kIntKey)); -} - -// Test list list value. -void TestListList(CefRefPtr value, int index, - CefRefPtr& list_value) { - list_value = CefListValue::Create(); - EXPECT_TRUE(list_value.get()); - EXPECT_TRUE(list_value->IsValid()); - EXPECT_FALSE(list_value->IsOwned()); - EXPECT_FALSE(list_value->IsReadOnly()); - EXPECT_TRUE(list_value->SetInt(0, kIntValue)); - EXPECT_EQ((size_t)1, list_value->GetSize()); - - CefValueType type = value->GetType(index); - EXPECT_TRUE(type == VTYPE_INVALID || type == VTYPE_NULL); - - EXPECT_TRUE(value->SetList(index, list_value)); - EXPECT_FALSE(list_value->IsValid()); // Value should be detached - EXPECT_EQ(VTYPE_LIST, value->GetType(index)); - list_value = value->GetList(index); - EXPECT_TRUE(list_value.get()); - EXPECT_TRUE(list_value->IsValid()); - EXPECT_TRUE(list_value->IsOwned()); - EXPECT_FALSE(list_value->IsReadOnly()); - EXPECT_EQ((size_t)1, list_value->GetSize()); - EXPECT_EQ(kIntValue, list_value->GetInt(0)); -} - -// Test list value. -void TestList(CefRefPtr value, - char* binary_data, size_t binary_data_size) { - CefRefPtr binary_value; - CefRefPtr dictionary_value; - CefRefPtr list_value; - - // Test the size. - EXPECT_EQ((size_t)0, value->GetSize()); - - // Set the size. - EXPECT_TRUE(value->SetSize(8)); - EXPECT_EQ((size_t)8, value->GetSize()); - - EXPECT_EQ(VTYPE_NULL, value->GetType(kNullIndex)); - TestListNull(value, kNullIndex); - EXPECT_EQ(VTYPE_NULL, value->GetType(kBoolIndex)); - TestListBool(value, kBoolIndex); - EXPECT_EQ(VTYPE_NULL, value->GetType(kIntIndex)); - TestListInt(value, kIntIndex); - EXPECT_EQ(VTYPE_NULL, value->GetType(kDoubleIndex)); - TestListDouble(value, kDoubleIndex); - EXPECT_EQ(VTYPE_NULL, value->GetType(kStringIndex)); - TestListString(value, kStringIndex); - EXPECT_EQ(VTYPE_NULL, value->GetType(kBinaryIndex)); - TestListBinary(value, kBinaryIndex, binary_data, binary_data_size, - binary_value); - EXPECT_EQ(VTYPE_NULL, value->GetType(kDictionaryIndex)); - TestListDictionary(value, kDictionaryIndex, dictionary_value); - EXPECT_EQ(VTYPE_NULL, value->GetType(kListIndex)); - TestListList(value, kListIndex, list_value); - - // Test the size. - EXPECT_EQ((size_t)8, value->GetSize()); - - // Test copy. - CefRefPtr copy = value->Copy(); - TestListEqual(value, copy); - - // Test removal (in reverse order so indexes stay valid). - EXPECT_TRUE(value->Remove(kListIndex)); - EXPECT_EQ((size_t)7, value->GetSize()); - EXPECT_FALSE(list_value->IsValid()); // Value should be detached - - EXPECT_TRUE(value->Remove(kDictionaryIndex)); - EXPECT_EQ((size_t)6, value->GetSize()); - EXPECT_FALSE(dictionary_value->IsValid()); // Value should be detached - - EXPECT_TRUE(value->Remove(kBinaryIndex)); - EXPECT_EQ((size_t)5, value->GetSize()); - EXPECT_FALSE(binary_value->IsValid()); // Value should be detached - - EXPECT_TRUE(value->Remove(kStringIndex)); - EXPECT_EQ((size_t)4, value->GetSize()); - - EXPECT_TRUE(value->Remove(kDoubleIndex)); - EXPECT_EQ((size_t)3, value->GetSize()); - - EXPECT_TRUE(value->Remove(kIntIndex)); - EXPECT_EQ((size_t)2, value->GetSize()); - - EXPECT_TRUE(value->Remove(kBoolIndex)); - EXPECT_EQ((size_t)1, value->GetSize()); - - EXPECT_TRUE(value->Remove(kNullIndex)); - EXPECT_EQ((size_t)0, value->GetSize()); - - // Re-add some values. - EXPECT_EQ(VTYPE_INVALID, value->GetType(0)); - TestListNull(value, 0); - EXPECT_EQ(VTYPE_INVALID, value->GetType(1)); - TestListBool(value, 1); - EXPECT_EQ(VTYPE_INVALID, value->GetType(2)); - TestListList(value, 2, list_value); - - // Test the size. - EXPECT_EQ((size_t)3, value->GetSize()); - - // Clear the values. - EXPECT_TRUE(value->Clear()); - EXPECT_EQ((size_t)0, value->GetSize()); - EXPECT_FALSE(list_value->IsValid()); // Value should be detached - - // Add some values in random order. - EXPECT_EQ(VTYPE_INVALID, value->GetType(2)); - TestListInt(value, 2); - EXPECT_EQ(VTYPE_NULL, value->GetType(0)); - TestListBool(value, 0); - EXPECT_EQ(VTYPE_NULL, value->GetType(1)); - TestListList(value, 1, list_value); - - EXPECT_EQ(VTYPE_BOOL, value->GetType(0)); - EXPECT_EQ(VTYPE_LIST, value->GetType(1)); - EXPECT_EQ(VTYPE_INT, value->GetType(2)); - - // Test the size. - EXPECT_EQ((size_t)3, value->GetSize()); - - // Clear some values. - EXPECT_TRUE(value->SetSize(1)); - EXPECT_EQ((size_t)1, value->GetSize()); - EXPECT_FALSE(list_value->IsValid()); // Value should be detached - - EXPECT_EQ(VTYPE_BOOL, value->GetType(0)); - EXPECT_EQ(VTYPE_INVALID, value->GetType(1)); - EXPECT_EQ(VTYPE_INVALID, value->GetType(2)); - - // Clear all values. - EXPECT_TRUE(value->Clear()); - EXPECT_EQ((size_t)0, value->GetSize()); -} - -// Used to test access of list data on a different thread. -class ListTask : public CefTask { - public: - ListTask(CefRefPtr value, char* binary_data, - size_t binary_data_size) - : value_(value), - binary_data_(binary_data), - binary_data_size_(binary_data_size) {} - - virtual void Execute(CefThreadId threadId) OVERRIDE { - TestList(value_, binary_data_, binary_data_size_); - } - - private: - CefRefPtr value_; - char* binary_data_; - size_t binary_data_size_; - - IMPLEMENT_REFCOUNTING(ListTask); -}; - -} // namespace - - -// Test binary value access. -TEST(ValuesTest, BinaryAccess) { - char data[] = "This is my test data"; - - CefRefPtr value = - CefBinaryValue::Create(data, sizeof(data)-1); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsValid()); - EXPECT_FALSE(value->IsOwned()); - - // Test on this thread. - TestBinary(value, data, sizeof(data)-1); -} - -// Test binary value access on a different thread. -TEST(ValuesTest, BinaryAccessOtherThread) { - char data[] = "This is my test data"; - - CefRefPtr value = - CefBinaryValue::Create(data, sizeof(data)-1); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsValid()); - EXPECT_FALSE(value->IsOwned()); - - // Test on a different thread. - CefPostTask(TID_UI, new BinaryTask(value, data, sizeof(data)-1)); - WaitForUIThread(); -} - -// Test dictionary value access. -TEST(ValuesTest, DictionaryAccess) { - CefRefPtr value = CefDictionaryValue::Create(); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsValid()); - EXPECT_FALSE(value->IsOwned()); - EXPECT_FALSE(value->IsReadOnly()); - - char binary_data[] = "This is my test data"; - - // Test on this thread. - TestDictionary(value, binary_data, sizeof(binary_data)-1); -} - -// Test dictionary value access on a different thread. -TEST(ValuesTest, DictionaryAccessOtherThread) { - CefRefPtr value = CefDictionaryValue::Create(); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsValid()); - EXPECT_FALSE(value->IsOwned()); - EXPECT_FALSE(value->IsReadOnly()); - - char binary_data[] = "This is my test data"; - - // Test on a different thread. - CefPostTask(TID_UI, - new DictionaryTask(value, binary_data, sizeof(binary_data)-1)); - WaitForUIThread(); -} - -// Test dictionary value nested detachment -TEST(ValuesTest, DictionaryDetachment) { - CefRefPtr value = CefDictionaryValue::Create(); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsValid()); - EXPECT_FALSE(value->IsOwned()); - EXPECT_FALSE(value->IsReadOnly()); - - CefRefPtr dictionary_value = CefDictionaryValue::Create(); - CefRefPtr dictionary_value2 = - CefDictionaryValue::Create(); - CefRefPtr dictionary_value3 = - CefDictionaryValue::Create(); - - dictionary_value2->SetDictionary(kDictionaryKey, dictionary_value3); - EXPECT_FALSE(dictionary_value3->IsValid()); - dictionary_value->SetDictionary(kDictionaryKey, dictionary_value2); - EXPECT_FALSE(dictionary_value2->IsValid()); - value->SetDictionary(kDictionaryKey, dictionary_value); - EXPECT_FALSE(dictionary_value->IsValid()); - - dictionary_value = value->GetDictionary(kDictionaryKey); - EXPECT_TRUE(dictionary_value.get()); - EXPECT_TRUE(dictionary_value->IsValid()); - - dictionary_value2 = dictionary_value->GetDictionary(kDictionaryKey); - EXPECT_TRUE(dictionary_value2.get()); - EXPECT_TRUE(dictionary_value2->IsValid()); - - dictionary_value3 = dictionary_value2->GetDictionary(kDictionaryKey); - EXPECT_TRUE(dictionary_value3.get()); - EXPECT_TRUE(dictionary_value3->IsValid()); - - EXPECT_TRUE(value->Remove(kDictionaryKey)); - EXPECT_FALSE(dictionary_value->IsValid()); - EXPECT_FALSE(dictionary_value2->IsValid()); - EXPECT_FALSE(dictionary_value3->IsValid()); -} - -// Test list value access. -TEST(ValuesTest, ListAccess) { - CefRefPtr value = CefListValue::Create(); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsValid()); - EXPECT_FALSE(value->IsOwned()); - EXPECT_FALSE(value->IsReadOnly()); - - char binary_data[] = "This is my test data"; - - // Test on this thread. - TestList(value, binary_data, sizeof(binary_data)-1); -} - -// Test list value access on a different thread. -TEST(ValuesTest, ListAccessOtherThread) { - CefRefPtr value = CefListValue::Create(); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsValid()); - EXPECT_FALSE(value->IsOwned()); - EXPECT_FALSE(value->IsReadOnly()); - - char binary_data[] = "This is my test data"; - - // Test on a different thread. - CefPostTask(TID_UI, new ListTask(value, binary_data, sizeof(binary_data)-1)); - WaitForUIThread(); -} - -// Test list value nested detachment -TEST(ValuesTest, ListDetachment) { - CefRefPtr value = CefListValue::Create(); - EXPECT_TRUE(value.get()); - EXPECT_TRUE(value->IsValid()); - EXPECT_FALSE(value->IsOwned()); - EXPECT_FALSE(value->IsReadOnly()); - - CefRefPtr list_value = CefListValue::Create(); - CefRefPtr list_value2 = CefListValue::Create(); - CefRefPtr list_value3 = CefListValue::Create(); - - list_value2->SetList(0, list_value3); - EXPECT_FALSE(list_value3->IsValid()); - list_value->SetList(0, list_value2); - EXPECT_FALSE(list_value2->IsValid()); - value->SetList(0, list_value); - EXPECT_FALSE(list_value->IsValid()); - - list_value = value->GetList(0); - EXPECT_TRUE(list_value.get()); - EXPECT_TRUE(list_value->IsValid()); - - list_value2 = list_value->GetList(0); - EXPECT_TRUE(list_value2.get()); - EXPECT_TRUE(list_value2->IsValid()); - - list_value3 = list_value2->GetList(0); - EXPECT_TRUE(list_value3.get()); - EXPECT_TRUE(list_value3->IsValid()); - - EXPECT_TRUE(value->Remove(0)); - EXPECT_FALSE(list_value->IsValid()); - EXPECT_FALSE(list_value2->IsValid()); - EXPECT_FALSE(list_value3->IsValid()); -} diff --git a/tests/unittests/xml_reader_unittest.cc b/tests/unittests/xml_reader_unittest.cc deleted file mode 100644 index fcc85600e..000000000 --- a/tests/unittests/xml_reader_unittest.cc +++ /dev/null @@ -1,642 +0,0 @@ -// Copyright (c) 2010 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 "include/cef_stream.h" -#include "include/cef_xml_reader.h" -#include "include/wrapper/cef_xml_object.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -char g_test_xml[] = - "\n" - "\n" - "\n" - " \n" - "]>\n" - "\n" - " value A\n" - " \n" - " \n" - " value B1\n" - " data]]>\n" - " &EB;\n" - " this is mixed content &EA;\n" - " \n" - " " - "\n" - "\n"; - -} // namespace - -// Test XML reading -TEST(XmlReaderTest, Read) { - // Create the stream reader. - CefRefPtr stream( - CefStreamReader::CreateForData(g_test_xml, sizeof(g_test_xml) - 1)); - ASSERT_TRUE(stream.get() != NULL); - - // Create the XML reader. - CefRefPtr reader( - CefXmlReader::Create(stream, XML_ENCODING_NONE, - "http://www.example.org/example.xml")); - ASSERT_TRUE(reader.get() != NULL); - - // Move to the processing instruction node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 0); - ASSERT_EQ(reader->GetType(), XML_NODE_PROCESSING_INSTRUCTION); - ASSERT_EQ(reader->GetLocalName(), "my_instruction"); - ASSERT_EQ(reader->GetQualifiedName(), "my_instruction"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), "my_value"); - - // Move to the DOCTYPE node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 0); - ASSERT_EQ(reader->GetType(), XML_NODE_DOCUMENT_TYPE); - ASSERT_EQ(reader->GetLocalName(), "my_document"); - ASSERT_EQ(reader->GetQualifiedName(), "my_document"); - ASSERT_FALSE(reader->HasValue()); - - // Move to ns:obj element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 0); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "obj"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:obj"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_TRUE(reader->HasAttributes()); - ASSERT_EQ(reader->GetAttributeCount(), (size_t)1); - ASSERT_EQ(reader->GetAttribute(0), "http://www.example.org/ns"); - ASSERT_EQ(reader->GetAttribute("xmlns:ns"), "http://www.example.org/ns"); - ASSERT_EQ(reader->GetAttribute("ns", "http://www.w3.org/2000/xmlns/"), - "http://www.example.org/ns"); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the ns:objA element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "objA"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objA"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the ns:objA value node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_TEXT); - ASSERT_EQ(reader->GetLocalName(), "#text"); - ASSERT_EQ(reader->GetQualifiedName(), "#text"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), "value A"); - - // Move to the ns:objA element ending node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "objA"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objA"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the comment node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_COMMENT); - ASSERT_EQ(reader->GetLocalName(), "#comment"); - ASSERT_EQ(reader->GetQualifiedName(), "#comment"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), " my comment "); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the ns:objB element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "objB"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the ns:objB_1 element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "objB_1"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_1"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the ns:objB_1 value node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 3); - ASSERT_EQ(reader->GetType(), XML_NODE_TEXT); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), "value B1"); - - // Move to the ns:objB_1 element ending node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "objB_1"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_1"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the ns:objB_2 element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "objB_2"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_2"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the ns:objB_2 value node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 3); - ASSERT_EQ(reader->GetType(), XML_NODE_CDATA); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), "some
data"); - - // Move to the ns:objB_2 element ending node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "objB_2"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_2"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the ns:objB_3 element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "objB_3"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_3"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the EB entity reference node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 3); - ASSERT_EQ(reader->GetType(), XML_NODE_ENTITY_REFERENCE); - ASSERT_EQ(reader->GetLocalName(), "EB"); - ASSERT_EQ(reader->GetQualifiedName(), "EB"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), "EB Value"); - - // Move to the ns:objB_3 element ending node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "objB_3"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_3"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the ns:objB_4 element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "objB_4"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_4"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - ASSERT_EQ(reader->GetInnerXml(), "this is mixed content &EA;"); - ASSERT_EQ(reader->GetOuterXml(), - "" - "this is mixed content &EA;"); - - // Move to the element node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 3); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "b"); - ASSERT_EQ(reader->GetQualifiedName(), "b"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the text node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 4); - ASSERT_EQ(reader->GetType(), XML_NODE_TEXT); - ASSERT_EQ(reader->GetLocalName(), "#text"); - ASSERT_EQ(reader->GetQualifiedName(), "#text"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), "this is"); - - // Move to the element node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 3); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "b"); - ASSERT_EQ(reader->GetQualifiedName(), "b"); - - // Move to the text node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 3); - ASSERT_EQ(reader->GetType(), XML_NODE_TEXT); - ASSERT_EQ(reader->GetLocalName(), "#text"); - ASSERT_EQ(reader->GetQualifiedName(), "#text"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), " mixed content "); - - // Move to the EA entity reference node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 3); - ASSERT_EQ(reader->GetType(), XML_NODE_ENTITY_REFERENCE); - ASSERT_EQ(reader->GetLocalName(), "EA"); - ASSERT_EQ(reader->GetQualifiedName(), "EA"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_EQ(reader->GetValue(), "EA Value"); - - // Move to the ns:objB_4 element ending node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "objB_4"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB_4"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the ns:objB element ending node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "objB"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objB"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the whitespace node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to the ns:objC element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "objC"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objC"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_TRUE(reader->IsEmptyElement()); - ASSERT_TRUE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - ASSERT_EQ(reader->GetAttributeCount(), (size_t)2); - ASSERT_EQ(reader->GetAttribute(0), "value C1"); - ASSERT_EQ(reader->GetAttribute("ns:attr1"), "value C1"); - ASSERT_EQ(reader->GetAttribute("attr1", "http://www.example.org/ns"), - "value C1"); - ASSERT_EQ(reader->GetAttribute(1), "value C2"); - ASSERT_EQ(reader->GetAttribute("ns:attr2"), "value C2"); - ASSERT_EQ(reader->GetAttribute("attr2", "http://www.example.org/ns"), - "value C2"); - - // Move to the ns:attr1 attribute. - ASSERT_TRUE(reader->MoveToFirstAttribute()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ATTRIBUTE); - ASSERT_EQ(reader->GetLocalName(), "attr1"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:attr1"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_EQ(reader->GetValue(), "value C1"); - - // Move to the ns:attr2 attribute. - ASSERT_TRUE(reader->MoveToNextAttribute()); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ATTRIBUTE); - ASSERT_EQ(reader->GetLocalName(), "attr2"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:attr2"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_EQ(reader->GetValue(), "value C2"); - - // No more attributes. - ASSERT_FALSE(reader->MoveToNextAttribute()); - - // Return to the ns:objC element start node. - ASSERT_TRUE(reader->MoveToCarryingElement()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objC"); - - // Move to the ns:attr1 attribute. - ASSERT_TRUE(reader->MoveToAttribute(0)); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ATTRIBUTE); - ASSERT_EQ(reader->GetLocalName(), "attr1"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:attr1"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_EQ(reader->GetValue(), "value C1"); - - // Return to the ns:objC element start node. - ASSERT_TRUE(reader->MoveToCarryingElement()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objC"); - - // Move to the ns:attr2 attribute. - ASSERT_TRUE(reader->MoveToAttribute("ns:attr2")); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ATTRIBUTE); - ASSERT_EQ(reader->GetLocalName(), "attr2"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:attr2"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_EQ(reader->GetValue(), "value C2"); - - // Move to the ns:attr1 attribute without returning to the ns:objC element. - ASSERT_TRUE(reader->MoveToAttribute("attr1", "http://www.example.org/ns")); - ASSERT_EQ(reader->GetDepth(), 2); - ASSERT_EQ(reader->GetType(), XML_NODE_ATTRIBUTE); - ASSERT_EQ(reader->GetLocalName(), "attr1"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:attr1"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_TRUE(reader->HasValue()); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_EQ(reader->GetValue(), "value C1"); - - // Move to the ns:objD element start node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_START); - ASSERT_EQ(reader->GetLocalName(), "objD"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objD"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the ns:objD element end node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 1); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "objD"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:objD"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_FALSE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - - // Move to the whitespace node without returning to the ns:objC element. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetType(), XML_NODE_WHITESPACE); - - // Move to ns:obj element ending node. - ASSERT_TRUE(reader->MoveToNextNode()); - ASSERT_EQ(reader->GetDepth(), 0); - ASSERT_EQ(reader->GetType(), XML_NODE_ELEMENT_END); - ASSERT_EQ(reader->GetLocalName(), "obj"); - ASSERT_EQ(reader->GetPrefix(), "ns"); - ASSERT_EQ(reader->GetQualifiedName(), "ns:obj"); - ASSERT_EQ(reader->GetNamespaceURI(), "http://www.example.org/ns"); - ASSERT_FALSE(reader->IsEmptyElement()); - ASSERT_TRUE(reader->HasAttributes()); - ASSERT_FALSE(reader->HasValue()); - // Strangely, the end node will report if the starting node has attributes - // but will not provide access to them. - ASSERT_TRUE(reader->HasAttributes()); - ASSERT_EQ(reader->GetAttributeCount(), (size_t)0); - - // And we're done. - ASSERT_FALSE(reader->MoveToNextNode()); - - ASSERT_TRUE(reader->Close()); -} - -// Test XML read error handling. -TEST(XmlReaderTest, ReadError) { - char test_str[] = - "\n" - "\n"; - - // Create the stream reader. - CefRefPtr stream( - CefStreamReader::CreateForData(test_str, sizeof(test_str) - 1)); - ASSERT_TRUE(stream.get() != NULL); - - // Create the XML reader. - CefRefPtr reader( - CefXmlReader::Create(stream, XML_ENCODING_NONE, - "http://www.example.org/example.xml")); - ASSERT_TRUE(reader.get() != NULL); - - // Move to the processing instruction node and generate parser error. - ASSERT_FALSE(reader->MoveToNextNode()); - ASSERT_TRUE(reader->HasError()); -} - -// Test XmlObject load behavior. -TEST(XmlReaderTest, ObjectLoad) { - // Create the stream reader. - CefRefPtr stream( - CefStreamReader::CreateForData(g_test_xml, sizeof(g_test_xml) - 1)); - ASSERT_TRUE(stream.get() != NULL); - - // Create the XML reader. - CefRefPtr object(new CefXmlObject("object")); - ASSERT_TRUE(object->Load(stream, XML_ENCODING_NONE, - "http://www.example.org/example.xml", NULL)); - - ASSERT_FALSE(object->HasAttributes()); - ASSERT_TRUE(object->HasChildren()); - ASSERT_EQ(object->GetChildCount(), (size_t)1); - - CefRefPtr obj(object->FindChild("ns:obj")); - ASSERT_TRUE(obj.get()); - ASSERT_TRUE(obj->HasChildren()); - ASSERT_EQ(obj->GetChildCount(), (size_t)4); - - CefRefPtr obj_child(obj->FindChild("ns:objC")); - ASSERT_TRUE(obj_child.get()); - ASSERT_EQ(obj_child->GetName(), "ns:objC"); - ASSERT_FALSE(obj_child->HasChildren()); - ASSERT_FALSE(obj_child->HasValue()); - ASSERT_TRUE(obj_child->HasAttributes()); - - CefXmlObject::ObjectVector obj_children; - ASSERT_EQ(obj->GetChildren(obj_children), (size_t)4); - ASSERT_EQ(obj_children.size(), (size_t)4); - - CefXmlObject::ObjectVector::const_iterator it = obj_children.begin(); - for (int ct = 0; it != obj_children.end(); ++it, ++ct) { - obj_child = *it; - ASSERT_TRUE(obj_child.get()); - if (ct == 0) { - // ns:objA - ASSERT_EQ(obj_child->GetName(), "ns:objA"); - ASSERT_FALSE(obj_child->HasChildren()); - ASSERT_TRUE(obj_child->HasValue()); - ASSERT_FALSE(obj_child->HasAttributes()); - ASSERT_EQ(obj_child->GetValue(), "value A"); - } else if (ct == 1) { - // ns:objB - ASSERT_EQ(obj_child->GetName(), "ns:objB"); - ASSERT_TRUE(obj_child->HasChildren()); - ASSERT_FALSE(obj_child->HasValue()); - ASSERT_FALSE(obj_child->HasAttributes()); - ASSERT_EQ(obj_child->GetChildCount(), (size_t)4); - obj_child = obj_child->FindChild("ns:objB_4"); - ASSERT_TRUE(obj_child.get()); - ASSERT_TRUE(obj_child->HasValue()); - ASSERT_EQ(obj_child->GetValue(), - "this is mixed content EA Value"); - } else if (ct == 2) { - // ns:objC - ASSERT_EQ(obj_child->GetName(), "ns:objC"); - ASSERT_FALSE(obj_child->HasChildren()); - ASSERT_FALSE(obj_child->HasValue()); - ASSERT_TRUE(obj_child->HasAttributes()); - - CefXmlObject::AttributeMap attribs; - ASSERT_EQ(obj_child->GetAttributes(attribs), (size_t)2); - ASSERT_EQ(attribs.size(), (size_t)2); - ASSERT_EQ(attribs["ns:attr1"], "value C1"); - ASSERT_EQ(attribs["ns:attr2"], "value C2"); - - ASSERT_EQ(obj_child->GetAttributeCount(), (size_t)2); - ASSERT_TRUE(obj_child->HasAttribute("ns:attr1")); - ASSERT_EQ(obj_child->GetAttributeValue("ns:attr1"), "value C1"); - ASSERT_TRUE(obj_child->HasAttribute("ns:attr2")); - ASSERT_EQ(obj_child->GetAttributeValue("ns:attr2"), "value C2"); - } else if (ct == 3) { - // ns:objD - ASSERT_EQ(obj_child->GetName(), "ns:objD"); - ASSERT_FALSE(obj_child->HasChildren()); - ASSERT_FALSE(obj_child->HasValue()); - ASSERT_FALSE(obj_child->HasAttributes()); - } - } -} - -// Test XmlObject load error handling behavior. -TEST(XmlReaderTest, ObjectLoadError) { - // Test start/end tag mismatch error. - { - char error_xml[] = "\n\n\n"; - - // Create the stream reader. - CefRefPtr stream( - CefStreamReader::CreateForData(error_xml, sizeof(error_xml) - 1)); - ASSERT_TRUE(stream.get() != NULL); - - CefString error_str; - - // Create the XML reader. - CefRefPtr object(new CefXmlObject("object")); - ASSERT_FALSE(object->Load(stream, XML_ENCODING_NONE, - "http://www.example.org/example.xml", &error_str)); - ASSERT_EQ(error_str, - "Opening and ending tag mismatch: foo line 2 and obj, line 3"); - } - - // Test value following child error. - { - char error_xml[] = "\n\ndisallowed value\n"; - - // Create the stream reader. - CefRefPtr stream( - CefStreamReader::CreateForData(error_xml, sizeof(error_xml) - 1)); - ASSERT_TRUE(stream.get() != NULL); - - CefString error_str; - - // Create the XML reader. - CefRefPtr object(new CefXmlObject("object")); - ASSERT_FALSE(object->Load(stream, XML_ENCODING_NONE, - "http://www.example.org/example.xml", &error_str)); - ASSERT_EQ(error_str, - "Value following child element, line 4"); - } -} diff --git a/tests/unittests/zip_reader_unittest.cc b/tests/unittests/zip_reader_unittest.cc deleted file mode 100644 index 41f83fdde..000000000 --- a/tests/unittests/zip_reader_unittest.cc +++ /dev/null @@ -1,253 +0,0 @@ -// Copyright (c) 2010 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 "include/cef_stream.h" -#include "include/cef_zip_reader.h" -#include "include/wrapper/cef_zip_archive.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - - unsigned char g_test_zip[] = { - 0x50, 0x4b, 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x7f, - 0x57, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, - 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x7f, 0x57, 0x3d, 0xf8, 0x47, 0x0c, - 0xc6, 0x13, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, - 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, - 0x65, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x2e, 0x74, 0x78, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, - 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x2e, 0x50, 0x4b, 0x03, 0x04, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x7f, 0x57, 0x3d, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, - 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, - 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x31, 0x2f, 0x50, - 0x4b, 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x7f, 0x57, - 0x3d, 0x43, 0xe3, 0x11, 0x5f, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x21, 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, - 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, - 0x20, 0x31, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x61, 0x2e, 0x74, - 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, - 0x66, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x41, 0x2e, 0x50, 0x4b, - 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x7f, 0x57, 0x3d, - 0x80, 0xb0, 0x3c, 0x74, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, - 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, - 0x31, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x62, 0x2e, 0x74, 0x78, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x42, 0x2e, 0x50, 0x4b, 0x03, - 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x7f, 0x57, 0x3d, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, - 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x31, - 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x31, 0x61, 0x2f, 0x50, - 0x4b, 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x7f, 0x57, - 0x3d, 0x15, 0xed, 0x04, 0x2c, 0x15, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, - 0x00, 0x2c, 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, - 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, - 0x20, 0x31, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x31, 0x61, - 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x61, 0x31, 0x2e, 0x74, 0x78, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x41, 0x31, 0x2e, 0x50, 0x4b, - 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x7f, 0x57, 0x3d, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, - 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, - 0x32, 0x2f, 0x50, 0x4b, 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x80, 0x57, 0x3d, 0x1a, 0x5d, 0x57, 0x5d, 0x14, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, - 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, - 0x64, 0x65, 0x72, 0x20, 0x32, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x32, - 0x61, 0x2e, 0x74, 0x78, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x73, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x32, 0x41, - 0x2e, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x67, 0x7f, 0x57, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, - 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, - 0x50, 0x4b, 0x01, 0x02, 0x14, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0x7f, 0x57, 0x3d, 0xf8, 0x47, 0x0c, 0xc6, 0x13, 0x00, 0x00, 0x00, - 0x13, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x74, 0x65, - 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, - 0x69, 0x6c, 0x65, 0x20, 0x31, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x01, - 0x02, 0x14, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x7f, 0x57, - 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, - 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, - 0x65, 0x72, 0x20, 0x31, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x00, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x7f, 0x57, 0x3d, 0x43, 0xe3, 0x11, - 0x5f, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xa7, - 0x00, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, - 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x31, - 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x31, 0x61, 0x2e, 0x74, 0x78, 0x74, - 0x50, 0x4b, 0x01, 0x02, 0x14, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x78, 0x7f, 0x57, 0x3d, 0x80, 0xb0, 0x3c, 0x74, 0x14, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x74, 0x65, - 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, - 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x31, 0x2f, 0x66, 0x69, 0x6c, 0x65, - 0x20, 0x31, 0x62, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x01, 0x02, 0x14, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x7f, 0x57, 0x3d, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x4d, 0x01, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, - 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, - 0x20, 0x31, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x31, 0x61, - 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7c, 0x7f, 0x57, 0x3d, 0x15, 0xed, 0x04, 0x2c, 0x15, 0x00, 0x00, - 0x00, 0x15, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, 0x74, - 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, - 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x31, 0x2f, 0x66, 0x6f, 0x6c, - 0x64, 0x65, 0x72, 0x20, 0x31, 0x61, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x20, - 0x31, 0x61, 0x31, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x01, 0x02, 0x14, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x7f, 0x57, 0x3d, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0xea, 0x01, 0x00, 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, - 0x63, 0x68, 0x69, 0x76, 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, - 0x20, 0x32, 0x2f, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x80, 0x57, 0x3d, 0x1a, 0x5d, 0x57, 0x5d, 0x14, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1e, 0x02, 0x00, - 0x00, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, - 0x65, 0x2f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x32, 0x2f, 0x66, - 0x69, 0x6c, 0x65, 0x20, 0x32, 0x61, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, - 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00, 0x9d, 0x02, - 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - -} // namespace - -// Test Zip reading. -TEST(ZipReaderTest, Read) { - // Create the stream reader. - CefRefPtr stream( - CefStreamReader::CreateForData(g_test_zip, sizeof(g_test_zip) - 1)); - ASSERT_TRUE(stream.get() != NULL); - - // Create the Zip reader. - CefRefPtr reader(CefZipReader::Create(stream)); - ASSERT_TRUE(reader.get() != NULL); - - char buff[25]; - - // Walk through the archive contents. - ASSERT_TRUE(reader->MoveToFirstFile()); - ASSERT_EQ(reader->GetFileName(), "test_archive/"); - ASSERT_EQ(reader->GetFileSize(), 0); - - ASSERT_TRUE(reader->MoveToNextFile()); - ASSERT_EQ(reader->GetFileName(), "test_archive/file 1.txt"); - ASSERT_EQ(reader->GetFileSize(), 19); - ASSERT_TRUE(reader->OpenFile("")); - ASSERT_EQ(reader->ReadFile(buff, sizeof(buff)), 19); - ASSERT_TRUE(!strncmp(buff, "Contents of file 1.", 19)); - - ASSERT_TRUE(reader->MoveToNextFile()); - ASSERT_EQ(reader->GetFileName(), "test_archive/folder 1/"); - ASSERT_EQ(reader->GetFileSize(), 0); - - ASSERT_TRUE(reader->MoveToNextFile()); - ASSERT_EQ(reader->GetFileName(), "test_archive/folder 1/file 1a.txt"); - ASSERT_EQ(reader->GetFileSize(), 20); - ASSERT_TRUE(reader->OpenFile("")); - ASSERT_EQ(reader->ReadFile(buff, sizeof(buff)), 20); - ASSERT_TRUE(reader->CloseFile()); - ASSERT_TRUE(!strncmp(buff, "Contents of file 1A.", 20)); - - ASSERT_TRUE(reader->MoveToNextFile()); - ASSERT_EQ(reader->GetFileName(), "test_archive/folder 1/file 1b.txt"); - ASSERT_EQ(reader->GetFileSize(), 20); - ASSERT_TRUE(reader->OpenFile("")); - ASSERT_EQ(reader->ReadFile(buff, sizeof(buff)), 20); - ASSERT_TRUE(reader->CloseFile()); - ASSERT_TRUE(!strncmp(buff, "Contents of file 1B.", 20)); - - ASSERT_TRUE(reader->MoveToNextFile()); - ASSERT_EQ(reader->GetFileName(), "test_archive/folder 1/folder 1a/"); - ASSERT_EQ(reader->GetFileSize(), 0); - - ASSERT_TRUE(reader->MoveToNextFile()); - ASSERT_EQ(reader->GetFileName(), - "test_archive/folder 1/folder 1a/file 1a1.txt"); - ASSERT_EQ(reader->GetFileSize(), 21); - ASSERT_TRUE(reader->OpenFile("")); - ASSERT_EQ(reader->ReadFile(buff, sizeof(buff)), 21); - ASSERT_TRUE(reader->CloseFile()); - ASSERT_TRUE(!strncmp(buff, "Contents of file 1A1.", 21)); - - ASSERT_TRUE(reader->MoveToNextFile()); - ASSERT_EQ(reader->GetFileName(), "test_archive/folder 2/"); - ASSERT_EQ(reader->GetFileSize(), 0); - - ASSERT_TRUE(reader->MoveToNextFile()); - ASSERT_EQ(reader->GetFileName(), "test_archive/folder 2/file 2a.txt"); - ASSERT_EQ(reader->GetFileSize(), 20); - ASSERT_TRUE(reader->OpenFile("")); - ASSERT_EQ(reader->ReadFile(buff, sizeof(buff)), 20); - ASSERT_TRUE(reader->CloseFile()); - ASSERT_TRUE(!strncmp(buff, "Contents of file 2A.", 20)); - - ASSERT_FALSE(reader->MoveToNextFile()); - - // Try seeking a particular file - ASSERT_TRUE(reader->MoveToFile("TEST_ARCHIVE/FOLDER 1/FILE 1B.TXT", false)); - ASSERT_EQ(reader->GetFileName(), "test_archive/folder 1/file 1b.txt"); - ASSERT_EQ(reader->GetFileSize(), 20); - ASSERT_TRUE(reader->OpenFile("")); - ASSERT_EQ(reader->ReadFile(buff, sizeof(buff)), 20); - ASSERT_TRUE(reader->CloseFile()); - ASSERT_TRUE(!strncmp(buff, "Contents of file 1B.", 20)); - - ASSERT_TRUE(reader->MoveToFile("test_archive/folder 1/file 1b.txt", true)); - ASSERT_FALSE(reader->MoveToFile("test_archive/folder 1/FILE 1B.txt", true)); - - ASSERT_TRUE(reader->Close()); -} - -// Test CefZipArchive object. -TEST(ZipReaderTest, ReadArchive) { - // Create the stream reader. - CefRefPtr stream( - CefStreamReader::CreateForData(g_test_zip, sizeof(g_test_zip) - 1)); - ASSERT_TRUE(stream.get() != NULL); - - // Create the Zip archive object. - CefRefPtr archive(new CefZipArchive()); - - ASSERT_EQ(archive->Load(stream, false), (size_t)5); - - ASSERT_TRUE(archive->HasFile("test_archive/file 1.txt")); - ASSERT_TRUE(archive->HasFile("test_archive/folder 1/file 1a.txt")); - ASSERT_TRUE(archive->HasFile("test_archive/FOLDER 1/file 1b.txt")); - ASSERT_TRUE(archive->HasFile("test_archive/folder 1/folder 1a/file 1a1.txt")); - ASSERT_TRUE(archive->HasFile("test_archive/folder 2/file 2a.txt")); - - // Test content retrieval. - CefRefPtr file; - file = archive->GetFile("test_archive/folder 2/file 2a.txt"); - ASSERT_TRUE(file.get()); - - ASSERT_EQ(file->GetDataSize(), (size_t)20); - ASSERT_TRUE(!strncmp(reinterpret_cast(file->GetData()), - "Contents of file 2A.", 20)); - - // Test stream reading. - CefRefPtr reader(file->GetStreamReader()); - ASSERT_TRUE(reader.get()); - - char buff[8]; - ASSERT_EQ(reader->Read(buff, 1, 8), (size_t)8); - ASSERT_TRUE(!strncmp(buff, "Contents", 8)); - ASSERT_EQ(reader->Read(buff, 1, 8), (size_t)8); - ASSERT_TRUE(!strncmp(buff, " of file", 8)); - ASSERT_EQ(reader->Read(buff, 1, 8), (size_t)4); - ASSERT_TRUE(!strncmp(buff, " 2A.", 4)); - ASSERT_TRUE(reader->Eof()); -}