Skip to content

Commit

Permalink
feat: add support of JSDialogHandler
Browse files Browse the repository at this point in the history
  • Loading branch information
tishion committed Jan 12, 2025
1 parent d072b57 commit 45fc5a8
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 26 deletions.
10 changes: 5 additions & 5 deletions include/CefViewBrowserClient.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//
//
// CefViewBrowserClient.h
// CefViewCore
//
Expand All @@ -22,8 +22,8 @@
#define CEFVIEW_MAIN_FRAME (0)
#define CEFVIEW_ALL_FRAMES (-1)
#else
#define CEFVIEW_MAIN_FRAME ("0")
#define CEFVIEW_ALL_FRAMES ("-1")
#define CEFVIEW_MAIN_FRAME ("0")
#define CEFVIEW_ALL_FRAMES ("-1")
#endif

/// <summary>
Expand Down Expand Up @@ -283,7 +283,7 @@ class CefViewBrowserClient
#pragma endregion

// CefFindHandler methods
#pragma region CefDragHandler
#pragma region CefFindHandler
virtual CefRefPtr<CefFindHandler> GetFindHandler() override;
virtual void OnFindResult(CefRefPtr<CefBrowser> browser,
int identifier,
Expand Down Expand Up @@ -311,12 +311,12 @@ class CefViewBrowserClient
const CefString& default_prompt_text,
CefRefPtr<CefJSDialogCallback> callback,
bool& suppress_message) override;

virtual bool OnBeforeUnloadDialog(CefRefPtr<CefBrowser> browser,
const CefString& message_text,
bool is_reload,
CefRefPtr<CefJSDialogCallback> callback) override;
virtual void OnResetDialogState(CefRefPtr<CefBrowser> browser) override;
virtual void OnDialogClosed(CefRefPtr<CefBrowser> browser) override;
#pragma endregion

// CefKeyboardHandler methods
Expand Down
58 changes: 38 additions & 20 deletions include/CefViewBrowserClientDelegate.h
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,8 @@ class CefViewBrowserClientDelegateInterface
CefRefPtr<CefDownloadItemCallback> callback) = 0;
#pragma endregion

#pragma region GetDragHandler
// drag hander
#pragma region DragHandler
virtual bool onDragEnter(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefDragData> dragData,
CefDragHandler::DragOperationsMask mask)
Expand All @@ -175,6 +175,43 @@ class CefViewBrowserClientDelegateInterface
const std::vector<CefDraggableRegion>& regions) = 0;
#pragma endregion

// focus handler
#pragma region FocusHandler
virtual void takeFocus(CefRefPtr<CefBrowser>& browser, bool next) = 0;

virtual bool setFocus(CefRefPtr<CefBrowser>& browser) = 0;

virtual void gotFocus(CefRefPtr<CefBrowser>& browser) = 0;
#pragma endregion

// JS dialog handler
#pragma region JSDialogHandler
virtual bool onJSDialog(CefRefPtr<CefBrowser> browser,
const CefString& origin_url,
CefJSDialogHandler::JSDialogType dialog_type,
const CefString& message_text,
const CefString& default_prompt_text,
CefRefPtr<CefJSDialogCallback> callback,
bool& suppress_message) = 0;

virtual bool onBeforeUnloadDialog(CefRefPtr<CefBrowser> browser,
const CefString& message_text,
bool is_reload,
CefRefPtr<CefJSDialogCallback> callback) = 0;
virtual void onResetDialogState(CefRefPtr<CefBrowser> browser) = 0;
virtual void onDialogClosed(CefRefPtr<CefBrowser> browser) = 0;
#pragma endregion

// keyboard handler
#pragma region KeyboardHandler
virtual bool onPreKeyEvent(CefRefPtr<CefBrowser> browser,
const CefKeyEvent& event,
CefEventHandle os_event,
bool* is_keyboard_shortcut) = 0;

virtual bool onKeyEvent(CefRefPtr<CefBrowser> browser, const CefKeyEvent& event, CefEventHandle os_event) = 0;
#pragma endregion

// life span handler
#pragma region LifeSpanHandler
virtual bool onBeforePopup(CefRefPtr<CefBrowser>& browser,
Expand All @@ -194,15 +231,6 @@ class CefViewBrowserClientDelegateInterface
virtual void onBeforeClose(CefRefPtr<CefBrowser> browser) = 0;
#pragma endregion

// focus handler
#pragma region FocusHandler
virtual void takeFocus(CefRefPtr<CefBrowser>& browser, bool next) = 0;

virtual bool setFocus(CefRefPtr<CefBrowser>& browser) = 0;

virtual void gotFocus(CefRefPtr<CefBrowser>& browser) = 0;
#pragma endregion

// load handler
#pragma region LoadHandler
virtual void loadingStateChanged(CefRefPtr<CefBrowser>& browser,
Expand All @@ -222,16 +250,6 @@ class CefViewBrowserClientDelegateInterface
bool& handled) = 0;
#pragma endregion

// keyboard handler
#pragma region KeyboardHandler
virtual bool onPreKeyEvent(CefRefPtr<CefBrowser> browser,
const CefKeyEvent& event,
CefEventHandle os_event,
bool* is_keyboard_shortcut) = 0;

virtual bool onKeyEvent(CefRefPtr<CefBrowser> browser, const CefKeyEvent& event, CefEventHandle os_event) = 0;
#pragma endregion

// Off screen rendering
#pragma region RenderHandler
virtual bool getRootScreenRect(CefRefPtr<CefBrowser> browser, CefRect& rect) { return false; }
Expand Down
2 changes: 1 addition & 1 deletion src/CefView/CefBrowserApp/CefViewBrowserClient.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include <CefViewBrowserClient.h>
#include <CefViewBrowserClient.h>

#pragma region stl_headers
#include <sstream>
Expand Down
60 changes: 60 additions & 0 deletions src/CefView/CefBrowserApp/CefViewBrowserClient_JSDialogHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,34 @@ CefViewBrowserClient::OnJSDialog(CefRefPtr<CefBrowser> browser,
{
CEF_REQUIRE_UI_THREAD();

/// Called to run a JavaScript dialog.
///
/// If |origin_url| is non-empty it can be passed to the CefFormatUrlForSecurityDisplay
/// function to retrieve a secureand user-friendly display string.
///
/// The |default_prompt_text| value will be specified for prompt dialogs only.
///
/// Set |suppress_message| to true and return false to suppress the message
/// (suppressing messages is preferable to immediately executing the callback
/// as this is used to detect presumably malicious behavior like spamming alert
/// messages in onbeforeunload).
///
/// Set |suppress_message| to false and return false to use the default
/// implementation (the default implementation will show one modal dialog at a
/// time and suppress any additional dialog requests until the displayed
/// dialog is dismissed).
///
/// Return true if the application will use a custom dialog or if the callback has
/// been executed immediately. Custom dialogs may be either modal or modeless. If a
/// custom dialog is used the application must execute |callback| once the custom
/// dialog is dismissed.

auto delegate = client_delegate_.lock();
if (delegate) {
return delegate->onJSDialog(
browser, origin_url, dialog_type, message_text, default_prompt_text, callback, suppress_message);
}

return false;
}

Expand All @@ -36,11 +64,43 @@ CefViewBrowserClient::OnBeforeUnloadDialog(CefRefPtr<CefBrowser> browser,
{
CEF_REQUIRE_UI_THREAD();

/// Called to run a dialog asking the user if they want to leave a page.
/// Return false to use the default dialog implementation. Return true if the
/// application will use a custom dialog or if the callback has been executed
/// immediately. Custom dialogs may be either modal or modeless. If a custom
/// dialog is used the application must execute |callback| once the custom
/// dialog is dismissed.

auto delegate = client_delegate_.lock();
if (delegate) {
return delegate->onBeforeUnloadDialog(browser, message_text, is_reload, callback);
}

return false;
}

void
CefViewBrowserClient::OnResetDialogState(CefRefPtr<CefBrowser> browser)
{
CEF_REQUIRE_UI_THREAD();

/// Called to cancel any pending dialogs and reset any saved dialog state.
/// Will be called due to events like page navigation irregardless of whether
/// any dialogs are currently pending.

auto delegate = client_delegate_.lock();
if (delegate)
delegate->onResetDialogState(browser);
}

void
CefViewBrowserClient::OnDialogClosed(CefRefPtr<CefBrowser> browser)
{
CEF_REQUIRE_UI_THREAD();

/// Called when the dialog is closed.

auto delegate = client_delegate_.lock();
if (delegate)
delegate->onDialogClosed(browser);
}

0 comments on commit 45fc5a8

Please sign in to comment.