diff --git a/CefSharp.WinForms/WebView.h b/CefSharp.WinForms/WebView.h index 296a0e6379..61753a060d 100644 --- a/CefSharp.WinForms/WebView.h +++ b/CefSharp.WinForms/WebView.h @@ -146,6 +146,12 @@ namespace WinForms void set(IKeyboardHandler^ handler) { _browserCore->KeyboardHandler = handler; } } + virtual property IJsDialogHandler^ JsDialogHandler + { + IJsDialogHandler^ get() { return _browserCore->JsDialogHandler; } + void set(IJsDialogHandler^ handler) { _browserCore->JsDialogHandler = handler; } + } + virtual void OnInitialized(); virtual void Load(String^ url); diff --git a/CefSharp.Wpf/WebView.h b/CefSharp.Wpf/WebView.h index 2e9fab377a..71a2408e08 100644 --- a/CefSharp.Wpf/WebView.h +++ b/CefSharp.Wpf/WebView.h @@ -225,6 +225,12 @@ namespace Wpf void set(IKeyboardHandler^ handler) { _browserCore->KeyboardHandler = handler; } } + virtual property IJsDialogHandler^ JsDialogHandler + { + IJsDialogHandler^ get() { return _browserCore->JsDialogHandler; } + void set(IJsDialogHandler^ handler) { _browserCore->JsDialogHandler = handler; } + } + virtual void OnInitialized(); virtual void Load(String^ url); @@ -271,4 +277,4 @@ namespace Wpf virtual void SetPopupSizeAndPosition(const CefRect& rect); }; -}} \ No newline at end of file +}} diff --git a/CefSharp/BrowserCore.h b/CefSharp/BrowserCore.h index 75a803d8b6..0bb0188e58 100644 --- a/CefSharp/BrowserCore.h +++ b/CefSharp/BrowserCore.h @@ -14,6 +14,7 @@ namespace CefSharp interface class IRequestHandler; interface class IMenuHandler; interface class IKeyboardHandler; + interface class IJsDialogHandler; public ref class BrowserCore : INotifyPropertyChanged { @@ -37,6 +38,7 @@ namespace CefSharp IRequestHandler^ _requestHandler; IMenuHandler^ _menuHandler; IKeyboardHandler^ _keyboardHandler; + IJsDialogHandler^ _jsDialogHandler; IDictionary^ _boundObjects; @@ -172,6 +174,12 @@ namespace CefSharp void set(IKeyboardHandler^ handler) { _keyboardHandler = handler; } } + virtual property IJsDialogHandler^ JsDialogHandler + { + IJsDialogHandler^ get() { return _jsDialogHandler; } + void set(IJsDialogHandler^ handler) { _jsDialogHandler = handler; } + } + void CheckBrowserInitialization(); void RegisterJsObject(String^ name, Object^ objectToBind); diff --git a/CefSharp/CefSharp.vcproj b/CefSharp/CefSharp.vcproj index be374f8a2e..352d15e04c 100644 --- a/CefSharp/CefSharp.vcproj +++ b/CefSharp/CefSharp.vcproj @@ -314,6 +314,10 @@ RelativePath=".\IDownloadHandler.h" > + + diff --git a/CefSharp/ClientAdapter.cpp b/CefSharp/ClientAdapter.cpp index 2a67a7147c..a96d924c65 100644 --- a/CefSharp/ClientAdapter.cpp +++ b/CefSharp/ClientAdapter.cpp @@ -11,6 +11,7 @@ #include "IRequestHandler.h" #include "IMenuHandler.h" #include "IKeyboardHandler.h" +#include "IJsDialogHandler.h" using namespace std; @@ -320,4 +321,50 @@ namespace CefSharp { _browserControl->OnTakeFocus(next); } + + bool ClientAdapter::OnJSAlert(CefRefPtr browser, CefRefPtr frame, const CefString& message) + { + IJsDialogHandler^ handler = _browserControl->JsDialogHandler; + if (handler == nullptr) + { + return false; + } + + bool handled = handler->OnJSAlert(_browserControl, toClr(frame->GetURL()), toClr(message)); + + return handled; + } + + bool ClientAdapter::OnJSConfirm(CefRefPtr browser, CefRefPtr frame, const CefString& message, bool& retval) + { + IJsDialogHandler^ handler = _browserControl->JsDialogHandler; + if (handler == nullptr) + { + return false; + } + + bool handled = handler->OnJSConfirm(_browserControl, toClr(frame->GetURL()), toClr(message), retval); + + return handled; + } + + bool ClientAdapter::OnJSPrompt(CefRefPtr browser, CefRefPtr frame, const CefString& message, const CefString& defaultValue, bool& retval, CefString& result) + { + IJsDialogHandler^ handler = _browserControl->JsDialogHandler; + if (handler == nullptr) + { + return false; + } + + String^ resultString = nullptr; + + bool handled = handler->OnJSPrompt(_browserControl, toClr(frame->GetURL()), toClr(message), toClr(defaultValue), retval, resultString); + + if(resultString != nullptr) + { + result = toNative(resultString); + } + + return handled; + } } diff --git a/CefSharp/ClientAdapter.h b/CefSharp/ClientAdapter.h index 3509a1ee26..808bcc359e 100644 --- a/CefSharp/ClientAdapter.h +++ b/CefSharp/ClientAdapter.h @@ -17,7 +17,8 @@ namespace CefSharp public CefV8ContextHandler, public CefMenuHandler, public CefFocusHandler, - public CefKeyboardHandler + public CefKeyboardHandler, + public CefJSDialogHandler { private: gcroot _browserControl; @@ -42,6 +43,7 @@ namespace CefSharp virtual CefRefPtr GetMenuHandler() OVERRIDE { return this; } virtual CefRefPtr GetFocusHandler() OVERRIDE { return this; } virtual CefRefPtr GetKeyboardHandler() OVERRIDE { return this; } + virtual CefRefPtr GetJSDialogHandler() OVERRIDE { return this; } // CefLifeSpanHandler virtual DECL bool OnBeforePopup(CefRefPtr parentBrowser, const CefPopupFeatures& popupFeatures, CefWindowInfo& windowInfo, const CefString& url, CefRefPtr& client, CefBrowserSettings& settings) OVERRIDE; @@ -80,6 +82,11 @@ namespace CefSharp // CefKeyboardHandler virtual DECL bool OnKeyEvent(CefRefPtr browser, KeyEventType type, int code, int modifiers, bool isSystemKey, bool isAfterJavaScript) OVERRIDE; + // CefJSDialogHandler + virtual DECL bool OnJSAlert(CefRefPtr browser, CefRefPtr frame, const CefString& message) OVERRIDE; + virtual DECL bool OnJSConfirm(CefRefPtr browser, CefRefPtr frame, const CefString& message, bool& retval) OVERRIDE; + virtual DECL bool OnJSPrompt(CefRefPtr browser, CefRefPtr frame, const CefString& message, const CefString& defaultValue, bool& retval, CefString& result) OVERRIDE; + IMPLEMENT_LOCKING(ClientAdapter); IMPLEMENT_REFCOUNTING(ClientAdapter); }; diff --git a/CefSharp/IJsDialogHandler.h b/CefSharp/IJsDialogHandler.h new file mode 100644 index 0000000000..09c6f7efc8 --- /dev/null +++ b/CefSharp/IJsDialogHandler.h @@ -0,0 +1,14 @@ +#pragma once + +using namespace System; + +namespace CefSharp +{ + public interface class IJsDialogHandler + { + public: + bool OnJSAlert(IWebBrowser^ browser, String^ url, String^ message); + bool OnJSConfirm(IWebBrowser^ browser, String^ url, String^ message, bool& retval); + bool OnJSPrompt(IWebBrowser^ browser, String^ url, String^ message, String^ defaultValue, bool& retval, String^% result); + }; +} diff --git a/CefSharp/IWebBrowser.h b/CefSharp/IWebBrowser.h index eb89d142ba..213059fc0d 100644 --- a/CefSharp/IWebBrowser.h +++ b/CefSharp/IWebBrowser.h @@ -15,6 +15,7 @@ namespace CefSharp interface class IRequestHandler; interface class IMenuHandler; interface class IKeyboardHandler; + interface class IJsDialogHandler; public interface class IWebBrowser : IDisposable, INotifyPropertyChanged { @@ -38,6 +39,7 @@ namespace CefSharp property IRequestHandler^ RequestHandler; property IMenuHandler^ MenuHandler; property IKeyboardHandler^ KeyboardHandler; + property IJsDialogHandler^ JsDialogHandler; void OnInitialized();