![]() |
![]() |
很重要--转载声明
- 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 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