diff --git a/cef1/cef.gyp b/cef1/cef.gyp index 15233f81f..1668e0cac 100644 --- a/cef1/cef.gyp +++ b/cef1/cef.gyp @@ -728,6 +728,8 @@ 'libcef/response_impl.cc', 'libcef/response_impl.h', 'libcef/scheme_impl.cc', + 'libcef/scheme_registrar_impl.cc', + 'libcef/scheme_registrar_impl.h', 'libcef/simple_clipboard_impl.cc', 'libcef/simple_clipboard_impl.h', 'libcef/sqlite_diagnostics_stub.cc', diff --git a/cef1/cef_paths.gypi b/cef1/cef_paths.gypi index 04c3c4a71..e85a0ceb7 100644 --- a/cef1/cef_paths.gypi +++ b/cef1/cef_paths.gypi @@ -180,6 +180,8 @@ 'libcef_dll/cpptoc/scheme_handler_callback_cpptoc.h', 'libcef_dll/ctocpp/scheme_handler_factory_ctocpp.cc', 'libcef_dll/ctocpp/scheme_handler_factory_ctocpp.h', + 'libcef_dll/cpptoc/scheme_registrar_cpptoc.cc', + 'libcef_dll/cpptoc/scheme_registrar_cpptoc.h', 'libcef_dll/cpptoc/stream_reader_cpptoc.cc', 'libcef_dll/cpptoc/stream_reader_cpptoc.h', 'libcef_dll/cpptoc/stream_writer_cpptoc.cc', @@ -300,6 +302,8 @@ 'libcef_dll/ctocpp/scheme_handler_callback_ctocpp.h', 'libcef_dll/cpptoc/scheme_handler_factory_cpptoc.cc', 'libcef_dll/cpptoc/scheme_handler_factory_cpptoc.h', + 'libcef_dll/ctocpp/scheme_registrar_ctocpp.cc', + 'libcef_dll/ctocpp/scheme_registrar_ctocpp.h', 'libcef_dll/ctocpp/stream_reader_ctocpp.cc', 'libcef_dll/ctocpp/stream_reader_ctocpp.h', 'libcef_dll/ctocpp/stream_writer_ctocpp.cc', diff --git a/cef1/include/capi/cef_app_capi.h b/cef1/include/capi/cef_app_capi.h index 2b25a4ef8..9e443b903 100644 --- a/cef1/include/capi/cef_app_capi.h +++ b/cef1/include/capi/cef_app_capi.h @@ -103,6 +103,15 @@ typedef struct _cef_app_t { /// cef_base_t base; + /// + // Provides an opportunity to register custom schemes. Do not keep a reference + // to the |registrar| object. This function is called on the main thread for + // each process and the registered schemes should be the same across all + // processes. + /// + void (CEF_CALLBACK *on_register_custom_schemes)(struct _cef_app_t* self, + struct _cef_scheme_registrar_t* registrar); + /// // Return the handler for resource bundle events. If // CefSettings.pack_loading_disabled is true (1) a handler must be returned. diff --git a/cef1/include/capi/cef_scheme_capi.h b/cef1/include/capi/cef_scheme_capi.h index 2ca8b4c70..a56b7fa14 100644 --- a/cef1/include/capi/cef_scheme_capi.h +++ b/cef1/include/capi/cef_scheme_capi.h @@ -45,53 +45,6 @@ extern "C" { #include "include/capi/cef_base_capi.h" -/// -// Register a custom scheme. This function should not be called for the built-in -// HTTP, HTTPS, FILE, FTP, ABOUT and DATA schemes. -// -// If |is_standard| is true (1) the scheme will be treated as a standard scheme. -// Standard schemes are subject to URL canonicalization and parsing rules as -// defined in the Common Internet Scheme Syntax RFC 1738 Section 3.1 available -// at http://www.ietf.org/rfc/rfc1738.txt -// -// In particular, the syntax for standard scheme URLs must be of the form:
-//  [scheme]://[username]:[password]@[host]:[port]/[url-path]
-// 
Standard scheme URLs must have a host component that is a fully -// qualified domain name as defined in Section 3.5 of RFC 1034 [13] and Section -// 2.1 of RFC 1123. These URLs will be canonicalized to "scheme://host/path" in -// the simplest case and "scheme://username:password@host:port/path" in the most -// explicit case. For example, "scheme:host/path" and "scheme:///host/path" will -// both be canonicalized to "scheme://host/path". The origin of a standard -// scheme URL is the combination of scheme, host and port (i.e., -// "scheme://host:port" in the most explicit case). -// -// For non-standard scheme URLs only the "scheme:" component is parsed and -// canonicalized. The remainder of the URL will be passed to the handler as-is. -// For example, "scheme:///some%20text" will remain the same. Non-standard -// scheme URLs cannot be used as a target for form submission. -// -// If |is_local| is true (1) the scheme will be treated as local (i.e., with the -// same security rules as those applied to "file" URLs). Normal pages cannot -// link to or access local URLs. Also, by default, local URLs can only perform -// XMLHttpRequest calls to the same URL (origin + path) that originated the -// request. To allow XMLHttpRequest calls from a local URL to other URLs with -// the same origin set the CefSettings.file_access_from_file_urls_allowed value -// to true (1). To allow XMLHttpRequest calls from a local URL to all origins -// set the CefSettings.universal_access_from_file_urls_allowed value to true -// (1). -// -// If |is_display_isolated| is true (1) the scheme will be treated as display- -// isolated. This means that pages cannot display these URLs unless they are -// from the same scheme. For example, pages in another origin cannot create -// iframes or hyperlinks to URLs with this scheme. -// -// This function may be called on any thread. It should only be called once per -// unique |scheme_name| value. If |scheme_name| is already registered or if an -// error occurs this function will return false (0). -/// -CEF_EXPORT int cef_register_custom_scheme(const cef_string_t* scheme_name, - int is_standard, int is_local, int is_display_isolated); - /// // Register a scheme handler factory for the specified |scheme_name| and // optional |domain_name|. An NULL |domain_name| value for a standard scheme @@ -99,7 +52,7 @@ CEF_EXPORT int cef_register_custom_scheme(const cef_string_t* scheme_name, // will be ignored for non-standard schemes. If |scheme_name| is a built-in // scheme and no handler is returned by |factory| then the built-in scheme // handler factory will be called. If |scheme_name| is a custom scheme the -// cef_register_custom_scheme() function should be called for that scheme. This +// CefRegisterCustomScheme() function should be called for that scheme. This // function may be called multiple times to change or remove the factory that // matches the specified |scheme_name| and optional |domain_name|. Returns false // (0) if an error occurs. This function may be called on any thread. @@ -114,6 +67,67 @@ CEF_EXPORT int cef_register_scheme_handler_factory( /// CEF_EXPORT int cef_clear_scheme_handler_factories(); +/// +// Structure that manages custom scheme registrations. +/// +typedef struct _cef_scheme_registrar_t { + /// + // Base structure. + /// + cef_base_t base; + + /// + // Register a custom scheme. This function should not be called for the built- + // in HTTP, HTTPS, FILE, FTP, ABOUT and DATA schemes. + // + // If |is_standard| is true (1) the scheme will be treated as a standard + // scheme. Standard schemes are subject to URL canonicalization and parsing + // rules as defined in the Common Internet Scheme Syntax RFC 1738 Section 3.1 + // available at http://www.ietf.org/rfc/rfc1738.txt + // + // In particular, the syntax for standard scheme URLs must be of the form: + //
+  //  [scheme]://[username]:[password]@[host]:[port]/[url-path]
+  // 
Standard scheme URLs must have a host component that is a fully + // qualified domain name as defined in Section 3.5 of RFC 1034 [13] and + // Section 2.1 of RFC 1123. These URLs will be canonicalized to + // "scheme://host/path" in the simplest case and + // "scheme://username:password@host:port/path" in the most explicit case. For + // example, "scheme:host/path" and "scheme:///host/path" will both be + // canonicalized to "scheme://host/path". The origin of a standard scheme URL + // is the combination of scheme, host and port (i.e., "scheme://host:port" in + // the most explicit case). + // + // For non-standard scheme URLs only the "scheme:" component is parsed and + // canonicalized. The remainder of the URL will be passed to the handler as- + // is. For example, "scheme:///some%20text" will remain the same. Non-standard + // scheme URLs cannot be used as a target for form submission. + // + // If |is_local| is true (1) the scheme will be treated as local (i.e., with + // the same security rules as those applied to "file" URLs). Normal pages + // cannot link to or access local URLs. Also, by default, local URLs can only + // perform XMLHttpRequest calls to the same URL (origin + path) that + // originated the request. To allow XMLHttpRequest calls from a local URL to + // other URLs with the same origin set the + // CefSettings.file_access_from_file_urls_allowed value to true (1). To allow + // XMLHttpRequest calls from a local URL to all origins set the + // CefSettings.universal_access_from_file_urls_allowed value to true (1). + // + // If |is_display_isolated| is true (1) the scheme will be treated as display- + // isolated. This means that pages cannot display these URLs unless they are + // from the same scheme. For example, pages in another origin cannot create + // iframes or hyperlinks to URLs with this scheme. + // + // This function may be called on any thread. It should only be called once + // per unique |scheme_name| value. If |scheme_name| is already registered or + // if an error occurs this function will return false (0). + /// + int (CEF_CALLBACK *add_custom_scheme)(struct _cef_scheme_registrar_t* self, + const cef_string_t* scheme_name, int is_standard, int is_local, + int is_display_isolated); +} cef_scheme_registrar_t; + + /// // Structure that creates cef_scheme_handler_t instances. The functions of this // structure will always be called on the IO thread. diff --git a/cef1/include/cef_app.h b/cef1/include/cef_app.h index 213636883..e352ebbac 100644 --- a/cef1/include/cef_app.h +++ b/cef1/include/cef_app.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 Marshall A. Greenblatt. All rights reserved. +// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -42,6 +42,7 @@ #include "include/cef_base.h" #include "include/cef_proxy_handler.h" #include "include/cef_resource_bundle_handler.h" +#include "include/cef_scheme.h" class CefApp; @@ -105,6 +106,15 @@ void CefSetOSModalLoop(bool osModalLoop); /*--cef(source=client,no_debugct_check)--*/ class CefApp : public virtual CefBase { public: + /// + // Provides an opportunity to register custom schemes. Do not keep a reference + // to the |registrar| object. This method is called on the UI thread. + /// + /*--cef()--*/ + virtual void OnRegisterCustomSchemes( + CefRefPtr registrar) { + } + /// // Return the handler for resource bundle events. If // CefSettings.pack_loading_disabled is true a handler must be returned. If no diff --git a/cef1/include/cef_scheme.h b/cef1/include/cef_scheme.h index e4055456a..97786590b 100644 --- a/cef1/include/cef_scheme.h +++ b/cef1/include/cef_scheme.h @@ -46,57 +46,6 @@ class CefSchemeHandler; class CefSchemeHandlerFactory; -/// -// Register a custom scheme. This method should not be called for the built-in -// HTTP, HTTPS, FILE, FTP, ABOUT and DATA schemes. -// -// If |is_standard| is true the scheme will be treated as a standard scheme. -// Standard schemes are subject to URL canonicalization and parsing rules as -// defined in the Common Internet Scheme Syntax RFC 1738 Section 3.1 available -// at http://www.ietf.org/rfc/rfc1738.txt -// -// In particular, the syntax for standard scheme URLs must be of the form: -//
-//  [scheme]://[username]:[password]@[host]:[port]/[url-path]
-// 
-// Standard scheme URLs must have a host component that is a fully qualified -// domain name as defined in Section 3.5 of RFC 1034 [13] and Section 2.1 of RFC -// 1123. These URLs will be canonicalized to "scheme://host/path" in the -// simplest case and "scheme://username:password@host:port/path" in the most -// explicit case. For example, "scheme:host/path" and "scheme:///host/path" will -// both be canonicalized to "scheme://host/path". The origin of a standard -// scheme URL is the combination of scheme, host and port (i.e., -// "scheme://host:port" in the most explicit case). -// -// For non-standard scheme URLs only the "scheme:" component is parsed and -// canonicalized. The remainder of the URL will be passed to the handler as-is. -// For example, "scheme:///some%20text" will remain the same. Non-standard -// scheme URLs cannot be used as a target for form submission. -// -// If |is_local| is true the scheme will be treated as local (i.e., with the -// same security rules as those applied to "file" URLs). Normal pages cannot -// link to or access local URLs. Also, by default, local URLs can only perform -// XMLHttpRequest calls to the same URL (origin + path) that originated the -// request. To allow XMLHttpRequest calls from a local URL to other URLs with -// the same origin set the CefSettings.file_access_from_file_urls_allowed value -// to true. To allow XMLHttpRequest calls from a local URL to all origins set -// the CefSettings.universal_access_from_file_urls_allowed value to true. -// -// If |is_display_isolated| is true the scheme will be treated as display- -// isolated. This means that pages cannot display these URLs unless they are -// from the same scheme. For example, pages in another origin cannot create -// iframes or hyperlinks to URLs with this scheme. -// -// This function may be called on any thread. It should only be called once -// per unique |scheme_name| value. If |scheme_name| is already registered or if -// an error occurs this method will return false. -/// -/*--cef()--*/ -bool CefRegisterCustomScheme(const CefString& scheme_name, - bool is_standard, - bool is_local, - bool is_display_isolated); - /// // Register a scheme handler factory for the specified |scheme_name| and // optional |domain_name|. An empty |domain_name| value for a standard scheme @@ -122,6 +71,66 @@ bool CefRegisterSchemeHandlerFactory(const CefString& scheme_name, bool CefClearSchemeHandlerFactories(); +/// +// Class that manages custom scheme registrations. +/// +/*--cef(source=library)--*/ +class CefSchemeRegistrar : public virtual CefBase { + public: + /// + // Register a custom scheme. This method should not be called for the built-in + // HTTP, HTTPS, FILE, FTP, ABOUT and DATA schemes. + // + // If |is_standard| is true the scheme will be treated as a standard scheme. + // Standard schemes are subject to URL canonicalization and parsing rules as + // defined in the Common Internet Scheme Syntax RFC 1738 Section 3.1 available + // at http://www.ietf.org/rfc/rfc1738.txt + // + // In particular, the syntax for standard scheme URLs must be of the form: + //
+  //  [scheme]://[username]:[password]@[host]:[port]/[url-path]
+  // 
+ // Standard scheme URLs must have a host component that is a fully qualified + // domain name as defined in Section 3.5 of RFC 1034 [13] and Section 2.1 of + // RFC 1123. These URLs will be canonicalized to "scheme://host/path" in the + // simplest case and "scheme://username:password@host:port/path" in the most + // explicit case. For example, "scheme:host/path" and "scheme:///host/path" + // will both be canonicalized to "scheme://host/path". The origin of a + // standard scheme URL is the combination of scheme, host and port (i.e., + // "scheme://host:port" in the most explicit case). + // + // For non-standard scheme URLs only the "scheme:" component is parsed and + // canonicalized. The remainder of the URL will be passed to the handler + // as-is. For example, "scheme:///some%20text" will remain the same. + // Non-standard scheme URLs cannot be used as a target for form submission. + // + // If |is_local| is true the scheme will be treated as local (i.e., with the + // same security rules as those applied to "file" URLs). Normal pages cannot + // link to or access local URLs. Also, by default, local URLs can only perform + // XMLHttpRequest calls to the same URL (origin + path) that originated the + // request. To allow XMLHttpRequest calls from a local URL to other URLs with + // the same origin set the CefSettings.file_access_from_file_urls_allowed + // value to true. To allow XMLHttpRequest calls from a local URL to all + // origins set the CefSettings.universal_access_from_file_urls_allowed value + // to true. + // + // If |is_display_isolated| is true the scheme will be treated as display- + // isolated. This means that pages cannot display these URLs unless they are + // from the same scheme. For example, pages in another origin cannot create + // iframes or hyperlinks to URLs with this scheme. + // + // This function may be called on any thread. It should only be called once + // per unique |scheme_name| value. If |scheme_name| is already registered or + // if an error occurs this method will return false. + /// + /*--cef()--*/ + virtual bool AddCustomScheme(const CefString& scheme_name, + bool is_standard, + bool is_local, + bool is_display_isolated) =0; +}; + + /// // Class that creates CefSchemeHandler instances. The methods of this class will // always be called on the IO thread. diff --git a/cef1/libcef/browser_devtools_scheme_handler.cc b/cef1/libcef/browser_devtools_scheme_handler.cc index 95df96e68..d3d1d1909 100644 --- a/cef1/libcef/browser_devtools_scheme_handler.cc +++ b/cef1/libcef/browser_devtools_scheme_handler.cc @@ -125,9 +125,7 @@ class DevToolsSchemeHandlerFactory : public CefSchemeHandlerFactory { } // namespace // Register the DevTools scheme handler. -void RegisterDevToolsSchemeHandler(bool firstTime) { - if (firstTime) - CefRegisterCustomScheme(kChromeDevToolsScheme, true, false, true); +void RegisterDevToolsSchemeHandler() { CefRegisterSchemeHandlerFactory(kChromeDevToolsScheme, kChromeDevToolsHost, new DevToolsSchemeHandlerFactory()); } diff --git a/cef1/libcef/browser_devtools_scheme_handler.h b/cef1/libcef/browser_devtools_scheme_handler.h index e655b75c0..c459fa438 100644 --- a/cef1/libcef/browser_devtools_scheme_handler.h +++ b/cef1/libcef/browser_devtools_scheme_handler.h @@ -11,6 +11,6 @@ extern const char kChromeDevToolsHost[]; extern const char kChromeDevToolsURL[]; // Register the DevTools scheme handler. -void RegisterDevToolsSchemeHandler(bool firstTime); +void RegisterDevToolsSchemeHandler(); #endif // CEF_LIBCEF_BROWSER_DEVTOOLS_SCHEME_HANDLER_H_ diff --git a/cef1/libcef/cef_context.cc b/cef1/libcef/cef_context.cc index 5c9f53beb..1375847af 100644 --- a/cef1/libcef/cef_context.cc +++ b/cef1/libcef/cef_context.cc @@ -282,7 +282,7 @@ bool CefContext::Initialize(const CefSettings& settings, // Perform DevTools scheme registration when CEF initialization is complete. CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(&RegisterDevToolsSchemeHandler, true)); + base::Bind(&RegisterDevToolsSchemeHandler)); return true; } diff --git a/cef1/libcef/cef_process_ui_thread.cc b/cef1/libcef/cef_process_ui_thread.cc index 8e0451394..fac0ad592 100644 --- a/cef1/libcef/cef_process_ui_thread.cc +++ b/cef1/libcef/cef_process_ui_thread.cc @@ -8,9 +8,11 @@ #include #include "include/cef_version.h" +#include "libcef/browser_devtools_scheme_handler.h" #include "libcef/browser_webkit_glue.h" #include "libcef/browser_webkit_init.h" #include "libcef/cef_context.h" +#include "libcef/scheme_registrar_impl.h" #include "libcef/v8_impl.h" #include "base/bind.h" @@ -86,6 +88,20 @@ void CefProcessUIThread::Init() { logging::DONT_LOCK_LOG_FILE, logging::APPEND_TO_OLD_LOG_FILE, dcheck_state); + CefRefPtr schemeRegistrar( + new CefSchemeRegistrarImpl()); + + CefRefPtr app = _Context->application(); + if (app.get()) + app->OnRegisterCustomSchemes(schemeRegistrar.get()); + + // Add built-in schemes. + schemeRegistrar->AddCustomScheme(kChromeDevToolsScheme, true, false, true); + + // No references to the registar should be kept. + schemeRegistrar->Detach(); + DCHECK(schemeRegistrar->VerifyRefCount()); + // Load ICU data tables. bool ret = icu_util::Initialize(); if (!ret) { @@ -113,6 +129,9 @@ void CefProcessUIThread::Init() { // Initialize WebKit encodings webkit_glue::InitializeTextEncoding(); + // Register custom schemes with WebKit. + schemeRegistrar->RegisterWithWebKit(); + // Config the network module so it has access to a limited set of resources. net::NetModule::SetResourceProvider(ResourceProvider); diff --git a/cef1/libcef/scheme_impl.cc b/cef1/libcef/scheme_impl.cc index 04b0a9569..2cdac707b 100644 --- a/cef1/libcef/scheme_impl.cc +++ b/cef1/libcef/scheme_impl.cc @@ -53,13 +53,6 @@ bool IsStandardScheme(const std::string& scheme) { return url_util::IsStandard(scheme.c_str(), scheme_comp); } -void RegisterStandardScheme(const std::string& scheme) { - REQUIRE_UIT(); - url_parse::Component scheme_comp(0, scheme.length()); - if (!url_util::IsStandard(scheme.c_str(), scheme_comp)) - url_util::AddStandardScheme(scheme.c_str()); -} - // Copied from net/url_request/url_request_job_manager.cc. struct SchemeToFactory { const char* scheme; @@ -98,13 +91,6 @@ net::URLRequestJob* GetBuiltinSchemeRequestJob( return NULL; } -std::string ToLower(const std::string& str) { - std::string str_lower = str; - std::transform(str_lower.begin(), str_lower.end(), str_lower.begin(), - towlower); - return str; -} - bool SetHeaderIfMissing(CefRequest::HeaderMap& headerMap, const std::string& name, const std::string& value) { @@ -614,8 +600,8 @@ class CefUrlRequestManager { REQUIRE_IOT(); - std::string scheme_lower = ToLower(scheme); - std::string domain_lower = ToLower(domain); + std::string scheme_lower = StringToLowerASCII(scheme); + std::string domain_lower = StringToLowerASCII(domain); // Hostname is only supported for standard schemes. if (!IsStandardScheme(scheme_lower)) @@ -636,8 +622,8 @@ class CefUrlRequestManager { const std::string& domain) { REQUIRE_IOT(); - std::string scheme_lower = ToLower(scheme); - std::string domain_lower = ToLower(domain); + std::string scheme_lower = StringToLowerASCII(scheme); + std::string domain_lower = StringToLowerASCII(domain); // Hostname is only supported for standard schemes. if (!IsStandardScheme(scheme_lower)) @@ -670,50 +656,6 @@ class CefUrlRequestManager { handler_map_.clear(); } - // Check if a scheme has already been registered. - bool HasRegisteredScheme(const std::string& scheme) { - std::string scheme_lower = ToLower(scheme); - - // Don't register builtin schemes. - if (IsBuiltinScheme(scheme_lower)) - return true; - - scheme_set_lock_.Acquire(); - bool registered = (scheme_set_.find(scheme_lower) != scheme_set_.end()); - scheme_set_lock_.Release(); - return registered; - } - - // Register a scheme. - bool RegisterScheme(const std::string& scheme, - bool is_standard, - bool is_local, - bool is_display_isolated) { - if (HasRegisteredScheme(scheme)) { - NOTREACHED() << "Scheme already registered: " << scheme; - return false; - } - - std::string scheme_lower = ToLower(scheme); - - scheme_set_lock_.Acquire(); - scheme_set_.insert(scheme_lower); - scheme_set_lock_.Release(); - - if (is_standard) - RegisterStandardScheme(scheme_lower); - if (is_local) { - WebSecurityPolicy::registerURLSchemeAsLocal( - WebString::fromUTF8(scheme_lower)); - } - if (is_display_isolated) { - WebSecurityPolicy::registerURLSchemeAsDisplayIsolated( - WebString::fromUTF8(scheme_lower)); - } - - return true; - } - private: // Retrieve the matching handler factory, if any. |scheme| will already be in // lower case. @@ -797,34 +739,6 @@ CefUrlRequestManager* CefUrlRequestManager::GetInstance() { } // namespace -bool CefRegisterCustomScheme(const CefString& scheme_name, - bool is_standard, - bool is_local, - bool is_display_isolated) { - // Verify that the context is in a valid state. - if (!CONTEXT_STATE_VALID()) { - NOTREACHED() << "context not valid"; - return false; - } - - if (CefThread::CurrentlyOn(CefThread::UI)) { - // Must be executed on the UI thread because it calls WebKit APIs. - return CefUrlRequestManager::GetInstance()->RegisterScheme(scheme_name, - is_standard, is_local, is_display_isolated); - } else { - // Verify that the scheme has not already been registered. - if (CefUrlRequestManager::GetInstance()->HasRegisteredScheme(scheme_name)) { - NOTREACHED() << "Scheme already registered: " << scheme_name; - return false; - } - - CefThread::PostTask(CefThread::UI, FROM_HERE, - base::Bind(base::IgnoreResult(&CefRegisterCustomScheme), scheme_name, - is_standard, is_local, is_display_isolated)); - return true; - } -} - bool CefRegisterSchemeHandlerFactory( const CefString& scheme_name, const CefString& domain_name, @@ -858,7 +772,7 @@ bool CefClearSchemeHandlerFactories() { CefUrlRequestManager::GetInstance()->ClearFactories(); // Re-register the DevTools scheme handler. - RegisterDevToolsSchemeHandler(false); + RegisterDevToolsSchemeHandler(); } else { CefThread::PostTask(CefThread::IO, FROM_HERE, base::Bind(base::IgnoreResult(&CefClearSchemeHandlerFactories))); diff --git a/cef1/libcef/scheme_registrar_impl.cc b/cef1/libcef/scheme_registrar_impl.cc new file mode 100644 index 000000000..7e1d952b4 --- /dev/null +++ b/cef1/libcef/scheme_registrar_impl.cc @@ -0,0 +1,83 @@ +// Copyright (c) 2013 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 "libcef/scheme_registrar_impl.h" + +#include + +#include "base/logging.h" +#include "base/string_util.h" +#include "googleurl/src/url_util.h" +#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityPolicy.h" + +struct CefSchemeRegistrarImpl::SchemeInfo { + std::string scheme_name; + bool is_local; + bool is_display_isolated; +}; + +CefSchemeRegistrarImpl::CefSchemeRegistrarImpl() + : supported_thread_id_(base::PlatformThread::CurrentId()) { +} + +bool CefSchemeRegistrarImpl::AddCustomScheme( + const CefString& scheme_name, + bool is_standard, + bool is_local, + bool is_display_isolated) { + if (!VerifyContext()) + return false; + + std::string scheme_lower = StringToLowerASCII(scheme_name.ToString()); + if (is_standard) { + url_parse::Component scheme_comp(0, scheme_lower.length()); + if (!url_util::IsStandard(scheme_lower.c_str(), scheme_comp)) + url_util::AddStandardScheme(scheme_lower.c_str()); + } + + SchemeInfo info = {scheme_lower, is_local, is_display_isolated}; + scheme_info_list_.push_back(info); + + return true; +} + +void CefSchemeRegistrarImpl::RegisterWithWebKit() { + if (scheme_info_list_.empty()) + return; + + // Register the custom schemes. + SchemeInfoList::const_iterator it = scheme_info_list_.begin(); + for (; it != scheme_info_list_.end(); ++it) { + const SchemeInfo& info = *it; + if (info.is_local) { + WebKit::WebSecurityPolicy::registerURLSchemeAsLocal( + WebKit::WebString::fromUTF8(info.scheme_name)); + } + if (info.is_display_isolated) { + WebKit::WebSecurityPolicy::registerURLSchemeAsDisplayIsolated( + WebKit::WebString::fromUTF8(info.scheme_name)); + } + } +} + +bool CefSchemeRegistrarImpl::VerifyRefCount() { + return (GetRefCt() == 1); +} + +void CefSchemeRegistrarImpl::Detach() { + DCHECK_EQ(base::PlatformThread::CurrentId(), supported_thread_id_); + url_util::LockStandardSchemes(); + supported_thread_id_ = base::kInvalidThreadId; +} + +bool CefSchemeRegistrarImpl::VerifyContext() { + if (base::PlatformThread::CurrentId() != supported_thread_id_) { + // This object should only be accessed from the thread that created it. + NOTREACHED(); + return false; + } + + return true; +} diff --git a/cef1/libcef/scheme_registrar_impl.h b/cef1/libcef/scheme_registrar_impl.h new file mode 100644 index 000000000..98d31ad31 --- /dev/null +++ b/cef1/libcef/scheme_registrar_impl.h @@ -0,0 +1,49 @@ +// Copyright (c) 2013 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_LIBCEF_SCHEME_REGISTRAR_IMPL_H_ +#define CEF_LIBCEF_SCHEME_REGISTRAR_IMPL_H_ +#pragma once + +#include +#include + +#include "include/cef_scheme.h" + +#include "base/threading/platform_thread.h" + +class CefSchemeRegistrarImpl : public CefSchemeRegistrar { + public: + CefSchemeRegistrarImpl(); + + // CefSchemeRegistrar methods. + virtual bool AddCustomScheme(const CefString& scheme_name, + bool is_standard, + bool is_local, + bool is_display_isolated) OVERRIDE; + + void RegisterWithWebKit(); + + // Verify that only a single reference exists to all CefSchemeRegistrarImpl + // objects. + bool VerifyRefCount(); + + void Detach(); + + private: + // Verify that the object is being accessed from the correct thread. + bool VerifyContext(); + + base::PlatformThreadId supported_thread_id_; + + // Custom schemes that need to be registered with WebKit. + struct SchemeInfo; + typedef std::list SchemeInfoList; + SchemeInfoList scheme_info_list_; + + IMPLEMENT_REFCOUNTING(CefSchemeRegistrarImpl); + DISALLOW_COPY_AND_ASSIGN(CefSchemeRegistrarImpl); +}; + +#endif // CEF_LIBCEF_SCHEME_REGISTRAR_IMPL_H_ diff --git a/cef1/libcef_dll/cpptoc/app_cpptoc.cc b/cef1/libcef_dll/cpptoc/app_cpptoc.cc index 2361aed44..9ba613da1 100644 --- a/cef1/libcef_dll/cpptoc/app_cpptoc.cc +++ b/cef1/libcef_dll/cpptoc/app_cpptoc.cc @@ -13,10 +13,28 @@ #include "libcef_dll/cpptoc/app_cpptoc.h" #include "libcef_dll/cpptoc/proxy_handler_cpptoc.h" #include "libcef_dll/cpptoc/resource_bundle_handler_cpptoc.h" +#include "libcef_dll/ctocpp/scheme_registrar_ctocpp.h" // MEMBER FUNCTIONS - Body may be edited by hand. +void CEF_CALLBACK app_on_register_custom_schemes(struct _cef_app_t* self, + struct _cef_scheme_registrar_t* registrar) { + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + DCHECK(self); + if (!self) + return; + // Verify param: registrar; type: refptr_diff + DCHECK(registrar); + if (!registrar) + return; + + // Execute + CefAppCppToC::Get(self)->OnRegisterCustomSchemes( + CefSchemeRegistrarCToCpp::Wrap(registrar)); +} + struct _cef_resource_bundle_handler_t* CEF_CALLBACK app_get_resource_bundle_handler( struct _cef_app_t* self) { // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING @@ -54,6 +72,7 @@ struct _cef_proxy_handler_t* CEF_CALLBACK app_get_proxy_handler( CefAppCppToC::CefAppCppToC(CefApp* cls) : CefCppToC(cls) { + struct_.struct_.on_register_custom_schemes = app_on_register_custom_schemes; struct_.struct_.get_resource_bundle_handler = app_get_resource_bundle_handler; struct_.struct_.get_proxy_handler = app_get_proxy_handler; } diff --git a/cef1/libcef_dll/cpptoc/scheme_registrar_cpptoc.cc b/cef1/libcef_dll/cpptoc/scheme_registrar_cpptoc.cc new file mode 100644 index 000000000..24702af33 --- /dev/null +++ b/cef1/libcef_dll/cpptoc/scheme_registrar_cpptoc.cc @@ -0,0 +1,55 @@ +// Copyright (c) 2013 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. +// +// --------------------------------------------------------------------------- +// +// This file was generated by the CEF translator tool. If making changes by +// hand only do so within the body of existing method and function +// implementations. See the translator.README.txt file in the tools directory +// for more information. +// + +#include "libcef_dll/cpptoc/scheme_registrar_cpptoc.h" + + +// MEMBER FUNCTIONS - Body may be edited by hand. + +int CEF_CALLBACK scheme_registrar_add_custom_scheme( + struct _cef_scheme_registrar_t* self, const cef_string_t* scheme_name, + int is_standard, int is_local, int is_display_isolated) { + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + DCHECK(self); + if (!self) + return 0; + // Verify param: scheme_name; type: string_byref_const + DCHECK(scheme_name); + if (!scheme_name) + return 0; + + // Execute + bool _retval = CefSchemeRegistrarCppToC::Get(self)->AddCustomScheme( + CefString(scheme_name), + is_standard?true:false, + is_local?true:false, + is_display_isolated?true:false); + + // Return type: bool + return _retval; +} + + +// CONSTRUCTOR - Do not edit by hand. + +CefSchemeRegistrarCppToC::CefSchemeRegistrarCppToC(CefSchemeRegistrar* cls) + : CefCppToC(cls) { + struct_.struct_.add_custom_scheme = scheme_registrar_add_custom_scheme; +} + +#ifndef NDEBUG +template<> long CefCppToC::DebugObjCt = 0; +#endif + diff --git a/cef1/libcef_dll/cpptoc/scheme_registrar_cpptoc.h b/cef1/libcef_dll/cpptoc/scheme_registrar_cpptoc.h new file mode 100644 index 000000000..e5bca2e9a --- /dev/null +++ b/cef1/libcef_dll/cpptoc/scheme_registrar_cpptoc.h @@ -0,0 +1,37 @@ +// Copyright (c) 2013 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. +// +// --------------------------------------------------------------------------- +// +// This file was generated by the CEF translator tool. If making changes by +// hand only do so within the body of existing method and function +// implementations. See the translator.README.txt file in the tools directory +// for more information. +// + +#ifndef CEF_LIBCEF_DLL_CPPTOC_SCHEME_REGISTRAR_CPPTOC_H_ +#define CEF_LIBCEF_DLL_CPPTOC_SCHEME_REGISTRAR_CPPTOC_H_ +#pragma once + +#ifndef BUILDING_CEF_SHARED +#pragma message("Warning: "__FILE__" may be accessed DLL-side only") +#else // BUILDING_CEF_SHARED + +#include "include/cef_scheme.h" +#include "include/capi/cef_scheme_capi.h" +#include "libcef_dll/cpptoc/cpptoc.h" + +// Wrap a C++ class with a C structure. +// This class may be instantiated and accessed DLL-side only. +class CefSchemeRegistrarCppToC + : public CefCppToC { + public: + explicit CefSchemeRegistrarCppToC(CefSchemeRegistrar* cls); + virtual ~CefSchemeRegistrarCppToC() {} +}; + +#endif // BUILDING_CEF_SHARED +#endif // CEF_LIBCEF_DLL_CPPTOC_SCHEME_REGISTRAR_CPPTOC_H_ + diff --git a/cef1/libcef_dll/ctocpp/app_ctocpp.cc b/cef1/libcef_dll/ctocpp/app_ctocpp.cc index ddf1ab3a3..730bcd1e6 100644 --- a/cef1/libcef_dll/ctocpp/app_ctocpp.cc +++ b/cef1/libcef_dll/ctocpp/app_ctocpp.cc @@ -10,6 +10,7 @@ // for more information. // +#include "libcef_dll/cpptoc/scheme_registrar_cpptoc.h" #include "libcef_dll/ctocpp/app_ctocpp.h" #include "libcef_dll/ctocpp/proxy_handler_ctocpp.h" #include "libcef_dll/ctocpp/resource_bundle_handler_ctocpp.h" @@ -17,6 +18,23 @@ // VIRTUAL METHODS - Body may be edited by hand. +void CefAppCToCpp::OnRegisterCustomSchemes( + CefRefPtr registrar) { + if (CEF_MEMBER_MISSING(struct_, on_register_custom_schemes)) + return; + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + // Verify param: registrar; type: refptr_diff + DCHECK(registrar.get()); + if (!registrar.get()) + return; + + // Execute + struct_->on_register_custom_schemes(struct_, + CefSchemeRegistrarCppToC::Wrap(registrar)); +} + CefRefPtr CefAppCToCpp::GetResourceBundleHandler() { if (CEF_MEMBER_MISSING(struct_, get_resource_bundle_handler)) return NULL; diff --git a/cef1/libcef_dll/ctocpp/app_ctocpp.h b/cef1/libcef_dll/ctocpp/app_ctocpp.h index 6cf107a1c..baf525320 100644 --- a/cef1/libcef_dll/ctocpp/app_ctocpp.h +++ b/cef1/libcef_dll/ctocpp/app_ctocpp.h @@ -32,6 +32,8 @@ class CefAppCToCpp virtual ~CefAppCToCpp() {} // CefApp methods + virtual void OnRegisterCustomSchemes( + CefRefPtr registrar) OVERRIDE; virtual CefRefPtr GetResourceBundleHandler( ) OVERRIDE; virtual CefRefPtr GetProxyHandler() OVERRIDE; diff --git a/cef1/libcef_dll/ctocpp/scheme_registrar_ctocpp.cc b/cef1/libcef_dll/ctocpp/scheme_registrar_ctocpp.cc new file mode 100644 index 000000000..bbc05d41b --- /dev/null +++ b/cef1/libcef_dll/ctocpp/scheme_registrar_ctocpp.cc @@ -0,0 +1,46 @@ +// Copyright (c) 2013 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. +// +// --------------------------------------------------------------------------- +// +// This file was generated by the CEF translator tool. If making changes by +// hand only do so within the body of existing method and function +// implementations. See the translator.README.txt file in the tools directory +// for more information. +// + +#include "libcef_dll/ctocpp/scheme_registrar_ctocpp.h" + + +// VIRTUAL METHODS - Body may be edited by hand. + +bool CefSchemeRegistrarCToCpp::AddCustomScheme(const CefString& scheme_name, + bool is_standard, bool is_local, bool is_display_isolated) { + if (CEF_MEMBER_MISSING(struct_, add_custom_scheme)) + return false; + + // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING + + // Verify param: scheme_name; type: string_byref_const + DCHECK(!scheme_name.empty()); + if (scheme_name.empty()) + return false; + + // Execute + int _retval = struct_->add_custom_scheme(struct_, + scheme_name.GetStruct(), + is_standard, + is_local, + is_display_isolated); + + // Return type: bool + return _retval?true:false; +} + + +#ifndef NDEBUG +template<> long CefCToCpp::DebugObjCt = 0; +#endif + diff --git a/cef1/libcef_dll/ctocpp/scheme_registrar_ctocpp.h b/cef1/libcef_dll/ctocpp/scheme_registrar_ctocpp.h new file mode 100644 index 000000000..f01b9a5f1 --- /dev/null +++ b/cef1/libcef_dll/ctocpp/scheme_registrar_ctocpp.h @@ -0,0 +1,43 @@ +// Copyright (c) 2013 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. +// +// --------------------------------------------------------------------------- +// +// This file was generated by the CEF translator tool. If making changes by +// hand only do so within the body of existing method and function +// implementations. See the translator.README.txt file in the tools directory +// for more information. +// + +#ifndef CEF_LIBCEF_DLL_CTOCPP_SCHEME_REGISTRAR_CTOCPP_H_ +#define CEF_LIBCEF_DLL_CTOCPP_SCHEME_REGISTRAR_CTOCPP_H_ +#pragma once + +#ifndef USING_CEF_SHARED +#pragma message("Warning: "__FILE__" may be accessed wrapper-side only") +#else // USING_CEF_SHARED + +#include "include/cef_scheme.h" +#include "include/capi/cef_scheme_capi.h" +#include "libcef_dll/ctocpp/ctocpp.h" + +// Wrap a C structure with a C++ class. +// This class may be instantiated and accessed wrapper-side only. +class CefSchemeRegistrarCToCpp + : public CefCToCpp { + public: + explicit CefSchemeRegistrarCToCpp(cef_scheme_registrar_t* str) + : CefCToCpp(str) {} + virtual ~CefSchemeRegistrarCToCpp() {} + + // CefSchemeRegistrar methods + virtual bool AddCustomScheme(const CefString& scheme_name, bool is_standard, + bool is_local, bool is_display_isolated) OVERRIDE; +}; + +#endif // USING_CEF_SHARED +#endif // CEF_LIBCEF_DLL_CTOCPP_SCHEME_REGISTRAR_CTOCPP_H_ + diff --git a/cef1/libcef_dll/libcef_dll.cc b/cef1/libcef_dll/libcef_dll.cc index 700f038ce..f980d0d4e 100644 --- a/cef1/libcef_dll/libcef_dll.cc +++ b/cef1/libcef_dll/libcef_dll.cc @@ -39,6 +39,7 @@ #include "libcef_dll/cpptoc/request_cpptoc.h" #include "libcef_dll/cpptoc/response_cpptoc.h" #include "libcef_dll/cpptoc/scheme_handler_callback_cpptoc.h" +#include "libcef_dll/cpptoc/scheme_registrar_cpptoc.h" #include "libcef_dll/cpptoc/stream_reader_cpptoc.h" #include "libcef_dll/cpptoc/stream_writer_cpptoc.h" #include "libcef_dll/cpptoc/v8context_cpptoc.h" @@ -157,6 +158,7 @@ CEF_EXPORT void cef_shutdown() { DCHECK_EQ(CefSchemeHandlerCToCpp::DebugObjCt, 0); DCHECK_EQ(CefSchemeHandlerCallbackCppToC::DebugObjCt, 0); DCHECK_EQ(CefSchemeHandlerFactoryCToCpp::DebugObjCt, 0); + DCHECK_EQ(CefSchemeRegistrarCppToC::DebugObjCt, 0); DCHECK_EQ(CefStreamReaderCppToC::DebugObjCt, 0); DCHECK_EQ(CefStreamWriterCppToC::DebugObjCt, 0); DCHECK_EQ(CefTaskCToCpp::DebugObjCt, 0); @@ -286,26 +288,6 @@ CEF_EXPORT int cef_clear_cross_origin_whitelist() { return _retval; } -CEF_EXPORT int cef_register_custom_scheme(const cef_string_t* scheme_name, - int is_standard, int is_local, int is_display_isolated) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: scheme_name; type: string_byref_const - DCHECK(scheme_name); - if (!scheme_name) - return 0; - - // Execute - bool _retval = CefRegisterCustomScheme( - CefString(scheme_name), - is_standard?true:false, - is_local?true:false, - is_display_isolated?true:false); - - // Return type: bool - return _retval; -} - CEF_EXPORT int cef_register_scheme_handler_factory( const cef_string_t* scheme_name, const cef_string_t* domain_name, struct _cef_scheme_handler_factory_t* factory) { diff --git a/cef1/libcef_dll/wrapper/libcef_dll_wrapper.cc b/cef1/libcef_dll/wrapper/libcef_dll_wrapper.cc index 78fe0e277..16a1b5e16 100644 --- a/cef1/libcef_dll/wrapper/libcef_dll_wrapper.cc +++ b/cef1/libcef_dll/wrapper/libcef_dll_wrapper.cc @@ -73,6 +73,7 @@ #include "libcef_dll/ctocpp/request_ctocpp.h" #include "libcef_dll/ctocpp/response_ctocpp.h" #include "libcef_dll/ctocpp/scheme_handler_callback_ctocpp.h" +#include "libcef_dll/ctocpp/scheme_registrar_ctocpp.h" #include "libcef_dll/ctocpp/stream_reader_ctocpp.h" #include "libcef_dll/ctocpp/stream_writer_ctocpp.h" #include "libcef_dll/ctocpp/v8context_ctocpp.h" @@ -159,6 +160,7 @@ CEF_GLOBAL void CefShutdown() { DCHECK_EQ(CefSchemeHandlerCallbackCToCpp::DebugObjCt, 0); DCHECK_EQ(CefSchemeHandlerCppToC::DebugObjCt, 0); DCHECK_EQ(CefSchemeHandlerFactoryCppToC::DebugObjCt, 0); + DCHECK_EQ(CefSchemeRegistrarCToCpp::DebugObjCt, 0); DCHECK_EQ(CefStreamReaderCToCpp::DebugObjCt, 0); DCHECK_EQ(CefStreamWriterCToCpp::DebugObjCt, 0); DCHECK_EQ(CefTaskCppToC::DebugObjCt, 0); @@ -288,26 +290,6 @@ CEF_GLOBAL bool CefClearCrossOriginWhitelist() { return _retval?true:false; } -CEF_GLOBAL bool CefRegisterCustomScheme(const CefString& scheme_name, - bool is_standard, bool is_local, bool is_display_isolated) { - // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING - - // Verify param: scheme_name; type: string_byref_const - DCHECK(!scheme_name.empty()); - if (scheme_name.empty()) - return false; - - // Execute - int _retval = cef_register_custom_scheme( - scheme_name.GetStruct(), - is_standard, - is_local, - is_display_isolated); - - // Return type: bool - return _retval?true:false; -} - CEF_GLOBAL bool CefRegisterSchemeHandlerFactory(const CefString& scheme_name, const CefString& domain_name, CefRefPtr factory) { diff --git a/cef1/tests/cefclient/cefclient.cpp b/cef1/tests/cefclient/cefclient.cpp index 0225173fb..197f12597 100644 --- a/cef1/tests/cefclient/cefclient.cpp +++ b/cef1/tests/cefclient/cefclient.cpp @@ -17,6 +17,7 @@ #include "cefclient/cefclient_switches.h" #include "cefclient/client_handler.h" #include "cefclient/binding_test.h" +#include "cefclient/scheme_test.h" #include "cefclient/string_util.h" #include "cefclient/util.h" @@ -125,6 +126,11 @@ class ClientApp : public CefApp, proxy_config_(proxy_config) { } + virtual void OnRegisterCustomSchemes( + CefRefPtr registrar) OVERRIDE { + AddSchemeTestSchemes(registrar); + } + // CefApp methods virtual CefRefPtr GetProxyHandler() OVERRIDE { return this; } diff --git a/cef1/tests/cefclient/scheme_test.cpp b/cef1/tests/cefclient/scheme_test.cpp index 3f06dc040..f9e3189ca 100644 --- a/cef1/tests/cefclient/scheme_test.cpp +++ b/cef1/tests/cefclient/scheme_test.cpp @@ -157,8 +157,11 @@ class ClientSchemeHandlerFactory : public CefSchemeHandlerFactory { IMPLEMENT_REFCOUNTING(ClientSchemeHandlerFactory); }; +void AddSchemeTestSchemes(CefRefPtr registrar) { + registrar->AddCustomScheme("client", true, false, false); +} + void InitSchemeTest() { - CefRegisterCustomScheme("client", true, false, false); CefRegisterSchemeHandlerFactory("client", "tests", new ClientSchemeHandlerFactory()); } diff --git a/cef1/tests/cefclient/scheme_test.h b/cef1/tests/cefclient/scheme_test.h index 396cf7973..c2a4c01ca 100644 --- a/cef1/tests/cefclient/scheme_test.h +++ b/cef1/tests/cefclient/scheme_test.h @@ -6,9 +6,10 @@ #define CEF_TESTS_CEFCLIENT_SCHEME_TEST_H_ #pragma once -#include "include/cef_base.h" +#include "include/cef_browser.h" +#include "include/cef_scheme.h" -class CefBrowser; +void AddSchemeTestSchemes(CefRefPtr registrar); // Register the scheme handler. void InitSchemeTest(); diff --git a/cef1/tests/unittests/cookie_unittest.cc b/cef1/tests/unittests/cookie_unittest.cc index 16bd156ad..fbef0662b 100644 --- a/cef1/tests/unittests/cookie_unittest.cc +++ b/cef1/tests/unittests/cookie_unittest.cc @@ -808,8 +808,6 @@ class CookieTestSchemeHandler : public TestHandler { manager2_ = CefCookieManager::CreateManager(CefString()); if (scheme_ != "http") { - CefRegisterCustomScheme(scheme_, true, false, false); - std::vector schemes; schemes.push_back("http"); schemes.push_back("https"); @@ -952,3 +950,12 @@ TEST(CookieTest, GetCookieManagerCustom) { EXPECT_TRUE(handler->got_cookie2_); EXPECT_TRUE(handler->got_cookie3_); } + + +// Entry point for registering custom schemes. +// Called from run_all_unittests.cc. +void RegisterCookieCustomSchemes( + CefRefPtr registrar) { + // Used by the GetCookieManagerCustom test. + registrar->AddCustomScheme("ccustom", true, false, false); +} diff --git a/cef1/tests/unittests/run_all_unittests.cc b/cef1/tests/unittests/run_all_unittests.cc index c06af9219..aec7aa3df 100644 --- a/cef1/tests/unittests/run_all_unittests.cc +++ b/cef1/tests/unittests/run_all_unittests.cc @@ -40,6 +40,27 @@ class CefTestThread : public base::Thread { int retval_; }; +class ClientApp : public CefApp { + public: + ClientApp() {} + + virtual void OnRegisterCustomSchemes( + CefRefPtr registrar) OVERRIDE { + // Bring in the scheme handler tests. + extern void RegisterSchemeHandlerCustomSchemes( + CefRefPtr registrar); + RegisterSchemeHandlerCustomSchemes(registrar); + + // Bring in the cookie tests. + extern void RegisterCookieCustomSchemes( + CefRefPtr registrar); + RegisterCookieCustomSchemes(registrar); + } + + protected: + IMPLEMENT_REFCOUNTING(ClientApp); +}; + } // namespace @@ -57,7 +78,7 @@ int main(int argc, char** argv) { #endif // Initialize CEF. - CefInitialize(settings, NULL); + CefInitialize(settings, new ClientApp()); // Create the test suite object. CefTestSuite test_suite(argc, argv); diff --git a/cef1/tests/unittests/scheme_handler_unittest.cc b/cef1/tests/unittests/scheme_handler_unittest.cc index e31cfc06b..a09414d86 100644 --- a/cef1/tests/unittests/scheme_handler_unittest.cc +++ b/cef1/tests/unittests/scheme_handler_unittest.cc @@ -337,20 +337,6 @@ TestResults g_TestResults; // If |domain| is empty the scheme will be registered as non-standard. void RegisterTestScheme(const std::string& scheme, const std::string& domain) { g_TestResults.reset(); - static std::set schemes; - - if (schemes.empty()) { - // Never register built-in schemes. - schemes.insert("http"); - } - - // Only register custom schemes one time. - if (schemes.find(scheme) == schemes.end()) { - EXPECT_TRUE(CefRegisterCustomScheme(scheme, domain.empty()?false:true, - false, false)); - WaitForUIThread(); - schemes.insert(scheme); - } EXPECT_TRUE(CefRegisterSchemeHandlerFactory(scheme, domain, new ClientSchemeHandlerFactory(&g_TestResults))); @@ -973,3 +959,13 @@ TEST(SchemeHandlerTest, HttpXSSDifferentOriginWithDomain) { ClearTestSchemes(); } + +// Entry point for registering custom schemes. +// Called from run_all_unittests.cc. +void RegisterSchemeHandlerCustomSchemes( + CefRefPtr registrar) { + // Add a custom standard scheme. + registrar->AddCustomScheme("customstd", true, false, false); + // Ad a custom non-standard scheme. + registrar->AddCustomScheme("customnonstd", false, false, false); +}