namespace Xilium.CefGlue { using System; using System.Collections.Generic; using System.Diagnostics; using System.Runtime.InteropServices; using Xilium.CefGlue.Interop; /// /// Callback interface for CefBrowserHost::AddDevToolsMessageObserver. The /// methods of this class will be called on the browser process UI thread. /// public abstract unsafe partial class CefDevToolsMessageObserver { private int on_dev_tools_message(cef_dev_tools_message_observer_t* self, cef_browser_t* browser, void* message, UIntPtr message_size) { CheckSelf(self); var m_browser = CefBrowser.FromNative(browser); var m_result = OnDevToolsMessage(m_browser, (IntPtr)message, checked((int)message_size)); return m_result ? 1 : 0; } /// /// Method that will be called on receipt of a DevTools protocol message. /// |browser| is the originating browser instance. |message| is a UTF8-encoded /// JSON dictionary representing either a method result or an event. |message| /// is only valid for the scope of this callback and should be copied if /// necessary. Return true if the message was handled or false if the message /// should be further processed and passed to the OnDevToolsMethodResult or /// OnDevToolsEvent methods as appropriate. /// Method result dictionaries include an "id" (int) value that identifies the /// orginating method call sent from CefBrowserHost::SendDevToolsMessage, and /// optionally either a "result" (dictionary) or "error" (dictionary) value. /// The "error" dictionary will contain "code" (int) and "message" (string) /// values. Event dictionaries include a "method" (string) value and optionally /// a "params" (dictionary) value. See the DevTools protocol documentation at /// https://chromedevtools.github.io/devtools-protocol/ for details of /// supported method calls and the expected "result" or "params" dictionary /// contents. JSON dictionaries can be parsed using the CefParseJSON function /// if desired, however be aware of performance considerations when parsing /// large messages (some of which may exceed 1MB in size). /// protected abstract bool OnDevToolsMessage(CefBrowser browser, IntPtr message, int messageSize); private void on_dev_tools_method_result(cef_dev_tools_message_observer_t* self, cef_browser_t* browser, int message_id, int success, void* result, UIntPtr result_size) { CheckSelf(self); var m_browser = CefBrowser.FromNative(browser); OnDevToolsMethodResult(m_browser, message_id, success != 0, (IntPtr)result, checked((int)result_size)); } /// /// Method that will be called after attempted execution of a DevTools protocol /// method. |browser| is the originating browser instance. |message_id| is the /// "id" value that identifies the originating method call message. If the /// method succeeded |success| will be true and |result| will be the /// UTF8-encoded JSON "result" dictionary value (which may be empty). If the /// method failed |success| will be false and |result| will be the UTF8-encoded /// JSON "error" dictionary value. |result| is only valid for the scope of this /// callback and should be copied if necessary. See the OnDevToolsMessage /// documentation for additional details on |result| contents. /// protected abstract void OnDevToolsMethodResult(CefBrowser browser, int messageId, bool success, IntPtr result, int resultSize); private void on_dev_tools_event(cef_dev_tools_message_observer_t* self, cef_browser_t* browser, cef_string_t* method, void* @params, UIntPtr params_size) { CheckSelf(self); var m_browser = CefBrowser.FromNative(browser); var m_method = cef_string_t.ToString(method); OnDevToolsEvent(m_browser, m_method, (IntPtr)@params, checked((int)params_size)); } /// /// Method that will be called on receipt of a DevTools protocol event. /// |browser| is the originating browser instance. |method| is the "method" /// value. |params| is the UTF8-encoded JSON "params" dictionary value (which /// may be empty). |params| is only valid for the scope of this callback and /// should be copied if necessary. See the OnDevToolsMessage documentation for /// additional details on |params| contents. /// protected abstract void OnDevToolsEvent(CefBrowser browser, string method, IntPtr parameters, int parametersSize); private void on_dev_tools_agent_attached(cef_dev_tools_message_observer_t* self, cef_browser_t* browser) { CheckSelf(self); var m_browser = CefBrowser.FromNative(browser); OnDevToolsAgentAttached(m_browser); } /// /// Method that will be called when the DevTools agent has attached. |browser| /// is the originating browser instance. This will generally occur in response /// to the first message sent while the agent is detached. /// protected abstract void OnDevToolsAgentAttached(CefBrowser browser); private void on_dev_tools_agent_detached(cef_dev_tools_message_observer_t* self, cef_browser_t* browser) { CheckSelf(self); var m_browser = CefBrowser.FromNative(browser); OnDevToolsAgentDetached(m_browser); } /// /// Method that will be called when the DevTools agent has detached. |browser| /// is the originating browser instance. Any method results that were pending /// before the agent became detached will not be delivered, and any active /// event subscriptions will be canceled. /// protected abstract void OnDevToolsAgentDetached(CefBrowser browser); } }