mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
Mac:
- Complete basic functionality in libcef. - Port cefclient and unittests. git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@135 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
94
cef.gyp
94
cef.gyp
@ -10,6 +10,7 @@
|
|||||||
{
|
{
|
||||||
'target_name': 'cefclient',
|
'target_name': 'cefclient',
|
||||||
'type': 'executable',
|
'type': 'executable',
|
||||||
|
'mac_bundle': 1,
|
||||||
'msvs_guid': '6617FED9-C5D4-4907-BF55-A90062A6683F',
|
'msvs_guid': '6617FED9-C5D4-4907-BF55-A90062A6683F',
|
||||||
'dependencies': [
|
'dependencies': [
|
||||||
'../third_party/npapi/npapi.gyp:npapi',
|
'../third_party/npapi/npapi.gyp:npapi',
|
||||||
@ -32,17 +33,29 @@
|
|||||||
'tests/cefclient/download_handler.h',
|
'tests/cefclient/download_handler.h',
|
||||||
'tests/cefclient/extension_test.cpp',
|
'tests/cefclient/extension_test.cpp',
|
||||||
'tests/cefclient/extension_test.h',
|
'tests/cefclient/extension_test.h',
|
||||||
'tests/cefclient/plugin_test.cpp',
|
|
||||||
'tests/cefclient/plugin_test.h',
|
|
||||||
'tests/cefclient/resource_util.h',
|
'tests/cefclient/resource_util.h',
|
||||||
'tests/cefclient/scheme_test.cpp',
|
'tests/cefclient/scheme_test.cpp',
|
||||||
'tests/cefclient/scheme_test.h',
|
'tests/cefclient/scheme_test.h',
|
||||||
'tests/cefclient/string_util.cpp',
|
'tests/cefclient/string_util.cpp',
|
||||||
'tests/cefclient/string_util.h',
|
'tests/cefclient/string_util.h',
|
||||||
'tests/cefclient/uiplugin_test.cpp',
|
|
||||||
'tests/cefclient/uiplugin_test.h',
|
|
||||||
'tests/cefclient/util.h',
|
'tests/cefclient/util.h',
|
||||||
],
|
],
|
||||||
|
'mac_bundle_resources': [
|
||||||
|
'tests/cefclient/mac/cefclient.icns',
|
||||||
|
'tests/cefclient/mac/data/',
|
||||||
|
'tests/cefclient/mac/English.lproj/InfoPlist.strings',
|
||||||
|
'tests/cefclient/mac/English.lproj/MainMenu.xib',
|
||||||
|
'tests/cefclient/mac/Info.plist',
|
||||||
|
],
|
||||||
|
'mac_bundle_resources!': [
|
||||||
|
# TODO(mark): Come up with a fancier way to do this (mac_info_plist?)
|
||||||
|
# that automatically sets the correct INFOPLIST_FILE setting and adds
|
||||||
|
# the file to a source group.
|
||||||
|
'tests/cefclient/mac/Info.plist',
|
||||||
|
],
|
||||||
|
'xcode_settings': {
|
||||||
|
'INFOPLIST_FILE': 'tests/cefclient/mac/Info.plist',
|
||||||
|
},
|
||||||
'conditions': [
|
'conditions': [
|
||||||
['OS=="win"', {
|
['OS=="win"', {
|
||||||
'msvs_settings': {
|
'msvs_settings': {
|
||||||
@ -67,6 +80,8 @@
|
|||||||
'tests/cefclient/cefclient_win.cpp',
|
'tests/cefclient/cefclient_win.cpp',
|
||||||
'tests/cefclient/clientplugin.cpp',
|
'tests/cefclient/clientplugin.cpp',
|
||||||
'tests/cefclient/clientplugin.h',
|
'tests/cefclient/clientplugin.h',
|
||||||
|
'tests/cefclient/plugin_test.cpp',
|
||||||
|
'tests/cefclient/plugin_test.h',
|
||||||
'tests/cefclient/Resource.h',
|
'tests/cefclient/Resource.h',
|
||||||
'tests/cefclient/res/cefclient.ico',
|
'tests/cefclient/res/cefclient.ico',
|
||||||
'tests/cefclient/res/logo.jpg',
|
'tests/cefclient/res/logo.jpg',
|
||||||
@ -77,6 +92,74 @@
|
|||||||
'tests/cefclient/string_util_win.cpp',
|
'tests/cefclient/string_util_win.cpp',
|
||||||
'tests/cefclient/uiplugin.cpp',
|
'tests/cefclient/uiplugin.cpp',
|
||||||
'tests/cefclient/uiplugin.h',
|
'tests/cefclient/uiplugin.h',
|
||||||
|
'tests/cefclient/uiplugin_test.cpp',
|
||||||
|
'tests/cefclient/uiplugin_test.h',
|
||||||
|
],
|
||||||
|
}],
|
||||||
|
[ 'OS=="mac"', {
|
||||||
|
'product_name': 'cefclient',
|
||||||
|
'variables': {
|
||||||
|
'repack_path': '../tools/data_pack/repack.py',
|
||||||
|
},
|
||||||
|
'actions': [
|
||||||
|
{
|
||||||
|
# TODO(mark): Make this work with more languages than the
|
||||||
|
# hardcoded en-US.
|
||||||
|
'action_name': 'repack_locale',
|
||||||
|
'variables': {
|
||||||
|
'pak_inputs': [
|
||||||
|
'<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_chromium_resources.pak',
|
||||||
|
'<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_strings_en-US.pak',
|
||||||
|
'<(SHARED_INTERMEDIATE_DIR)/webkit/webkit_resources.pak',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'inputs': [
|
||||||
|
'<(repack_path)',
|
||||||
|
'<@(pak_inputs)',
|
||||||
|
],
|
||||||
|
'outputs': [
|
||||||
|
'<(INTERMEDIATE_DIR)/repack/cefclient.pak',
|
||||||
|
],
|
||||||
|
'action': ['python', '<(repack_path)', '<@(_outputs)', '<@(pak_inputs)'],
|
||||||
|
'process_outputs_as_mac_bundle_resources': 1,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'copies': [
|
||||||
|
# TODO(ajwong): This, and the parallel chromium stanza below
|
||||||
|
# really should find a way to share file paths with
|
||||||
|
# ffmpeg.gyp so they don't diverge. (BUG=23602)
|
||||||
|
{
|
||||||
|
'destination': '<(PRODUCT_DIR)/cefclient.app/Contents/MacOS/',
|
||||||
|
'files': ['<(PRODUCT_DIR)/libffmpegsumo.dylib'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
# TODO(tony): We should have cefclient.app load plugins from
|
||||||
|
# <(PRODUCT_DIR)/plugins so we don't have this extra copy of
|
||||||
|
# the plugin.
|
||||||
|
'destination': '<(PRODUCT_DIR)/cefclient.app/Contents/PlugIns/',
|
||||||
|
'files': ['<(PRODUCT_DIR)/TestNetscapePlugIn.plugin/'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
# Add the WebCore resources to the bundle.
|
||||||
|
'destination': '<(PRODUCT_DIR)/cefclient.app/Contents/',
|
||||||
|
'files': ['../third_party/WebKit/WebCore/Resources/'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'link_settings': {
|
||||||
|
'libraries': [
|
||||||
|
'$(SDKROOT)/System/Library/Frameworks/AppKit.framework',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'sources': [
|
||||||
|
'tests/cefclient/cefclient_mac.mm',
|
||||||
|
'tests/cefclient/string_util_mac.h',
|
||||||
|
'tests/cefclient/string_util_mac.mm',
|
||||||
|
],
|
||||||
|
}],
|
||||||
|
[ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', {
|
||||||
|
'sources': [
|
||||||
|
'tests/cefclient/cefclient_gtk.cpp',
|
||||||
|
'tests/cefclient/string_util_gtk.cpp',
|
||||||
],
|
],
|
||||||
}],
|
}],
|
||||||
],
|
],
|
||||||
@ -461,6 +544,7 @@
|
|||||||
'libcef/browser_impl_win.cc',
|
'libcef/browser_impl_win.cc',
|
||||||
'libcef/browser_webkit_glue_win.cc',
|
'libcef/browser_webkit_glue_win.cc',
|
||||||
'libcef/browser_webview_delegate_win.cc',
|
'libcef/browser_webview_delegate_win.cc',
|
||||||
|
'libcef/cef_process_ui_thread_win.cc',
|
||||||
'libcef/printing/print_settings.cc',
|
'libcef/printing/print_settings.cc',
|
||||||
'libcef/printing/print_settings.h',
|
'libcef/printing/print_settings.h',
|
||||||
'libcef/printing/win_printing_context.cc',
|
'libcef/printing/win_printing_context.cc',
|
||||||
@ -478,6 +562,7 @@
|
|||||||
'libcef/browser_webview_delegate_mac.mm',
|
'libcef/browser_webview_delegate_mac.mm',
|
||||||
'libcef/browser_webview_mac.h',
|
'libcef/browser_webview_mac.h',
|
||||||
'libcef/browser_webview_mac.mm',
|
'libcef/browser_webview_mac.mm',
|
||||||
|
'libcef/cef_process_ui_thread_mac.mm',
|
||||||
'libcef/webview_host_mac.mm',
|
'libcef/webview_host_mac.mm',
|
||||||
'libcef/webwidget_host_mac.mm',
|
'libcef/webwidget_host_mac.mm',
|
||||||
],
|
],
|
||||||
@ -489,6 +574,7 @@
|
|||||||
'libcef/browser_impl_gtk.cc',
|
'libcef/browser_impl_gtk.cc',
|
||||||
'libcef/browser_webkit_glue_gtk.cc',
|
'libcef/browser_webkit_glue_gtk.cc',
|
||||||
'libcef/browser_webview_delegate_gtk.cc',
|
'libcef/browser_webview_delegate_gtk.cc',
|
||||||
|
'libcef/cef_process_ui_thread_gtk.cc',
|
||||||
'libcef/webview_host_gtk.cc',
|
'libcef/webview_host_gtk.cc',
|
||||||
'libcef/webwidget_host_gtk.cc',
|
'libcef/webwidget_host_gtk.cc',
|
||||||
],
|
],
|
||||||
|
@ -45,6 +45,9 @@ inline long CefAtomicDecrement(long volatile *pDest)
|
|||||||
return __sync_sub_and_fetch(pDest, 1);
|
return __sync_sub_and_fetch(pDest, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Window handle.
|
||||||
|
#define CefWindowHandle cef_window_handle_t
|
||||||
|
|
||||||
// Critical section wrapper.
|
// Critical section wrapper.
|
||||||
class CefCriticalSection
|
class CefCriticalSection
|
||||||
{
|
{
|
||||||
@ -100,12 +103,24 @@ public:
|
|||||||
|
|
||||||
void Init()
|
void Init()
|
||||||
{
|
{
|
||||||
|
m_View = NULL;
|
||||||
|
m_ParentView = NULL;
|
||||||
m_windowName = NULL;
|
m_windowName = NULL;
|
||||||
m_x = 0;
|
m_x = 0;
|
||||||
m_y = 0;
|
m_y = 0;
|
||||||
m_nWidth = 0;
|
m_nWidth = 0;
|
||||||
m_nHeight = 0;
|
m_nHeight = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetAsChild(CefWindowHandle ParentView, int x, int y, int width,
|
||||||
|
int height)
|
||||||
|
{
|
||||||
|
m_ParentView = ParentView;
|
||||||
|
m_x = x;
|
||||||
|
m_y = y;
|
||||||
|
m_nWidth = width;
|
||||||
|
m_nHeight = height;
|
||||||
|
}
|
||||||
|
|
||||||
CefWindowInfo& operator=(const CefWindowInfo& r)
|
CefWindowInfo& operator=(const CefWindowInfo& r)
|
||||||
{
|
{
|
||||||
@ -113,6 +128,8 @@ public:
|
|||||||
}
|
}
|
||||||
CefWindowInfo& operator=(const cef_window_info_t& r)
|
CefWindowInfo& operator=(const cef_window_info_t& r)
|
||||||
{
|
{
|
||||||
|
m_View = r.m_View;
|
||||||
|
m_ParentView = r.m_ParentView;
|
||||||
if(m_windowName)
|
if(m_windowName)
|
||||||
cef_string_free(m_windowName);
|
cef_string_free(m_windowName);
|
||||||
if(r.m_windowName)
|
if(r.m_windowName)
|
||||||
@ -166,8 +183,6 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Window handle.
|
|
||||||
#define CefWindowHandle cef_window_handle_t
|
|
||||||
#endif // defined(__APPLE__)
|
#endif // defined(__APPLE__)
|
||||||
|
|
||||||
#endif // _CEF_MAC_H
|
#endif // _CEF_MAC_H
|
||||||
|
@ -51,11 +51,11 @@ typedef struct _cef_window_info_t
|
|||||||
int m_nWidth;
|
int m_nWidth;
|
||||||
int m_nHeight;
|
int m_nHeight;
|
||||||
|
|
||||||
// NSWindow pointer for the parent window.
|
// NSView pointer for the parent view.
|
||||||
cef_window_handle_t m_ParentWindow;
|
cef_window_handle_t m_ParentView;
|
||||||
|
|
||||||
// NSWindow pointer for the new browser window.
|
// NSView pointer for the new browser view.
|
||||||
cef_window_handle_t m_Window;
|
cef_window_handle_t m_View;
|
||||||
} cef_window_info_t;
|
} cef_window_info_t;
|
||||||
|
|
||||||
// Class representing print context information.
|
// Class representing print context information.
|
||||||
|
@ -40,10 +40,6 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#ifndef min
|
|
||||||
#define min(a,b) ((a)<(b)?(a):(b))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// Thread safe class for representing XML data as a structured object. This
|
// Thread safe class for representing XML data as a structured object. This
|
||||||
// class should not be used with large XML documents because all data will be
|
// class should not be used with large XML documents because all data will be
|
||||||
|
@ -539,6 +539,25 @@ CefRefPtr<CefBrowser> CefBrowser::CreateBrowserSync(CefWindowInfo& windowInfo,
|
|||||||
return browser;
|
return browser;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CefBrowserImpl::UIT_DestroyBrowser()
|
||||||
|
{
|
||||||
|
if(handler_.get()) {
|
||||||
|
// Notify the handler that the window is about to be closed.
|
||||||
|
handler_->HandleBeforeWindowClose(this);
|
||||||
|
}
|
||||||
|
GetWebViewDelegate()->RevokeDragDrop();
|
||||||
|
|
||||||
|
// Clean up anything associated with the WebViewHost widget.
|
||||||
|
GetWebViewHost()->webwidget()->close();
|
||||||
|
webviewhost_.reset();
|
||||||
|
|
||||||
|
// Remove the reference added in UIT_CreateBrowser().
|
||||||
|
Release();
|
||||||
|
|
||||||
|
// Remove the browser from the list maintained by the context.
|
||||||
|
_Context->RemoveBrowser(this);
|
||||||
|
}
|
||||||
|
|
||||||
void CefBrowserImpl::UIT_LoadURL(CefFrame* frame,
|
void CefBrowserImpl::UIT_LoadURL(CefFrame* frame,
|
||||||
const std::wstring& url)
|
const std::wstring& url)
|
||||||
{
|
{
|
||||||
|
@ -160,6 +160,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void UIT_CreateBrowser(const std::wstring& url);
|
void UIT_CreateBrowser(const std::wstring& url);
|
||||||
|
void UIT_DestroyBrowser();
|
||||||
|
|
||||||
void UIT_LoadURL(CefFrame* frame,
|
void UIT_LoadURL(CefFrame* frame,
|
||||||
const std::wstring& url);
|
const std::wstring& url);
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "cef_context.h"
|
#include "cef_context.h"
|
||||||
#include "browser_impl.h"
|
#include "browser_impl.h"
|
||||||
|
#include "browser_webview_mac.h"
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
@ -20,36 +21,38 @@ using WebKit::WebSize;
|
|||||||
CefWindowHandle CefBrowserImpl::GetWindowHandle()
|
CefWindowHandle CefBrowserImpl::GetWindowHandle()
|
||||||
{
|
{
|
||||||
Lock();
|
Lock();
|
||||||
CefWindowHandle handle = window_info_.m_Window;
|
CefWindowHandle handle = window_info_.m_View;
|
||||||
Unlock();
|
Unlock();
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
gfx::NativeWindow CefBrowserImpl::GetMainWndHandle() const {
|
gfx::NativeWindow CefBrowserImpl::GetMainWndHandle() const {
|
||||||
return (NSWindow*)window_info_.m_Window;
|
return (NSWindow*)window_info_.m_View;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CefBrowserImpl::UIT_CreateBrowser(const std::wstring& url)
|
void CefBrowserImpl::UIT_CreateBrowser(const std::wstring& url)
|
||||||
{
|
{
|
||||||
REQUIRE_UIT();
|
REQUIRE_UIT();
|
||||||
|
|
||||||
// Create the new browser window
|
// Add a reference that will be released in UIT_DestroyBrowser().
|
||||||
// TODO(port): Add implementation.
|
|
||||||
|
|
||||||
// Add a reference that will be released on WM_DESTROY.
|
|
||||||
AddRef();
|
AddRef();
|
||||||
|
|
||||||
// Add the new browser to the list maintained by the context
|
// Add the new browser to the list maintained by the context
|
||||||
_Context->AddBrowser(this);
|
_Context->AddBrowser(this);
|
||||||
|
|
||||||
|
NSView* parentView = (NSView*)window_info_.m_ParentView;
|
||||||
|
gfx::Rect contentRect(window_info_.m_x, window_info_.m_y,
|
||||||
|
window_info_.m_nWidth, window_info_.m_nHeight);
|
||||||
|
|
||||||
// Create the webview host object
|
// Create the webview host object
|
||||||
webviewhost_.reset(
|
webviewhost_.reset(
|
||||||
WebViewHost::Create([GetMainWndHandle() contentView], delegate_.get(),
|
WebViewHost::Create(parentView, contentRect, delegate_.get(),
|
||||||
NULL, *_Context->web_preferences()));
|
NULL, *_Context->web_preferences()));
|
||||||
delegate_->RegisterDragDrop();
|
delegate_->RegisterDragDrop();
|
||||||
|
|
||||||
// Size the web view window to the browser window
|
BrowserWebView* browserView = (BrowserWebView*)webviewhost_->view_handle();
|
||||||
// TODO(port): Add implementation.
|
browserView.browser = this;
|
||||||
|
window_info_.m_View = (void*)browserView;
|
||||||
|
|
||||||
if(handler_.get()) {
|
if(handler_.get()) {
|
||||||
// Notify the handler that we're done creating the new window
|
// Notify the handler that we're done creating the new window
|
||||||
@ -68,8 +71,13 @@ void CefBrowserImpl::UIT_SetFocus(WebWidgetHost* host, bool enable)
|
|||||||
REQUIRE_UIT();
|
REQUIRE_UIT();
|
||||||
if (!host)
|
if (!host)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
NSView* view = host->view_handle();
|
||||||
|
if (!view)
|
||||||
|
return;
|
||||||
|
|
||||||
// TODO(port): Add implementation.
|
if (enable)
|
||||||
|
[[view window] makeFirstResponder:view];
|
||||||
}
|
}
|
||||||
|
|
||||||
WebKit::WebWidget* CefBrowserImpl::UIT_CreatePopupWidget()
|
WebKit::WebWidget* CefBrowserImpl::UIT_CreatePopupWidget()
|
||||||
|
@ -46,26 +46,12 @@ LRESULT CALLBACK CefBrowserImpl::WndProc(HWND hwnd, UINT message,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
if (browser)
|
if (browser) {
|
||||||
{
|
|
||||||
CefRefPtr<CefHandler> handler = browser->GetHandler();
|
|
||||||
if(handler.get()) {
|
|
||||||
// Notify the handler that the window is about to be closed
|
|
||||||
handler->HandleBeforeWindowClose(browser);
|
|
||||||
}
|
|
||||||
browser->GetWebViewDelegate()->RevokeDragDrop();
|
|
||||||
|
|
||||||
// Clean up anything associated with the WebViewHost widget.
|
|
||||||
browser->GetWebViewHost()->webwidget()->close();
|
|
||||||
browser->webviewhost_.reset();
|
|
||||||
|
|
||||||
// Clear the user data pointer.
|
// Clear the user data pointer.
|
||||||
win_util::SetWindowUserData(hwnd, NULL);
|
win_util::SetWindowUserData(hwnd, NULL);
|
||||||
// Remove the reference added in UIT_CreateBrowser().
|
|
||||||
browser->Release();
|
|
||||||
|
|
||||||
// Remove the browser from the list maintained by the context
|
// Destroy the browser.
|
||||||
_Context->RemoveBrowser(browser);
|
browser->UIT_DestroyBrowser();
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -123,7 +109,8 @@ void CefBrowserImpl::UIT_CreateBrowser(const std::wstring& url)
|
|||||||
// Set window user data to this object for future reference from the window
|
// Set window user data to this object for future reference from the window
|
||||||
// procedure
|
// procedure
|
||||||
win_util::SetWindowUserData(window_info_.m_hWnd, this);
|
win_util::SetWindowUserData(window_info_.m_hWnd, this);
|
||||||
// Add a reference that will be released on WM_DESTROY.
|
|
||||||
|
// Add a reference that will be released in UIT_DestroyBrowser().
|
||||||
AddRef();
|
AddRef();
|
||||||
|
|
||||||
// Add the new browser to the list maintained by the context
|
// Add the new browser to the list maintained by the context
|
||||||
@ -131,8 +118,8 @@ void CefBrowserImpl::UIT_CreateBrowser(const std::wstring& url)
|
|||||||
|
|
||||||
// Create the webview host object
|
// Create the webview host object
|
||||||
webviewhost_.reset(
|
webviewhost_.reset(
|
||||||
WebViewHost::Create(window_info_.m_hWnd, delegate_.get(), NULL,
|
WebViewHost::Create(window_info_.m_hWnd, gfx::Rect(), delegate_.get(),
|
||||||
*_Context->web_preferences()));
|
NULL, *_Context->web_preferences()));
|
||||||
delegate_->RegisterDragDrop();
|
delegate_->RegisterDragDrop();
|
||||||
|
|
||||||
// Size the web view window to the browser window
|
// Size the web view window to the browser window
|
||||||
|
@ -26,6 +26,10 @@ void CaptureWebViewBitmap(HWND mainWnd, WebKit::WebView* webview,
|
|||||||
// Save a bitmap image to file, providing optional alternative data in |lpBits|
|
// Save a bitmap image to file, providing optional alternative data in |lpBits|
|
||||||
BOOL SaveBitmapToFile(HBITMAP hBmp, HDC hDC, LPCTSTR file, LPBYTE lpBits);
|
BOOL SaveBitmapToFile(HBITMAP hBmp, HDC hDC, LPCTSTR file, LPBYTE lpBits);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(OS_MACOSX)
|
||||||
|
void InitializeDataPak();
|
||||||
|
#endif
|
||||||
|
|
||||||
// Text encoding objects must be initialized on the main thread.
|
// Text encoding objects must be initialized on the main thread.
|
||||||
void InitializeTextEncoding();
|
void InitializeTextEncoding();
|
||||||
|
@ -24,6 +24,17 @@ namespace webkit_glue {
|
|||||||
// Data pack resource. This is a pointer to the mmapped resources file.
|
// Data pack resource. This is a pointer to the mmapped resources file.
|
||||||
static base::DataPack* g_resource_data_pack = NULL;
|
static base::DataPack* g_resource_data_pack = NULL;
|
||||||
|
|
||||||
|
void InitializeDataPak() {
|
||||||
|
// mmap the data pack which holds strings used by WebCore.
|
||||||
|
// TODO(port): Allow the embedder to customize the pak name.
|
||||||
|
g_resource_data_pack = new base::DataPack;
|
||||||
|
NSString *resource_path =
|
||||||
|
[mac_util::MainAppBundle() pathForResource:@"cefclient" ofType:@"pak"];
|
||||||
|
FilePath resources_pak_path([resource_path fileSystemRepresentation]);
|
||||||
|
if (!g_resource_data_pack->Load(resources_pak_path))
|
||||||
|
LOG(FATAL) << "failed to load cefclient.pak";
|
||||||
|
}
|
||||||
|
|
||||||
// Helper method for getting the path to the CEF resources directory.
|
// Helper method for getting the path to the CEF resources directory.
|
||||||
FilePath GetResourcesFilePath() {
|
FilePath GetResourcesFilePath() {
|
||||||
FilePath path;
|
FilePath path;
|
||||||
@ -33,10 +44,13 @@ FilePath GetResourcesFilePath() {
|
|||||||
path = path.Append(FilePath::kParentDirectory);
|
path = path.Append(FilePath::kParentDirectory);
|
||||||
return path.AppendASCII("Resources");
|
return path.AppendASCII("Resources");
|
||||||
} else {
|
} else {
|
||||||
|
// TODO(port): Allow the embedder to customize the resource path.
|
||||||
PathService::Get(base::DIR_SOURCE_ROOT, &path);
|
PathService::Get(base::DIR_SOURCE_ROOT, &path);
|
||||||
path = path.AppendASCII("src");
|
path = path.AppendASCII("src");
|
||||||
path = path.AppendASCII("cef");
|
path = path.AppendASCII("cef");
|
||||||
return path.AppendASCII("resources");
|
path = path.AppendASCII("tests");
|
||||||
|
path = path.AppendASCII("cefclient");
|
||||||
|
return path.AppendASCII("res");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,13 +198,14 @@ void BrowserWebViewDelegate::DidMovePlugin(
|
|||||||
void BrowserWebViewDelegate::ShowJavaScriptAlert(
|
void BrowserWebViewDelegate::ShowJavaScriptAlert(
|
||||||
WebKit::WebFrame* webframe, const std::wstring& message) {
|
WebKit::WebFrame* webframe, const std::wstring& message) {
|
||||||
NSString *text =
|
NSString *text =
|
||||||
[NSString stringWithUTF8String:WideToUTF8(message).c_str()];
|
[NSString stringWithUTF8String:WideToUTF8(message).c_str()];
|
||||||
NSAlert *alert = [NSAlert alertWithMessageText:@"JavaScript Alert"
|
NSAlert *alert = [NSAlert alertWithMessageText:@"JavaScript Alert"
|
||||||
defaultButton:@"OK"
|
defaultButton:@"OK"
|
||||||
alternateButton:nil
|
alternateButton:nil
|
||||||
otherButton:nil
|
otherButton:nil
|
||||||
informativeTextWithFormat:text];
|
informativeTextWithFormat:text];
|
||||||
[alert runModal];
|
[alert runModal];
|
||||||
|
[text release];
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BrowserWebViewDelegate::ShowJavaScriptConfirm(
|
bool BrowserWebViewDelegate::ShowJavaScriptConfirm(
|
||||||
|
@ -15,12 +15,6 @@ class CefBrowserImpl;
|
|||||||
NSTrackingArea *trackingArea_;
|
NSTrackingArea *trackingArea_;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)goBack:(id)sender;
|
|
||||||
- (IBAction)goForward:(id)sender;
|
|
||||||
- (IBAction)reload:(id)sender;
|
|
||||||
- (IBAction)stopLoading:(id)sender;
|
|
||||||
- (IBAction)takeURLStringValueFrom:(NSTextField *)sender;
|
|
||||||
|
|
||||||
- (void)mouseDown:(NSEvent *)theEvent;
|
- (void)mouseDown:(NSEvent *)theEvent;
|
||||||
- (void)rightMouseDown:(NSEvent *)theEvent;
|
- (void)rightMouseDown:(NSEvent *)theEvent;
|
||||||
- (void)otherMouseDown:(NSEvent *)theEvent;
|
- (void)otherMouseDown:(NSEvent *)theEvent;
|
||||||
@ -38,7 +32,6 @@ class CefBrowserImpl;
|
|||||||
- (void)keyUp:(NSEvent *)theEvent;
|
- (void)keyUp:(NSEvent *)theEvent;
|
||||||
- (BOOL)isOpaque;
|
- (BOOL)isOpaque;
|
||||||
- (void)setFrame:(NSRect)frameRect;
|
- (void)setFrame:(NSRect)frameRect;
|
||||||
- (void)setIsActive:(BOOL)active;
|
|
||||||
|
|
||||||
@property (nonatomic, assign) CefBrowserImpl *browser;
|
@property (nonatomic, assign) CefBrowserImpl *browser;
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
#include "browser_impl.h"
|
#include "browser_impl.h"
|
||||||
|
#include "cef_context.h"
|
||||||
#include "webwidget_host.h"
|
#include "webwidget_host.h"
|
||||||
|
|
||||||
#include "base/scoped_ptr.h"
|
#include "base/scoped_ptr.h"
|
||||||
@ -35,9 +36,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void) dealloc {
|
- (void) dealloc {
|
||||||
|
browser_->UIT_DestroyBrowser();
|
||||||
|
|
||||||
[self removeTrackingArea:trackingArea_];
|
[self removeTrackingArea:trackingArea_];
|
||||||
[trackingArea_ release];
|
[trackingArea_ release];
|
||||||
|
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,37 +64,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)goBack:(id)sender {
|
|
||||||
if (browser_)
|
|
||||||
browser_->UIT_GoBackOrForward(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (IBAction)goForward:(id)sender {
|
|
||||||
if (browser_)
|
|
||||||
browser_->UIT_GoBackOrForward(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (IBAction)reload:(id)sender {
|
|
||||||
if (browser_)
|
|
||||||
browser_->UIT_Reload(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (IBAction)stopLoading:(id)sender {
|
|
||||||
if (browser_ && browser_->GetWebView())
|
|
||||||
browser_->GetWebView()->mainFrame()->stopLoading();
|
|
||||||
}
|
|
||||||
|
|
||||||
- (IBAction)takeURLStringValueFrom:(NSTextField *)sender {
|
|
||||||
NSString *url = [sender stringValue];
|
|
||||||
|
|
||||||
// if it doesn't already have a prefix, add http. If we can't parse it,
|
|
||||||
// just don't bother rather than making things worse.
|
|
||||||
NSURL* tempUrl = [NSURL URLWithString:url];
|
|
||||||
if (tempUrl && ![tempUrl scheme])
|
|
||||||
url = [@"http://" stringByAppendingString:url];
|
|
||||||
browser_->LoadURL(browser_->GetMainFrame(), UTF8ToWide([url UTF8String]));
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)mouseDown:(NSEvent *)theEvent {
|
- (void)mouseDown:(NSEvent *)theEvent {
|
||||||
if (browser_ && browser_->GetWebView())
|
if (browser_ && browser_->GetWebView())
|
||||||
browser_->GetWebViewHost()->MouseEvent(theEvent);
|
browser_->GetWebViewHost()->MouseEvent(theEvent);
|
||||||
@ -197,11 +169,6 @@
|
|||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setIsActive:(BOOL)active {
|
|
||||||
if (browser_ && browser_->GetWebView())
|
|
||||||
browser_->GetWebViewHost()->SetIsActive(active ? true : false);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)setFrame:(NSRect)frameRect {
|
- (void)setFrame:(NSRect)frameRect {
|
||||||
[super setFrame:frameRect];
|
[super setFrame:frameRect];
|
||||||
if (browser_ && browser_->GetWebView())
|
if (browser_ && browser_->GetWebView())
|
||||||
|
@ -4,9 +4,6 @@
|
|||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "cef_process_ui_thread.h"
|
#include "cef_process_ui_thread.h"
|
||||||
#include "browser_impl.h"
|
|
||||||
#include "browser_resource_loader_bridge.h"
|
|
||||||
#include "browser_request_context.h"
|
|
||||||
#include "browser_webkit_glue.h"
|
#include "browser_webkit_glue.h"
|
||||||
#include "browser_webkit_init.h"
|
#include "browser_webkit_init.h"
|
||||||
#include "cef_context.h"
|
#include "cef_context.h"
|
||||||
@ -66,38 +63,7 @@ CefProcessUIThread::~CefProcessUIThread() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CefProcessUIThread::Init() {
|
void CefProcessUIThread::Init() {
|
||||||
#if defined(OS_WIN)
|
PlatformInit();
|
||||||
HRESULT res;
|
|
||||||
|
|
||||||
// Initialize common controls
|
|
||||||
res = CoInitialize(NULL);
|
|
||||||
DCHECK(SUCCEEDED(res));
|
|
||||||
INITCOMMONCONTROLSEX InitCtrlEx;
|
|
||||||
InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
|
|
||||||
InitCtrlEx.dwICC = ICC_STANDARD_CLASSES;
|
|
||||||
InitCommonControlsEx(&InitCtrlEx);
|
|
||||||
|
|
||||||
// Start COM stuff
|
|
||||||
res = OleInitialize(NULL);
|
|
||||||
DCHECK(SUCCEEDED(res));
|
|
||||||
|
|
||||||
// Register the window class
|
|
||||||
WNDCLASSEX wcex = {
|
|
||||||
/* cbSize = */ sizeof(WNDCLASSEX),
|
|
||||||
/* style = */ CS_HREDRAW | CS_VREDRAW,
|
|
||||||
/* lpfnWndProc = */ CefBrowserImpl::WndProc,
|
|
||||||
/* cbClsExtra = */ 0,
|
|
||||||
/* cbWndExtra = */ 0,
|
|
||||||
/* hInstance = */ ::GetModuleHandle(NULL),
|
|
||||||
/* hIcon = */ NULL,
|
|
||||||
/* hCursor = */ LoadCursor(NULL, IDC_ARROW),
|
|
||||||
/* hbrBackground = */ 0,
|
|
||||||
/* lpszMenuName = */ NULL,
|
|
||||||
/* lpszClassName = */ CefBrowserImpl::GetWndClass(),
|
|
||||||
/* hIconSm = */ NULL,
|
|
||||||
};
|
|
||||||
RegisterClassEx(&wcex);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _DEBUG
|
#ifndef _DEBUG
|
||||||
// Only log error messages and above in release build.
|
// Only log error messages and above in release build.
|
||||||
@ -167,12 +133,5 @@ void CefProcessUIThread::CleanUp() {
|
|||||||
delete webkit_init_;
|
delete webkit_init_;
|
||||||
webkit_init_ = NULL;
|
webkit_init_ = NULL;
|
||||||
|
|
||||||
#if defined(OS_WIN)
|
PlatformCleanUp();
|
||||||
// Uninitialize COM stuff
|
|
||||||
OleUninitialize();
|
|
||||||
|
|
||||||
// Closes the COM library on the current thread. CoInitialize must
|
|
||||||
// be balanced by a corresponding call to CoUninitialize.
|
|
||||||
CoUninitialize();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,9 @@ class CefProcessUIThread : public CefThread {
|
|||||||
virtual void CleanUp();
|
virtual void CleanUp();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void PlatformInit();
|
||||||
|
void PlatformCleanUp();
|
||||||
|
|
||||||
base::StatsTable* statstable_;
|
base::StatsTable* statstable_;
|
||||||
|
|
||||||
// WebKit implementation class.
|
// WebKit implementation class.
|
||||||
|
51
libcef/cef_process_ui_thread_mac.mm
Normal file
51
libcef/cef_process_ui_thread_mac.mm
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
// Copyright (c) 2010 The Chromium Embedded Framework Authors.
|
||||||
|
// Portions copyright (c) 2010 The Chromium Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "include/cef.h"
|
||||||
|
#include "cef_process_ui_thread.h"
|
||||||
|
#include "browser_webkit_glue.h"
|
||||||
|
#include "base/chrome_application_mac.h"
|
||||||
|
#include "third_party/WebKit/WebKit/mac/WebCoreSupport/WebSystemInterface.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
// Memory autorelease pool.
|
||||||
|
NSAutoreleasePool* g_autopool;
|
||||||
|
|
||||||
|
void RunLoopObserver(CFRunLoopObserverRef observer, CFRunLoopActivity activity,
|
||||||
|
void* info)
|
||||||
|
{
|
||||||
|
CefDoMessageLoopWork();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
void CefProcessUIThread::PlatformInit() {
|
||||||
|
// Initialize the CrApplication instance.
|
||||||
|
[CrApplication sharedApplication];
|
||||||
|
g_autopool = [[NSAutoreleasePool alloc] init];
|
||||||
|
|
||||||
|
InitWebCoreSystemInterface();
|
||||||
|
|
||||||
|
// Register the run loop observer.
|
||||||
|
CFRunLoopObserverRef observer =
|
||||||
|
CFRunLoopObserverCreate(NULL,
|
||||||
|
kCFRunLoopBeforeTimers | kCFRunLoopBeforeWaiting,
|
||||||
|
YES, /* repeat */
|
||||||
|
0,
|
||||||
|
&RunLoopObserver,
|
||||||
|
NULL);
|
||||||
|
if (observer) {
|
||||||
|
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer,
|
||||||
|
kCFRunLoopCommonModes);
|
||||||
|
}
|
||||||
|
|
||||||
|
webkit_glue::InitializeDataPak();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CefProcessUIThread::PlatformCleanUp() {
|
||||||
|
[g_autopool release];
|
||||||
|
}
|
||||||
|
|
52
libcef/cef_process_ui_thread_win.cc
Normal file
52
libcef/cef_process_ui_thread_win.cc
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
// Copyright (c) 2010 The Chromium Embedded Framework Authors.
|
||||||
|
// Portions copyright (c) 2010 The Chromium Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "cef_process_ui_thread.h"
|
||||||
|
#include "browser_impl.h"
|
||||||
|
#include <commctrl.h>
|
||||||
|
#include <Objbase.h>
|
||||||
|
|
||||||
|
void CefProcessUIThread::PlatformInit() {
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
|
// Initialize common controls
|
||||||
|
res = CoInitialize(NULL);
|
||||||
|
DCHECK(SUCCEEDED(res));
|
||||||
|
INITCOMMONCONTROLSEX InitCtrlEx;
|
||||||
|
InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
|
||||||
|
InitCtrlEx.dwICC = ICC_STANDARD_CLASSES;
|
||||||
|
InitCommonControlsEx(&InitCtrlEx);
|
||||||
|
|
||||||
|
// Start COM stuff
|
||||||
|
res = OleInitialize(NULL);
|
||||||
|
DCHECK(SUCCEEDED(res));
|
||||||
|
|
||||||
|
// Register the window class
|
||||||
|
WNDCLASSEX wcex = {
|
||||||
|
/* cbSize = */ sizeof(WNDCLASSEX),
|
||||||
|
/* style = */ CS_HREDRAW | CS_VREDRAW,
|
||||||
|
/* lpfnWndProc = */ CefBrowserImpl::WndProc,
|
||||||
|
/* cbClsExtra = */ 0,
|
||||||
|
/* cbWndExtra = */ 0,
|
||||||
|
/* hInstance = */ ::GetModuleHandle(NULL),
|
||||||
|
/* hIcon = */ NULL,
|
||||||
|
/* hCursor = */ LoadCursor(NULL, IDC_ARROW),
|
||||||
|
/* hbrBackground = */ 0,
|
||||||
|
/* lpszMenuName = */ NULL,
|
||||||
|
/* lpszClassName = */ CefBrowserImpl::GetWndClass(),
|
||||||
|
/* hIconSm = */ NULL,
|
||||||
|
};
|
||||||
|
RegisterClassEx(&wcex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CefProcessUIThread::PlatformCleanUp() {
|
||||||
|
// Uninitialize COM stuff
|
||||||
|
OleUninitialize();
|
||||||
|
|
||||||
|
// Closes the COM library on the current thread. CoInitialize must
|
||||||
|
// be balanced by a corresponding call to CoUninitialize.
|
||||||
|
CoUninitialize();
|
||||||
|
}
|
||||||
|
|
@ -58,16 +58,19 @@ static void TrackDestructor(v8::Persistent<v8::Value> object,
|
|||||||
// Convert a wide string to a V8 string.
|
// Convert a wide string to a V8 string.
|
||||||
static v8::Handle<v8::String> GetV8String(const std::wstring& str)
|
static v8::Handle<v8::String> GetV8String(const std::wstring& str)
|
||||||
{
|
{
|
||||||
return v8::String::New(
|
std::string tmpStr = WideToUTF8(str);
|
||||||
reinterpret_cast<const uint16_t*>(str.c_str()), str.length());
|
return v8::String::New(tmpStr.c_str(), tmpStr.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert a V8 string to a wide string.
|
// Convert a V8 string to a wide string.
|
||||||
static std::wstring GetWString(v8::Handle<v8::String> str)
|
static std::wstring GetWString(v8::Handle<v8::String> str)
|
||||||
{
|
{
|
||||||
uint16_t* buf = new uint16_t[str->Length()+1];
|
// Allocate enough space for a worst-case conversion.
|
||||||
str->Write(buf);
|
size_t len = str->Length()*4;
|
||||||
std::wstring value = reinterpret_cast<wchar_t*>(buf);
|
char* buf = new char[len];
|
||||||
|
int newlen = str->WriteUtf8(buf, len);
|
||||||
|
std::wstring value;
|
||||||
|
UTF8ToWide(buf, newlen, &value);
|
||||||
delete [] buf;
|
delete [] buf;
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
#define _WEBVIEW_HOST_H
|
#define _WEBVIEW_HOST_H
|
||||||
|
|
||||||
#include "base/basictypes.h"
|
#include "base/basictypes.h"
|
||||||
#include "gfx/rect.h"
|
|
||||||
#include "gfx/native_widget_types.h"
|
#include "gfx/native_widget_types.h"
|
||||||
#include "webwidget_host.h"
|
#include "webwidget_host.h"
|
||||||
|
|
||||||
@ -29,6 +28,7 @@ class WebViewHost : public WebWidgetHost {
|
|||||||
// The newly created window should be resized after it is created, using the
|
// The newly created window should be resized after it is created, using the
|
||||||
// MoveWindow (or equivalent) function.
|
// MoveWindow (or equivalent) function.
|
||||||
static WebViewHost* Create(gfx::NativeView parent_view,
|
static WebViewHost* Create(gfx::NativeView parent_view,
|
||||||
|
const gfx::Rect& rect,
|
||||||
BrowserWebViewDelegate* delegate,
|
BrowserWebViewDelegate* delegate,
|
||||||
WebKit::WebDevToolsAgentClient* devtools_client,
|
WebKit::WebDevToolsAgentClient* devtools_client,
|
||||||
const WebPreferences& prefs);
|
const WebPreferences& prefs);
|
||||||
|
@ -21,17 +21,13 @@ using WebKit::WebView;
|
|||||||
|
|
||||||
// static
|
// static
|
||||||
WebViewHost* WebViewHost::Create(NSView* parent_view,
|
WebViewHost* WebViewHost::Create(NSView* parent_view,
|
||||||
|
const gfx::Rect& rect,
|
||||||
BrowserWebViewDelegate* delegate,
|
BrowserWebViewDelegate* delegate,
|
||||||
WebDevToolsAgentClient* dev_tools_client,
|
WebDevToolsAgentClient* dev_tools_client,
|
||||||
const WebPreferences& prefs) {
|
const WebPreferences& prefs) {
|
||||||
WebViewHost* host = new WebViewHost();
|
WebViewHost* host = new WebViewHost();
|
||||||
|
|
||||||
NSRect content_rect = [parent_view frame];
|
NSRect content_rect = {{rect.x(), rect.y()}, {rect.width(), rect.height()}};
|
||||||
// bump down the top of the view so that it doesn't overlap the buttons
|
|
||||||
// and URL field. 32 is an ad hoc constant.
|
|
||||||
// TODO(awalker): replace explicit view layout with a little nib file
|
|
||||||
// and use that for view geometry.
|
|
||||||
content_rect.size.height -= 32;
|
|
||||||
host->view_ = [[BrowserWebView alloc] initWithFrame:content_rect];
|
host->view_ = [[BrowserWebView alloc] initWithFrame:content_rect];
|
||||||
// make the height and width track the window size.
|
// make the height and width track the window size.
|
||||||
[host->view_ setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
|
[host->view_ setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
|
||||||
|
@ -17,6 +17,7 @@ static const wchar_t kWindowClassName[] = L"WebViewHost";
|
|||||||
|
|
||||||
/*static*/
|
/*static*/
|
||||||
WebViewHost* WebViewHost::Create(HWND parent_view,
|
WebViewHost* WebViewHost::Create(HWND parent_view,
|
||||||
|
const gfx::Rect&,
|
||||||
BrowserWebViewDelegate* delegate,
|
BrowserWebViewDelegate* delegate,
|
||||||
WebDevToolsAgentClient* dev_tools_client,
|
WebDevToolsAgentClient* dev_tools_client,
|
||||||
const WebPreferences& prefs) {
|
const WebPreferences& prefs) {
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace gfx {
|
namespace gfx {
|
||||||
|
class Rect;
|
||||||
class Size;
|
class Size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,13 +35,9 @@ WebWidgetHost* WebWidgetHost::Create(NSView* parent_view,
|
|||||||
WebWidgetHost* host = new WebWidgetHost();
|
WebWidgetHost* host = new WebWidgetHost();
|
||||||
|
|
||||||
NSRect content_rect = [parent_view frame];
|
NSRect content_rect = [parent_view frame];
|
||||||
content_rect.origin.y += 64;
|
|
||||||
content_rect.size.height -= 64;
|
|
||||||
host->view_ = [[NSView alloc] initWithFrame:content_rect];
|
host->view_ = [[NSView alloc] initWithFrame:content_rect];
|
||||||
[parent_view addSubview:host->view_];
|
[parent_view addSubview:host->view_];
|
||||||
|
|
||||||
// win_util::SetWindowUserData(host->hwnd_, host);
|
|
||||||
|
|
||||||
host->webwidget_ = WebPopupMenu::create(client);
|
host->webwidget_ = WebPopupMenu::create(client);
|
||||||
host->webwidget_->resize(WebSize(content_rect.size.width,
|
host->webwidget_->resize(WebSize(content_rect.size.width,
|
||||||
content_rect.size.height));
|
content_rect.size.height));
|
||||||
@ -137,9 +133,6 @@ void WebWidgetHost::ScheduleComposite() {
|
|||||||
[view_ setNeedsDisplayInRect:r];
|
[view_ setNeedsDisplayInRect:r];
|
||||||
}
|
}
|
||||||
|
|
||||||
// void WebWidgetHost::SetCursor(HCURSOR cursor) {
|
|
||||||
// }
|
|
||||||
|
|
||||||
void WebWidgetHost::DiscardBackingStore() {
|
void WebWidgetHost::DiscardBackingStore() {
|
||||||
canvas_.reset();
|
canvas_.reset();
|
||||||
}
|
}
|
||||||
@ -153,9 +146,6 @@ WebWidgetHost::WebWidgetHost()
|
|||||||
}
|
}
|
||||||
|
|
||||||
WebWidgetHost::~WebWidgetHost() {
|
WebWidgetHost::~WebWidgetHost() {
|
||||||
// win_util::SetWindowUserData(hwnd_, 0);
|
|
||||||
|
|
||||||
webwidget_->close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebWidgetHost::UpdatePaintRect(const gfx::Rect& rect) {
|
void WebWidgetHost::UpdatePaintRect(const gfx::Rect& rect) {
|
||||||
@ -225,7 +215,7 @@ void WebWidgetHost::Paint() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebWidgetHost::SetTooltipText(const std::wstring& tooltip_text) {
|
void WebWidgetHost::SetTooltipText(const std::wstring& tooltip_text) {
|
||||||
NOTIMPLEMENTED();
|
// TODO(port): Implement this method.
|
||||||
}
|
}
|
||||||
|
|
||||||
WebScreenInfo WebWidgetHost::GetScreenInfo() {
|
WebScreenInfo WebWidgetHost::GetScreenInfo() {
|
||||||
|
@ -40,13 +40,13 @@ public:
|
|||||||
bool VerifyContext();
|
bool VerifyContext();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
PlatformThreadId supported_thread_id_;
|
||||||
unzFile reader_;
|
unzFile reader_;
|
||||||
bool has_fileopen_;
|
bool has_fileopen_;
|
||||||
bool has_fileinfo_;
|
bool has_fileinfo_;
|
||||||
std::wstring filename_;
|
std::wstring filename_;
|
||||||
long filesize_;
|
long filesize_;
|
||||||
time_t filemodified_;
|
time_t filemodified_;
|
||||||
PlatformThreadId supported_thread_id_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _ZIP_READER_IMPL_H
|
#endif // _ZIP_READER_IMPL_H
|
||||||
|
@ -164,4 +164,4 @@ CEF_EXPORT int cef_post_delayed_task(cef_thread_id_t threadId,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return CefPostDelayedTask(threadId, CefTaskCToCpp::Wrap(task), delay_ms);
|
return CefPostDelayedTask(threadId, CefTaskCToCpp::Wrap(task), delay_ms);
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ size_t CefByteReadHandler::Read(void* ptr, size_t size, size_t n)
|
|||||||
{
|
{
|
||||||
Lock();
|
Lock();
|
||||||
size_t s = (size_ - offset_) / size;
|
size_t s = (size_ - offset_) / size;
|
||||||
size_t ret = min(n, s);
|
size_t ret = std::min(n, s);
|
||||||
memcpy(ptr, bytes_ + offset_, ret * size);
|
memcpy(ptr, bytes_ + offset_, ret * size);
|
||||||
offset_ += ret * size;
|
offset_ += ret * size;
|
||||||
Unlock();
|
Unlock();
|
||||||
|
@ -104,7 +104,7 @@ public:
|
|||||||
cur_object->GetName() != reader->GetQualifiedName()) {
|
cur_object->GetName() != reader->GetQualifiedName()) {
|
||||||
// Open tag without close tag or close tag without open tag should
|
// Open tag without close tag or close tag without open tag should
|
||||||
// never occur (the parser catches this error).
|
// never occur (the parser catches this error).
|
||||||
DCHECK(FALSE);
|
DCHECK(false);
|
||||||
std::wstringstream ss;
|
std::wstringstream ss;
|
||||||
ss << L"Mismatched end tag for " << cur_object->GetName() <<
|
ss << L"Mismatched end tag for " << cur_object->GetName() <<
|
||||||
L", line " << reader->GetLineNumber();
|
L", line " << reader->GetLineNumber();
|
||||||
|
@ -175,14 +175,24 @@ CefHandler::RetVal ClientHandler::HandleConsoleMessage(
|
|||||||
bool first_message = m_LogFile.empty();
|
bool first_message = m_LogFile.empty();
|
||||||
if(first_message) {
|
if(first_message) {
|
||||||
std::wstringstream ss;
|
std::wstringstream ss;
|
||||||
ss << AppGetWorkingDirectory() << L"\\console.log";
|
ss << AppGetWorkingDirectory();
|
||||||
|
#ifdef _WIN32
|
||||||
|
ss << L"\\";
|
||||||
|
#else
|
||||||
|
ss << L"/";
|
||||||
|
#endif
|
||||||
|
ss << L"console.log";
|
||||||
m_LogFile = ss.str();
|
m_LogFile = ss.str();
|
||||||
}
|
}
|
||||||
std::wstring logFile = m_LogFile;
|
std::wstring logFile = m_LogFile;
|
||||||
Unlock();
|
Unlock();
|
||||||
|
|
||||||
FILE* file = NULL;
|
FILE* file = NULL;
|
||||||
|
#ifdef _WIN32
|
||||||
_wfopen_s(&file, logFile.c_str(), L"a, ccs=UTF-8");
|
_wfopen_s(&file, logFile.c_str(), L"a, ccs=UTF-8");
|
||||||
|
#else
|
||||||
|
file = fopen(WStringToString(logFile).c_str(), "a");
|
||||||
|
#endif
|
||||||
|
|
||||||
if(file) {
|
if(file) {
|
||||||
std::wstringstream ss;
|
std::wstringstream ss;
|
||||||
|
444
tests/cefclient/cefclient_mac.mm
Normal file
444
tests/cefclient/cefclient_mac.mm
Normal file
@ -0,0 +1,444 @@
|
|||||||
|
// Copyright (c) 2010 The Chromium Embedded Framework Authors.
|
||||||
|
// Portions copyright (c) 2010 The Chromium Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "include/cef.h"
|
||||||
|
#include "include/cef_wrapper.h"
|
||||||
|
#include "cefclient.h"
|
||||||
|
#include "binding_test.h"
|
||||||
|
#include "extension_test.h"
|
||||||
|
#include "scheme_test.h"
|
||||||
|
#include "string_util.h"
|
||||||
|
#include "string_util_mac.h"
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
// The global ClientHandler reference.
|
||||||
|
extern CefRefPtr<ClientHandler> g_handler;
|
||||||
|
|
||||||
|
char szWorkingDir[512]; // The current working directory
|
||||||
|
|
||||||
|
// Sizes for URL bar layout
|
||||||
|
#define BUTTON_HEIGHT 22
|
||||||
|
#define BUTTON_WIDTH 72
|
||||||
|
#define BUTTON_MARGIN 8
|
||||||
|
#define URLBAR_HEIGHT 32
|
||||||
|
|
||||||
|
// Content area size for newly created windows.
|
||||||
|
const int kWindowWidth = 800;
|
||||||
|
const int kWindowHeight = 600;
|
||||||
|
|
||||||
|
|
||||||
|
// Receives notifications from controls and the browser window. Will delete
|
||||||
|
// itself when done.
|
||||||
|
@interface ClientWindowDelegate : NSObject
|
||||||
|
- (IBAction)goBack:(id)sender;
|
||||||
|
- (IBAction)goForward:(id)sender;
|
||||||
|
- (IBAction)reload:(id)sender;
|
||||||
|
- (IBAction)stopLoading:(id)sender;
|
||||||
|
- (IBAction)takeURLStringValueFrom:(NSTextField *)sender;
|
||||||
|
- (void)alert:(NSString*)title withMessage:(NSString*)message;
|
||||||
|
- (void)notifyConsoleMessage:(id)object;
|
||||||
|
- (void)notifyDownloadComplete:(id)object;
|
||||||
|
- (void)notifyDownloadError:(id)object;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation ClientWindowDelegate
|
||||||
|
|
||||||
|
- (IBAction)goBack:(id)sender {
|
||||||
|
if (g_handler.get() && g_handler->GetBrowserHwnd())
|
||||||
|
g_handler->GetBrowser()->GoBack();
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)goForward:(id)sender {
|
||||||
|
if (g_handler.get() && g_handler->GetBrowserHwnd())
|
||||||
|
g_handler->GetBrowser()->GoForward();
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)reload:(id)sender {
|
||||||
|
if (g_handler.get() && g_handler->GetBrowserHwnd())
|
||||||
|
g_handler->GetBrowser()->Reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)stopLoading:(id)sender {
|
||||||
|
if (g_handler.get() && g_handler->GetBrowserHwnd())
|
||||||
|
g_handler->GetBrowser()->StopLoad();
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)takeURLStringValueFrom:(NSTextField *)sender {
|
||||||
|
if (!g_handler.get() || !g_handler->GetBrowserHwnd())
|
||||||
|
return;
|
||||||
|
|
||||||
|
NSString *url = [sender stringValue];
|
||||||
|
|
||||||
|
// if it doesn't already have a prefix, add http. If we can't parse it,
|
||||||
|
// just don't bother rather than making things worse.
|
||||||
|
NSURL* tempUrl = [NSURL URLWithString:url];
|
||||||
|
if (tempUrl && ![tempUrl scheme])
|
||||||
|
url = [@"http://" stringByAppendingString:url];
|
||||||
|
|
||||||
|
std::wstring urlStr = NSStringToWString(url);
|
||||||
|
g_handler->GetBrowser()->GetMainFrame()->LoadURL(urlStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)alert:(NSString*)title withMessage:(NSString*)message {
|
||||||
|
NSAlert *alert = [NSAlert alertWithMessageText:title
|
||||||
|
defaultButton:@"OK"
|
||||||
|
alternateButton:nil
|
||||||
|
otherButton:nil
|
||||||
|
informativeTextWithFormat:message];
|
||||||
|
[alert runModal];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)notifyConsoleMessage:(id)object {
|
||||||
|
std::wstringstream ss;
|
||||||
|
ss << L"Console messages will be written to " << g_handler->GetLogFile();
|
||||||
|
NSString* str = WStringToNSString(ss.str());
|
||||||
|
[self alert:@"Console Messages" withMessage:str];
|
||||||
|
[str release];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)notifyDownloadComplete:(id)object {
|
||||||
|
std::wstringstream ss;
|
||||||
|
ss << L"File \"" << g_handler->GetLastDownloadFile() <<
|
||||||
|
L"\" downloaded successfully.";
|
||||||
|
NSString* str = WStringToNSString(ss.str());
|
||||||
|
[self alert:@"File Download" withMessage:str];
|
||||||
|
[str release];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)notifyDownloadError:(id)object {
|
||||||
|
std::wstringstream ss;
|
||||||
|
ss << L"File \"" << g_handler->GetLastDownloadFile() <<
|
||||||
|
L"\" failed to download.";
|
||||||
|
NSString* str = WStringToNSString(ss.str());
|
||||||
|
[self alert:@"File Download" withMessage:str];
|
||||||
|
[str release];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)windowDidBecomeKey:(NSNotification*)notification {
|
||||||
|
if(g_handler.get() && g_handler->GetBrowserHwnd()) {
|
||||||
|
// Give focus to the browser window.
|
||||||
|
g_handler->GetBrowser()->SetFocus(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called when the window is about to close. Perform the self-destruction
|
||||||
|
// sequence by getting rid of the window. By returning YES, we allow the window
|
||||||
|
// to be removed from the screen.
|
||||||
|
- (BOOL)windowShouldClose:(id)window {
|
||||||
|
// Try to make the window go away.
|
||||||
|
[window autorelease];
|
||||||
|
|
||||||
|
// Clean ourselves up after clearing the stack of anything that might have the
|
||||||
|
// window on it.
|
||||||
|
[self performSelectorOnMainThread:@selector(cleanup:)
|
||||||
|
withObject:window
|
||||||
|
waitUntilDone:NO];
|
||||||
|
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deletes itself.
|
||||||
|
- (void)cleanup:(id)window {
|
||||||
|
[self release];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
NSButton* MakeButton(NSRect* rect, NSString* title, NSView* parent) {
|
||||||
|
NSButton* button = [[[NSButton alloc] initWithFrame:*rect] autorelease];
|
||||||
|
[button setTitle:title];
|
||||||
|
[button setBezelStyle:NSSmallSquareBezelStyle];
|
||||||
|
[button setAutoresizingMask:(NSViewMaxXMargin | NSViewMinYMargin)];
|
||||||
|
[parent addSubview:button];
|
||||||
|
rect->origin.x += BUTTON_WIDTH;
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Receives notifications from the application. Will delete itself when done.
|
||||||
|
@interface ClientAppDelegate : NSObject
|
||||||
|
- (void)createApp:(id)object;
|
||||||
|
- (IBAction)testGetSource:(id)sender;
|
||||||
|
- (IBAction)testGetText:(id)sender;
|
||||||
|
- (IBAction)testJSBinding:(id)sender;
|
||||||
|
- (IBAction)testJSExtension:(id)sender;
|
||||||
|
- (IBAction)testJSExecute:(id)sender;
|
||||||
|
- (IBAction)testRequest:(id)sender;
|
||||||
|
- (IBAction)testSchemeHandler:(id)sender;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation ClientAppDelegate
|
||||||
|
|
||||||
|
// Create the application on the UI thread.
|
||||||
|
- (void)createApp:(id)object {
|
||||||
|
[NSApplication sharedApplication];
|
||||||
|
[NSBundle loadNibNamed:@"MainMenu" owner:NSApp];
|
||||||
|
|
||||||
|
// Set the delegate for application events.
|
||||||
|
[NSApp setDelegate:self];
|
||||||
|
|
||||||
|
// Add the Tests menu.
|
||||||
|
NSMenu* menubar = [NSApp mainMenu];
|
||||||
|
NSMenuItem *testItem = [[[NSMenuItem alloc] initWithTitle:@"Tests"
|
||||||
|
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:@"JavaScript Binding Handler"
|
||||||
|
action:@selector(testJSBinding:)
|
||||||
|
keyEquivalent:@""];
|
||||||
|
[testMenu addItemWithTitle:@"JavaScript Extension Handler"
|
||||||
|
action:@selector(testJSExtension:)
|
||||||
|
keyEquivalent:@""];
|
||||||
|
[testMenu addItemWithTitle:@"JavaScript Execute"
|
||||||
|
action:@selector(testJSExecute:)
|
||||||
|
keyEquivalent:@""];
|
||||||
|
[testMenu addItemWithTitle:@"Request"
|
||||||
|
action:@selector(testRequest:)
|
||||||
|
keyEquivalent:@""];
|
||||||
|
[testMenu addItemWithTitle:@"Scheme Handler"
|
||||||
|
action:@selector(testSchemeHandler:)
|
||||||
|
keyEquivalent:@""];
|
||||||
|
[testItem setSubmenu:testMenu];
|
||||||
|
[menubar addItem:testItem];
|
||||||
|
|
||||||
|
// Create the delegate for control and browser window events.
|
||||||
|
NSObject* delegate = [[ClientWindowDelegate alloc] init];
|
||||||
|
|
||||||
|
// Create the main application window.
|
||||||
|
NSRect screen_rect = [[NSScreen mainScreen] visibleFrame];
|
||||||
|
NSRect window_rect = { {0, screen_rect.size.height - kWindowHeight},
|
||||||
|
{kWindowWidth, kWindowHeight} };
|
||||||
|
NSWindow* mainWnd = [[NSWindow alloc]
|
||||||
|
initWithContentRect:window_rect
|
||||||
|
styleMask:(NSTitledWindowMask |
|
||||||
|
NSClosableWindowMask |
|
||||||
|
NSMiniaturizableWindowMask |
|
||||||
|
NSResizableWindowMask )
|
||||||
|
backing:NSBackingStoreBuffered
|
||||||
|
defer:NO];
|
||||||
|
[mainWnd setTitle:@"cefclient"];
|
||||||
|
[mainWnd setDelegate:delegate];
|
||||||
|
|
||||||
|
// Rely on the window delegate to clean us up rather than immediately
|
||||||
|
// releasing when the window gets closed. We use the delegate to do
|
||||||
|
// everything from the autorelease pool so the window isn't on the stack
|
||||||
|
// during cleanup (ie, a window close from javascript).
|
||||||
|
[mainWnd setReleasedWhenClosed:NO];
|
||||||
|
|
||||||
|
// Create the buttons.
|
||||||
|
NSRect button_rect = [[mainWnd contentView] bounds];
|
||||||
|
button_rect.origin.y = window_rect.size.height - URLBAR_HEIGHT +
|
||||||
|
(URLBAR_HEIGHT - BUTTON_HEIGHT) / 2;
|
||||||
|
button_rect.size.height = BUTTON_HEIGHT;
|
||||||
|
button_rect.origin.x += BUTTON_MARGIN;
|
||||||
|
button_rect.size.width = BUTTON_WIDTH;
|
||||||
|
|
||||||
|
NSView* content = [mainWnd contentView];
|
||||||
|
|
||||||
|
NSButton* button = MakeButton(&button_rect, @"Back", content);
|
||||||
|
[button setTarget:delegate];
|
||||||
|
[button setAction:@selector(goBack:)];
|
||||||
|
|
||||||
|
button = MakeButton(&button_rect, @"Forward", content);
|
||||||
|
[button setTarget:delegate];
|
||||||
|
[button setAction:@selector(goForward:)];
|
||||||
|
|
||||||
|
button = MakeButton(&button_rect, @"Reload", content);
|
||||||
|
[button setTarget:delegate];
|
||||||
|
[button setAction:@selector(reload:)];
|
||||||
|
|
||||||
|
button = MakeButton(&button_rect, @"Stop", content);
|
||||||
|
[button setTarget:delegate];
|
||||||
|
[button setAction:@selector(stopLoading:)];
|
||||||
|
|
||||||
|
// Create the URL text field.
|
||||||
|
button_rect.origin.x += BUTTON_MARGIN;
|
||||||
|
button_rect.size.width = [[mainWnd contentView] bounds].size.width -
|
||||||
|
button_rect.origin.x - BUTTON_MARGIN;
|
||||||
|
NSTextField* editWnd = [[NSTextField alloc] initWithFrame:button_rect];
|
||||||
|
[[mainWnd contentView] addSubview:editWnd];
|
||||||
|
[editWnd setAutoresizingMask:(NSViewWidthSizable | NSViewMinYMargin)];
|
||||||
|
[editWnd setTarget:delegate];
|
||||||
|
[editWnd setAction:@selector(takeURLStringValueFrom:)];
|
||||||
|
[[editWnd cell] setWraps:NO];
|
||||||
|
[[editWnd cell] setScrollable:YES];
|
||||||
|
|
||||||
|
// Create the handler.
|
||||||
|
g_handler = new ClientHandler();
|
||||||
|
g_handler->SetMainHwnd(mainWnd);
|
||||||
|
g_handler->SetEditHwnd(editWnd);
|
||||||
|
|
||||||
|
// Create the browser view.
|
||||||
|
CefWindowInfo window_info;
|
||||||
|
window_info.SetAsChild((void*)[mainWnd contentView], 0, 0,
|
||||||
|
kWindowWidth, kWindowHeight);
|
||||||
|
CefBrowser::CreateBrowser(window_info, false, g_handler.get(),
|
||||||
|
L"http://www.google.com");
|
||||||
|
|
||||||
|
// Show the window.
|
||||||
|
[mainWnd makeKeyAndOrderFront: nil];
|
||||||
|
|
||||||
|
// Size the window.
|
||||||
|
NSRect r = [mainWnd contentRectForFrameRect:[mainWnd frame]];
|
||||||
|
r.size.width = kWindowWidth;
|
||||||
|
r.size.height = kWindowHeight + URLBAR_HEIGHT;
|
||||||
|
[mainWnd setFrame:[mainWnd frameRectForContentRect:r] display:YES];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)testGetSource:(id)sender {
|
||||||
|
if(g_handler.get() && g_handler->GetBrowserHwnd())
|
||||||
|
RunGetSourceTest(g_handler->GetBrowser()->GetMainFrame());
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)testGetText:(id)sender {
|
||||||
|
if(g_handler.get() && g_handler->GetBrowserHwnd())
|
||||||
|
RunGetTextTest(g_handler->GetBrowser()->GetMainFrame());
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)testJSBinding:(id)sender {
|
||||||
|
if(g_handler.get() && g_handler->GetBrowserHwnd())
|
||||||
|
RunBindingTest(g_handler->GetBrowser());
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)testJSExtension:(id)sender {
|
||||||
|
if(g_handler.get() && g_handler->GetBrowserHwnd())
|
||||||
|
RunExtensionTest(g_handler->GetBrowser());
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)testJSExecute:(id)sender {
|
||||||
|
if(g_handler.get() && g_handler->GetBrowserHwnd())
|
||||||
|
RunJavaScriptExecuteTest(g_handler->GetBrowser());
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)testRequest:(id)sender {
|
||||||
|
if(g_handler.get() && g_handler->GetBrowserHwnd())
|
||||||
|
RunRequestTest(g_handler->GetBrowser());
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)testSchemeHandler:(id)sender {
|
||||||
|
if(g_handler.get() && g_handler->GetBrowserHwnd())
|
||||||
|
RunSchemeTest(g_handler->GetBrowser());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sent by the default notification center immediately before the application
|
||||||
|
// terminates.
|
||||||
|
- (void)applicationWillTerminate:(NSNotification *)aNotification {
|
||||||
|
// Shut down CEF.
|
||||||
|
g_handler = NULL;
|
||||||
|
CefShutdown();
|
||||||
|
|
||||||
|
[self release];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
// Retrieve the current working directory.
|
||||||
|
getcwd(szWorkingDir, sizeof(szWorkingDir));
|
||||||
|
|
||||||
|
// Initialize CEF. This will also create the NSApplication instance.
|
||||||
|
CefInitialize(false, std::wstring());
|
||||||
|
|
||||||
|
// Initialize tests.
|
||||||
|
InitExtensionTest();
|
||||||
|
InitSchemeTest();
|
||||||
|
|
||||||
|
// Create the application delegate and window.
|
||||||
|
NSObject* delegate = [[ClientAppDelegate alloc] init];
|
||||||
|
[delegate performSelectorOnMainThread:@selector(createApp:) withObject:nil
|
||||||
|
waitUntilDone:NO];
|
||||||
|
|
||||||
|
// Run the application message loop.
|
||||||
|
[NSApp run];
|
||||||
|
|
||||||
|
// Don't put anything below this line because it won't be executed.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ClientHandler implementation
|
||||||
|
|
||||||
|
CefHandler::RetVal ClientHandler::HandleAddressChange(
|
||||||
|
CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame,
|
||||||
|
const std::wstring& url)
|
||||||
|
{
|
||||||
|
if(m_BrowserHwnd == browser->GetWindowHandle() && frame->IsMain())
|
||||||
|
{
|
||||||
|
// Set the edit window text
|
||||||
|
NSTextField* textField = (NSTextField*)m_EditHwnd;
|
||||||
|
NSString* str = WStringToNSString(url);
|
||||||
|
[textField setStringValue:str];
|
||||||
|
[str release];
|
||||||
|
}
|
||||||
|
return RV_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
CefHandler::RetVal ClientHandler::HandleTitleChange(
|
||||||
|
CefRefPtr<CefBrowser> browser, const std::wstring& title)
|
||||||
|
{
|
||||||
|
// Set the frame window title bar
|
||||||
|
NSWindow* window = (NSWindow*)m_MainHwnd;
|
||||||
|
NSString* str = WStringToNSString(title);
|
||||||
|
[window setTitle:str];
|
||||||
|
[str release];
|
||||||
|
return RV_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
CefHandler::RetVal ClientHandler::HandleBeforeResourceLoad(
|
||||||
|
CefRefPtr<CefBrowser> browser, CefRefPtr<CefRequest> request,
|
||||||
|
std::wstring& redirectUrl, CefRefPtr<CefStreamReader>& resourceStream,
|
||||||
|
std::wstring& mimeType, int loadFlags)
|
||||||
|
{
|
||||||
|
std::wstring url = request->GetURL();
|
||||||
|
if(url == L"http://tests/request") {
|
||||||
|
// Show the request contents
|
||||||
|
std::wstring dump;
|
||||||
|
DumpRequestContents(request, dump);
|
||||||
|
resourceStream = CefStreamReader::CreateForData(
|
||||||
|
(void*)dump.c_str(), dump.size() * sizeof(wchar_t));
|
||||||
|
mimeType = L"text/plain";
|
||||||
|
}
|
||||||
|
return RV_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientHandler::SendNotification(NotificationType type)
|
||||||
|
{
|
||||||
|
SEL sel = nil;
|
||||||
|
switch(type) {
|
||||||
|
case NOTIFY_CONSOLE_MESSAGE:
|
||||||
|
sel = @selector(notifyConsoleMessage:);
|
||||||
|
break;
|
||||||
|
case NOTIFY_DOWNLOAD_COMPLETE:
|
||||||
|
sel = @selector(notifyDownloadComplete:);
|
||||||
|
break;
|
||||||
|
case NOTIFY_DOWNLOAD_ERROR:
|
||||||
|
sel = @selector(notifyDownloadError:);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(sel == nil)
|
||||||
|
return;
|
||||||
|
|
||||||
|
NSWindow* window = (NSWindow*)g_handler->GetMainHwnd();
|
||||||
|
NSObject* delegate = [window delegate];
|
||||||
|
[delegate performSelectorOnMainThread:sel withObject:nil waitUntilDone:NO];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Global functions
|
||||||
|
|
||||||
|
std::wstring AppGetWorkingDirectory()
|
||||||
|
{
|
||||||
|
return StringToWString(szWorkingDir);
|
||||||
|
}
|
@ -169,7 +169,10 @@ public:
|
|||||||
file_ = _wfopen(ss.str().c_str(), L"wb");
|
file_ = _wfopen(ss.str().c_str(), L"wb");
|
||||||
ASSERT(file_ != NULL);
|
ASSERT(file_ != NULL);
|
||||||
}
|
}
|
||||||
#endif // _WIN32
|
#else
|
||||||
|
// TODO(port): Implement this.
|
||||||
|
ASSERT(false); // Not implemented
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnComplete()
|
void OnComplete()
|
||||||
|
@ -38,16 +38,21 @@ public:
|
|||||||
// Build the response html
|
// Build the response html
|
||||||
html_ = "<html><head><title>Client Scheme Handler</title></head><body>"
|
html_ = "<html><head><title>Client Scheme Handler</title></head><body>"
|
||||||
"This contents of this page page are served by the "
|
"This contents of this page page are served by the "
|
||||||
"ClientSchemeHandler class handling the client:// protocol."
|
"ClientSchemeHandler class handling the client:// protocol.";
|
||||||
"<br>You should see an image:"
|
|
||||||
"<br/><img src=\"client://tests/client.gif\"><pre>";
|
#ifdef _WIN32
|
||||||
|
html_.append("<br/>You should see an image:"
|
||||||
|
"<br/><img src=\"client://tests/client.gif\">");
|
||||||
|
#endif // _WIN32
|
||||||
|
|
||||||
|
html_.append("<pre>");
|
||||||
|
|
||||||
// Output a string representation of the request
|
// Output a string representation of the request
|
||||||
std::wstring dump;
|
std::wstring dump;
|
||||||
DumpRequestContents(request, dump);
|
DumpRequestContents(request, dump);
|
||||||
html_.append(WStringToString(dump));
|
html_.append(WStringToString(dump));
|
||||||
|
|
||||||
html_.append("</pre><br>Try the test form:"
|
html_.append("</pre><br/>Try the test form:"
|
||||||
"<form method=\"POST\" action=\"handler.html\">"
|
"<form method=\"POST\" action=\"handler.html\">"
|
||||||
"<input type=\"text\" name=\"field1\">"
|
"<input type=\"text\" name=\"field1\">"
|
||||||
"<input type=\"text\" name=\"field2\">"
|
"<input type=\"text\" name=\"field2\">"
|
||||||
@ -56,7 +61,7 @@ public:
|
|||||||
|
|
||||||
handled = true;
|
handled = true;
|
||||||
size_ = html_.size();
|
size_ = html_.size();
|
||||||
bytes_ = (LPBYTE)html_.c_str();
|
bytes_ = html_.c_str();
|
||||||
|
|
||||||
// Set the resulting mime type
|
// Set the resulting mime type
|
||||||
mime_type = L"text/html";
|
mime_type = L"text/html";
|
||||||
@ -64,7 +69,11 @@ public:
|
|||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
else if(wcsstr(url.c_str(), L"client.gif") != NULL) {
|
else if(wcsstr(url.c_str(), L"client.gif") != NULL) {
|
||||||
// Load the response image
|
// Load the response image
|
||||||
if(LoadBinaryResource(IDS_LOGO, size_, bytes_)) {
|
DWORD dwSize;
|
||||||
|
LPBYTE pBytes;
|
||||||
|
if(LoadBinaryResource(IDS_LOGO, dwSize, pBytes)) {
|
||||||
|
size_ = dwSize;
|
||||||
|
bytes_ = reinterpret_cast<const char*>(pBytes);
|
||||||
handled = true;
|
handled = true;
|
||||||
// Set the resulting mime type
|
// Set the resulting mime type
|
||||||
mime_type = L"image/jpg";
|
mime_type = L"image/jpg";
|
||||||
@ -97,7 +106,8 @@ public:
|
|||||||
|
|
||||||
if(offset_ < size_) {
|
if(offset_ < size_) {
|
||||||
// Copy the next block of data into the buffer.
|
// Copy the next block of data into the buffer.
|
||||||
int transfer_size = min(bytes_to_read, static_cast<int>(size_ - offset_));
|
int transfer_size =
|
||||||
|
std::min(bytes_to_read, static_cast<int>(size_ - offset_));
|
||||||
memcpy(data_out, bytes_ + offset_, transfer_size);
|
memcpy(data_out, bytes_ + offset_, transfer_size);
|
||||||
offset_ += transfer_size;
|
offset_ += transfer_size;
|
||||||
|
|
||||||
@ -111,8 +121,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DWORD size_, offset_;
|
size_t size_, offset_;
|
||||||
LPBYTE bytes_;
|
const char* bytes_;
|
||||||
std::string html_;
|
std::string html_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
22
tests/cefclient/string_util_mac.h
Normal file
22
tests/cefclient/string_util_mac.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// 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 _CEFCLIENT_STRING_UTIL_MAC_H
|
||||||
|
#define _CEFCLIENT_STRING_UTIL_MAC_H
|
||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
// Convert a std::wstring to an NSString. The NSString must be released by the
|
||||||
|
// caller.
|
||||||
|
NSString* WStringToNSString(const std::wstring& str);
|
||||||
|
|
||||||
|
// Convert an NSString to a std::wstring.
|
||||||
|
std::wstring NSStringToWString(NSString* str);
|
||||||
|
|
||||||
|
#endif // defined(__APPLE__)
|
||||||
|
|
||||||
|
#endif // _CEFCLIENT_STRING_UTIL_MAC_H
|
47
tests/cefclient/string_util_mac.mm
Normal file
47
tests/cefclient/string_util_mac.mm
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
// 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 "string_util.h"
|
||||||
|
#include "string_util_mac.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
|
||||||
|
#if TARGET_RT_BIG_ENDIAN
|
||||||
|
#define WCHAR_T_ENCODING NSUTF32BigEndianStringEncoding
|
||||||
|
#else
|
||||||
|
#define WCHAR_T_ENCODING NSUTF32LittleEndianStringEncoding
|
||||||
|
#endif
|
||||||
|
|
||||||
|
std::wstring StringToWString(const std::string& s)
|
||||||
|
{
|
||||||
|
NSString* nsstr = [[NSString alloc] initWithCString:s.c_str()];
|
||||||
|
std::wstring wstr = NSStringToWString(nsstr);
|
||||||
|
[nsstr release];
|
||||||
|
return wstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string WStringToString(const std::wstring& s)
|
||||||
|
{
|
||||||
|
NSString* nsstr = WStringToNSString(s);
|
||||||
|
std::string str = [nsstr UTF8String];
|
||||||
|
[nsstr release];
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSString* WStringToNSString(const std::wstring& str)
|
||||||
|
{
|
||||||
|
return [[NSString alloc] initWithBytes:(void*)str.c_str()
|
||||||
|
length:str.length()*4
|
||||||
|
encoding:WCHAR_T_ENCODING];
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring NSStringToWString(NSString* str)
|
||||||
|
{
|
||||||
|
NSData* data = [str dataUsingEncoding:WCHAR_T_ENCODING];
|
||||||
|
return std::wstring((wchar_t*)[data bytes],
|
||||||
|
[data length] / sizeof(wchar_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // defined(__APPLE__)
|
@ -42,6 +42,18 @@
|
|||||||
code \
|
code \
|
||||||
MSVC_POP_WARNING()
|
MSVC_POP_WARNING()
|
||||||
|
|
||||||
#endif // _WIN32
|
#else // !_WIN32
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
#define ASSERT(condition) if(!(condition)) { assert(false); }
|
||||||
|
#else
|
||||||
|
#define ASSERT(condition) ((void)0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ALLOW_THIS_IN_INITIALIZER_LIST(code) code
|
||||||
|
|
||||||
|
#endif // !_WIN32
|
||||||
|
|
||||||
#endif // _CEFCLIENT_UTIL_H
|
#endif // _CEFCLIENT_UTIL_H
|
||||||
|
@ -46,6 +46,8 @@ static void VerifyPostDataElementEqual(CefRefPtr<CefPostDataElement> elem1,
|
|||||||
case PDE_TYPE_FILE:
|
case PDE_TYPE_FILE:
|
||||||
ASSERT_EQ(elem1->GetFile(), elem2->GetFile());
|
ASSERT_EQ(elem1->GetFile(), elem2->GetFile());
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,19 +130,19 @@ TEST(RequestTest, SetGet)
|
|||||||
// CefPostData AddElement
|
// CefPostData AddElement
|
||||||
postData->AddElement(element1);
|
postData->AddElement(element1);
|
||||||
postData->AddElement(element2);
|
postData->AddElement(element2);
|
||||||
ASSERT_EQ(2, postData->GetElementCount());
|
ASSERT_EQ((size_t)2, postData->GetElementCount());
|
||||||
|
|
||||||
// CefPostData RemoveElement
|
// CefPostData RemoveElement
|
||||||
postData->RemoveElement(element1);
|
postData->RemoveElement(element1);
|
||||||
ASSERT_EQ(1, postData->GetElementCount());
|
ASSERT_EQ((size_t)1, postData->GetElementCount());
|
||||||
|
|
||||||
// CefPostData RemoveElements
|
// CefPostData RemoveElements
|
||||||
postData->RemoveElements();
|
postData->RemoveElements();
|
||||||
ASSERT_EQ(0, postData->GetElementCount());
|
ASSERT_EQ((size_t)0, postData->GetElementCount());
|
||||||
|
|
||||||
postData->AddElement(element1);
|
postData->AddElement(element1);
|
||||||
postData->AddElement(element2);
|
postData->AddElement(element2);
|
||||||
ASSERT_EQ(2, postData->GetElementCount());
|
ASSERT_EQ((size_t)2, postData->GetElementCount());
|
||||||
CefPostData::ElementVector elements;
|
CefPostData::ElementVector elements;
|
||||||
postData->GetElements(elements);
|
postData->GetElements(elements);
|
||||||
CefPostData::ElementVector::const_iterator it = elements.begin();
|
CefPostData::ElementVector::const_iterator it = elements.begin();
|
||||||
|
@ -5,8 +5,6 @@
|
|||||||
#include "include/cef.h"
|
#include "include/cef.h"
|
||||||
#include "testing/gtest/include/gtest/gtest.h"
|
#include "testing/gtest/include/gtest/gtest.h"
|
||||||
|
|
||||||
#define min(a,b) ((a)<(b)?(a):(b))
|
|
||||||
|
|
||||||
static void VerifyStreamReadBehavior(CefRefPtr<CefStreamReader> stream,
|
static void VerifyStreamReadBehavior(CefRefPtr<CefStreamReader> stream,
|
||||||
const std::string& contents)
|
const std::string& contents)
|
||||||
{
|
{
|
||||||
@ -29,7 +27,7 @@ static void VerifyStreamReadBehavior(CefRefPtr<CefStreamReader> stream,
|
|||||||
char buff[10];
|
char buff[10];
|
||||||
int res, read, offset = 0;
|
int res, read, offset = 0;
|
||||||
do {
|
do {
|
||||||
read = min(sizeof(buff), contentSize-offset);
|
read = std::min((int)sizeof(buff), contentSize-offset);
|
||||||
res = stream->Read(buff, 1, read);
|
res = stream->Read(buff, 1, read);
|
||||||
ASSERT_EQ(read, res);
|
ASSERT_EQ(read, res);
|
||||||
ASSERT_TRUE(!memcmp(contentStr+offset, buff, res));
|
ASSERT_TRUE(!memcmp(contentStr+offset, buff, res));
|
||||||
@ -50,7 +48,7 @@ static void VerifyStreamWriteBehavior(CefRefPtr<CefStreamWriter> stream,
|
|||||||
// Write 10 characters at a time and verify the result
|
// Write 10 characters at a time and verify the result
|
||||||
int res, write, offset = 0;
|
int res, write, offset = 0;
|
||||||
do {
|
do {
|
||||||
write = min(10, contentSize-offset);
|
write = std::min(10, contentSize-offset);
|
||||||
res = stream->Write(contentStr+offset, 1, write);
|
res = stream->Write(contentStr+offset, 1, write);
|
||||||
ASSERT_EQ(write, res);
|
ASSERT_EQ(write, res);
|
||||||
offset += res;
|
offset += res;
|
||||||
@ -72,18 +70,24 @@ static void VerifyStreamWriteBehavior(CefRefPtr<CefStreamWriter> stream,
|
|||||||
|
|
||||||
TEST(StreamTest, ReadFile)
|
TEST(StreamTest, ReadFile)
|
||||||
{
|
{
|
||||||
std::wstring fileName = L"StreamTest.VerifyReadFile.txt";
|
const char* fileName = "StreamTest.VerifyReadFile.txt";
|
||||||
|
std::wstring fileNameStr = L"StreamTest.VerifyReadFile.txt";
|
||||||
std::string contents = "This is my test\ncontents for the file";
|
std::string contents = "This is my test\ncontents for the file";
|
||||||
|
|
||||||
// Create the file
|
// Create the file
|
||||||
FILE* f = NULL;
|
FILE* f = NULL;
|
||||||
_wfopen_s(&f, fileName.c_str(), L"wb");
|
#ifdef _WIN32
|
||||||
|
fopen_s(&f, fileName, "wb");
|
||||||
|
#else
|
||||||
|
f = fopen(fileName, "wb");
|
||||||
|
#endif
|
||||||
ASSERT_TRUE(f != NULL);
|
ASSERT_TRUE(f != NULL);
|
||||||
ASSERT_EQ(1, fwrite(contents.c_str(), contents.size(), 1, f));
|
ASSERT_EQ((size_t)1, fwrite(contents.c_str(), contents.size(), 1, f));
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
|
||||||
// Test the stream
|
// Test the stream
|
||||||
CefRefPtr<CefStreamReader> stream(CefStreamReader::CreateForFile(fileName));
|
CefRefPtr<CefStreamReader> stream(
|
||||||
|
CefStreamReader::CreateForFile(fileNameStr));
|
||||||
ASSERT_TRUE(stream.get() != NULL);
|
ASSERT_TRUE(stream.get() != NULL);
|
||||||
VerifyStreamReadBehavior(stream, contents);
|
VerifyStreamReadBehavior(stream, contents);
|
||||||
|
|
||||||
@ -91,7 +95,11 @@ TEST(StreamTest, ReadFile)
|
|||||||
stream = NULL;
|
stream = NULL;
|
||||||
|
|
||||||
// Delete the file
|
// Delete the file
|
||||||
ASSERT_EQ(0, _wunlink(fileName.c_str()));
|
#ifdef _WIN32
|
||||||
|
ASSERT_EQ(0, _unlink(fileName));
|
||||||
|
#else
|
||||||
|
ASSERT_EQ(0, unlink(fileName));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(StreamTest, ReadData)
|
TEST(StreamTest, ReadData)
|
||||||
@ -107,11 +115,13 @@ TEST(StreamTest, ReadData)
|
|||||||
|
|
||||||
TEST(StreamTest, WriteFile)
|
TEST(StreamTest, WriteFile)
|
||||||
{
|
{
|
||||||
std::wstring fileName = L"StreamTest.VerifyWriteFile.txt";
|
const char* fileName = "StreamTest.VerifyWriteFile.txt";
|
||||||
|
std::wstring fileNameStr = L"StreamTest.VerifyWriteFile.txt";
|
||||||
std::string contents = "This is my test\ncontents for the file";
|
std::string contents = "This is my test\ncontents for the file";
|
||||||
|
|
||||||
// Test the stream
|
// Test the stream
|
||||||
CefRefPtr<CefStreamWriter> stream(CefStreamWriter::CreateForFile(fileName));
|
CefRefPtr<CefStreamWriter> stream(
|
||||||
|
CefStreamWriter::CreateForFile(fileNameStr));
|
||||||
ASSERT_TRUE(stream.get() != NULL);
|
ASSERT_TRUE(stream.get() != NULL);
|
||||||
VerifyStreamWriteBehavior(stream, contents);
|
VerifyStreamWriteBehavior(stream, contents);
|
||||||
|
|
||||||
@ -121,9 +131,13 @@ TEST(StreamTest, WriteFile)
|
|||||||
// Read the file that was written
|
// Read the file that was written
|
||||||
FILE* f = NULL;
|
FILE* f = NULL;
|
||||||
char* buff = new char[contents.size()];
|
char* buff = new char[contents.size()];
|
||||||
_wfopen_s(&f, fileName.c_str(), L"rb");
|
#ifdef _WIN32
|
||||||
|
fopen_s(&f, fileName, "rb");
|
||||||
|
#else
|
||||||
|
f = fopen(fileName, "rb");
|
||||||
|
#endif
|
||||||
ASSERT_TRUE(f != NULL);
|
ASSERT_TRUE(f != NULL);
|
||||||
ASSERT_EQ(1, fread(buff, contents.size(), 1, f));
|
ASSERT_EQ((size_t)1, fread(buff, contents.size(), 1, f));
|
||||||
|
|
||||||
// Read past the end of the file
|
// Read past the end of the file
|
||||||
fgetc(f);
|
fgetc(f);
|
||||||
@ -135,7 +149,11 @@ TEST(StreamTest, WriteFile)
|
|||||||
delete [] buff;
|
delete [] buff;
|
||||||
|
|
||||||
// Delete the file
|
// Delete the file
|
||||||
ASSERT_EQ(0, _wunlink(fileName.c_str()));
|
#ifdef _WIN32
|
||||||
|
ASSERT_EQ(0, _unlink(fileName));
|
||||||
|
#else
|
||||||
|
ASSERT_EQ(0, unlink(fileName));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool g_ReadHandlerTesterDeleted = false;
|
bool g_ReadHandlerTesterDeleted = false;
|
||||||
@ -206,12 +224,12 @@ TEST(StreamTest, ReadHandler)
|
|||||||
ASSERT_TRUE(stream.get() != NULL);
|
ASSERT_TRUE(stream.get() != NULL);
|
||||||
|
|
||||||
// CefReadHandler Read
|
// CefReadHandler Read
|
||||||
char* read_ptr = "My data";
|
const char* read_ptr = "My data";
|
||||||
size_t read_size = sizeof(read_ptr);
|
size_t read_size = sizeof(read_ptr);
|
||||||
size_t read_n = 1;
|
size_t read_n = 1;
|
||||||
size_t read_res = stream->Read(read_ptr, read_size, read_n);
|
size_t read_res = stream->Read((void*)read_ptr, read_size, read_n);
|
||||||
ASSERT_TRUE(handler->read_called_);
|
ASSERT_TRUE(handler->read_called_);
|
||||||
ASSERT_EQ(10, read_res);
|
ASSERT_EQ((size_t)10, read_res);
|
||||||
ASSERT_EQ(read_ptr, handler->read_ptr_);
|
ASSERT_EQ(read_ptr, handler->read_ptr_);
|
||||||
ASSERT_EQ(read_size, handler->read_size_);
|
ASSERT_EQ(read_size, handler->read_size_);
|
||||||
ASSERT_EQ(read_n, handler->read_n_);
|
ASSERT_EQ(read_n, handler->read_n_);
|
||||||
@ -310,12 +328,12 @@ TEST(StreamTest, WriteHandler)
|
|||||||
ASSERT_TRUE(stream.get() != NULL);
|
ASSERT_TRUE(stream.get() != NULL);
|
||||||
|
|
||||||
// CefWriteHandler Write
|
// CefWriteHandler Write
|
||||||
char* write_ptr = "My data";
|
const char* write_ptr = "My data";
|
||||||
size_t write_size = sizeof(write_ptr);
|
size_t write_size = sizeof(write_ptr);
|
||||||
size_t write_n = 1;
|
size_t write_n = 1;
|
||||||
size_t write_res = stream->Write(write_ptr, write_size, write_n);
|
size_t write_res = stream->Write(write_ptr, write_size, write_n);
|
||||||
ASSERT_TRUE(handler->write_called_);
|
ASSERT_TRUE(handler->write_called_);
|
||||||
ASSERT_EQ(10, write_res);
|
ASSERT_EQ((size_t)10, write_res);
|
||||||
ASSERT_EQ(write_ptr, handler->write_ptr_);
|
ASSERT_EQ(write_ptr, handler->write_ptr_);
|
||||||
ASSERT_EQ(write_size, handler->write_size_);
|
ASSERT_EQ(write_size, handler->write_size_);
|
||||||
ASSERT_EQ(write_n, handler->write_n_);
|
ASSERT_EQ(write_n, handler->write_n_);
|
||||||
|
@ -251,7 +251,7 @@ public:
|
|||||||
return browser_;
|
return browser_;
|
||||||
}
|
}
|
||||||
|
|
||||||
HWND GetBrowserHwnd()
|
CefWindowHandle GetBrowserHwnd()
|
||||||
{
|
{
|
||||||
return browser_hwnd_;
|
return browser_hwnd_;
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,7 @@ public:
|
|||||||
if(name == L"execute") {
|
if(name == L"execute") {
|
||||||
g_V8TestV8HandlerExecuteCalled = true;
|
g_V8TestV8HandlerExecuteCalled = true;
|
||||||
|
|
||||||
ASSERT_EQ(8, arguments.size());
|
ASSERT_EQ((size_t)8, arguments.size());
|
||||||
int argct = 0;
|
int argct = 0;
|
||||||
|
|
||||||
// basic types
|
// basic types
|
||||||
@ -203,7 +203,7 @@ public:
|
|||||||
g_V8TestV8HandlerExecute2Called = true;
|
g_V8TestV8HandlerExecute2Called = true;
|
||||||
|
|
||||||
// check the result of calling the "execute" function
|
// check the result of calling the "execute" function
|
||||||
ASSERT_EQ(1, arguments.size());
|
ASSERT_EQ((size_t)1, arguments.size());
|
||||||
ASSERT_TRUE(arguments[0]->IsInt());
|
ASSERT_TRUE(arguments[0]->IsInt());
|
||||||
ASSERT_EQ(5, arguments[0]->GetIntValue());
|
ASSERT_EQ(5, arguments[0]->GetIntValue());
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ TEST(XmlReaderTest, Read)
|
|||||||
ASSERT_EQ(reader->GetQualifiedName(), L"ns:obj");
|
ASSERT_EQ(reader->GetQualifiedName(), L"ns:obj");
|
||||||
ASSERT_EQ(reader->GetNamespaceURI(), L"http://www.example.org/ns");
|
ASSERT_EQ(reader->GetNamespaceURI(), L"http://www.example.org/ns");
|
||||||
ASSERT_TRUE(reader->HasAttributes());
|
ASSERT_TRUE(reader->HasAttributes());
|
||||||
ASSERT_EQ(reader->GetAttributeCount(), 1);
|
ASSERT_EQ(reader->GetAttributeCount(), (size_t)1);
|
||||||
ASSERT_EQ(reader->GetAttribute(0), L"http://www.example.org/ns");
|
ASSERT_EQ(reader->GetAttribute(0), L"http://www.example.org/ns");
|
||||||
ASSERT_EQ(reader->GetAttribute(L"xmlns:ns"), L"http://www.example.org/ns");
|
ASSERT_EQ(reader->GetAttribute(L"xmlns:ns"), L"http://www.example.org/ns");
|
||||||
ASSERT_EQ(reader->GetAttribute(L"ns", L"http://www.w3.org/2000/xmlns/"),
|
ASSERT_EQ(reader->GetAttribute(L"ns", L"http://www.w3.org/2000/xmlns/"),
|
||||||
@ -356,7 +356,7 @@ TEST(XmlReaderTest, Read)
|
|||||||
ASSERT_TRUE(reader->IsEmptyElement());
|
ASSERT_TRUE(reader->IsEmptyElement());
|
||||||
ASSERT_TRUE(reader->HasAttributes());
|
ASSERT_TRUE(reader->HasAttributes());
|
||||||
ASSERT_FALSE(reader->HasValue());
|
ASSERT_FALSE(reader->HasValue());
|
||||||
ASSERT_EQ(reader->GetAttributeCount(), 2);
|
ASSERT_EQ(reader->GetAttributeCount(), (size_t)2);
|
||||||
ASSERT_EQ(reader->GetAttribute(0), L"value C1");
|
ASSERT_EQ(reader->GetAttribute(0), L"value C1");
|
||||||
ASSERT_EQ(reader->GetAttribute(L"ns:attr1"), L"value C1");
|
ASSERT_EQ(reader->GetAttribute(L"ns:attr1"), L"value C1");
|
||||||
ASSERT_EQ(reader->GetAttribute(L"attr1", L"http://www.example.org/ns"),
|
ASSERT_EQ(reader->GetAttribute(L"attr1", L"http://www.example.org/ns"),
|
||||||
@ -486,7 +486,7 @@ TEST(XmlReaderTest, Read)
|
|||||||
// Strangely, the end node will report if the starting node has attributes
|
// Strangely, the end node will report if the starting node has attributes
|
||||||
// but will not provide access to them.
|
// but will not provide access to them.
|
||||||
ASSERT_TRUE(reader->HasAttributes());
|
ASSERT_TRUE(reader->HasAttributes());
|
||||||
ASSERT_EQ(reader->GetAttributeCount(), 0);
|
ASSERT_EQ(reader->GetAttributeCount(), (size_t)0);
|
||||||
|
|
||||||
// And we're done.
|
// And we're done.
|
||||||
ASSERT_FALSE(reader->MoveToNextNode());
|
ASSERT_FALSE(reader->MoveToNextNode());
|
||||||
@ -532,12 +532,12 @@ TEST(XmlReaderTest, ObjectLoad)
|
|||||||
|
|
||||||
ASSERT_FALSE(object->HasAttributes());
|
ASSERT_FALSE(object->HasAttributes());
|
||||||
ASSERT_TRUE(object->HasChildren());
|
ASSERT_TRUE(object->HasChildren());
|
||||||
ASSERT_EQ(object->GetChildCount(), 1);
|
ASSERT_EQ(object->GetChildCount(), (size_t)1);
|
||||||
|
|
||||||
CefRefPtr<CefXmlObject> obj(object->FindChild(L"ns:obj"));
|
CefRefPtr<CefXmlObject> obj(object->FindChild(L"ns:obj"));
|
||||||
ASSERT_TRUE(obj.get());
|
ASSERT_TRUE(obj.get());
|
||||||
ASSERT_TRUE(obj->HasChildren());
|
ASSERT_TRUE(obj->HasChildren());
|
||||||
ASSERT_EQ(obj->GetChildCount(), 4);
|
ASSERT_EQ(obj->GetChildCount(), (size_t)4);
|
||||||
|
|
||||||
CefRefPtr<CefXmlObject> obj_child(obj->FindChild(L"ns:objC"));
|
CefRefPtr<CefXmlObject> obj_child(obj->FindChild(L"ns:objC"));
|
||||||
ASSERT_TRUE(obj_child.get());
|
ASSERT_TRUE(obj_child.get());
|
||||||
@ -547,8 +547,8 @@ TEST(XmlReaderTest, ObjectLoad)
|
|||||||
ASSERT_TRUE(obj_child->HasAttributes());
|
ASSERT_TRUE(obj_child->HasAttributes());
|
||||||
|
|
||||||
CefXmlObject::ObjectVector obj_children;
|
CefXmlObject::ObjectVector obj_children;
|
||||||
ASSERT_EQ(obj->GetChildren(obj_children), 4);
|
ASSERT_EQ(obj->GetChildren(obj_children), (size_t)4);
|
||||||
ASSERT_EQ(obj_children.size(), 4);
|
ASSERT_EQ(obj_children.size(), (size_t)4);
|
||||||
|
|
||||||
CefXmlObject::ObjectVector::const_iterator it = obj_children.begin();
|
CefXmlObject::ObjectVector::const_iterator it = obj_children.begin();
|
||||||
for (int ct = 0; it != obj_children.end(); ++it, ++ct) {
|
for (int ct = 0; it != obj_children.end(); ++it, ++ct) {
|
||||||
@ -567,7 +567,7 @@ TEST(XmlReaderTest, ObjectLoad)
|
|||||||
ASSERT_TRUE(obj_child->HasChildren());
|
ASSERT_TRUE(obj_child->HasChildren());
|
||||||
ASSERT_FALSE(obj_child->HasValue());
|
ASSERT_FALSE(obj_child->HasValue());
|
||||||
ASSERT_FALSE(obj_child->HasAttributes());
|
ASSERT_FALSE(obj_child->HasAttributes());
|
||||||
ASSERT_EQ(obj_child->GetChildCount(), 4);
|
ASSERT_EQ(obj_child->GetChildCount(), (size_t)4);
|
||||||
obj_child = obj_child->FindChild(L"ns:objB_4");
|
obj_child = obj_child->FindChild(L"ns:objB_4");
|
||||||
ASSERT_TRUE(obj_child.get());
|
ASSERT_TRUE(obj_child.get());
|
||||||
ASSERT_TRUE(obj_child->HasValue());
|
ASSERT_TRUE(obj_child->HasValue());
|
||||||
@ -581,12 +581,12 @@ TEST(XmlReaderTest, ObjectLoad)
|
|||||||
ASSERT_TRUE(obj_child->HasAttributes());
|
ASSERT_TRUE(obj_child->HasAttributes());
|
||||||
|
|
||||||
CefXmlObject::AttributeMap attribs;
|
CefXmlObject::AttributeMap attribs;
|
||||||
ASSERT_EQ(obj_child->GetAttributes(attribs), 2);
|
ASSERT_EQ(obj_child->GetAttributes(attribs), (size_t)2);
|
||||||
ASSERT_EQ(attribs.size(), 2);
|
ASSERT_EQ(attribs.size(), (size_t)2);
|
||||||
ASSERT_EQ(attribs[L"ns:attr1"], L"value C1");
|
ASSERT_EQ(attribs[L"ns:attr1"], L"value C1");
|
||||||
ASSERT_EQ(attribs[L"ns:attr2"], L"value C2");
|
ASSERT_EQ(attribs[L"ns:attr2"], L"value C2");
|
||||||
|
|
||||||
ASSERT_EQ(obj_child->GetAttributeCount(), 2);
|
ASSERT_EQ(obj_child->GetAttributeCount(), (size_t)2);
|
||||||
ASSERT_TRUE(obj_child->HasAttribute(L"ns:attr1"));
|
ASSERT_TRUE(obj_child->HasAttribute(L"ns:attr1"));
|
||||||
ASSERT_EQ(obj_child->GetAttributeValue(L"ns:attr1"), L"value C1");
|
ASSERT_EQ(obj_child->GetAttributeValue(L"ns:attr1"), L"value C1");
|
||||||
ASSERT_TRUE(obj_child->HasAttribute(L"ns:attr2"));
|
ASSERT_TRUE(obj_child->HasAttribute(L"ns:attr2"));
|
||||||
|
@ -222,7 +222,7 @@ TEST(ZipReaderTest, ReadArchive)
|
|||||||
// Create the Zip archive object.
|
// Create the Zip archive object.
|
||||||
CefRefPtr<CefZipArchive> archive(new CefZipArchive());
|
CefRefPtr<CefZipArchive> archive(new CefZipArchive());
|
||||||
|
|
||||||
ASSERT_EQ(archive->Load(stream, false), 5);
|
ASSERT_EQ(archive->Load(stream, false), (size_t)5);
|
||||||
|
|
||||||
ASSERT_TRUE(archive->HasFile(L"test_archive/file 1.txt"));
|
ASSERT_TRUE(archive->HasFile(L"test_archive/file 1.txt"));
|
||||||
ASSERT_TRUE(archive->HasFile(L"test_archive/folder 1/file 1a.txt"));
|
ASSERT_TRUE(archive->HasFile(L"test_archive/folder 1/file 1a.txt"));
|
||||||
@ -235,7 +235,7 @@ TEST(ZipReaderTest, ReadArchive)
|
|||||||
file = archive->GetFile(L"test_archive/folder 2/file 2a.txt");
|
file = archive->GetFile(L"test_archive/folder 2/file 2a.txt");
|
||||||
ASSERT_TRUE(file.get());
|
ASSERT_TRUE(file.get());
|
||||||
|
|
||||||
ASSERT_EQ(file->GetDataSize(), 20);
|
ASSERT_EQ(file->GetDataSize(), (size_t)20);
|
||||||
ASSERT_TRUE(!strncmp(reinterpret_cast<const char*>(file->GetData()),
|
ASSERT_TRUE(!strncmp(reinterpret_cast<const char*>(file->GetData()),
|
||||||
"Contents of file 2A.", 20));
|
"Contents of file 2A.", 20));
|
||||||
|
|
||||||
@ -244,11 +244,11 @@ TEST(ZipReaderTest, ReadArchive)
|
|||||||
ASSERT_TRUE(reader.get());
|
ASSERT_TRUE(reader.get());
|
||||||
|
|
||||||
char buff[8];
|
char buff[8];
|
||||||
ASSERT_EQ(reader->Read(buff, 1, 8), 8);
|
ASSERT_EQ(reader->Read(buff, 1, 8), (size_t)8);
|
||||||
ASSERT_TRUE(!strncmp(buff, "Contents", 8));
|
ASSERT_TRUE(!strncmp(buff, "Contents", 8));
|
||||||
ASSERT_EQ(reader->Read(buff, 1, 8), 8);
|
ASSERT_EQ(reader->Read(buff, 1, 8), (size_t)8);
|
||||||
ASSERT_TRUE(!strncmp(buff, " of file", 8));
|
ASSERT_TRUE(!strncmp(buff, " of file", 8));
|
||||||
ASSERT_EQ(reader->Read(buff, 1, 8), 4);
|
ASSERT_EQ(reader->Read(buff, 1, 8), (size_t)4);
|
||||||
ASSERT_TRUE(!strncmp(buff, " 2A.", 4));
|
ASSERT_TRUE(!strncmp(buff, " 2A.", 4));
|
||||||
ASSERT_TRUE(reader->Eof());
|
ASSERT_TRUE(reader->Eof());
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user