Skip to content

Commit

Permalink
gui, feat: support headless mode in cef webview.
Browse files Browse the repository at this point in the history
  • Loading branch information
xicilion committed Feb 27, 2021
1 parent ca8197f commit ee60471
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 34 deletions.
62 changes: 44 additions & 18 deletions fibjs/src/gui/cef/CefWebView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class GuiWindowDelegate : public CefWindowDelegate {

if (m_webview) {
m_webview->m_browser = browser_view_->GetBrowser();
os_config_window(m_webview, (void*)window->GetWindowHandle(), m_webview->m_opt);
m_webview->config_window();
}

window->Show();
Expand Down Expand Up @@ -81,6 +81,7 @@ CefWebView::CefWebView(exlib::string url, NObject* opt)
, m_url(url)
, m_bDebug(true)
, m_bPopup(true)
, m_bHeadless(false)
{
holder()->Ref();

Expand All @@ -95,6 +96,9 @@ CefWebView::CefWebView(exlib::string url, NObject* opt)

if (m_opt->get("popup", v) == 0)
m_bPopup = v.boolVal();

if (m_opt->get("headless", v) == 0)
m_bHeadless = v.boolVal();
}
}

Expand All @@ -104,28 +108,50 @@ CefWebView::~CefWebView()

void CefWebView::open()
{
CefBrowserSettings browser_settings;
static CefRefPtr<GuiHandler> handler;
if (handler == NULL)
handler = new GuiHandler();
static CefRefPtr<GuiHandler> gui_handler;

handler->browser_list_.push_back(this);

#ifndef Darwin
static CefRefPtr<GuiBrowserViewDelegate> view_delegate;
if (view_delegate == NULL)
view_delegate = new GuiBrowserViewDelegate();
if (gui_handler == NULL)
gui_handler = new GuiHandler();

CefRefPtr<CefBrowserView> browser_view = CefBrowserView::CreateBrowserView(handler, m_url.c_str(), browser_settings,
nullptr, nullptr, view_delegate);
CefWindow::CreateTopLevelWindow(new GuiWindowDelegate(browser_view, this));
#ifdef Darwin
bool use_view = false;
#else
CefWindowInfo window_info;
m_browser = CefBrowserHost::CreateBrowserSync(window_info, handler, m_url.c_str(), browser_settings,
nullptr, nullptr);
config_window();
bool use_view = !m_bHeadless;
#endif

gui_handler->browser_list_.push_back(this);

CefBrowserSettings browser_settings;
if (use_view) {
static CefRefPtr<GuiBrowserViewDelegate> view_delegate;
if (view_delegate == NULL)
view_delegate = new GuiBrowserViewDelegate();

CefRefPtr<CefBrowserView> browser_view = CefBrowserView::CreateBrowserView(gui_handler, m_url.c_str(), browser_settings,
nullptr, nullptr, view_delegate);
CefWindow::CreateTopLevelWindow(new GuiWindowDelegate(browser_view, this));
} else {
CefWindowInfo window_info;

if (m_bHeadless)
window_info.windowless_rendering_enabled = true;

m_browser = CefBrowserHost::CreateBrowserSync(window_info, gui_handler, m_url.c_str(), browser_settings,
nullptr, nullptr);

if (!m_bHeadless)
config_window();
else
_emit("open");
}
}

#ifndef Darwin
void CefWebView::config_window()
{
os_config_window(this, (void*)m_browser->GetHost()->GetWindowHandle(), m_opt);
}
#endif

result_t CefWebView::loadUrl(exlib::string url, AsyncEvent* ac)
{
Expand Down
1 change: 1 addition & 0 deletions fibjs/src/gui/cef/CefWebView.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ class CefWebView : public WebView_base {

bool m_bDebug;
bool m_bPopup;
bool m_bHeadless;
};
}

Expand Down
30 changes: 19 additions & 11 deletions fibjs/src/gui/cef/gui_handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,26 +22,17 @@

namespace fibjs {

GuiHandler* g_instance = nullptr;

inline std::string GetDataURI(const std::string& data, const std::string& mime_type)
{
return "data:" + mime_type + ";base64," + CefURIEncode(CefBase64Encode(data.data(), data.size()), false).ToString();
}

GuiHandler::GuiHandler()
{
g_instance = this;
}

GuiHandler::~GuiHandler()
{
g_instance = nullptr;
}

GuiHandler* GuiHandler::GetInstance()
{
return g_instance;
}

void GuiHandler::OnTitleChange(CefRefPtr<CefBrowser> browser,
Expand Down Expand Up @@ -92,10 +83,15 @@ void GuiHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser)
{
BrowserList::iterator bit = fromBrowser(browser);
if (bit != browser_list_.end()) {
if ((*bit)->m_bHeadless) {
(*bit)->_emit("closed");
(*bit)->holder()->Unref();
} else {
#ifdef Linux
(*bit)->_emit("closed");
(*bit)->holder()->Unref();
(*bit)->_emit("closed");
(*bit)->holder()->Unref();
#endif
}
browser_list_.erase(bit);
}
}
Expand Down Expand Up @@ -144,4 +140,16 @@ void GuiHandler::OnLoadEnd(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> fr
(*bit)->_emit("load");
}
}

void GuiHandler::GetViewRect(CefRefPtr<CefBrowser> browser, CefRect& rect)
{
rect.x = rect.y = 0;
rect.width = 800;
rect.height = 600;
}

void GuiHandler::OnPaint(CefRefPtr<CefBrowser> browser, PaintElementType type, const RectList& dirtyRects,
const void* buffer, int width, int height)
{
}
}
21 changes: 16 additions & 5 deletions fibjs/src/gui/cef/gui_handler.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
* Author: lion
*/

#ifndef CEF_TESTS_CEFSIMPLE_SIMPLE_HANDLER_H_
#define CEF_TESTS_CEFSIMPLE_SIMPLE_HANDLER_H_
#ifndef GUI_HANDLER_H
#define GUI_HANDLER_H

#include "include/cef_client.h"
#include "CefWebView.h"
Expand All @@ -18,14 +18,13 @@ namespace fibjs {
class GuiHandler : public CefClient,
public CefDisplayHandler,
public CefLifeSpanHandler,
public CefLoadHandler {
public CefLoadHandler,
public CefRenderHandler {
public:
explicit GuiHandler();
~GuiHandler();

public:
static GuiHandler* GetInstance();

virtual CefRefPtr<CefDisplayHandler> GetDisplayHandler() OVERRIDE
{
return this;
Expand All @@ -41,6 +40,11 @@ class GuiHandler : public CefClient,
return this;
}

virtual CefRefPtr<CefRenderHandler> GetRenderHandler() OVERRIDE
{
return this;
}

public:
// CefLifeSpanHandler
virtual bool OnBeforePopup(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame,
Expand All @@ -63,6 +67,13 @@ class GuiHandler : public CefClient,
virtual void OnLoadEnd(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame,
int httpStatusCode) OVERRIDE;

public:
// CefRenderHandler
virtual void GetViewRect(CefRefPtr<CefBrowser> browser, CefRect& rect) OVERRIDE;
virtual void OnPaint(CefRefPtr<CefBrowser> browser, CefRenderHandler::PaintElementType type,
const CefRenderHandler::RectList& dirtyRects, const void* buffer, int width,
int height) OVERRIDE;

public:
typedef std::list<obj_ptr<CefWebView>> BrowserList;
BrowserList browser_list_;
Expand Down

0 comments on commit ee60471

Please sign in to comment.