Skip to content

Commit

Permalink
feat: implemented JSDialogHandler
Browse files Browse the repository at this point in the history
  • Loading branch information
tishion committed Jan 12, 2025
1 parent 0948703 commit 8018395
Show file tree
Hide file tree
Showing 11 changed files with 339 additions and 41 deletions.
4 changes: 2 additions & 2 deletions example/QCefViewTest/CefViewWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
CefViewWidget::CefViewWidget(const QString url, const QCefSetting* setting, QWidget* parent /* = 0*/)
: QCefView(url, setting, parent)
{
setStyleSheet("background: blue;");
// setStyleSheet("background: blue;");

connect(this, &CefViewWidget::draggableRegionChanged, this, &CefViewWidget::onDraggableRegionChanged);
connect(this, &CefViewWidget::nativeBrowserCreated, this, &CefViewWidget::onNativeBrowserWindowCreated);
Expand Down Expand Up @@ -65,7 +65,7 @@ CefViewWidget::onNewPopup(const QCefFrameId& sourceFrameId,
bool& disableJavascriptAccess)
{
// create new QCefView as popup browser
settings.setBackgroundColor(Qt::red);
// settings.setBackgroundColor(Qt::red);
return false;
}

Expand Down
4 changes: 2 additions & 2 deletions example/QCefViewTest/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,8 @@ MainWindow::createRightCefView()
#endif

setting.setWindowlessFrameRate(60);
setting.setBackgroundColor(QColor::fromRgba(qRgba(255, 255, 220, 255)));
// setting.setBackgroundColor(Qt::blue);
// setting.setBackgroundColor(QColor::fromRgba(qRgba(255, 255, 220, 255)));
// setting.setBackgroundColor(Qt::blue);

// create the QCefView widget and add it to the layout container
// m_pRightCefViewWidget = new CefViewWidget("https://cefview.github.io/QCefView/", &setting, this);
Expand Down
31 changes: 30 additions & 1 deletion example/QCefViewTest/index.in.html
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,27 @@
);
}

function onAlert() {
alert('JSDialog: alert');
}

function onConfirm() {
if (confirm('JSDialog: confirm')) {
alert("JSDialog: confirm was accepted by clicking ok");
} else {
alert("JSDialog: confirm was canceled");
}
}

function onPrompt() {
let name = prompt("JSDialog: prompt: Please input your name", "Your Name Here");
if (name === null) {
alert("JSDialog: prompt was canceled");
} else {
alert("JSDialog: prompt was accepted and hello " + name);
}
}

function onInvokeMethodClicked(name, ...arg) {
CallBridge.invoke(name, ...arg);
}
Expand Down Expand Up @@ -94,13 +115,21 @@ <h1>Dragging area</h1>
<br />
<br />

<label> Test Case for EventListener</label>
<label> Test Case for EventListener (changeColor)</label>
<br />
<input type="button" value="AddEventListener" onclick="onAddEventListener()" />
<input type="button" value="RemoveEventListener" onclick="onRemoveEventListener()" />
<br />
<br />

<label> Test Case for JSDialog</label>
<br />
<input type="button" value="Alert" onclick="onAlert()" />
<input type="button" value="Confirm" onclick="onConfirm()" />
<input type="button" value="Promt" onclick="onPrompt()" />
<br />
<br />

<label> Test Case for InvokeMethod </label>
<br />
<input type="button" value="Invoke Method" onclick="testInvokeMethod()" />
Expand Down
2 changes: 1 addition & 1 deletion example/QCefViewTest/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ main(int argc, char* argv[])
config.setRemoteDebuggingPort(9000);
// set background color for all browsers
// (QCefSetting.setBackgroundColor will overwrite this value for specified browser instance)
config.setBackgroundColor(Qt::lightGray);
// config.setBackgroundColor(Qt::lightGray);

// WindowlessRenderingEnabled is set to true by default,
// set to false to disable the OSR mode
Expand Down
84 changes: 74 additions & 10 deletions example/QCefViewTest/tutorial.in.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,15 @@

<head>
<script>
function onLoad() {
console.log("page script starts.....");

window.onwheel = e => console.log(`wheel event: altKey=${e.altKey} ctrlKey=${e.ctrlKey}`);

function onLoad() {
if (typeof CallBridge == "undefined") {
alert("Not in CefView context");
return;
}
}

function onChangeColorEvent(color) {
Expand Down Expand Up @@ -32,6 +39,27 @@
);
}

function onAlert() {
alert('JSDialog: alert');
}

function onConfirm() {
if (confirm('JSDialog: confirm')) {
alert("JSDialog: confirm was accepted by clicking ok");
} else {
alert("JSDialog: confirm was canceled");
}
}

function onPrompt() {
let name = prompt("JSDialog: prompt: Please input your name", "Your Name Here");
if (name === null) {
alert("JSDialog: prompt was canceled");
} else {
alert("JSDialog: prompt was accepted and hello " + name);
}
}

function onInvokeMethodClicked(name, ...arg) {
CallBridge.invoke(name, ...arg);
}
Expand All @@ -48,6 +76,22 @@
};
window.cefViewQuery(query);
}

function testInvokeMethod() {
let d = {
d1: true,
d2: 5678,
d3: "test object",
d4: [1, "2", false],
d5: {
d1: true,
d2: 5678,
d3: "nested object",
d4: [1, "2", true],
},
};
onInvokeMethodClicked("TestMethod", 1, false, "arg3", d);
}
</script>
<style>
.noselect {
Expand All @@ -60,22 +104,35 @@
<body onload="onLoad()" id="main" class="noselect">
<h1 align="center" style="font-size: 12pt">Web Area</h1>
<div align="center">
<label> Test Case for EventListener</label>
<div style="background-color: green; -webkit-app-region: drag">
<h1>Dragging area</h1>
</div>
<br />

<label> Test Case for Built-in Scheme Handler </label>
<br />
<a href="cefview://custom.scheme.handler/api/example?arg1=1&args=hello">Built-in Scheme Handler (CefView://)</a>
<br />
<br />

<label> Test Case for EventListener (changeColor)</label>
<br />
<input type="button" value="AddEventListener" onclick="onAddEventListener()" />
<input type="button" value="RemoveEventListener" onclick="onRemoveEventListener()" />
<br />
<br />

<label> Test Case for Built-in Scheme Handler </label>
<label> Test Case for JSDialog</label>
<br />
<a href="cefview://custom.scheme.handler/api/example?arg1=1&args=hello">Built-in Scheme Handler (CefView://)</a>
<input type="button" value="Alert" onclick="onAlert()" />
<input type="button" value="Confirm" onclick="onConfirm()" />
<input type="button" value="Promt" onclick="onPrompt()" />
<br />
<br />

<label> Test Case for InvokeMethod </label>
<br />
<input type="button" value="Invoke Method" onclick="onInvokeMethodClicked('TestMethod', 1, false, 'arg3')" />
<input type="button" value="Invoke Method" onclick="testInvokeMethod()" />
<br />
<br />

Expand All @@ -87,13 +144,20 @@ <h1 align="center" style="font-size: 12pt">Web Area</h1>
<br />
<br />

<!--
<div style="background-color: green; -webkit-app-region: drag">
<h1>Dragging area</h1>
</div>
<label> Test Case for Popup Browser </label>
<br />
<a href="#" target="_blank">Popup Browser By HTML</a>
<br />
-->
<a href="#" onClick="window.open('#','QCefView Popup','width=800, height=600'); return false;">
Popup Browser By Script
</a>

<br />
<a href="#" onClick="window.close();">Close Current Window</a>


<p>An iframe with default borders:</p>
<iframe src="/tutorial.html" width="100%" height="300"> </iframe>
</div>
</body>

Expand Down
46 changes: 45 additions & 1 deletion src/details/CCefClientDelegate.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,11 @@
#pragma endregion

#pragma region qt_headers
#include <QDialog>
#include <QMap>
#include <QPointer>
#include <QSharedPointer>
#include <QWeakPointer>
#pragma endregion

#include <CefViewBrowserClientDelegate.h>
Expand Down Expand Up @@ -38,6 +42,8 @@ class CCefClientDelegate

QMap<qint32, QWeakPointer<QCefDownloadItem>> confirmedDownloadItemMap_;

QMap<void*, QPointer<QDialog>> pendingJSDialogMap_;

public:
CCefClientDelegate(QCefViewPrivate* p);

Expand Down Expand Up @@ -66,6 +72,7 @@ class CCefClientDelegate
const CefRefPtr<CefValue>& result) override;

// ContextMenuHandler
#pragma region ContextMenuHandler
virtual void onBeforeContextMenu(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefContextMenuParams> params,
Expand All @@ -84,8 +91,10 @@ class CCefClientDelegate
CefContextMenuHandler::EventFlags event_flags) override;

virtual void onContextMenuDismissed(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame) override;
#pragma endregion

// DialogHandler
#pragma region DialogHandler
virtual bool onFileDialog(CefRefPtr<CefBrowser> browser,
CefBrowserHost::FileDialogMode mode,
const CefString& title,
Expand All @@ -95,8 +104,10 @@ class CCefClientDelegate
int selected_accept_filter,
#endif
CefRefPtr<CefFileDialogCallback> callback) override;
#pragma endregion

// DisplayHandler
#pragma region DisplayHandler
virtual void addressChanged(CefRefPtr<CefBrowser>& browser, const CefFrameId& frameId, const CefString& url) override;
virtual void titleChanged(CefRefPtr<CefBrowser>& browser, const CefString& title) override;
virtual void faviconURLChanged(CefRefPtr<CefBrowser> browser, const std::vector<CefString>& icon_urls) override;
Expand All @@ -109,8 +120,10 @@ class CCefClientDelegate
CefCursorHandle cursor,
cef_cursor_type_t type,
const CefCursorInfo& custom_cursor_info) override;
#pragma endregion

// DownloadHander
#pragma region DownloadHander
virtual void onBeforeDownload(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefDownloadItem> download_item,
const CefString& suggested_name,
Expand All @@ -119,26 +132,52 @@ class CCefClientDelegate
virtual void onDownloadUpdated(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefDownloadItem> download_item,
CefRefPtr<CefDownloadItemCallback> callback) override;
#pragma endregion

// DragHandler
#pragma region DragHandler
virtual bool onDragEnter(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefDragData> dragData,
CefDragHandler::DragOperationsMask mask) override;
virtual void draggableRegionChanged(CefRefPtr<CefBrowser>& browser,
const std::vector<CefDraggableRegion>& regions) override;
#pragma endregion

// FocusHandler
#pragma region FocusHandler
virtual void takeFocus(CefRefPtr<CefBrowser>& browser, bool next) override;
virtual bool setFocus(CefRefPtr<CefBrowser>& browser) override;
virtual void gotFocus(CefRefPtr<CefBrowser>& browser) override;
#pragma endregion

// JSDialogHandler
#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) 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

// KeyboardHandler
#pragma region KeyboardHandler
virtual bool onPreKeyEvent(CefRefPtr<CefBrowser> browser,
const CefKeyEvent& event,
CefEventHandle os_event,
bool* is_keyboard_shortcut) override;
virtual bool onKeyEvent(CefRefPtr<CefBrowser> browser, const CefKeyEvent& event, CefEventHandle os_event) override;
#pragma endregion

// LifSpanHandler
// LifeSpanHandler
#pragma region LifeSpanHandler
virtual bool onBeforePopup(CefRefPtr<CefBrowser>& browser,
const CefFrameId& frameId,
const CefString& targetUrl,
Expand All @@ -151,8 +190,10 @@ class CCefClientDelegate
virtual bool doClose(CefRefPtr<CefBrowser> browser) override;
virtual bool requestClose(CefRefPtr<CefBrowser> browser) override;
virtual void onBeforeClose(CefRefPtr<CefBrowser> browser) override;
#pragma endregion

// LoadHandler
#pragma region LoadHandler
virtual void loadingStateChanged(CefRefPtr<CefBrowser>& browser,
bool isLoading,
bool canGoBack,
Expand All @@ -165,8 +206,10 @@ class CCefClientDelegate
const CefString& errorMsg,
const CefString& failedUrl,
bool& handled) override;
#pragma endregion

// RenderHandler
#pragma region RenderHandler
virtual bool getRootScreenRect(CefRefPtr<CefBrowser> browser, CefRect& rect) override;
virtual void getViewRect(CefRefPtr<CefBrowser> browser, CefRect& rect) override;
virtual bool getScreenPoint(CefRefPtr<CefBrowser> browser, int viewX, int viewY, int& screenX, int& screenY) override;
Expand Down Expand Up @@ -205,4 +248,5 @@ class CCefClientDelegate
const CefRange& selected_range) override;
virtual void onVirtualKeyboardRequested(CefRefPtr<CefBrowser> browser,
CefRenderHandler::TextInputMode input_mode) override;
#pragma endregion
};
Loading

0 comments on commit 8018395

Please sign in to comment.