![]() |
![]() |
很重要--转载声明
- 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords
- 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。
。
。



// Initialize CEF. int CefInit(int &argc, char **argv); // Load web plugins. void CefLoadPlugins(bool isWow64); // Quit CEF. void CefQuit(); // Quit CEF until all browser windows have closed. void CefQuitUntilAllBrowserClosed(); // Returns the application working directory. QString AppGetWorkingDirectory(); // Notify all browser windows have closed. void NotifyAllBrowserClosed();
namespace {
// Initialize the CEF settings.
void CefInitSettings(CefSettings& settings)
{
// Make browser process message loop run in a separate thread.
settings.multi_threaded_message_loop = true;
// Store cache data will on disk.
std::string cache_path = QString2StdStr(AppGetWorkingDirectory()) + "/.cache";
CefString(&settings.cache_path) = CefString(cache_path);
// Completely disable logging.
settings.log_severity = LOGSEVERITY_DISABLE;
// The resources(cef.pak and/or devtools_resources.pak) directory.
CefString(&settings.resources_dir_path) = CefString();
// The locales directory.
CefString(&settings.locales_dir_path) = CefString();
// Enable remote debugging on the specified port.
settings.remote_debugging_port = 8088;
// Ignore errors related to invalid SSL certificates.
//settings.ignore_certificate_errors = true;
}
} // namespace
CefRefPtr g_handler;
CefRefPtr g_appHandler;
int CefInit(int &argc, char **argv)
{
qDebug() << __FUNCTION__;
HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL);
CefMainArgs main_args(hInstance);
g_appHandler = new ClientApp;
CefRefPtr app(g_appHandler);
// Execute the secondary process, if any.
int exit_code = CefExecuteProcess(main_args, app.get(), NULL);
if (exit_code >= 0)
return exit_code;
CefSettings settings;
CefInitSettings(settings);
#ifndef SUB_PROCESS_DISABLED
// Specify the path for the sub-process executable.
CefString(&settings.browser_subprocess_path).FromASCII("cefclient_process.exe");
#endif
settings.single_process = true;
settings.no_sandbox = true;
settings.multi_threaded_message_loop = true;
// Initialize CEF.
CefInitialize(main_args, settings, app.get(), NULL);
g_handler = new ClientHandler();
return -1;
}
void CefLoadPlugins(bool isWow64)
{
CefString flash_plugin_dir = isWow64 ? "C:\\Windows\\SysWOW64\\Macromed\\Flash"
: "C:\\Windows\\System32\\Macromed\\Flash";
CefAddWebPluginDirectory(flash_plugin_dir);
CefRefreshWebPlugins();
}
void CefQuit()
{
qDebug() << __FUNCTION__;
// Shut down CEF.
CefShutdown();
}
class QCefWebView : public QWidget
, public ClientHandler::Listener
, public ClientApp::RenderDelegate
{
Q_OBJECT
public:
enum BrowserState
{
kNone,
kCreating,
kCreated,
};
static const QString kUrlBlank;
QCefWebView(QWidget* parent = 0);
virtual ~QCefWebView();
void load(const QUrl& url);
void setHtml(const QString& html, const QUrl& baseUrl = QUrl());
QUrl url() const;
public slots:
void back();
void forward();
void reload();
void stop();
QVariant evaluateJavaScript(const QString& scriptSource);//执行js脚本
signals:
void titleChanged(QString title);
void urlChanged(QUrl url);
void loadStarted();
void loadFinished(bool ok);
void webRequest(const QString & title);
void navStateChanged(bool canGoBack, bool canGoForward);
void jsMessage(QString name, QVariantList args);
protected:
virtual void resizeEvent(QResizeEvent*);
virtual void closeEvent(QCloseEvent*);
virtual void showEvent(QShowEvent*);
virtual void customEvent(QEvent*);
//ClientHandler::Listener
virtual void OnAddressChange(const QString& url);
virtual void OnTitleChange(const QString& title);
virtual void SetLoading(bool isLoading);
virtual void SetNavState(bool canGoBack, bool canGoForward);
virtual void OnAfterCreated();
virtual void OnMessageEvent(MessageEvent* e);
virtual void OnWebRequest(const QString & order);
//ClientApp::RenderDelegate
virtual void OnContextCreated(CefRefPtr app,
CefRefPtr browser,
CefRefPtr frame,
CefRefPtr context);
private:
bool CreateBrowser(const QSize& size);
CefRefPtr GetBrowser() const;
void ResizeBrowser(const QSize& size);
bool BrowserLoadUrl(const QUrl& url);
BrowserState browser_state_;
bool need_resize_;
bool need_load_;
QUrl url_;
QMutex mutex_;
Q_DISABLE_COPY(QCefWebView);
IMPLEMENT_REFCOUNTING(QCefWebView);
};
extern CefRefPtr g_handler;
extern CefRefPtr g_appHandler;
const QString QCefWebView::kUrlBlank = "about:blank";
QCefWebView::QCefWebView(QWidget* parent)
: QWidget(parent),
browser_state_(kNone),
need_resize_(false),
need_load_(false)
{
setAttribute(Qt::WA_NativeWindow);
setAttribute(Qt::WA_DontCreateNativeAncestors);
}
QCefWebView::~QCefWebView()
{
}
void QCefWebView::load(const QUrl& url)
{
url_ = url;
switch (browser_state_)
{
case kNone:
CreateBrowser(size()); break;
case kCreating:
// If resizeEvent()/showEvent() before you load a url, it will
// CreateBrowser() as soon as possible with "about:blank".
need_load_ = true; break;
default: // The browser should have been created.
BrowserLoadUrl(url);
}
}
void QCefWebView::setHtml(const QString& html, const QUrl& baseUrl)
{
if (GetBrowser().get())
{
QUrl url = baseUrl.isEmpty() ? this->url() : baseUrl;
if (!url.isEmpty())
{
CefRefPtr frame = GetBrowser()->GetMainFrame();
frame->LoadString(CefString(html.toStdWString()),
CefString(url.toString().toStdWString()));
}
}
}
QUrl QCefWebView::url() const {
if (GetBrowser().get())
{
CefString url = GetBrowser()->GetMainFrame()->GetURL();
return QUrl(QString::fromStdWString(url.ToWString()));
}
return QUrl();
}
void QCefWebView::back()
{
CefRefPtr browser = GetBrowser();
if (browser.get())
browser->GoBack();
}
void QCefWebView::forward()
{
CefRefPtr browser = GetBrowser();
if (browser.get())
browser->GoForward();
}
void QCefWebView::reload()
{
CefRefPtr browser = GetBrowser();
if (browser.get())
browser->Reload();
}
void QCefWebView::stop()
{
CefRefPtr browser = GetBrowser();
if (browser.get())
browser->StopLoad();
}
QVariant QCefWebView::evaluateJavaScript(const QString& scriptSource)
{
if (GetBrowser().get())
{
CefString code(scriptSource.toStdWString());
GetBrowser()->GetMainFrame()->ExecuteJavaScript(code, "", 0);
return true;
}
return false;
}
void QCefWebView::resizeEvent(QResizeEvent* e)
{
switch (browser_state_)
{
case kNone:
CreateBrowser(e->size()); break;
case kCreating:
need_resize_ = true; break;
default:
ResizeBrowser(e->size());
}
}
void QCefWebView::closeEvent(QCloseEvent* e)
{
if (g_handler.get() && !g_handler->IsClosing())
{
CefRefPtr browser = g_handler->GetBrowser();
if (browser.get())
{
browser->GetHost()->CloseBrowser(false);
}
}
e->accept();
}
void QCefWebView::showEvent(QShowEvent* e)
{
CreateBrowser(size());
}
void QCefWebView::customEvent(QEvent* e)
{
if (e->type() == MessageEvent::MessageEventType)
{
MessageEvent* event = static_cast(e);
QString name = event->name();
QVariantList args = event->args();
emit jsMessage(name, args);
}
}
void QCefWebView::OnAddressChange(const QString& url)
{
if (url != "about:blank")
{
emit urlChanged(QUrl(url));
}
}
void QCefWebView::OnTitleChange(const QString& title)
{
emit titleChanged(title);
}
void QCefWebView::SetLoading(bool isLoading)
{
if (isLoading)
{
if (!need_load_ && !url_.isEmpty())
emit loadStarted();
}
else
{
if (need_load_)
{
BrowserLoadUrl(url_);
need_load_ = false;
}
else if (!url_.isEmpty())
{
emit loadFinished(true);
}
}
}
void QCefWebView::SetNavState(bool canGoBack, bool canGoForward)
{
emit navStateChanged(canGoBack, canGoForward);
}
void QCefWebView::OnAfterCreated()
{
browser_state_ = kCreated;
if (need_resize_)
{
ResizeBrowser(size());
need_resize_ = false;
}
}
void QCefWebView::OnMessageEvent(MessageEvent* e)
{
QCoreApplication::postEvent(this, e, Qt::HighEventPriority);
}
void QCefWebView::OnWebRequest(const QString & order)
{
emit webRequest(order);
}
bool QCefWebView::CreateBrowser(const QSize& size)
{
if (browser_state_ != kNone || size.isEmpty())
{
return false;
}
mutex_.lock();
if (browser_state_ != kNone)
{
mutex_.unlock();
return false;
}
RECT rect;
rect.left = 0;
rect.top = 0;
rect.right = size.width();
rect.bottom = size.height();
CefWindowInfo info;
CefBrowserSettings settings;
info.SetAsChild((HWND)this->winId(), rect);
g_handler->set_listener(this);
g_appHandler->insertMainRenderDelegate(this);
QString url = url_.isEmpty() ? kUrlBlank : url_.toString();
CefBrowserHost::CreateBrowser(info,
g_handler.get(),
CefString(url.toStdWString()),
settings,
NULL);
browser_state_ = kCreating;
mutex_.unlock();
return true;
}
CefRefPtr QCefWebView::GetBrowser() const
{
CefRefPtr browser;
if (g_handler.get())
browser = g_handler->GetBrowser();
return browser;
}
void QCefWebView::ResizeBrowser(const QSize& size)
{
if (g_handler.get() && g_handler->GetBrowser())
{
CefWindowHandle hwnd =
g_handler->GetBrowser()->GetHost()->GetWindowHandle();
if (hwnd)
{
HDWP hdwp = BeginDeferWindowPos(1);
hdwp = DeferWindowPos(hdwp, hwnd, NULL,
0, 0, size.width(), size.height(),
SWP_NOZORDER);
EndDeferWindowPos(hdwp);
}
}
}
bool QCefWebView::BrowserLoadUrl(const QUrl& url)
{
if (!url.isEmpty() && GetBrowser().get())
{
CefString cefurl(url_.toString().toStdWString());
GetBrowser()->GetMainFrame()->LoadURL(cefurl);
return true;
}
return false;
}
void QCefWebView::OnContextCreated(CefRefPtr app
, CefRefPtr browser
, CefRefPtr frame
, CefRefPtr context)
{
CefRefPtr object = context->GetGlobal();
CefRefPtr myV8Acc = new QCefV8Accessor;
CefRefPtr val = CefV8Value::CreateString(L"videoHandler");
CefString cefException;
myV8Acc->Set(L"videoHandler", object, val, cefException);
CefRefPtr pObjApp = CefV8Value::CreateObject(myV8Acc);
object->SetValue(L"videoHandler", pObjApp, V8_PROPERTY_ATTRIBUTE_NONE);
CefRefPtr mapHandler = new CefMapV8Handler(g_appHandler);
CefRefPtr ExecuteRequestOrder =
CefV8Value::CreateFunction("ExecuteRequestOrder", mapHandler);
object->SetValue("ExecuteRequestOrder", ExecuteRequestOrder, V8_PROPERTY_ATTRIBUTE_NONE);
}
![]() |
![]() |
很重要--转载声明
来源:https://www.cnblogs.com/swarmbees/p/5621415.html