Disclosure Statement: This site contains affiliate links, which means that I may receive a commission if you make a purchase using these links. As an eBay Partner, I earn from qualifying purchases.

SchemeRegistrationBrowser

Post Reply
dilfich
Posts: 330
Joined: Thu Nov 30, 2017 1:17 am

SchemeRegistrationBrowser

Post by dilfich »

Code: Select all

Chromium1.CreateBrowser(BufferPanel1, '', TempContext);
Does not work with the installed context, how to make it work?
User avatar
salvadordf
Posts: 4016
Joined: Thu Feb 02, 2017 12:24 pm
Location: Spain
Contact:

Re: SchemeRegistrationBrowser

Post by salvadordf »

Hi,

These are the code comments for the cef_register_scheme_handler_factory function used by the SchemeRegistrationBrowser demo when it calls CefRegisterSchemeHandlerFactory in the TForm.OnCreate event :

Code: Select all

///
// Register a scheme handler factory with the global request context. An NULL
// |domain_name| value for a standard scheme will cause the factory to match all
// domain names. The |domain_name| value 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 then you must also implement the
// cef_app_t::on_register_custom_schemes() function in all processes. 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 in the
// browser process. Using this function is equivalent to calling cef_request_con
// text_t::cef_request_context_get_global_context()->register_scheme_handler_fac
// tory().
///
CefRegisterSchemeHandlerFactory can only register schemes in the global request context.

Try using TempContext.RegisterSchemeHandlerFactory to register your scheme in the new request context.
dilfich
Posts: 330
Joined: Thu Nov 30, 2017 1:17 am

Re: SchemeRegistrationBrowser

Post by dilfich »

salvadordf wrote: Tue Feb 04, 2020 9:39 am Try using TempContext.RegisterSchemeHandlerFactory to register your scheme in the new request context.
Thank you, it seems everything worked out!
dilfich
Posts: 330
Joined: Thu Nov 30, 2017 1:17 am

Re: SchemeRegistrationBrowser

Post by dilfich »

Only "server headers" are passed to GetResponseHeaders, and is it possible to change request headers?

Image
User avatar
salvadordf
Posts: 4016
Joined: Thu Feb 02, 2017 12:24 pm
Location: Spain
Contact:

Re: SchemeRegistrationBrowser

Post by salvadordf »

Perhaps you can use TCefResourceHandlerOwn.ProcessRequest to read the request but, to be honest, I don't have a clear picture of the ICefResourceHandler's state.

As you can see in the official documentation, there are some deprecated functions that we still have to use because the replacements still have issues.

https://magpcss.org/ceforum/apidocs3/pr ... ndler.html
dilfich
Posts: 330
Joined: Thu Nov 30, 2017 1:17 am

Re: SchemeRegistrationBrowser

Post by dilfich »

Yes, you can read that changing or adding a title doesn't work.
lasaranza
Posts: 23
Joined: Tue Feb 25, 2020 8:27 am

Re: SchemeRegistrationBrowser

Post by lasaranza »

Hi,

I have question related to this demo. If my url contains a port, for example, 'hello://localhost:[port]/test.html', and when the processrequest is called in the schemehandler, the url in the request does not contain the port. But when I register the custom scheme using CEF_SCHEME_OPTION_STANDARD and (instead of or) CEF_SCHEME_OPTION_LOCAL, the url remains unchanged and has the port. I wonder if this is the correct way to do it?
User avatar
salvadordf
Posts: 4016
Joined: Thu Feb 02, 2017 12:24 pm
Location: Spain
Contact:

Re: SchemeRegistrationBrowser

Post by salvadordf »

These are the final values of those constants :

Code: Select all

CEF_SCHEME_OPTION_STANDARD = $01;
CEF_SCHEME_OPTION_LOCAL = $02;
When the demo uses OR it's passing the value $03.
Using CEF_SCHEME_OPTION_STANDARD AND CEF_SCHEME_OPTION_LOCAL will pass the value $00 which means CEF_SCHEME_OPTION_NONE.

Here you have the code comments of all those constants in the CEF project :
https://bitbucket.org/chromiumembedded/ ... lines-2820

Code: Select all

//
// 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:
  // <pre>
  //  [scheme]://[username]:[password]@[host]:[port]/[url-path]
  // </pre> 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;
Post Reply