public MyCefBrowser(IWindowControl parentControl, int x, int y, int w, int h, string initUrl, bool isOsr) { //global handler this.managedCallback = new MyCefCallback(this.HandleNativeReq); //cef-specific collection of cef-handler myBwHandler = new MyCefBwHandler(this); //--------------------------------------------------------------- this.currentUrl = initUrl; //create cef browser view handler this.parentControl = parentControl; this.topForm = parentControl.GetTopLevelControl() as IWindowForm; //for specific browser if (this.IsOsr = isOsr) { _myCefBw = new MyCefBw(Cef3Binder.MyCefCreateMyWebBrowserOSR(managedCallback)); Cef3Binder.MyCefSetupBrowserHwndOSR(_myCefBw.ptr, parentControl.GetHandle(), x, y, w, h, initUrl, IntPtr.Zero); } else { _myCefBw = new MyCefBw(Cef3Binder.MyCefCreateMyWebBrowser(managedCallback)); Cef3Binder.MyCefSetupBrowserHwnd(_myCefBw.ptr, parentControl.GetHandle(), x, y, w, h, initUrl, IntPtr.Zero); } Cef3Binder.MyCefBwCall(this._myCefBw.ptr, CefBwCallMsg.CefBw_MyCef_EnableKeyIntercept, 1); //register mycef browser RegisterCefWbControl(this); }
public static void DisposeAllChildWebBrowserControls(IWindowForm ownerForm) { //dispose all web browser (child) windows inside this window form List <MyCefBrowser> foundList; if (registerTopWindowForms.TryGetValue(ownerForm, out foundList)) { //remove webbrowser controls for (int i = foundList.Count - 1; i >= 0; --i) { MyCefBrowser mycefBw = foundList[i]; IWindowControl wb = mycefBw.ParentControl; mycefBw.NotifyCloseBw(); //--------------------------------------- var parent = wb.GetParent(); parent.RemoveChild(wb); //this Dispose() will terminate cef_life_time_handle *** //after native side dispose the wb control //it will raise event BrowserDisposed wb.Dispose(); //--------------------------------------- } registerTopWindowForms.Remove(ownerForm); } }
//---- public MyCefBrowser(IWindowControl parentControl, int x, int y, int w, int h, string initUrl, bool isOsr) { this.currentUrl = initUrl; //create cef browser view handler this.parentControl = parentControl; this.topForm = (IWindowForm)parentControl.GetTopLevelControl(); //ui process *** this.managedCallback = new MyCefCallback(this.MxCallBack); //for specific browser if (this.IsOsr = isOsr) { this.myCefBrowser = Cef3Binder.MyCefCreateMyWebBrowserOSR(managedCallback); Cef3Binder.MyCefSetupBrowserHwndOSR(myCefBrowser, parentControl.GetHandle(), x, y, w, h, initUrl, IntPtr.Zero); } else { this.myCefBrowser = Cef3Binder.MyCefCreateMyWebBrowser(managedCallback); Cef3Binder.MyCefSetupBrowserHwnd(myCefBrowser, parentControl.GetHandle(), x, y, w, h, initUrl, IntPtr.Zero); } Cef3Binder.MyCefEnableKeyIntercept(myCefBrowser, 1); //register mycef browser RegisterCefWbControl(this); }
public static bool IsReadyToClose(IWindowForm winForm) { //ready-to-close winform lock (sync_remove) { List <MyCefBrowser> cefBrowserList; if (registerTopWindowForms.TryGetValue(winForm, out cefBrowserList)) { return(cefBrowserList.Count == 0); } return(true); } }
public void ShowDevTools() { if (cefDevWindow == null) { cefDevWindow = new MyCefDevWindow(); IWindowForm devForm = Cef3Binder.CreateBlankForm(800, 600); devForm.Text = "Developer Tool"; devForm.Show(); Cef3Binder.MyCefShowDevTools(this.myCefBrowser, cefDevWindow.GetMyCefBrowser(), devForm.GetHandle()); } }
static void cefBrowserControl_Disposed(object sender, EventArgs e) { //web browser control is dispose MyCefBrowser wb = (MyCefBrowser)sender; List <MyCefBrowser> wblist; IWindowForm winHandle = wb.ParentForm; if (registerTopWindowForms.TryGetValue(winHandle, out wblist)) { lock (sync_remove) { wblist.Remove(wb); } } }
public void ShowDevTools() { if (devForm == null) { devForm = Cef3Binder.CreateBlankForm(800, 600); devForm.Text = "Developer Tool"; devForm.Show(); devForm.FormClosed += DevForm_FormClosed; } if (cefDevWindow == null) { cefDevWindow = new MyCefDevWindow(); Cef3Binder.MyCefShowDevTools(_myCefBw.ptr, cefDevWindow.GetMyCefBrowser(), devForm.GetHandle()); } }
static void cefBrowserControl_Disposed(object sender, EventArgs e) { //web browser control is disposed //TODO: review here MyCefBrowser wb = sender as MyCefBrowser; if (wb != null) { IWindowForm winHandle = wb.ParentForm; List <MyCefBrowser> wblist; if (registerTopWindowForms.TryGetValue(winHandle, out wblist)) { lock (sync_remove) { wblist.Remove(wb); } } } else { throw new NotSupportedException(); } }
void HandleNativeReq(int met_id, IntPtr argsPtr) { //main raw msg switch table if ((met_id >> 16) > 0) { //built in object CefNativeRequestHandlers.HandleNativeReq_I0(myBwHandler, met_id, argsPtr); return; } //else this is custom msg switch ((MyCefMsg)met_id) { default: break; case MyCefMsg.CEF_MSG_ClientHandler_NotifyBrowserCreated: { IsBrowserCreated = true; } break; case MyCefMsg.CEF_MSG_ClientHandler_NotifyBrowserClosing: { } break; case MyCefMsg.CEF_MSG_ClientHandler_NotifyBrowserClosed: { if (this.devForm != null) { this.devForm.Close(); ((IDisposable)this.devForm).Dispose(); this.devForm = null; } if (this.BrowserDisposed != null) { this.BrowserDisposed(this, EventArgs.Empty); } } break; //case MyCefMsg.CEF_MSG_ClientHandler_OnBeforeContextMenu: // { // } // break; //case MyCefMsg.CEF_MSG_ClientHandler_DownloadUpdated: // { // //this version we notify back // //when // NativeCallArgs metArgs = new NativeCallArgs(argsPtr); // if (browserProcessListener != null) // { // browserProcessListener.OnDownloadCompleted(metArgs); // } // } // break; //case MyCefMsg.CEF_MSG_ClientHandler_OnBeforePopup: // { // NativeCallArgs args = new NativeCallArgs(argsPtr); // //open new form with specific url // string url = args.GetArgAsString(0); // Cef3Binder.SafeUIInvoke(() => // { // IWindowForm form = Cef3Binder.CreateNewBrowserWindow(800, 600); // form.Show(); // //and navigate to a specific url // }); // } // break; //case MyCefMsg.CEF_MSG_ClientHandler_OnConsoleMessage: // { // //console.log ... // if (browserProcessListener != null) // { // NativeCallArgs args = new NativeCallArgs(argsPtr); // browserProcessListener.OnConsoleLog(args); // } // } // break; //case MyCefMsg.CEF_MSG_ClientHandler_ShowDevTools: // { // //show dev tools // //Cef3Binder.SafeUIInvoke(() => // //{ // // IWindowForm newPopupForm = Cef3Binder.CreateNewBrowserWindow(800, 600); // // newPopupForm.Show(); // //}); // } // break; //case MyCefMsg.CEF_MSG_ClientHandler_OnLoadError: // { // //load page error // //ui process // var args = new NativeCallArgs(argsPtr); // IntPtr cefBrowser = args.GetArgAsNativePtr(0); // IntPtr cefFrame = args.GetArgAsNativePtr(1); // int errorCode = args.GetArgAsInt32(2);//error code // string errorText = args.GetArgAsString(3);//errorText // string failedUrl = args.GetArgAsString(4); //failedUrl // //--------------------------- // //load error page // LoadErrorPage(cefBrowser, cefFrame, errorCode, errorText, failedUrl); // } // break; //case MyCefMsg.CEF_MSG_ClientHandler_OnCertError: // { // var args = new NativeCallArgs(argsPtr); // string certErrMsg = args.GetArgAsString(0); // args.SetOutput(0, 1);//true // } // break; //case MyCefMsg.CEF_MSG_ClientHandler_ExecCustomProtocol: // { // //disable all protocol // var args = new NativeCallArgs(argsPtr); // if (browserProcessListener != null) // { // browserProcessListener.OnExecProtocol(args); // } // else // { // args.SetOutput(0, 0);//disable all protocol // } // } // break; //---- //TODO: review here again //case MyCefMsg.CEF_MSG_ClientHandler_SetResourceManager: // { // //setup resource mx // if (browserProcessListener != null) // { // //INIT_MY_MET_ARGS(metArgs, 1) // // MyCefSetVoidPtr2(&vargs[1], resource_manager_); // var args = new NativeCallArgs(argsPtr); // var resourceMx = new NativeResourceMx(args.GetArgAsNativePtr(1)); // browserProcessListener.OnAddResourceMx(resourceMx); // } // } // break; //case MyCefMsg.CEF_MSG_RequestUrlFilter2: // { // //filter url name // if (browserProcessListener != null) // { // var args = new NativeCallArgs(argsPtr); // browserProcessListener.OnFilterUrl(args); // } // } // break; //case MyCefMsg.CEF_MSG_BinaryResouceProvider_OnRequest: // { // //request for binary resource // if (browserProcessListener != null) // { // var args = new NativeCallArgs(argsPtr); // browserProcessListener.OnRequestForBinaryResource(args); // } // } // break; //------------------------------ //eg. from cefQuery --> case MyCefMsg.CEF_MSG_OnQuery: { //if (browserProcessListener != null) //{ // var args = new NativeCallArgs(argsPtr); // QueryRequestArgs reqArgs = QueryRequestArgs.CreateRequest(args.GetArgAsNativePtr(0)); // browserProcessListener.OnCefQuery(args, reqArgs); //} //TODO: review here again //QueryRequestArgs queryReq; //memset(&queryReq, 0, sizeof(QueryRequestArgs)); //queryReq.browser = browser.get(); //queryReq.frame = frame.get(); //queryReq.query_id = query_id; //MyCefStringHolder mystr; //mystr.value = request; //queryReq.request = &mystr; //queryReq.persistent = persistent; //queryReq.callback = callback.get(); //MethodArgs args; //memset(&args, 0, sizeof(MethodArgs)); //args.SetArgAsNativeObject(0, &queryReq); //this->mcallback_(CEF_MSG_OnQuery, &args); ////auto result = args.ReadOutputAsString(0); //CefString cefstr = args.ReadOutputAsString(0); //callback->Success(cefstr); } break; //------------------------------ case MyCefMsg.CEF_MSG_ClientHandler_NotifyTitle: { //INIT_MY_MET_ARGS(metArgs, 1) //SetCefStringToJsValue2(&vargs[1], string); //title changed var args = new NativeCallArgs(argsPtr); string newtitle = args.GetArgAsString(1); // Console.WriteLine("title changed:" + newtitle); } break; case MyCefMsg.CEF_MSG_ClientHandler_NotifyAddress: { //INIT_MY_MET_ARGS(metArgs, 1) //SetCefStringToJsValue2(&vargs[1], string); //address changed var args = new NativeCallArgs(argsPtr); string newtitle = args.GetArgAsString(1); // Console.WriteLine("address changed:" + newtitle); } break; //------------------------------ case MyCefMsg.CEF_MSG_OSR_Render: { //receive rendere msg var args = new NativeCallArgs(argsPtr); //copy bits buffer and store to files if (cefOsrListener != null) { cefOsrListener.OnRender(args); } } break; } }
private void DevForm_FormClosed(object sender, EventArgs e) { devForm = null; cefDevWindow = null; }
void MxCallBack(int id, IntPtr argsPtr) { switch ((MyCefMsg)id) { case MyCefMsg.CEF_MSG_ClientHandler_OnBeforePopup: { NativeCallArgs args = new NativeCallArgs(argsPtr); string url = args.GetArgAsString(0); Cef3Binder.SafeUIInvoke(() => { IWindowForm popupWin = Cef3Binder.CreateNewBrowserWindow(600, 450); popupWin.Show(); }); } break; case MyCefMsg.CEF_MSG_ClientHandler_BeforeDownload: { } break; case MyCefMsg.CEF_MSG_ClientHandler_ShowDevTools: { //show dev tools Cef3Binder.SafeUIInvoke(() => { IWindowForm newPopupForm = Cef3Binder.CreateNewBrowserWindow(800, 600); newPopupForm.Show(); }); } break; case MyCefMsg.CEF_MSG_CefSettings_Init: { InitCefSettings(new CefSettings(argsPtr)); } break; case MyCefMsg.CEF_MSG_MainContext_GetConsoleLogPath: { NativeCallArgs nat1 = new NativeCallArgs(argsPtr); nat1.SetOutputAsAsciiString(0, "d:\\WImageTest\\cef_console.log"); } break; case MyCefMsg.CEF_MSG_OSR_Render: { //not visit here? } break; case MyCefMsg.CEF_MSG_RenderDelegate_OnContextCreated: { //client app callback //eg. from RenderClientApp //in render process *** //we can register external methods for window object here. //NativeMethods.MessageBox(IntPtr.Zero, id.ToString(), "NN2", 0); if (renderProcessListener != null) { NativeCallArgs args = new NativeCallArgs(argsPtr); MyCefContextArgs cefContextArgs = new MyCefContextArgs(args); //var clientRenderApp = new NativeRendererApp(args.GetArgAsNativePtr(0)); //var browser = new NativeBrowser(args.GetArgAsNativePtr(1)); //var context = new NativeJsContext(args.GetArgAsNativePtr(2)); renderProcessListener.OnContextCreated(cefContextArgs); } } break; case MyCefMsg.CEF_MSG_RenderDelegate_OnContextReleased: { if (renderProcessListener != null) { NativeCallArgs args = new NativeCallArgs(argsPtr); MyCefContextArgs cefContextArgs = new MyCefContextArgs(args); //var clientRenderApp = new NativeRendererApp(args.GetArgAsNativePtr(0)); //var browser = new NativeBrowser(args.GetArgAsNativePtr(1)); //var context = new NativeJsContext(args.GetArgAsNativePtr(2)); renderProcessListener.OnContextReleased(cefContextArgs); } } break; case MyCefMsg.CEF_MSG_RenderDelegate_OnWebKitInitialized: { if (renderProcessListener != null) { NativeCallArgs args = new NativeCallArgs(argsPtr); renderProcessListener.OnWebKitInitialized(args); } } break; } }
void MxCallBack(int id, IntPtr argsPtr) { switch ((MyCefMsg)id) { case MyCefMsg.CEF_MSG_ClientHandler_NotifyBrowserCreated: { IsBrowserCreated = true; } break; case MyCefMsg.CEF_MSG_ClientHandler_NotifyBrowserClosing: { } break; case MyCefMsg.CEF_MSG_ClientHandler_NotifyBrowserClosed: { if (this.devForm != null) { this.devForm.Close(); ((IDisposable)this.devForm).Dispose(); this.devForm = null; } if (this.BrowserDisposed != null) { this.BrowserDisposed(this, EventArgs.Empty); } } break; case MyCefMsg.CEF_MSG_ClientHandler_OnBeforeContextMenu: { } break; case MyCefMsg.CEF_MSG_ClientHandler_BeforeDownload: { //handle download path here NativeCallArgs metArgs = new NativeCallArgs(argsPtr); string pathName = metArgs.GetArgAsString(2); } break; case MyCefMsg.CEF_MSG_ClientHandler_DownloadUpdated: { //this version we notify back //when NativeCallArgs metArgs = new NativeCallArgs(argsPtr); if (browserProcessListener != null) { browserProcessListener.OnDownloadCompleted(metArgs); } } break; case MyCefMsg.CEF_MSG_ClientHandler_OnBeforePopup: { NativeCallArgs args = new NativeCallArgs(argsPtr); //open new form with specific url string url = args.GetArgAsString(0); Cef3Binder.SafeUIInvoke(() => { IWindowForm form = Cef3Binder.CreateNewBrowserWindow(800, 600); form.Show(); //and navigate to a specific url }); } break; case MyCefMsg.CEF_MSG_ClientHandler_OnConsoleMessage: { //console.log ... if (browserProcessListener != null) { NativeCallArgs args = new NativeCallArgs(argsPtr); browserProcessListener.OnConsoleLog(args); } } break; case MyCefMsg.CEF_MSG_ClientHandler_ShowDevTools: { //show dev tools Cef3Binder.SafeUIInvoke(() => { IWindowForm newPopupForm = Cef3Binder.CreateNewBrowserWindow(800, 600); newPopupForm.Show(); }); } break; case MyCefMsg.CEF_MSG_ClientHandler_OnLoadError: { //load page error //ui process var args = new NativeCallArgs(argsPtr); IntPtr cefBrowser = args.GetArgAsNativePtr(0); IntPtr cefFrame = args.GetArgAsNativePtr(1); int errorCode = args.GetArgAsInt32(2); //error code string errorText = args.GetArgAsString(3); //errorText string failedUrl = args.GetArgAsString(4); //failedUrl //--------------------------- //load error page LoadErrorPage(cefBrowser, cefFrame, errorCode, errorText, failedUrl); } break; case MyCefMsg.CEF_MSG_ClientHandler_OnCertError: { var args = new NativeCallArgs(argsPtr); string certErrMsg = args.GetArgAsString(0); args.SetOutput(0, 1); //true } break; case MyCefMsg.CEF_MSG_ClientHandler_ExecCustomProtocol: { //disable all protocol var args = new NativeCallArgs(argsPtr); if (browserProcessListener != null) { browserProcessListener.OnExecProtocol(args); } else { args.SetOutput(0, 0); //disable all protocol } } break; case MyCefMsg.CEF_MSG_ClientHandler_SetResourceManager: { //setup resource mx if (browserProcessListener != null) { var args = new NativeCallArgs(argsPtr); var resourceMx = new NativeResourceMx(args.GetArgAsNativePtr(0)); browserProcessListener.OnAddResourceMx(resourceMx); } } break; case MyCefMsg.CEF_MSG_RequestUrlFilter2: { //filter url name if (browserProcessListener != null) { var args = new NativeCallArgs(argsPtr); browserProcessListener.OnFilterUrl(args); } } break; case MyCefMsg.CEF_MSG_BinaryResouceProvider_OnRequest: { //request for binary resource if (browserProcessListener != null) { var args = new NativeCallArgs(argsPtr); browserProcessListener.OnRequestForBinaryResource(args); } } break; //------------------------------ //eg. from cefQuery --> case MyCefMsg.CEF_MSG_OnQuery: { if (browserProcessListener != null) { var args = new NativeCallArgs(argsPtr); QueryRequestArgs reqArgs = QueryRequestArgs.CreateRequest(args.GetArgAsNativePtr(0)); browserProcessListener.OnCefQuery(args, reqArgs); } } break; //------------------------------ case MyCefMsg.CEF_MSG_ClientHandler_OnPreKeyEvent: //on PreKey { // Console.WriteLine("on pre key"); NavigateTo("https://html5test.com"); } break; //------------------------------ case MyCefMsg.CEF_MSG_ClientHandler_NotifyTitle: { //title changed var args = new NativeCallArgs(argsPtr); string newtitle = args.GetArgAsString(0); // Console.WriteLine("title changed:" + newtitle); } break; case MyCefMsg.CEF_MSG_ClientHandler_NotifyAddress: { //address changed var args = new NativeCallArgs(argsPtr); string newtitle = args.GetArgAsString(0); // Console.WriteLine("address changed:" + newtitle); } break; //------------------------------ case MyCefMsg.CEF_MSG_OSR_Render: { //receive rendere msg var args = new NativeCallArgs(argsPtr); //copy bits buffer and store to files if (cefOsrListener != null) { cefOsrListener.OnRender(args); } } break; } }