Page 1 of 1

SchemeRegistrationBrowser

Posted: Mon Feb 03, 2020 8:09 am
by dilfich

Code: Select all

Chromium1.CreateBrowser(BufferPanel1, '', TempContext);
Does not work with the installed context, how to make it work?

Re: SchemeRegistrationBrowser

Posted: Tue Feb 04, 2020 9:39 am
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.

Re: SchemeRegistrationBrowser

Posted: Tue Feb 04, 2020 12:42 pm
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!

Re: SchemeRegistrationBrowser

Posted: Mon Feb 24, 2020 7:07 pm
by dilfich
Only "server headers" are passed to GetResponseHeaders, and is it possible to change request headers?

Image

Re: SchemeRegistrationBrowser

Posted: Tue Feb 25, 2020 8:45 am
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

Re: SchemeRegistrationBrowser

Posted: Tue Feb 25, 2020 11:16 am
by dilfich
Yes, you can read that changing or adding a title doesn't work.

Re: SchemeRegistrationBrowser

Posted: Tue Feb 25, 2020 12:32 pm
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?

Re: SchemeRegistrationBrowser

Posted: Tue Feb 25, 2020 7:29 pm
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;