Page 4 of 10

Re: Xilium.CefGlue/3 & CefGlue/1 - RegisterScriptableObject

PostPosted: Tue Oct 30, 2012 11:16 am
by fddima
steven181 wrote:Can you please give me any suggestion?

Without full code this no have sense. CefGlue.1 can't help you 'cause it outdated but many changes was be introduced from CEF by modern 1 & 3 versions.

1. Create scheme handler factory first:
Code: Select all
    class MySchemeHandlerFactory : CefSchemeHandlerFactory
    {
        protected override CefResourceHandler Create(CefBrowser browser, CefFrame frame, string schemeName, CefRequest request)
        {
            return new MySchemeHandler();
        }
    }


2. Create scheme handler (resource handler):
Code: Select all
    // very-very-very simple stub
    class MySchemeHandler : CefResourceHandler
    {
        private static int _no;
        private bool _completed;

        protected override bool ProcessRequest(CefRequest request, CefCallback callback)
        {
            callback.Continue();
            return true;
        }

        protected override void GetResponseHeaders(CefResponse response, out long responseLength, out string redirectUrl)
        {
            response.SetHeaderMap();

            response.Status = 200;
            response.MimeType = "text/html";
            response.StatusText = "OK";
            responseLength = -1; // unknown content-length
            redirectUrl = null;  // no-redirect
        }

        protected override bool ReadResponse(System.IO.Stream response, int bytesToRead, out int bytesRead, CefCallback callback)
        {
            if (_completed)
            {
                bytesRead = 0;
                return false;
            }
            else
            {
                _no++;
                // very simple response with one block
                var content = Encoding.UTF8.GetBytes("Response #" + _no.ToString());
                if (bytesToRead < content.Length) throw new NotImplementedException(); // oops
                response.Write(content, 0, content.Length);
                bytesRead = content.Length;

                _completed = true;

                return true;
            }
        }

        protected override bool CanGetCookie(CefCookie cookie)
        {
            return false;
        }

        protected override bool CanSetCookie(CefCookie cookie)
        {
            return false;
        }

        protected override void Cancel()
        {
        }
    }


3. Register scheme handler factory:
Code: Select all
CefRuntime.RegisterSchemeHandlerFactory("http", "_app.mycooldomain", new MySchemeHandlerFactory());


If you want use custom scheme name (not http) - then you must also register it within renderers, and they are restricted - body of POST requests are not delivered to scheme handler. So it is much easier use http scheme with own unique domain.
Just follow CEF docs.

Also follow CefRequest/CefResponse GetHeaderMap/SetHeaderMap methods issue - currently this methods not implemented and you can't access to request/response headers (for example to prevent caching). But this issue will be resolved soon.

May be i'm something missing - but it is looks as minimal setup.

Re: Xilium.CefGlue/3 & CefGlue/1

PostPosted: Wed Oct 31, 2012 3:07 am
by steven181
Thanks for you quickly and meaningful response.
Case 1: Access http://_app.mycooldomain/test.html using address bar
It runs normally and print out the result "Response #1" -> great.

Case 2: Trying with "XMLHttpRequest":
Code: Select all
var xhr = new XMLHttpRequest();
            xhr.open("GET", 'http://_app.mycooldomain/test.html', false);
            //xhr.setRequestHeader('My-Custom-Header', 'Some Value');
            xhr.send();
            document.getElementById('ta').value = "Status Code: " + xhr.status + "\n\n" + xhr.responseText;
            alert('done');


- I run in debug mode, it can step into MySchemeHandlerFactory, pass all the process "ProcessRequest", "GetResponseHeaders" and ReadResponse.
- But it didn't fire below code after MySchemeHandlerFactory cycle
Code: Select all
document.getElementById('ta').value = "Status Code: " + xhr.status + "\n\n" + xhr.responseText;
            alert('done');


Would you please give me some suggestion.

Thanks for your support.

Steven

Re: Xilium.CefGlue/3 & CefGlue/1

PostPosted: Wed Oct 31, 2012 4:29 am
by fddima
steven181 wrote:Case 2: Trying with "XMLHttpRequest":


Try play with cross-origin white list. If you play with file scheme then CefBrowserSettings.UniversalAccessFromFileUrlsAllowed can be helpful.
Code: Select all
CefRuntime.AddCrossOriginWhitelistEntry("http://localhost", "http", "_app.mycooldomain", false);


I.e. page from http://localhost domain can access to http://_app.mycooldomain.

Re: Xilium.CefGlue/3 & CefGlue/1

PostPosted: Wed Oct 31, 2012 6:00 am
by steven181
fddima wrote:
steven181 wrote:Case 2: Trying with "XMLHttpRequest":


Try play with cross-origin white list. If you play with file scheme then CefBrowserSettings.UniversalAccessFromFileUrlsAllowed can be helpful.
Code: Select all
CefRuntime.AddCrossOriginWhitelistEntry("http://localhost", "http", "_app.mycooldomain", false);


I.e. page from http://localhost domain can access to http://_app.mycooldomain.



Thanks for your response.
It's still can't work. I temporary trick it work by adding below lines into MySchemeHandler
Code: Select all
public MySchemeHandler(CefBrowser browser)
{
this._browser = browser
}

and below lines for "ReadResponse"
Code: Select all
var currentURL = _browser.GetMainFrame().Url;

            _browser.GetMainFrame().ExecuteJavaScript("SayHello('Steven')", currentURL, 0);


:D It's run cool.


Another issue is Browser.GetHost().GetDevToolsUrl(false). It's always return Null or Empty. Sorry for troubleshoot you again.

Thanks for your great support.

Steven

Re: Xilium.CefGlue/3 & CefGlue/1

PostPosted: Wed Oct 31, 2012 6:33 am
by fddima
steven181 wrote:It's still can't work. I temporary trick it work by adding below lines into MySchemeHandler
Another issue is Browser.GetHost().GetDevToolsUrl(false). It's always return Null or Empty. Sorry for troubleshoot you again.

It must work. Yes, better see on this in devtools.
To enable remote debugging you must specify port via CefSettings.RemoteDebuggingPort.
Code: Select all
        /// <summary>
        /// Set to a value between 1024 and 65535 to enable remote debugging on the
        /// specified port. For example, if 8080 is specified the remote debugging URL
        /// will be http://localhost:8080. CEF can be remotely debugged from any CEF or
        /// Chrome browser window.
        /// </summary>
        public int RemoteDebuggingPort { get; set; }

Re: Xilium.CefGlue/3 & CefGlue/1

PostPosted: Wed Oct 31, 2012 9:04 am
by steven181
fddima wrote:
steven181 wrote:It's still can't work. I temporary trick it work by adding below lines into MySchemeHandler
Another issue is Browser.GetHost().GetDevToolsUrl(false). It's always return Null or Empty. Sorry for troubleshoot you again.

It must work. Yes, better see on this in devtools.
To enable remote debugging you must specify port via CefSettings.RemoteDebuggingPort.
Code: Select all
        /// <summary>
        /// Set to a value between 1024 and 65535 to enable remote debugging on the
        /// specified port. For example, if 8080 is specified the remote debugging URL
        /// will be http://localhost:8080. CEF can be remotely debugged from any CEF or
        /// Chrome browser window.
        /// </summary>
        public int RemoteDebuggingPort { get; set; }


I'm so stupid. It's work great.
Million thanks to your effort help.

Steven

Re: Xilium.CefGlue/3 & CefGlue/1

PostPosted: Sun Nov 04, 2012 1:47 am
by steven181
Hi my friends,

Do you have any plan for RegisterExtension?

Regards,
Steven

Re: Xilium.CefGlue/3 & CefGlue/1

PostPosted: Sun Nov 04, 2012 10:26 am
by fddima
steven181 wrote:Hi my friends,

Do you have any plan for RegisterExtension?

Regards,
Steven

What you exactly mean?
You already can do any required work. May be little hardly in comparison with cefglue.1, but it is possible. We open for any proposals.

Re: Xilium.CefGlue/3 & CefGlue/1

PostPosted: Fri Nov 09, 2012 10:27 am
by sebarnolds
Hello.

I am currently working with CefGlue 3 (latest version, for cef 899) and I have a problem with tooltips not being displayed (it was already the case in the previous version I was using). I checked the CefDisplayHandler class and the on_tooltip method is never called (breakpoint never reached).

Tooltips are correctly displayed on the page I am using when displayed in FireFox.

The HTML element is like this:
Code: Select all
<li><span onclick="javascript:mainViewModel.calendarEyeItemClick(\'#= Guid #\');" class="smallbox eventsbox eye#= Guid #" title="Voir les événements" style="background-color: #= WebColor() #"></span><span onclick="javascript:mainViewModel.templateClockItemClick(\'#= Guid #\');" class="smallbox slot#= Guid # timeslotsbox_grayed" title="Voir les plages horaires" style="background-color: #= WebColor() #"></span>#= Name #</li>'

The tooltip is specified with the "title" attribute.

I tried cefclient.exe which shown correctly the tooltips while the CefGlue.Demo.WinForms didn't.

Any idea ?

Thanks,
Sebastien

Re: Xilium.CefGlue/3 & CefGlue/1

PostPosted: Fri Nov 09, 2012 3:37 pm
by fddima
sebarnolds wrote:I am currently working with CefGlue 3 (latest version, for cef 899) and I have a problem with tooltips not being displayed (it was already the case in the previous version I was using). I checked the CefDisplayHandler class and the on_tooltip method is never called (breakpoint never reached).

It is happens 'cause application manifest was be not included in image file. Update sources and you will got working solution (i.e. tooltips works same as in cefclient) in winforms application. What about on_tooltip, sorry, i'm doesn't know. Default implementation work only with manifest, custom impl (on_tooltip) also must work, but require investigation. May be you something miss, or it is real bug. If you interested in handling on_tooltip method, then try provide reproduction sample.