diff --git a/include/capi/cef_scheme_capi.h b/include/capi/cef_scheme_capi.h index 69c884e76..5122f8ace 100644 --- a/include/capi/cef_scheme_capi.h +++ b/include/capi/cef_scheme_capi.h @@ -33,7 +33,7 @@ // by hand. See the translator.README.txt file in the tools directory for // more information. // -// $hash=ba3b03834e2db16056cd2be805ec9f116a92e14e$ +// $hash=1d4a363735a7274fb957905f47841c63301507f0$ // #ifndef CEF_INCLUDE_CAPI_CEF_SCHEME_CAPI_H_ @@ -66,59 +66,7 @@ typedef struct _cef_scheme_registrar_t { // 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 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 can only be displayed from - // other content hosted with the same scheme. For example, pages in other - // origins cannot create iframes or hyperlinks to URLs with the scheme. For - // schemes that must be accessible from other schemes set this value to false - // (0), set |is_cors_enabled| to true (1), and use CORS "Access-Control-Allow- - // Origin" headers to further restrict access. - // - // If |is_secure| is true (1) the scheme will be treated with the same - // security rules as those applied to "https" URLs. For example, loading this - // scheme from other secure schemes will not trigger mixed content warnings. - // - // If |is_cors_enabled| is true (1) the scheme can be sent CORS requests. This - // value should be true (1) in most cases where |is_standard| is true (1). - // - // If |is_csp_bypassing| is true (1) the scheme can bypass Content-Security- - // Policy (CSP) checks. This value should be false (0) in most cases where - // |is_standard| is true (1). - // - // If |is_fetch_enabled| is true (1) the scheme can perform Fetch API - // requests. + // See cef_scheme_options_t for possible values for |options|. // // 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 @@ -126,13 +74,7 @@ typedef struct _cef_scheme_registrar_t { /// 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, - int is_secure, - int is_cors_enabled, - int is_csp_bypassing, - int is_fetch_enabled); + int options); } cef_scheme_registrar_t; /// diff --git a/include/cef_scheme.h b/include/cef_scheme.h index da66f4297..17b62cbae 100644 --- a/include/cef_scheme.h +++ b/include/cef_scheme.h @@ -86,72 +86,14 @@ class CefSchemeRegistrar : public CefBaseScoped { // 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 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 can only be displayed from - // other content hosted with the same scheme. For example, pages in other - // origins cannot create iframes or hyperlinks to URLs with the scheme. For - // schemes that must be accessible from other schemes set this value to false, - // set |is_cors_enabled| to true, and use CORS "Access-Control-Allow-Origin" - // headers to further restrict access. - // - // If |is_secure| is true the scheme will be treated with the same security - // rules as those applied to "https" URLs. For example, loading this scheme - // from other secure schemes will not trigger mixed content warnings. - // - // If |is_cors_enabled| is true the scheme can be sent CORS requests. This - // value should be true in most cases where |is_standard| is true. - // - // If |is_csp_bypassing| is true the scheme can bypass Content-Security-Policy - // (CSP) checks. This value should be false in most cases where |is_standard| - // is true. - // - // If |is_fetch_enabled| is true the scheme can perform Fetch API requests. + // See cef_scheme_options_t for possible values for |options|. // // 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, - bool is_secure, - bool is_cors_enabled, - bool is_csp_bypassing, - bool is_fetch_enabled) = 0; + virtual bool AddCustomScheme(const CefString& scheme_name, int options) = 0; }; /// diff --git a/include/internal/cef_types.h b/include/internal/cef_types.h index f47e8608d..4aef4ed30 100644 --- a/include/internal/cef_types.h +++ b/include/internal/cef_types.h @@ -2745,6 +2745,90 @@ typedef enum { SSL_CONTENT_RAN_INSECURE_CONTENT = 1 << 1, } cef_ssl_content_status_t; +// +// Configuration options for registering a custom scheme. +// These values are used when calling AddCustomScheme. +// +typedef enum { + CEF_SCHEME_OPTION_NONE = 0, + + /// + // If CEF_SCHEME_OPTION_STANDARD is set 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. + /// + CEF_SCHEME_OPTION_STANDARD = 1 << 0, + + /// + // If CEF_SCHEME_OPTION_LOCAL is set the scheme will be treated 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). + /// + CEF_SCHEME_OPTION_LOCAL = 1 << 1, + + /// + // If CEF_SCHEME_OPTION_DISPLAY_ISOLATED is set the scheme can only be + // displayed from other content hosted with the same scheme. For example, + // pages in other origins cannot create iframes or hyperlinks to URLs with the + // scheme. For schemes that must be accessible from other schemes don't set + // this, set CEF_SCHEME_OPTION_CORS_ENABLED, and use CORS + // "Access-Control-Allow-Origin" headers to further restrict access. + /// + CEF_SCHEME_OPTION_DISPLAY_ISOLATED = 1 << 2, + + /// + // If CEF_SCHEME_OPTION_SECURE is set the scheme will be treated with the same + // security rules as those applied to "https" URLs. For example, loading this + // scheme from other secure schemes will not trigger mixed content warnings. + /// + CEF_SCHEME_OPTION_SECURE = 1 << 3, + + /// + // If CEF_SCHEME_OPTION_CORS_ENABLED is set the scheme can be sent CORS + // requests. This value should be set in most cases where + // CEF_SCHEME_OPTION_STANDARD is set. + /// + CEF_SCHEME_OPTION_CORS_ENABLED = 1 << 4, + + /// + // If CEF_SCHEME_OPTION_CSP_BYPASSING is set the scheme can bypass Content- + // Security-Policy (CSP) checks. This value should not be set in most cases + // where CEF_SCHEME_OPTION_STANDARD is set. + /// + CEF_SCHEME_OPTION_CSP_BYPASSING = 1 << 5, + + /// + // If CEF_SCHEME_OPTION_FETCH_ENABLED is set the scheme can perform Fetch API + // requests. + /// + CEF_SCHEME_OPTION_FETCH_ENABLED = 1 << 6, +} cef_scheme_options_t; + /// // Error codes for CDM registration. See cef_web_plugin.h for details. /// diff --git a/libcef/common/scheme_registrar_impl.cc b/libcef/common/scheme_registrar_impl.cc index a6fda49b9..870d797a9 100644 --- a/libcef/common/scheme_registrar_impl.cc +++ b/libcef/common/scheme_registrar_impl.cc @@ -21,18 +21,12 @@ void AppendArray(const std::vector& source, return; target->insert(target->end(), source.begin(), source.end()); } -} +} // namespace CefSchemeRegistrarImpl::CefSchemeRegistrarImpl() {} bool CefSchemeRegistrarImpl::AddCustomScheme(const CefString& scheme_name, - bool is_standard, - bool is_local, - bool is_display_isolated, - bool is_secure, - bool is_cors_enabled, - bool is_csp_bypassing, - bool is_fetch_enabled) { + int options) { const std::string& scheme = base::ToLowerASCII(scheme_name.ToString()); if (scheme::IsInternalHandledScheme(scheme) || registered_schemes_.find(scheme) != registered_schemes_.end()) { @@ -41,6 +35,14 @@ bool CefSchemeRegistrarImpl::AddCustomScheme(const CefString& scheme_name, registered_schemes_.insert(scheme); + const bool is_standard = options & CEF_SCHEME_OPTION_STANDARD; + const bool is_local = options & CEF_SCHEME_OPTION_LOCAL; + const bool is_display_isolated = options & CEF_SCHEME_OPTION_DISPLAY_ISOLATED; + const bool is_secure = options & CEF_SCHEME_OPTION_SECURE; + const bool is_cors_enabled = options & CEF_SCHEME_OPTION_CORS_ENABLED; + const bool is_csp_bypassing = options & CEF_SCHEME_OPTION_CSP_BYPASSING; + const bool is_fetch_enabled = options & CEF_SCHEME_OPTION_FETCH_ENABLED; + // The |is_display_isolated| value is excluded here because it's registered // with Blink only. if (is_standard) diff --git a/libcef/common/scheme_registrar_impl.h b/libcef/common/scheme_registrar_impl.h index 66e295de5..ed712666c 100644 --- a/libcef/common/scheme_registrar_impl.h +++ b/libcef/common/scheme_registrar_impl.h @@ -18,14 +18,7 @@ class CefSchemeRegistrarImpl : public CefSchemeRegistrar { CefSchemeRegistrarImpl(); // CefSchemeRegistrar methods. - bool AddCustomScheme(const CefString& scheme_name, - bool is_standard, - bool is_local, - bool is_display_isolated, - bool is_secure, - bool is_cors_enabled, - bool is_csp_bypassing, - bool is_fetch_enabled) override; + bool AddCustomScheme(const CefString& scheme_name, int options) override; void GetSchemes(content::ContentClient::Schemes* schemes); diff --git a/libcef_dll/cpptoc/scheme_registrar_cpptoc.cc b/libcef_dll/cpptoc/scheme_registrar_cpptoc.cc index 653366279..06ce67619 100644 --- a/libcef_dll/cpptoc/scheme_registrar_cpptoc.cc +++ b/libcef_dll/cpptoc/scheme_registrar_cpptoc.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=5ceb0e97ddd8a7f8005eb9ee78f9b8a938896586$ +// $hash=614c8379cf69b72edaf8b590da66aaa3264e511e$ // #include "libcef_dll/cpptoc/scheme_registrar_cpptoc.h" @@ -21,13 +21,7 @@ namespace { 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, - int is_secure, - int is_cors_enabled, - int is_csp_bypassing, - int is_fetch_enabled) { + int options) { // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING DCHECK(self); @@ -40,10 +34,7 @@ scheme_registrar_add_custom_scheme(struct _cef_scheme_registrar_t* self, // Execute bool _retval = CefSchemeRegistrarCppToC::Get(self)->AddCustomScheme( - CefString(scheme_name), is_standard ? true : false, - is_local ? true : false, is_display_isolated ? true : false, - is_secure ? true : false, is_cors_enabled ? true : false, - is_csp_bypassing ? true : false, is_fetch_enabled ? true : false); + CefString(scheme_name), options); // Return type: bool return _retval; diff --git a/libcef_dll/ctocpp/scheme_registrar_ctocpp.cc b/libcef_dll/ctocpp/scheme_registrar_ctocpp.cc index 441a2e1d0..0454b79f6 100644 --- a/libcef_dll/ctocpp/scheme_registrar_ctocpp.cc +++ b/libcef_dll/ctocpp/scheme_registrar_ctocpp.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=cd85708cf16cdb2b3359094b1a9645ab6338c059$ +// $hash=b114df75241a43b240b00eb12509473eaa492dd0$ // #include "libcef_dll/ctocpp/scheme_registrar_ctocpp.h" @@ -18,13 +18,7 @@ NO_SANITIZE("cfi-icall") bool CefSchemeRegistrarCToCpp::AddCustomScheme(const CefString& scheme_name, - bool is_standard, - bool is_local, - bool is_display_isolated, - bool is_secure, - bool is_cors_enabled, - bool is_csp_bypassing, - bool is_fetch_enabled) { + int options) { cef_scheme_registrar_t* _struct = GetStruct(); if (CEF_MEMBER_MISSING(_struct, add_custom_scheme)) return false; @@ -37,10 +31,8 @@ bool CefSchemeRegistrarCToCpp::AddCustomScheme(const CefString& scheme_name, return false; // Execute - int _retval = _struct->add_custom_scheme( - _struct, scheme_name.GetStruct(), is_standard, is_local, - is_display_isolated, is_secure, is_cors_enabled, is_csp_bypassing, - is_fetch_enabled); + int _retval = + _struct->add_custom_scheme(_struct, scheme_name.GetStruct(), options); // Return type: bool return _retval ? true : false; diff --git a/libcef_dll/ctocpp/scheme_registrar_ctocpp.h b/libcef_dll/ctocpp/scheme_registrar_ctocpp.h index 34db688f4..1c53c8163 100644 --- a/libcef_dll/ctocpp/scheme_registrar_ctocpp.h +++ b/libcef_dll/ctocpp/scheme_registrar_ctocpp.h @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=b3cac10a32964e7c29eb39cfb7e2fda4c3f869f9$ +// $hash=3664a7285a3f5eac9bc7522a2b812bdaf5d42467$ // #ifndef CEF_LIBCEF_DLL_CTOCPP_SCHEME_REGISTRAR_CTOCPP_H_ @@ -35,14 +35,7 @@ class CefSchemeRegistrarCToCpp virtual ~CefSchemeRegistrarCToCpp(); // CefSchemeRegistrar methods. - bool AddCustomScheme(const CefString& scheme_name, - bool is_standard, - bool is_local, - bool is_display_isolated, - bool is_secure, - bool is_cors_enabled, - bool is_csp_bypassing, - bool is_fetch_enabled) OVERRIDE; + bool AddCustomScheme(const CefString& scheme_name, int options) OVERRIDE; }; #endif // CEF_LIBCEF_DLL_CTOCPP_SCHEME_REGISTRAR_CTOCPP_H_ diff --git a/tests/cefclient/common/scheme_test_common.cc b/tests/cefclient/common/scheme_test_common.cc index 6d0786bb1..4cf337a4d 100644 --- a/tests/cefclient/common/scheme_test_common.cc +++ b/tests/cefclient/common/scheme_test_common.cc @@ -11,8 +11,8 @@ namespace scheme_test { void RegisterCustomSchemes(CefRawPtr registrar, std::vector& cookiable_schemes) { - registrar->AddCustomScheme("client", true, false, false, false, true, false, - false); + registrar->AddCustomScheme( + "client", CEF_SCHEME_OPTION_STANDARD | CEF_SCHEME_OPTION_CORS_ENABLED); } } // namespace scheme_test diff --git a/tests/ceftests/cookie_unittest.cc b/tests/ceftests/cookie_unittest.cc index fdf2e8def..6cc6175d3 100644 --- a/tests/ceftests/cookie_unittest.cc +++ b/tests/ceftests/cookie_unittest.cc @@ -1333,6 +1333,6 @@ TEST(CookieTest, GetCookieManagerCustom) { void RegisterCookieCustomSchemes(CefRawPtr registrar, std::vector& cookiable_schemes) { // Used by GetCookieManagerCustom test. - registrar->AddCustomScheme("ccustom", true, false, false, false, true, false, - false); + registrar->AddCustomScheme( + "ccustom", CEF_SCHEME_OPTION_STANDARD | CEF_SCHEME_OPTION_CORS_ENABLED); } diff --git a/tests/ceftests/scheme_handler_unittest.cc b/tests/ceftests/scheme_handler_unittest.cc index 148723c1d..51c112d14 100644 --- a/tests/ceftests/scheme_handler_unittest.cc +++ b/tests/ceftests/scheme_handler_unittest.cc @@ -2114,13 +2114,14 @@ void RegisterSchemeHandlerCustomSchemes( CefRawPtr registrar, std::vector& cookiable_schemes) { // Add a custom standard scheme. - registrar->AddCustomScheme("customstd", true, false, false, false, true, - false, false); - registrar->AddCustomScheme("customstdfetch", true, false, false, false, true, - false, true); + registrar->AddCustomScheme( + "customstd", CEF_SCHEME_OPTION_STANDARD | CEF_SCHEME_OPTION_CORS_ENABLED); + registrar->AddCustomScheme("customstdfetch", + CEF_SCHEME_OPTION_STANDARD | + CEF_SCHEME_OPTION_CORS_ENABLED | + CEF_SCHEME_OPTION_FETCH_ENABLED); // Add a custom non-standard scheme. - registrar->AddCustomScheme("customnonstd", false, false, false, false, false, - false, false); - registrar->AddCustomScheme("customnonstdfetch", false, false, false, false, - false, false, true); + registrar->AddCustomScheme("customnonstd", CEF_SCHEME_OPTION_NONE); + registrar->AddCustomScheme("customnonstdfetch", + CEF_SCHEME_OPTION_FETCH_ENABLED); } diff --git a/tests/ceftests/urlrequest_unittest.cc b/tests/ceftests/urlrequest_unittest.cc index 08e0add08..dc7984eea 100644 --- a/tests/ceftests/urlrequest_unittest.cc +++ b/tests/ceftests/urlrequest_unittest.cc @@ -2246,8 +2246,8 @@ void RegisterURLRequestCustomSchemes( CefRawPtr registrar, std::vector& cookiable_schemes) { const std::string& scheme = GetRequestScheme(false); - registrar->AddCustomScheme(scheme, true, false, false, false, true, false, - false); + registrar->AddCustomScheme( + scheme, CEF_SCHEME_OPTION_STANDARD | CEF_SCHEME_OPTION_CORS_ENABLED); cookiable_schemes.push_back(scheme); }