- cefclient: Add test_runner as the single entry point for running test-related code and move test implementations to the client namespace (issue #1500).

git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@1983 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
Marshall Greenblatt 2015-01-22 20:21:21 +00:00
parent 249ad7f6e4
commit 1428f022af
33 changed files with 697 additions and 797 deletions

View File

@ -178,8 +178,8 @@
'tests/cefclient/resource_util.h',
'tests/cefclient/scheme_test.cc',
'tests/cefclient/scheme_test.h',
'tests/cefclient/string_util.cc',
'tests/cefclient/string_util.h',
'tests/cefclient/test_runner.cc',
'tests/cefclient/test_runner.h',
'tests/cefclient/window_test.cc',
'tests/cefclient/window_test.h',
'<@(cefclient_bundle_resources_common)',
@ -227,6 +227,8 @@
'tests/cefclient/client_switches.h',
'tests/cefclient/dialog_test.cc',
'tests/cefclient/dialog_test.h',
'tests/cefclient/main_message_loop.cc',
'tests/cefclient/main_message_loop.h',
'tests/cefclient/performance_test.cc',
'tests/cefclient/performance_test.h',
'tests/cefclient/performance_test_setup.h',
@ -237,8 +239,8 @@
'tests/cefclient/resource_util_posix.cc',
'tests/cefclient/scheme_test.cc',
'tests/cefclient/scheme_test.h',
'tests/cefclient/string_util.cc',
'tests/cefclient/string_util.h',
'tests/cefclient/test_runner.cc',
'tests/cefclient/test_runner.h',
'tests/cefclient/window_test.cc',
'tests/cefclient/window_test.h',
'tests/cefclient/window_test_mac.mm',

View File

@ -9,6 +9,7 @@
#include "include/wrapper/cef_stream_resource_handler.h"
namespace client {
namespace binding_test {
namespace {
@ -48,8 +49,9 @@ class Handler : public CefMessageRouterBrowserSide::Handler {
} // namespace
void CreateMessageHandlers(ClientHandler::MessageHandlerSet& handlers) {
void CreateMessageHandlers(test_runner::MessageHandlerSet& handlers) {
handlers.insert(new Handler());
}
} // namespace binding_test
} // namespace client

View File

@ -6,13 +6,15 @@
#define CEF_TESTS_CEFCLIENT_BINDING_TEST_H_
#pragma once
#include "cefclient/client_handler.h"
#include "cefclient/test_runner.h"
namespace client {
namespace binding_test {
// Handler creation. Called from ClientHandler.
void CreateMessageHandlers(ClientHandler::MessageHandlerSet& handlers);
// Handler creation.
void CreateMessageHandlers(test_runner::MessageHandlerSet& handlers);
} // namespace binding_test
} // namespace client
#endif // CEF_TESTS_CEFCLIENT_BINDING_TEST_H_

View File

@ -15,7 +15,6 @@
#include "include/wrapper/cef_helpers.h"
#include "cefclient/client_handler.h"
#include "cefclient/client_switches.h"
#include "cefclient/string_util.h"
CefRefPtr<ClientHandler> g_handler;
@ -94,112 +93,3 @@ bool AppIsOffScreenRenderingEnabled() {
return (g_offscreen_state == 1);
}
void RunGetSourceTest(CefRefPtr<CefBrowser> browser) {
class Visitor : public CefStringVisitor {
public:
explicit Visitor(CefRefPtr<CefBrowser> browser) : browser_(browser) {}
virtual void Visit(const CefString& string) OVERRIDE {
std::string source = StringReplace(string, "<", "&lt;");
source = StringReplace(source, ">", "&gt;");
std::stringstream ss;
ss << "<html><body bgcolor=\"white\">Source:<pre>" << source <<
"</pre></body></html>";
browser_->GetMainFrame()->LoadString(ss.str(), "http://tests/getsource");
}
private:
CefRefPtr<CefBrowser> browser_;
IMPLEMENT_REFCOUNTING(Visitor);
};
browser->GetMainFrame()->GetSource(new Visitor(browser));
}
void RunGetTextTest(CefRefPtr<CefBrowser> browser) {
class Visitor : public CefStringVisitor {
public:
explicit Visitor(CefRefPtr<CefBrowser> browser) : browser_(browser) {}
virtual void Visit(const CefString& string) OVERRIDE {
std::string text = StringReplace(string, "<", "&lt;");
text = StringReplace(text, ">", "&gt;");
std::stringstream ss;
ss << "<html><body bgcolor=\"white\">Text:<pre>" << text <<
"</pre></body></html>";
browser_->GetMainFrame()->LoadString(ss.str(), "http://tests/gettext");
}
private:
CefRefPtr<CefBrowser> browser_;
IMPLEMENT_REFCOUNTING(Visitor);
};
browser->GetMainFrame()->GetText(new Visitor(browser));
}
void RunRequestTest(CefRefPtr<CefBrowser> browser) {
// Create a new request
CefRefPtr<CefRequest> request(CefRequest::Create());
// Set the request URL
request->SetURL("http://tests/request");
// Add post data to the request. The correct method and content-
// type headers will be set by CEF.
CefRefPtr<CefPostDataElement> postDataElement(CefPostDataElement::Create());
std::string data = "arg1=val1&arg2=val2";
postDataElement->SetToBytes(data.length(), data.c_str());
CefRefPtr<CefPostData> postData(CefPostData::Create());
postData->AddElement(postDataElement);
request->SetPostData(postData);
// Add a custom header
CefRequest::HeaderMap headerMap;
headerMap.insert(
std::make_pair("X-My-Header", "My Header Value"));
request->SetHeaderMap(headerMap);
// Load the request
browser->GetMainFrame()->LoadRequest(request);
}
void RunPopupTest(CefRefPtr<CefBrowser> browser) {
browser->GetMainFrame()->ExecuteJavaScript(
"window.open('http://www.google.com');", "about:blank", 0);
}
void RunPluginInfoTest(CefRefPtr<CefBrowser> browser) {
class Visitor : public CefWebPluginInfoVisitor {
public:
explicit Visitor(CefRefPtr<CefBrowser> browser)
: browser_(browser) {
html_ = "<html><head><title>Plugin Info Test</title></head>"
"<body bgcolor=\"white\">"
"\n<b>Installed plugins:</b>";
}
~Visitor() {
html_ += "\n</body></html>";
// Load the html in the browser.
browser_->GetMainFrame()->LoadString(html_, "http://tests/plugin_info");
}
virtual bool Visit(CefRefPtr<CefWebPluginInfo> info, int count, int total)
OVERRIDE {
html_ += "\n<br/><br/>Name: " + info->GetName().ToString() +
"\n<br/>Description: " + info->GetDescription().ToString() +
"\n<br/>Version: " + info->GetVersion().ToString() +
"\n<br/>Path: " + info->GetPath().ToString();
return true;
}
private:
std::string html_;
CefRefPtr<CefBrowser> browser_;
IMPLEMENT_REFCOUNTING(Visitor);
};
CefVisitWebPluginInfo(new Visitor(browser));
}
void RunOtherTests(CefRefPtr<CefBrowser> browser) {
browser->GetMainFrame()->LoadURL("http://tests/other_tests");
}

View File

@ -38,19 +38,11 @@ void AppGetBrowserSettings(CefBrowserSettings& settings);
// argument.
bool AppIsOffScreenRenderingEnabled();
// Returns the full download path for the specified file, or an empty path to
// use the default temp directory.
std::string AppGetDownloadPath(const std::string& file_name);
// Quit the application message loop.
void AppQuitMessageLoop();
// Implementations for various tests.
void RunGetSourceTest(CefRefPtr<CefBrowser> browser);
void RunGetTextTest(CefRefPtr<CefBrowser> browser);
void RunRequestTest(CefRefPtr<CefBrowser> browser);
void RunPopupTest(CefRefPtr<CefBrowser> browser);
void RunPluginInfoTest(CefRefPtr<CefBrowser> browser);
void RunOtherTests(CefRefPtr<CefBrowser> browser);
#if defined(OS_WIN)
void RunTransparentPopupTest(CefRefPtr<CefBrowser> browser);
#endif
#endif // CEF_TESTS_CEFCLIENT_CEFCLIENT_H_

View File

@ -26,8 +26,8 @@
#include "cefclient/client_handler.h"
#include "cefclient/client_switches.h"
#include "cefclient/main_message_loop_std.h"
#include "cefclient/scheme_test.h"
#include "cefclient/string_util.h"
#include "cefclient/resource.h"
#include "cefclient/test_runner.h"
// The global ClientHandler reference.
extern CefRefPtr<ClientHandler> g_handler;
@ -224,108 +224,16 @@ gboolean WindowConfigure(GtkWindow* window,
return FALSE; // Don't stop this message.
}
// Callback for Tests > Get Source... menu item.
gboolean GetSourceActivated(GtkWidget* widget) {
if (g_handler.get() && g_handler->GetBrowserId())
RunGetSourceTest(g_handler->GetBrowser());
return FALSE; // Don't stop this message.
}
// Callback for Tests > Get Text... menu item.
gboolean GetTextActivated(GtkWidget* widget) {
if (g_handler.get() && g_handler->GetBrowserId())
RunGetTextTest(g_handler->GetBrowser());
return FALSE; // Don't stop this message.
}
// Callback for Tests > Popup Window... menu item.
gboolean PopupWindowActivated(GtkWidget* widget) {
if (g_handler.get() && g_handler->GetBrowserId())
RunPopupTest(g_handler->GetBrowser());
return FALSE; // Don't stop this message.
}
// Callback for Tests > Request... menu item.
gboolean RequestActivated(GtkWidget* widget) {
if (g_handler.get() && g_handler->GetBrowserId())
RunRequestTest(g_handler->GetBrowser());
return FALSE; // Don't stop this message.
}
// Callback for Tests > Plugin Info... menu item.
gboolean PluginInfoActivated(GtkWidget* widget) {
if (g_handler.get() && g_handler->GetBrowserId())
RunPluginInfoTest(g_handler->GetBrowser());
return FALSE; // Don't stop this message.
}
// Callback for Tests > Zoom In... menu item.
gboolean ZoomInActivated(GtkWidget* widget) {
// Callback for Tests menu items.
gboolean MenuItemActivated(GtkWidget* widget, gpointer data) {
if (g_handler.get() && g_handler->GetBrowserId()) {
CefRefPtr<CefBrowser> browser = g_handler->GetBrowser();
browser->GetHost()->SetZoomLevel(browser->GetHost()->GetZoomLevel() + 0.5);
client::test_runner::RunTest(g_handler->GetBrowser(),
GPOINTER_TO_INT(data));
}
return FALSE; // Don't stop this message.
}
// Callback for Tests > Zoom Out... menu item.
gboolean ZoomOutActivated(GtkWidget* widget) {
if (g_handler.get() && g_handler->GetBrowserId()) {
CefRefPtr<CefBrowser> browser = g_handler->GetBrowser();
browser->GetHost()->SetZoomLevel(browser->GetHost()->GetZoomLevel() - 0.5);
}
return FALSE; // Don't stop this message.
}
// Callback for Tests > Zoom Reset... menu item.
gboolean ZoomResetActivated(GtkWidget* widget) {
if (g_handler.get() && g_handler->GetBrowserId()) {
CefRefPtr<CefBrowser> browser = g_handler->GetBrowser();
browser->GetHost()->SetZoomLevel(0.0);
}
return FALSE; // Don't stop this message.
}
// Callback for Tests > Begin Tracing menu item.
gboolean BeginTracingActivated(GtkWidget* widget) {
if (g_handler.get())
g_handler->BeginTracing();
return FALSE; // Don't stop this message.
}
// Callback for Tests > End Tracing menu item.
gboolean EndTracingActivated(GtkWidget* widget) {
if (g_handler.get())
g_handler->EndTracing();
return FALSE; // Don't stop this message.
}
// Callback for Tests > Print menu item.
gboolean PrintActivated(GtkWidget* widget) {
if (g_handler.get())
g_handler->GetBrowser()->GetHost()->Print();
return FALSE; // Don't stop this message.
}
// Callback for Tests > Other Tests... menu item.
gboolean OtherTestsActivated(GtkWidget* widget) {
if (g_handler.get() && g_handler->GetBrowserId())
RunOtherTests(g_handler->GetBrowser());
return FALSE; // Don't stop this message.
}
// Callback for when you click the back button.
void BackButtonClicked(GtkButton* button) {
if (g_handler.get() && g_handler->GetBrowserId())
@ -375,10 +283,10 @@ gboolean URLEntryButtonPress(GtkWidget* widget,
// GTK utility functions ----------------------------------------------
GtkWidget* AddMenuEntry(GtkWidget* menu_widget, const char* text,
GCallback callback) {
GtkWidget* AddMenuEntry(GtkWidget* menu_widget, const char* text, int id) {
GtkWidget* entry = gtk_menu_item_new_with_label(text);
g_signal_connect(entry, "activate", callback, NULL);
g_signal_connect(entry, "activate", G_CALLBACK(MenuItemActivated),
GINT_TO_POINTER(id));
gtk_menu_shell_append(GTK_MENU_SHELL(menu_widget), entry);
return entry;
}
@ -395,30 +303,18 @@ GtkWidget* CreateMenuBar() {
GtkWidget* menu_bar = gtk_menu_bar_new();
GtkWidget* debug_menu = CreateMenu(menu_bar, "Tests");
AddMenuEntry(debug_menu, "Get Source",
G_CALLBACK(GetSourceActivated));
AddMenuEntry(debug_menu, "Get Text",
G_CALLBACK(GetTextActivated));
AddMenuEntry(debug_menu, "Popup Window",
G_CALLBACK(PopupWindowActivated));
AddMenuEntry(debug_menu, "Request",
G_CALLBACK(RequestActivated));
AddMenuEntry(debug_menu, "Plugin Info",
G_CALLBACK(PluginInfoActivated));
AddMenuEntry(debug_menu, "Zoom In",
G_CALLBACK(ZoomInActivated));
AddMenuEntry(debug_menu, "Zoom Out",
G_CALLBACK(ZoomOutActivated));
AddMenuEntry(debug_menu, "Zoom Reset",
G_CALLBACK(ZoomResetActivated));
AddMenuEntry(debug_menu, "Begin Tracing",
G_CALLBACK(BeginTracingActivated));
AddMenuEntry(debug_menu, "End Tracing",
G_CALLBACK(EndTracingActivated));
AddMenuEntry(debug_menu, "Print",
G_CALLBACK(PrintActivated));
AddMenuEntry(debug_menu, "Other Tests",
G_CALLBACK(OtherTestsActivated));
AddMenuEntry(debug_menu, "Get Source", ID_TESTS_GETSOURCE);
AddMenuEntry(debug_menu, "Get Text", ID_TESTS_GETTEXT);
AddMenuEntry(debug_menu, "Popup Window", ID_TESTS_POPUP);
AddMenuEntry(debug_menu, "Request", ID_TESTS_REQUEST);
AddMenuEntry(debug_menu, "Plugin Info", ID_TESTS_PLUGIN_INFO);
AddMenuEntry(debug_menu, "Zoom In", ID_TESTS_ZOOM_IN);
AddMenuEntry(debug_menu, "Zoom Out", ID_TESTS_ZOOM_OUT);
AddMenuEntry(debug_menu, "Zoom Reset", ID_TESTS_ZOOM_RESET);
AddMenuEntry(debug_menu, "Begin Tracing", ID_TESTS_TRACING_BEGIN);
AddMenuEntry(debug_menu, "End Tracing", ID_TESTS_TRACING_END);
AddMenuEntry(debug_menu, "Print", ID_TESTS_PRINT);
AddMenuEntry(debug_menu, "Other Tests", ID_TESTS_OTHER_TESTS);
return menu_bar;
}
@ -468,8 +364,8 @@ int main(int argc, char* argv[]) {
// Perform gtkglext initialization required by the OSR example.
gtk_gl_init(&argc, &argv_copy);
// Register the scheme handler.
scheme_test::InitTest();
// Register scheme handlers.
client::test_runner::RegisterSchemeHandlers();
GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
@ -605,6 +501,10 @@ std::string AppGetWorkingDirectory() {
return szWorkingDir;
}
std::string AppGetDownloadPath(const std::string& file_name) {
return std::string();
}
void AppQuitMessageLoop() {
client::MainMessageLoop::Get()->Quit();
}

View File

@ -14,9 +14,9 @@
#include "cefclient/client_handler.h"
#include "cefclient/client_switches.h"
#include "cefclient/main_message_loop_std.h"
#include "cefclient/resource.h"
#include "cefclient/resource_util.h"
#include "cefclient/scheme_test.h"
#include "cefclient/string_util.h"
#include "cefclient/test_runner.h"
// The global ClientHandler reference.
extern CefRefPtr<ClientHandler> g_handler;
@ -46,19 +46,7 @@ const int kWindowHeight = 600;
@interface ClientAppDelegate : NSObject
- (void)createApplication:(id)object;
- (void)tryToTerminateApplication:(NSApplication*)app;
- (IBAction)testGetSource:(id)sender;
- (IBAction)testGetText:(id)sender;
- (IBAction)testPopupWindow:(id)sender;
- (IBAction)testRequest:(id)sender;
- (IBAction)testPluginInfo:(id)sender;
- (IBAction)testZoomIn:(id)sender;
- (IBAction)testZoomOut:(id)sender;
- (IBAction)testZoomReset:(id)sender;
- (IBAction)testBeginTracing:(id)sender;
- (IBAction)testEndTracing:(id)sender;
- (IBAction)testPrint:(id)sender;
- (IBAction)testOtherTests:(id)sender;
- (IBAction)menuItemSelected:(id)sender;
@end
// Provide the CefAppProtocol implementation required by CEF.
@ -358,6 +346,13 @@ NSButton* MakeButton(NSRect* rect, NSString* title, NSView* parent) {
return button;
}
void AddMenuItem(NSMenu *menu, NSString* label, int idval) {
NSMenuItem* item = [menu addItemWithTitle:label
action:@selector(menuItemSelected:)
keyEquivalent:@""];
[item setTag:idval];
}
@implementation ClientAppDelegate
// Create the application on the UI thread.
@ -374,42 +369,18 @@ NSButton* MakeButton(NSRect* rect, NSString* title, NSView* parent) {
action:nil
keyEquivalent:@""] autorelease];
NSMenu *testMenu = [[[NSMenu alloc] initWithTitle:@"Tests"] autorelease];
[testMenu addItemWithTitle:@"Get Source"
action:@selector(testGetSource:)
keyEquivalent:@""];
[testMenu addItemWithTitle:@"Get Text"
action:@selector(testGetText:)
keyEquivalent:@""];
[testMenu addItemWithTitle:@"Popup Window"
action:@selector(testPopupWindow:)
keyEquivalent:@""];
[testMenu addItemWithTitle:@"Request"
action:@selector(testRequest:)
keyEquivalent:@""];
[testMenu addItemWithTitle:@"Plugin Info"
action:@selector(testPluginInfo:)
keyEquivalent:@""];
[testMenu addItemWithTitle:@"Zoom In"
action:@selector(testZoomIn:)
keyEquivalent:@""];
[testMenu addItemWithTitle:@"Zoom Out"
action:@selector(testZoomOut:)
keyEquivalent:@""];
[testMenu addItemWithTitle:@"Zoom Reset"
action:@selector(testZoomReset:)
keyEquivalent:@""];
[testMenu addItemWithTitle:@"Begin Tracing"
action:@selector(testBeginTracing:)
keyEquivalent:@""];
[testMenu addItemWithTitle:@"End Tracing"
action:@selector(testEndTracing:)
keyEquivalent:@""];
[testMenu addItemWithTitle:@"Print"
action:@selector(testPrint:)
keyEquivalent:@""];
[testMenu addItemWithTitle:@"Other Tests"
action:@selector(testOtherTests:)
keyEquivalent:@""];
AddMenuItem(testMenu, @"Get Text", ID_TESTS_GETSOURCE);
AddMenuItem(testMenu, @"Get Source", ID_TESTS_GETTEXT);
AddMenuItem(testMenu, @"Popup Window", ID_TESTS_POPUP);
AddMenuItem(testMenu, @"Request", ID_TESTS_REQUEST);
AddMenuItem(testMenu, @"Plugin Info", ID_TESTS_PLUGIN_INFO);
AddMenuItem(testMenu, @"Zoom In", ID_TESTS_ZOOM_IN);
AddMenuItem(testMenu, @"Zoom Out", ID_TESTS_ZOOM_OUT);
AddMenuItem(testMenu, @"Zoom Reset", ID_TESTS_ZOOM_RESET);
AddMenuItem(testMenu, @"Begin Tracing", ID_TESTS_TRACING_BEGIN);
AddMenuItem(testMenu, @"End Tracing", ID_TESTS_TRACING_END);
AddMenuItem(testMenu, @"Print", ID_TESTS_PRINT);
AddMenuItem(testMenu, @"Other Tests", ID_TESTS_OTHER_TESTS);
[testItem setSubmenu:testMenu];
[menubar addItem:testItem];
@ -523,70 +494,10 @@ NSButton* MakeButton(NSRect* rect, NSString* title, NSView* parent) {
g_handler->CloseAllBrowsers(false);
}
- (IBAction)testGetSource:(id)sender {
- (IBAction)menuItemSelected:(id)sender {
NSMenuItem *item = (NSMenuItem*)sender;
if (g_handler.get() && g_handler->GetBrowserId())
RunGetSourceTest(g_handler->GetBrowser());
}
- (IBAction)testGetText:(id)sender {
if (g_handler.get() && g_handler->GetBrowserId())
RunGetTextTest(g_handler->GetBrowser());
}
- (IBAction)testPopupWindow:(id)sender {
if (g_handler.get() && g_handler->GetBrowserId())
RunPopupTest(g_handler->GetBrowser());
}
- (IBAction)testRequest:(id)sender {
if (g_handler.get() && g_handler->GetBrowserId())
RunRequestTest(g_handler->GetBrowser());
}
- (IBAction)testPluginInfo:(id)sender {
if (g_handler.get() && g_handler->GetBrowserId())
RunPluginInfoTest(g_handler->GetBrowser());
}
- (IBAction)testZoomIn:(id)sender {
if (g_handler.get() && g_handler->GetBrowserId()) {
CefRefPtr<CefBrowser> browser = g_handler->GetBrowser();
browser->GetHost()->SetZoomLevel(browser->GetHost()->GetZoomLevel() + 0.5);
}
}
- (IBAction)testZoomOut:(id)sender {
if (g_handler.get() && g_handler->GetBrowserId()) {
CefRefPtr<CefBrowser> browser = g_handler->GetBrowser();
browser->GetHost()->SetZoomLevel(browser->GetHost()->GetZoomLevel() - 0.5);
}
}
- (IBAction)testZoomReset:(id)sender {
if (g_handler.get() && g_handler->GetBrowserId()) {
CefRefPtr<CefBrowser> browser = g_handler->GetBrowser();
browser->GetHost()->SetZoomLevel(0.0);
}
}
- (IBAction)testBeginTracing:(id)sender {
if (g_handler.get())
g_handler->BeginTracing();
}
- (IBAction)testEndTracing:(id)sender {
if (g_handler.get())
g_handler->EndTracing();
}
- (IBAction)testPrint:(id)sender {
if (g_handler.get() && g_handler->GetBrowserId())
g_handler->GetBrowser()->GetHost()->Print();
}
- (IBAction)testOtherTests:(id)sender {
if (g_handler.get() && g_handler->GetBrowserId())
RunOtherTests(g_handler->GetBrowser());
client::test_runner::RunTest(g_handler->GetBrowser(), [item tag]);
}
- (NSApplicationTerminateReply)applicationShouldTerminate:
@ -630,8 +541,8 @@ int main(int argc, char* argv[]) {
// Initialize CEF.
CefInitialize(main_args, settings, app.get(), NULL);
// Register the scheme handler.
scheme_test::InitTest();
// Register scheme handlers.
client::test_runner::RegisterSchemeHandlers();
// Create the application delegate and window.
NSObject* delegate = [[ClientAppDelegate alloc] init];
@ -667,6 +578,10 @@ std::string AppGetWorkingDirectory() {
return szWorkingDir;
}
std::string AppGetDownloadPath(const std::string& file_name) {
return std::string();
}
void AppQuitMessageLoop() {
client::MainMessageLoop::Get()->Quit();
}

View File

@ -8,6 +8,7 @@
#include <commdlg.h>
#include <shellapi.h>
#include <direct.h>
#include <shlobj.h>
#include <sstream>
#include <string>
@ -23,8 +24,7 @@
#include "cefclient/main_message_loop_multithreaded_win.h"
#include "cefclient/main_message_loop_std.h"
#include "cefclient/resource.h"
#include "cefclient/scheme_test.h"
#include "cefclient/string_util.h"
#include "cefclient/test_runner.h"
#include "cefclient/util_win.h"
@ -125,8 +125,8 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
// Initialize CEF.
CefInitialize(main_args, settings, app.get(), sandbox_info);
// Register the scheme handler.
scheme_test::InitTest();
// Register scheme handlers.
client::test_runner::RegisterSchemeHandlers();
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
@ -214,18 +214,6 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {
return TRUE;
}
// Change the zoom factor on the UI thread.
static void ModifyZoom(CefRefPtr<CefBrowser> browser, double delta) {
if (!CefCurrentlyOn(TID_UI)) {
// Execute on the UI thread.
CefPostTask(TID_UI, base::Bind(&ModifyZoom, browser, delta));
return;
}
browser->GetHost()->SetZoomLevel(
browser->GetHost()->GetZoomLevel() + delta);
}
// Show a warning message on the UI thread.
static void ShowWarning(CefRefPtr<CefBrowser> browser, int id) {
if (!CefCurrentlyOn(TID_UI)) {
@ -469,6 +457,12 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
if (wmId >= ID_TESTS_FIRST && wmId <= ID_TESTS_LAST) {
client::test_runner::RunTest(browser, wmId);
return 0;
}
// Parse the menu selections:
switch (wmId) {
case IDM_ABOUT:
@ -521,52 +515,6 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
if (browser.get())
browser->StopLoad();
return 0;
case ID_TESTS_GETSOURCE: // Test the GetSource function
if (browser.get())
RunGetSourceTest(browser);
return 0;
case ID_TESTS_GETTEXT: // Test the GetText function
if (browser.get())
RunGetTextTest(browser);
return 0;
case ID_TESTS_POPUP: // Test a popup window
if (browser.get())
RunPopupTest(browser);
return 0;
case ID_TESTS_REQUEST: // Test a request
if (browser.get())
RunRequestTest(browser);
return 0;
case ID_TESTS_PLUGIN_INFO: // Test plugin info
if (browser.get())
RunPluginInfoTest(browser);
return 0;
case ID_TESTS_ZOOM_IN:
if (browser.get())
ModifyZoom(browser, 0.5);
return 0;
case ID_TESTS_ZOOM_OUT:
if (browser.get())
ModifyZoom(browser, -0.5);
return 0;
case ID_TESTS_ZOOM_RESET:
if (browser.get())
browser->GetHost()->SetZoomLevel(0.0);
return 0;
case ID_TESTS_TRACING_BEGIN:
g_handler->BeginTracing();
return 0;
case ID_TESTS_TRACING_END:
g_handler->EndTracing();
return 0;
case ID_TESTS_PRINT:
if(browser.get())
browser->GetHost()->Print();
return 0;
case ID_TESTS_OTHER_TESTS:
if (browser.get())
RunOtherTests(browser);
return 0;
}
break;
}
@ -737,6 +685,20 @@ std::string AppGetWorkingDirectory() {
return szWorkingDir;
}
std::string AppGetDownloadPath(const std::string& file_name) {
TCHAR szFolderPath[MAX_PATH];
std::string path;
// Save the file in the user's "My Documents" folder.
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE,
NULL, 0, szFolderPath))) {
path = CefString(szFolderPath);
path += "\\" + file_name;
}
return path;
}
void AppQuitMessageLoop() {
client::MainMessageLoop::Get()->Quit();
}

View File

@ -18,14 +18,14 @@ void ClientApp::CreateBrowserDelegates(BrowserDelegateSet& delegates) {
// static
void ClientApp::CreateRenderDelegates(RenderDelegateSet& delegates) {
client_renderer::CreateRenderDelegates(delegates);
performance_test::CreateRenderDelegates(delegates);
client::performance_test::CreateRenderDelegates(delegates);
}
// static
void ClientApp::RegisterCustomSchemes(
CefRefPtr<CefSchemeRegistrar> registrar,
std::vector<CefString>& cookiable_schemes) {
scheme_test::RegisterCustomSchemes(registrar, cookiable_schemes);
client::scheme_test::RegisterCustomSchemes(registrar, cookiable_schemes);
}
// static

View File

@ -19,14 +19,11 @@
#include "include/cef_url.h"
#include "include/wrapper/cef_closure_task.h"
#include "include/wrapper/cef_stream_resource_handler.h"
#include "cefclient/binding_test.h"
#include "cefclient/cefclient.h"
#include "cefclient/client_renderer.h"
#include "cefclient/client_switches.h"
#include "cefclient/dialog_test.h"
#include "cefclient/resource_util.h"
#include "cefclient/string_util.h"
#include "cefclient/window_test.h"
#include "cefclient/test_runner.h"
namespace {
@ -42,49 +39,6 @@ enum client_menu_ids {
CLIENT_ID_TESTMENU_RADIOITEM3,
};
const char kTestOrigin[] = "http://tests/";
// Retrieve the file name and mime type based on the specified url.
bool ParseTestUrl(const std::string& url,
std::string* file_name,
std::string* mime_type) {
// Retrieve the path component.
CefURLParts parts;
CefParseURL(url, parts);
std::string file = CefString(&parts.path);
if (file.size() < 2)
return false;
// Remove the leading slash.
file = file.substr(1);
// Verify that the file name is valid.
for(size_t i = 0; i < file.size(); ++i) {
const char c = file[i];
if (!isalpha(c) && !isdigit(c) && c != '_' && c != '.')
return false;
}
// Determine the mime type based on the file extension, if any.
size_t pos = file.rfind(".");
if (pos != std::string::npos) {
std::string ext = file.substr(pos + 1);
if (ext == "html")
*mime_type = "text/html";
else if (ext == "png")
*mime_type = "image/png";
else
return false;
} else {
// Default to an html extension if none is specified.
*mime_type = "text/html";
file += ".html";
}
*file_name = file;
return true;
}
} // namespace
int ClientHandler::browser_count_ = 0;
@ -255,7 +209,7 @@ void ClientHandler::OnBeforeDownload(
CEF_REQUIRE_UI_THREAD();
// Continue the download and show the "Save As" dialog.
callback->Continue(GetDownloadPath(suggested_name), true);
callback->Continue(AppGetDownloadPath(suggested_name), true);
}
void ClientHandler::OnDownloadUpdated(
@ -372,7 +326,7 @@ void ClientHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser) {
message_router_ = CefMessageRouterBrowserSide::Create(config);
// Register handlers with the router.
CreateMessageHandlers(message_handler_set_);
client::test_runner::CreateMessageHandlers(message_handler_set_);
MessageHandlerSet::const_iterator it = message_handler_set_.begin();
for (; it != message_handler_set_.end(); ++it)
message_router_->AddHandler(*(it), false);
@ -513,35 +467,7 @@ CefRefPtr<CefResourceHandler> ClientHandler::GetResourceHandler(
CefRefPtr<CefFrame> frame,
CefRefPtr<CefRequest> request) {
CEF_REQUIRE_IO_THREAD();
std::string url = request->GetURL();
if (url.find(kTestOrigin) == 0) {
// Handle URLs in the test origin.
std::string file_name, mime_type;
if (ParseTestUrl(url, &file_name, &mime_type)) {
if (file_name == "request.html") {
// Show the request contents.
std::string dump;
DumpRequestContents(request, dump);
std::string str = "<html><body bgcolor=\"white\"><pre>" + dump +
"</pre></body></html>";
CefRefPtr<CefStreamReader> stream =
CefStreamReader::CreateForData(
static_cast<void*>(const_cast<char*>(str.c_str())),
str.size());
DCHECK(stream.get());
return new CefStreamResourceHandler("text/html", stream);
} else {
// Load the resource from file.
CefRefPtr<CefStreamReader> stream =
GetBinaryResourceReader(file_name.c_str());
if (stream.get())
return new CefStreamResourceHandler(mime_type, stream);
}
}
}
return NULL;
return client::test_runner::GetResourceHandler(browser, frame, request);
}
bool ClientHandler::OnQuotaRequest(CefRefPtr<CefBrowser> browser,
@ -809,76 +735,6 @@ std::string ClientHandler::GetStartupURL() const {
return startup_url_;
}
void ClientHandler::BeginTracing() {
if (!CefCurrentlyOn(TID_UI)) {
// Execute on the UI thread.
CefPostTask(TID_UI, base::Bind(&ClientHandler::BeginTracing, this));
return;
}
CefBeginTracing(CefString(), NULL);
}
void ClientHandler::EndTracing() {
if (!CefCurrentlyOn(TID_UI)) {
// Execute on the UI thread.
CefPostTask(TID_UI, base::Bind(&ClientHandler::EndTracing, this));
return;
}
class Client : public CefEndTracingCallback,
public CefRunFileDialogCallback {
public:
explicit Client(CefRefPtr<ClientHandler> handler)
: handler_(handler) {
RunDialog();
}
void RunDialog() {
static const char kDefaultFileName[] = "trace.txt";
std::string path = handler_->GetDownloadPath(kDefaultFileName);
if (path.empty())
path = kDefaultFileName;
// Results in a call to OnFileDialogDismissed.
handler_->GetBrowser()->GetHost()->RunFileDialog(
FILE_DIALOG_SAVE,
CefString(), // title
path,
std::vector<CefString>(), // accept_filters
0, // selected_accept_filter
this);
}
virtual void OnFileDialogDismissed(
int selected_accept_filter,
const std::vector<CefString>& file_paths) OVERRIDE {
CEF_REQUIRE_UI_THREAD();
if (!file_paths.empty()) {
// File selected. Results in a call to OnEndTracingComplete.
CefEndTracing(file_paths.front(), this);
} else {
// No file selected. Discard the trace data.
CefEndTracing(CefString(), NULL);
}
}
virtual void OnEndTracingComplete(
const CefString& tracing_file) OVERRIDE {
CEF_REQUIRE_UI_THREAD();
handler_->SetLastDownloadFile(tracing_file.ToString());
handler_->SendNotification(NOTIFY_DOWNLOAD_COMPLETE);
}
private:
CefRefPtr<ClientHandler> handler_;
IMPLEMENT_REFCOUNTING(Client);
};
new Client(this);
}
bool ClientHandler::Save(const std::string& path, const std::string& data) {
FILE* f = fopen(path.c_str(), "w");
if (!f)
@ -894,18 +750,6 @@ bool ClientHandler::Save(const std::string& path, const std::string& data) {
return true;
}
// static
void ClientHandler::CreateMessageHandlers(MessageHandlerSet& handlers) {
// Create the dialog test handlers.
dialog_test::CreateMessageHandlers(handlers);
// Create the binding test handlers.
binding_test::CreateMessageHandlers(handlers);
// Create the window test handlers.
window_test::CreateMessageHandlers(handlers);
}
void ClientHandler::BuildTestMenu(CefRefPtr<CefMenuModel> model) {
if (model->GetCount() > 0)
model->AddSeparator();
@ -942,4 +786,3 @@ bool ClientHandler::ExecuteTestMenu(int command_id) {
// Allow default handling to proceed.
return false;
}

View File

@ -292,19 +292,12 @@ class ClientHandler : public CefClient,
// Returns the startup URL.
std::string GetStartupURL() const;
void BeginTracing();
void EndTracing();
bool Save(const std::string& path, const std::string& data);
private:
void SetLoading(bool isLoading);
void SetNavState(bool canGoBack, bool canGoForward);
// Create all CefMessageRouterBrowserSide::Handler objects. They will be
// deleted when the ClientHandler is destroyed.
static void CreateMessageHandlers(MessageHandlerSet& handlers);
// Test context menu creation.
void BuildTestMenu(CefRefPtr<CefMenuModel> model);
bool ExecuteTestMenu(int command_id);
@ -314,10 +307,6 @@ class ClientHandler : public CefClient,
int radio_item;
} test_menu_state_;
// Returns the full download path for the specified file, or an empty path to
// use the default temp directory.
std::string GetDownloadPath(const std::string& file_name);
// START THREAD SAFE MEMBERS
// The following members are thread-safe because they're initialized during
// object construction and not changed thereafter.

View File

@ -482,7 +482,3 @@ void ClientHandler::SetNavState(bool canGoBack, bool canGoForward) {
else
gtk_widget_set_sensitive(GTK_WIDGET(forward_handle_), false);
}
std::string ClientHandler::GetDownloadPath(const std::string& file_name) {
return std::string();
}

View File

@ -64,7 +64,3 @@ void ClientHandler::SetLoading(bool isLoading) {
void ClientHandler::SetNavState(bool canGoBack, bool canGoForward) {
// TODO(port): Change button status.
}
std::string ClientHandler::GetDownloadPath(const std::string& file_name) {
return std::string();
}

View File

@ -6,7 +6,6 @@
#include <string>
#include <windows.h>
#include <shlobj.h>
#include "include/cef_browser.h"
#include "include/cef_frame.h"
@ -67,17 +66,3 @@ void ClientHandler::SetNavState(bool canGoBack, bool canGoForward) {
EnableWindow(back_handle_, canGoBack);
EnableWindow(forward_handle_, canGoForward);
}
std::string ClientHandler::GetDownloadPath(const std::string& file_name) {
TCHAR szFolderPath[MAX_PATH];
std::string path;
// Save the file in the user's "My Documents" folder.
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE,
NULL, 0, szFolderPath))) {
path = CefString(szFolderPath);
path += "\\" + file_name;
}
return path;
}

View File

@ -3,10 +3,13 @@
// can be found in the LICENSE file.
#include "cefclient/dialog_test.h"
#include "include/cef_browser.h"
#include <string>
#include "include/cef_browser.h"
#include "include/wrapper/cef_helpers.h"
namespace client {
namespace dialog_test {
namespace {
@ -176,8 +179,9 @@ class Handler : public CefMessageRouterBrowserSide::Handler {
} // namespace
void CreateMessageHandlers(ClientHandler::MessageHandlerSet& handlers) {
void CreateMessageHandlers(test_runner::MessageHandlerSet& handlers) {
handlers.insert(new Handler());
}
} // namespace dialog_test
} // namespace client

View File

@ -6,13 +6,15 @@
#define CEF_TESTS_CEFCLIENT_DIALOG_TEST_H_
#pragma once
#include "cefclient/client_handler.h"
#include "cefclient/test_runner.h"
namespace client {
namespace dialog_test {
/// Handler creation. Called from ClientHandler.
void CreateMessageHandlers(ClientHandler::MessageHandlerSet& handlers);
/// Handler creation.
void CreateMessageHandlers(test_runner::MessageHandlerSet& handlers);
} // namespace dialog_test
} // namespace client
#endif // CEF_TESTS_CEFCLIENT_DIALOG_TEST_H_

View File

@ -10,6 +10,7 @@
#include "include/wrapper/cef_stream_resource_handler.h"
#include "cefclient/performance_test_setup.h"
namespace client {
namespace performance_test {
// Use more interations for a Release build.
@ -161,3 +162,4 @@ void CreateRenderDelegates(ClientApp::RenderDelegateSet& delegates) {
}
} // namespace performance_test
} // namespace client

View File

@ -8,11 +8,13 @@
#include "cefclient/client_app.h"
namespace client {
namespace performance_test {
// Render delegate creation. Called from client_app_delegates.cc.
void CreateRenderDelegates(ClientApp::RenderDelegateSet& delegates);
} // namespace performance_test
} // namespace client
#endif // CEF_TESTS_CEFCLIENT_PERFORMANCE_TEST_H_

View File

@ -9,6 +9,7 @@
#include "include/base/cef_macros.h"
#include "include/base/cef_logging.h"
namespace client {
namespace performance_test {
// Default number of iterations.
@ -98,5 +99,6 @@ extern const PerfTestEntry kPerfTests[];
extern const int kPerfTestsCount;
} // namespace performance_test
} // namespace client
#endif // CEF_TESTS_CEFCLIENT_PERFORMANCE_TEST_H_

View File

@ -6,6 +6,7 @@
#include "cefclient/performance_test_setup.h"
#include "include/cef_v8.h"
namespace client {
namespace performance_test {
namespace {
@ -326,3 +327,4 @@ const PerfTestEntry kPerfTests[] = {
const int kPerfTestsCount = (sizeof(kPerfTests) / sizeof(kPerfTests[0]));
} // namespace performance_test
} // namespace client

View File

@ -12,6 +12,9 @@
std::string AppGetWorkingDirectory() {
return std::string();
}
std::string AppGetDownloadPath(const std::string& file_name) {
return std::string();
}
CefWindowHandle AppGetMainWindowHandle() {
return NULL;
}

View File

@ -27,6 +27,7 @@
#define ID_WARN_DOWNLOADERROR 32002
#define ID_QUIT 32500
#define ID_FIND 32501
#define ID_TESTS_FIRST 32700
#define ID_TESTS_GETSOURCE 32700
#define ID_TESTS_GETTEXT 32701
#define ID_TESTS_OTHER_TESTS 32702
@ -39,6 +40,7 @@
#define ID_TESTS_ZOOM_IN 32709
#define ID_TESTS_ZOOM_OUT 32710
#define ID_TESTS_ZOOM_RESET 32711
#define ID_TESTS_LAST 32711
#define IDC_STATIC -1
#define IDS_BINDING 1000
#define IDS_DIALOGS 1001
@ -53,9 +55,6 @@
#define IDS_XMLHTTPREQUEST 1010
#define IDS_PERFORMANCE2 1011
// Avoid files associated with MacOS
#define _X86_
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED

View File

@ -16,12 +16,9 @@
#include "include/cef_scheme.h"
#include "include/wrapper/cef_helpers.h"
#include "cefclient/resource_util.h"
#include "cefclient/string_util.h"
#if defined(OS_WIN)
#include "cefclient/resource.h"
#endif
#include "cefclient/test_runner.h"
namespace client {
namespace scheme_test {
namespace {
@ -50,7 +47,7 @@ class ClientSchemeHandler : public CefResourceHandler {
// Output a string representation of the request
std::string dump;
DumpRequestContents(request, dump);
test_runner::DumpRequestContents(request, dump);
data_.append(dump);
data_.append("</pre><br/>Try the test form:"
@ -155,9 +152,10 @@ void RegisterCustomSchemes(CefRefPtr<CefSchemeRegistrar> registrar,
registrar->AddCustomScheme("client", true, false, false);
}
void InitTest() {
void RegisterSchemeHandlers() {
CefRegisterSchemeHandlerFactory("client", "tests",
new ClientSchemeHandlerFactory());
}
} // namespace scheme_test
} // namespace client

View File

@ -12,6 +12,7 @@
class CefBrowser;
class CefSchemeRegistrar;
namespace client {
namespace scheme_test {
// Register the scheme.
@ -19,8 +20,9 @@ void RegisterCustomSchemes(CefRefPtr<CefSchemeRegistrar> registrar,
std::vector<CefString>& cookiable_schemes);
// Create the scheme handler.
void InitTest();
void RegisterSchemeHandlers();
} // namespace scheme_test
} // namespace client
#endif // CEF_TESTS_CEFCLIENT_SCHEME_TEST_H_

View File

@ -1,74 +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 <sstream>
#include <string>
#include "include/cef_request.h"
void DumpRequestContents(CefRefPtr<CefRequest> request, std::string& str) {
std::stringstream ss;
ss << "URL: " << std::string(request->GetURL());
ss << "\nMethod: " << std::string(request->GetMethod());
CefRequest::HeaderMap headerMap;
request->GetHeaderMap(headerMap);
if (headerMap.size() > 0) {
ss << "\nHeaders:";
CefRequest::HeaderMap::const_iterator it = headerMap.begin();
for (; it != headerMap.end(); ++it) {
ss << "\n\t" << std::string((*it).first) << ": " <<
std::string((*it).second);
}
}
CefRefPtr<CefPostData> postData = request->GetPostData();
if (postData.get()) {
CefPostData::ElementVector elements;
postData->GetElements(elements);
if (elements.size() > 0) {
ss << "\nPost Data:";
CefRefPtr<CefPostDataElement> element;
CefPostData::ElementVector::const_iterator it = elements.begin();
for (; it != elements.end(); ++it) {
element = (*it);
if (element->GetType() == PDE_TYPE_BYTES) {
// the element is composed of bytes
ss << "\n\tBytes: ";
if (element->GetBytesCount() == 0) {
ss << "(empty)";
} else {
// retrieve the data.
size_t size = element->GetBytesCount();
char* bytes = new char[size];
element->GetBytes(size, bytes);
ss << std::string(bytes, size);
delete [] bytes;
}
} else if (element->GetType() == PDE_TYPE_FILE) {
ss << "\n\tFile: " << std::string(element->GetFile());
}
}
}
}
str = ss.str();
}
std::string StringReplace(const std::string& str, const std::string& from,
const std::string& to) {
std::string result = str;
std::string::size_type pos = 0;
std::string::size_type from_len = from.length();
std::string::size_type to_len = to.length();
do {
pos = result.find(from, pos);
if (pos != std::string::npos) {
result.replace(pos, from_len, to);
pos += to_len;
}
} while (pos != std::string::npos);
return result;
}

View File

@ -1,21 +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 <string>
#include "include/cef_base.h"
class CefRequest;
// Dump the contents of the request into a string.
void DumpRequestContents(CefRefPtr<CefRequest> request, std::string& str);
// Replace all instances of |from| with |to| in |str|.
std::string StringReplace(const std::string& str, const std::string& from,
const std::string& to);
#endif // CEF_TESTS_CEFCLIENT_STRING_UTIL_H_

View File

@ -0,0 +1,432 @@
// Copyright (c) 2015 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
#include "cefclient/test_runner.h"
#include "include/base/cef_bind.h"
#include "include/cef_task.h"
#include "include/cef_trace.h"
#include "include/cef_url.h"
#include "include/cef_web_plugin.h"
#include "include/wrapper/cef_closure_task.h"
#include "include/wrapper/cef_stream_resource_handler.h"
#include "cefclient/binding_test.h"
#include "cefclient/cefclient.h"
#include "cefclient/dialog_test.h"
#include "cefclient/resource.h"
#include "cefclient/resource_util.h"
#include "cefclient/scheme_test.h"
#include "cefclient/window_test.h"
namespace client {
namespace test_runner {
namespace {
const char kTestOrigin[] = "http://tests/";
// Replace all instances of |from| with |to| in |str|.
std::string StringReplace(const std::string& str, const std::string& from,
const std::string& to) {
std::string result = str;
std::string::size_type pos = 0;
std::string::size_type from_len = from.length();
std::string::size_type to_len = to.length();
do {
pos = result.find(from, pos);
if (pos != std::string::npos) {
result.replace(pos, from_len, to);
pos += to_len;
}
} while (pos != std::string::npos);
return result;
}
void RunGetSourceTest(CefRefPtr<CefBrowser> browser) {
class Visitor : public CefStringVisitor {
public:
explicit Visitor(CefRefPtr<CefBrowser> browser) : browser_(browser) {}
virtual void Visit(const CefString& string) OVERRIDE {
std::string source = StringReplace(string, "<", "&lt;");
source = StringReplace(source, ">", "&gt;");
std::stringstream ss;
ss << "<html><body bgcolor=\"white\">Source:<pre>" << source <<
"</pre></body></html>";
browser_->GetMainFrame()->LoadString(ss.str(), "http://tests/getsource");
}
private:
CefRefPtr<CefBrowser> browser_;
IMPLEMENT_REFCOUNTING(Visitor);
};
browser->GetMainFrame()->GetSource(new Visitor(browser));
}
void RunGetTextTest(CefRefPtr<CefBrowser> browser) {
class Visitor : public CefStringVisitor {
public:
explicit Visitor(CefRefPtr<CefBrowser> browser) : browser_(browser) {}
virtual void Visit(const CefString& string) OVERRIDE {
std::string text = StringReplace(string, "<", "&lt;");
text = StringReplace(text, ">", "&gt;");
std::stringstream ss;
ss << "<html><body bgcolor=\"white\">Text:<pre>" << text <<
"</pre></body></html>";
browser_->GetMainFrame()->LoadString(ss.str(), "http://tests/gettext");
}
private:
CefRefPtr<CefBrowser> browser_;
IMPLEMENT_REFCOUNTING(Visitor);
};
browser->GetMainFrame()->GetText(new Visitor(browser));
}
void RunRequestTest(CefRefPtr<CefBrowser> browser) {
// Create a new request
CefRefPtr<CefRequest> request(CefRequest::Create());
// Set the request URL
request->SetURL("http://tests/request");
// Add post data to the request. The correct method and content-
// type headers will be set by CEF.
CefRefPtr<CefPostDataElement> postDataElement(CefPostDataElement::Create());
std::string data = "arg1=val1&arg2=val2";
postDataElement->SetToBytes(data.length(), data.c_str());
CefRefPtr<CefPostData> postData(CefPostData::Create());
postData->AddElement(postDataElement);
request->SetPostData(postData);
// Add a custom header
CefRequest::HeaderMap headerMap;
headerMap.insert(
std::make_pair("X-My-Header", "My Header Value"));
request->SetHeaderMap(headerMap);
// Load the request
browser->GetMainFrame()->LoadRequest(request);
}
void RunPopupTest(CefRefPtr<CefBrowser> browser) {
browser->GetMainFrame()->ExecuteJavaScript(
"window.open('http://www.google.com');", "about:blank", 0);
}
void RunPluginInfoTest(CefRefPtr<CefBrowser> browser) {
class Visitor : public CefWebPluginInfoVisitor {
public:
explicit Visitor(CefRefPtr<CefBrowser> browser)
: browser_(browser) {
html_ = "<html><head><title>Plugin Info Test</title></head>"
"<body bgcolor=\"white\">"
"\n<b>Installed plugins:</b>";
}
~Visitor() {
html_ += "\n</body></html>";
// Load the html in the browser.
browser_->GetMainFrame()->LoadString(html_, "http://tests/plugin_info");
}
virtual bool Visit(CefRefPtr<CefWebPluginInfo> info, int count, int total)
OVERRIDE {
html_ += "\n<br/><br/>Name: " + info->GetName().ToString() +
"\n<br/>Description: " + info->GetDescription().ToString() +
"\n<br/>Version: " + info->GetVersion().ToString() +
"\n<br/>Path: " + info->GetPath().ToString();
return true;
}
private:
std::string html_;
CefRefPtr<CefBrowser> browser_;
IMPLEMENT_REFCOUNTING(Visitor);
};
CefVisitWebPluginInfo(new Visitor(browser));
}
void ModifyZoom(CefRefPtr<CefBrowser> browser, double delta) {
if (!CefCurrentlyOn(TID_UI)) {
// Execute on the UI thread.
CefPostTask(TID_UI, base::Bind(&ModifyZoom, browser, delta));
return;
}
browser->GetHost()->SetZoomLevel(
browser->GetHost()->GetZoomLevel() + delta);
}
void BeginTracing() {
if (!CefCurrentlyOn(TID_UI)) {
// Execute on the UI thread.
CefPostTask(TID_UI, base::Bind(&BeginTracing));
return;
}
CefBeginTracing(CefString(), NULL);
}
void EndTracing(CefRefPtr<CefBrowser> browser) {
if (!CefCurrentlyOn(TID_UI)) {
// Execute on the UI thread.
CefPostTask(TID_UI, base::Bind(&EndTracing, browser));
return;
}
class Client : public CefEndTracingCallback,
public CefRunFileDialogCallback {
public:
explicit Client(CefRefPtr<CefBrowser> browser)
: browser_(browser) {
RunDialog();
}
void RunDialog() {
static const char kDefaultFileName[] = "trace.txt";
std::string path = AppGetDownloadPath(kDefaultFileName);
if (path.empty())
path = kDefaultFileName;
// Results in a call to OnFileDialogDismissed.
browser_->GetHost()->RunFileDialog(
FILE_DIALOG_SAVE,
CefString(), // title
path,
std::vector<CefString>(), // accept_filters
0, // selected_accept_filter
this);
}
virtual void OnFileDialogDismissed(
int selected_accept_filter,
const std::vector<CefString>& file_paths) OVERRIDE {
if (!file_paths.empty()) {
// File selected. Results in a call to OnEndTracingComplete.
CefEndTracing(file_paths.front(), this);
} else {
// No file selected. Discard the trace data.
CefEndTracing(CefString(), NULL);
}
}
virtual void OnEndTracingComplete(
const CefString& tracing_file) OVERRIDE {
Alert(browser_,
"File \"" + tracing_file.ToString() + "\" saved successfully.");
}
private:
CefRefPtr<CefBrowser> browser_;
IMPLEMENT_REFCOUNTING(Client);
};
new Client(browser);
}
void RunOtherTests(CefRefPtr<CefBrowser> browser) {
browser->GetMainFrame()->LoadURL("http://tests/other_tests");
}
// Retrieve the file name and mime type based on the specified url.
bool ParseTestUrl(const std::string& url,
std::string* file_name,
std::string* mime_type) {
// Retrieve the path component.
CefURLParts parts;
CefParseURL(url, parts);
std::string file = CefString(&parts.path);
if (file.size() < 2)
return false;
// Remove the leading slash.
file = file.substr(1);
// Verify that the file name is valid.
for(size_t i = 0; i < file.size(); ++i) {
const char c = file[i];
if (!isalpha(c) && !isdigit(c) && c != '_' && c != '.')
return false;
}
// Determine the mime type based on the file extension, if any.
size_t pos = file.rfind(".");
if (pos != std::string::npos) {
std::string ext = file.substr(pos + 1);
if (ext == "html")
*mime_type = "text/html";
else if (ext == "png")
*mime_type = "image/png";
else
return false;
} else {
// Default to an html extension if none is specified.
*mime_type = "text/html";
file += ".html";
}
*file_name = file;
return true;
}
} // namespace
void RunTest(CefRefPtr<CefBrowser> browser, int id) {
if (!browser)
return;
switch (id) {
case ID_TESTS_GETSOURCE:
RunGetSourceTest(browser);
break;
case ID_TESTS_GETTEXT:
RunGetTextTest(browser);
break;
case ID_TESTS_POPUP:
RunPopupTest(browser);
break;
case ID_TESTS_REQUEST:
RunRequestTest(browser);
break;
case ID_TESTS_PLUGIN_INFO:
RunPluginInfoTest(browser);
break;
case ID_TESTS_ZOOM_IN:
ModifyZoom(browser, 0.5);
break;
case ID_TESTS_ZOOM_OUT:
ModifyZoom(browser, -0.5);
break;
case ID_TESTS_ZOOM_RESET:
browser->GetHost()->SetZoomLevel(0.0);
break;
case ID_TESTS_TRACING_BEGIN:
BeginTracing();
break;
case ID_TESTS_TRACING_END:
EndTracing(browser);
break;
case ID_TESTS_PRINT:
browser->GetHost()->Print();
break;
case ID_TESTS_OTHER_TESTS:
RunOtherTests(browser);
break;
}
}
void DumpRequestContents(CefRefPtr<CefRequest> request, std::string& str) {
std::stringstream ss;
ss << "URL: " << std::string(request->GetURL());
ss << "\nMethod: " << std::string(request->GetMethod());
CefRequest::HeaderMap headerMap;
request->GetHeaderMap(headerMap);
if (headerMap.size() > 0) {
ss << "\nHeaders:";
CefRequest::HeaderMap::const_iterator it = headerMap.begin();
for (; it != headerMap.end(); ++it) {
ss << "\n\t" << std::string((*it).first) << ": " <<
std::string((*it).second);
}
}
CefRefPtr<CefPostData> postData = request->GetPostData();
if (postData.get()) {
CefPostData::ElementVector elements;
postData->GetElements(elements);
if (elements.size() > 0) {
ss << "\nPost Data:";
CefRefPtr<CefPostDataElement> element;
CefPostData::ElementVector::const_iterator it = elements.begin();
for (; it != elements.end(); ++it) {
element = (*it);
if (element->GetType() == PDE_TYPE_BYTES) {
// the element is composed of bytes
ss << "\n\tBytes: ";
if (element->GetBytesCount() == 0) {
ss << "(empty)";
} else {
// retrieve the data.
size_t size = element->GetBytesCount();
char* bytes = new char[size];
element->GetBytes(size, bytes);
ss << std::string(bytes, size);
delete [] bytes;
}
} else if (element->GetType() == PDE_TYPE_FILE) {
ss << "\n\tFile: " << std::string(element->GetFile());
}
}
}
}
str = ss.str();
}
CefRefPtr<CefResourceHandler> GetResourceHandler(
CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefRequest> request) {
std::string url = request->GetURL();
if (url.find(kTestOrigin) == 0) {
// Handle URLs in the test origin.
std::string file_name, mime_type;
if (ParseTestUrl(url, &file_name, &mime_type)) {
if (file_name == "request.html") {
// Show the request contents.
std::string dump;
DumpRequestContents(request, dump);
std::string str = "<html><body bgcolor=\"white\"><pre>" + dump +
"</pre></body></html>";
CefRefPtr<CefStreamReader> stream =
CefStreamReader::CreateForData(
static_cast<void*>(const_cast<char*>(str.c_str())),
str.size());
DCHECK(stream.get());
return new CefStreamResourceHandler("text/html", stream);
} else {
// Load the resource from file.
CefRefPtr<CefStreamReader> stream =
GetBinaryResourceReader(file_name.c_str());
if (stream.get())
return new CefStreamResourceHandler(mime_type, stream);
}
}
}
return NULL;
}
void Alert(CefRefPtr<CefBrowser> browser, const std::string& message) {
// Escape special characters in the message.
std::string msg = StringReplace(message, "\\", "\\\\");
msg = StringReplace(msg, "'", "\\'");
// Execute a JavaScript alert().
CefRefPtr<CefFrame> frame = browser->GetMainFrame();
frame->ExecuteJavaScript("alert('" + msg + "');", frame->GetURL(), 0);
}
void CreateMessageHandlers(MessageHandlerSet& handlers) {
// Create the dialog test handlers.
dialog_test::CreateMessageHandlers(handlers);
// Create the binding test handlers.
binding_test::CreateMessageHandlers(handlers);
// Create the window test handlers.
window_test::CreateMessageHandlers(handlers);
}
void RegisterSchemeHandlers() {
// Register the scheme handler.
scheme_test::RegisterSchemeHandlers();
}
} // namespace test_runner
} // namespace client

View File

@ -0,0 +1,45 @@
// Copyright (c) 2015 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
#ifndef CEF_TESTS_CEFCLIENT_TEST_RUNNER_H_
#define CEF_TESTS_CEFCLIENT_TEST_RUNNER_H_
#include <set>
#include <string>
#include "include/cef_browser.h"
#include "include/cef_resource_handler.h"
#include "include/cef_request.h"
#include "include/wrapper/cef_message_router.h"
namespace client {
namespace test_runner {
// Run a test.
void RunTest(CefRefPtr<CefBrowser> browser, int id);
// Dump the contents of the request into a string.
void DumpRequestContents(CefRefPtr<CefRequest> request, std::string& str);
// Get test resources.
CefRefPtr<CefResourceHandler> GetResourceHandler(
CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefRequest> request);
// Show a JS alert message.
void Alert(CefRefPtr<CefBrowser> browser, const std::string& message);
// Create all CefMessageRouterBrowserSide::Handler objects. They will be
// deleted when the ClientHandler is destroyed.
typedef std::set<CefMessageRouterBrowserSide::Handler*> MessageHandlerSet;
void CreateMessageHandlers(MessageHandlerSet& handlers);
// Register scheme handlers for tests.
void RegisterSchemeHandlers();
} // namespace test_runner
} // namespace client
#endif // CEF_TESTS_CEFCLIENT_TEST_RUNNER_H_

View File

@ -9,8 +9,11 @@
#include <string>
#include <vector>
#include "include/base/cef_bind.h"
#include "include/wrapper/cef_stream_resource_handler.h"
#include "cefclient/main_message_loop.h"
namespace client {
namespace window_test {
namespace {
@ -53,15 +56,19 @@ class Handler : public CefMessageRouterBrowserSide::Handler {
}
if (vec.size() == 4) {
SetPos(browser->GetHost()->GetWindowHandle(),
vec[0], vec[1], vec[2], vec[3]);
// Execute SetPos() on the main thread.
MAIN_POST_CLOSURE(base::Bind(&SetPos, browser,
vec[0], vec[1], vec[2], vec[3]));
}
} else if (message_name == kMessageMinimizeName) {
Minimize(browser->GetHost()->GetWindowHandle());
// Execute Minimize() on the main thread.
MAIN_POST_CLOSURE(base::Bind(&Minimize, browser));
} else if (message_name == kMessageMaximizeName) {
Maximize(browser->GetHost()->GetWindowHandle());
// Execute Maximize() on the main thread.
MAIN_POST_CLOSURE(base::Bind(&Maximize, browser));
} else if (message_name == kMessageRestoreName) {
Restore(browser->GetHost()->GetWindowHandle());
// Execute Restore() on the main thread.
MAIN_POST_CLOSURE(base::Bind(&Restore, browser));
} else {
NOTREACHED();
}
@ -73,10 +80,6 @@ class Handler : public CefMessageRouterBrowserSide::Handler {
} // namespace
void CreateMessageHandlers(ClientHandler::MessageHandlerSet& handlers) {
handlers.insert(new Handler());
}
void ModifyBounds(const CefRect& display, CefRect& window) {
window.x += display.x;
window.y += display.y;
@ -99,4 +102,9 @@ void ModifyBounds(const CefRect& display, CefRect& window) {
window.y = display.y + display.height - window.height;
}
void CreateMessageHandlers(test_runner::MessageHandlerSet& handlers) {
handlers.insert(new Handler());
}
} // namespace window_test
} // namespace client

View File

@ -6,23 +6,26 @@
#define CEF_TESTS_CEFCLIENT_WINDOW_TEST_H_
#pragma once
#include "cefclient/client_handler.h"
#include "cefclient/test_runner.h"
namespace client {
namespace window_test {
/// Handler creation. Called from ClientHandler.
void CreateMessageHandlers(ClientHandler::MessageHandlerSet& handlers);
/// Handler creation.
void CreateMessageHandlers(test_runner::MessageHandlerSet& handlers);
// Fit |window| inside |display|. Coordinates are relative to the upper-left
// corner of the display.
void ModifyBounds(const CefRect& display, CefRect& window);
// Platform implementations.
void SetPos(CefWindowHandle handle, int x, int y, int width, int height);
void Minimize(CefWindowHandle handle);
void Maximize(CefWindowHandle handle);
void Restore(CefWindowHandle handle);
void SetPos(CefRefPtr<CefBrowser> browser,
int x, int y, int width, int height);
void Minimize(CefRefPtr<CefBrowser> browser);
void Maximize(CefRefPtr<CefBrowser> browser);
void Restore(CefRefPtr<CefBrowser> browser);
} // namespace window_test
} // namespace client
#endif // CEF_TESTS_CEFCLIENT_WINDOW_TEST_H_

View File

@ -3,15 +3,22 @@
// can be found in the LICENSE file.
#include "cefclient/window_test.h"
#include "cefclient/client_handler.h"
#include <gtk/gtk.h>
namespace client {
namespace window_test {
namespace {
GtkWindow* GetWindow(CefWindowHandle handle) {
return GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(handle)));
GtkWindow* GetWindow(CefRefPtr<CefBrowser> browser) {
// We can't get the GtkWidget* from the X11 Window that would be returned via
// CefBrowserHost::GetWindowHandle so retrieve it via the ClientHandler
// instance instead.
CefRefPtr<ClientHandler> handler =
static_cast<ClientHandler*>(browser->GetHost()->GetClient().get());
return GTK_WINDOW(gtk_widget_get_toplevel(handler->GetMainWindowHandle()));
}
bool IsMaximized(GtkWindow* window) {
@ -22,8 +29,9 @@ bool IsMaximized(GtkWindow* window) {
} // namespace
void SetPos(CefWindowHandle handle, int x, int y, int width, int height) {
GtkWindow* window = GetWindow(handle);
void SetPos(CefRefPtr<CefBrowser> browser, int x, int y, int width,
int height) {
GtkWindow* window = GetWindow(browser);
GdkWindow* gdk_window = gtk_widget_get_window(GTK_WIDGET(window));
// Make sure the window isn't minimized or maximized.
@ -47,8 +55,8 @@ void SetPos(CefWindowHandle handle, int x, int y, int width, int height) {
window_rect.width, window_rect.height);
}
void Minimize(CefWindowHandle handle) {
GtkWindow* window = GetWindow(handle);
void Minimize(CefRefPtr<CefBrowser> browser) {
GtkWindow* window = GetWindow(browser);
// Unmaximize the window before minimizing so restore behaves correctly.
if (IsMaximized(window))
@ -57,12 +65,12 @@ void Minimize(CefWindowHandle handle) {
gtk_window_iconify(window);
}
void Maximize(CefWindowHandle handle) {
gtk_window_maximize(GetWindow(handle));
void Maximize(CefRefPtr<CefBrowser> browser) {
gtk_window_maximize(GetWindow(browser));
}
void Restore(CefWindowHandle handle) {
GtkWindow* window = GetWindow(handle);
void Restore(CefRefPtr<CefBrowser> browser) {
GtkWindow* window = GetWindow(browser);
if (IsMaximized(window))
gtk_window_unmaximize(window);
else
@ -70,3 +78,4 @@ void Restore(CefWindowHandle handle) {
}
} // namespace window_test
} // namespace client

View File

@ -6,19 +6,21 @@
#import <Cocoa/Cocoa.h>
namespace client {
namespace window_test {
namespace {
NSWindow* GetWindow(CefWindowHandle handle) {
NSView* view = (NSView*)handle;
NSWindow* GetWindow(CefRefPtr<CefBrowser> browser) {
NSView* view = (NSView*)browser->GetHost()->GetWindowHandle();
return [view window];
}
} // namespace
void SetPos(CefWindowHandle handle, int x, int y, int width, int height) {
NSWindow* window = GetWindow(handle);
void SetPos(CefRefPtr<CefBrowser> browser, int x, int y, int width,
int height) {
NSWindow* window = GetWindow(browser);
// Make sure the window isn't minimized or maximized.
if ([window isMiniaturized])
@ -50,16 +52,16 @@ void SetPos(CefWindowHandle handle, int x, int y, int width, int height) {
[window setFrame:newRect display:YES];
}
void Minimize(CefWindowHandle handle) {
[GetWindow(handle) performMiniaturize:nil];
void Minimize(CefRefPtr<CefBrowser> browser) {
[GetWindow(browser) performMiniaturize:nil];
}
void Maximize(CefWindowHandle handle) {
[GetWindow(handle) performZoom:nil];
void Maximize(CefRefPtr<CefBrowser> browser) {
[GetWindow(browser) performZoom:nil];
}
void Restore(CefWindowHandle handle) {
NSWindow* window = GetWindow(handle);
void Restore(CefRefPtr<CefBrowser> browser) {
NSWindow* window = GetWindow(browser);
if ([window isMiniaturized])
[window deminiaturize:nil];
else if ([window isZoomed])
@ -67,3 +69,4 @@ void Restore(CefWindowHandle handle) {
}
} // namespace window_test
} // namespace client

View File

@ -4,32 +4,36 @@
#include "cefclient/window_test.h"
namespace client {
namespace window_test {
namespace {
// Toggles the current display state.
void Toggle(CefWindowHandle handle, UINT nCmdShow) {
HWND root_wnd = ::GetAncestor(handle, GA_ROOT);
HWND GetRootHwnd(CefRefPtr<CefBrowser> browser) {
return ::GetAncestor(browser->GetHost()->GetWindowHandle(), GA_ROOT);
}
// Toggles the current display state.
void Toggle(HWND root_hwnd, UINT nCmdShow) {
// Retrieve current window placement information.
WINDOWPLACEMENT placement;
::GetWindowPlacement(root_wnd, &placement);
::GetWindowPlacement(root_hwnd, &placement);
if (placement.showCmd == nCmdShow)
::ShowWindow(root_wnd, SW_RESTORE);
::ShowWindow(root_hwnd, SW_RESTORE);
else
::ShowWindow(root_wnd, nCmdShow);
::ShowWindow(root_hwnd, nCmdShow);
}
} // namespace
void SetPos(CefWindowHandle handle, int x, int y, int width, int height) {
HWND root_wnd = ::GetAncestor(handle, GA_ROOT);
void SetPos(CefRefPtr<CefBrowser> browser,
int x, int y, int width, int height) {
HWND root_hwnd = GetRootHwnd(browser);
// Retrieve current window placement information.
WINDOWPLACEMENT placement;
::GetWindowPlacement(root_wnd, &placement);
::GetWindowPlacement(root_hwnd, &placement);
// Retrieve information about the display that contains the window.
HMONITOR monitor = MonitorFromRect(&placement.rcNormalPosition,
@ -54,25 +58,26 @@ void SetPos(CefWindowHandle handle, int x, int y, int width, int height) {
placement.rcNormalPosition.right = window_rect.x + window_rect.width;
placement.rcNormalPosition.top = window_rect.y;
placement.rcNormalPosition.bottom = window_rect.y + window_rect.height;
::SetWindowPlacement(root_wnd, &placement);
::ShowWindow(root_wnd, SW_RESTORE);
::SetWindowPlacement(root_hwnd, &placement);
::ShowWindow(root_hwnd, SW_RESTORE);
} else {
// Set the window position.
::SetWindowPos(root_wnd, NULL, window_rect.x, window_rect.y,
::SetWindowPos(root_hwnd, NULL, window_rect.x, window_rect.y,
window_rect.width, window_rect.height, SWP_NOZORDER);
}
}
void Minimize(CefWindowHandle handle) {
Toggle(handle, SW_MINIMIZE);
void Minimize(CefRefPtr<CefBrowser> browser) {
Toggle(GetRootHwnd(browser), SW_MINIMIZE);
}
void Maximize(CefWindowHandle handle) {
Toggle(handle, SW_MAXIMIZE);
void Maximize(CefRefPtr<CefBrowser> browser) {
Toggle(GetRootHwnd(browser), SW_MAXIMIZE);
}
void Restore(CefWindowHandle handle) {
::ShowWindow(::GetAncestor(handle, GA_ROOT), SW_RESTORE);
void Restore(CefRefPtr<CefBrowser> browser) {
::ShowWindow(GetRootHwnd(browser), SW_RESTORE);
}
} // namespace window_test
} // namespace client