From 90d0e24d44e446458bd9f08f725f3d521d0620c1 Mon Sep 17 00:00:00 2001 From: xicilion Date: Wed, 10 Mar 2021 23:58:18 +0800 Subject: [PATCH] gui, bugfix: executeDevToolsMethod does not return when the parameter is wrong. --- fibjs/src/gui/cef/CefWebView.cpp | 24 +++++++++++++++++++---- fibjs/src/gui/cef/CefWebView.h | 2 ++ test/cef_test.js | 33 +++++++++++++++++++++++++++++++- 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/fibjs/src/gui/cef/CefWebView.cpp b/fibjs/src/gui/cef/CefWebView.cpp index 67b287908c..64386a85e4 100644 --- a/fibjs/src/gui/cef/CefWebView.cpp +++ b/fibjs/src/gui/cef/CefWebView.cpp @@ -283,7 +283,7 @@ result_t CefWebView::printToPDF(exlib::string file, AsyncEvent* ac) public: virtual void OnPdfPrintFinished(const CefString& path, bool ok) { - m_ac->apost(ok ? 0 : CALL_E_INTERNAL); + m_ac->post(ok ? 0 : CALL_E_INTERNAL); } private: @@ -322,14 +322,20 @@ result_t CefWebView::executeJavaScript(exlib::string code, AsyncEvent* ac) void CefWebView::OnDevToolsMethodResult(CefRefPtr browser, int message_id, bool success, const void* result, size_t result_size) { + m_method_lock.lock(); std::map::iterator it_method; - it_method = m_method.find(message_id); if (it_method != m_method.end()) { it_method->second.m_retVal.setJSON(exlib::string((const char*)result, result_size)); - it_method->second.m_ac->apost(0); + it_method->second.m_ac->post(0); m_method.erase(it_method); + } else { + Variant v; + + v.setJSON(exlib::string((const char*)result, result_size)); + m_result.insert(std::pair(message_id, v)); } + m_method_lock.unlock(); } void CefWebView::OnDevToolsEvent(CefRefPtr browser, const CefString& method, @@ -379,7 +385,17 @@ result_t CefWebView::executeDevToolsMethod(exlib::string method, v8::Local(rid, ac_method(retVal, ac))); + m_method_lock.lock(); + std::map::iterator it_method; + it_method = m_result.find(rid); + if (it_method != m_result.end()) { + retVal = it_method->second; + m_result.erase(it_method); + ac->post(0); + } else + m_method.insert(std::pair(rid, ac_method(retVal, ac))); + m_method_lock.unlock(); + return CALL_E_PENDDING; } diff --git a/fibjs/src/gui/cef/CefWebView.h b/fibjs/src/gui/cef/CefWebView.h index 81646d41df..66e871ca2a 100644 --- a/fibjs/src/gui/cef/CefWebView.h +++ b/fibjs/src/gui/cef/CefWebView.h @@ -119,7 +119,9 @@ class CefWebView : public WebView_base, }; int32_t m_eid; + exlib::spinlock m_method_lock; std::map m_method; + std::map m_result; }; } diff --git a/test/cef_test.js b/test/cef_test.js index 0ea3e13355..4d539b0507 100644 --- a/test/cef_test.js +++ b/test/cef_test.js @@ -235,9 +235,19 @@ describe("cef", () => { }); win.on("load", () => { - var ret = win.dev.Page.captureScreenshot(); + var ret = win.dev.Page.captureScreenshot({ + clip: { + x: 0, + y: 0, + width: 100, + height: 100, + scale: 1 + } + }); try { var img = gd.load(encoding.base64.decode(ret.data)); + assert.equal(img.width, 100); + assert.equal(img.height, 100); assert.equal(img.getPixel(1, 1), gd.rgb(255, 255, 255)); done(); } catch (e) { @@ -247,6 +257,27 @@ describe("cef", () => { win.close(); }); }); + + it("FIX: screenshot with wrong clip", done => { + var win = gui.open("cef://test/basic.html", { + headless: true + }); + + win.on("load", () => { + var ret = win.dev.Page.captureScreenshot({ + clip: {} + }); + + try { + assert.equal(ret.code, -32602); + done(); + } catch (e) { + done(e); + } + + win.close(); + }); + }); }); require.main === module && test.run(console.DEBUG); \ No newline at end of file