diff --git a/libcef/browser_impl.cc b/libcef/browser_impl.cc index 880ea32bb..41b24614f 100644 --- a/libcef/browser_impl.cc +++ b/libcef/browser_impl.cc @@ -786,8 +786,11 @@ void CefBrowserImpl::UIT_DestroyBrowser() } // Clean up anything associated with the WebViewHost widget. - UIT_GetWebViewHost()->webwidget()->close(); - webviewhost_.reset(); + if (webviewhost_.get()) { + if (webviewhost_->webwidget()) + webviewhost_->webwidget()->close(); + webviewhost_.reset(); + } // Remove the reference added in UIT_CreateBrowser(). Release(); diff --git a/libcef/browser_impl_gtk.cc b/libcef/browser_impl_gtk.cc index 19a0854fa..f08fa7971 100644 --- a/libcef/browser_impl_gtk.cc +++ b/libcef/browser_impl_gtk.cc @@ -18,6 +18,14 @@ using WebKit::WebRect; using WebKit::WebSize; +namespace { + +void window_destroyed(GtkWidget* widget, CefBrowserImpl* browser) { + browser->UIT_DestroyBrowser(); +} + +} // namespace + void CefBrowserImpl::ParentWindowWillClose() { // TODO(port): Implement this method if necessary. @@ -84,6 +92,8 @@ bool CefBrowserImpl::UIT_CreateBrowser(const CefString& url) dev_tools_agent_->SetWebView(webviewhost_->webview()); window_info_.m_Widget = webviewhost_->view_handle(); + g_signal_connect(G_OBJECT(window_info_.m_Widget), "destroy", + G_CALLBACK(window_destroyed), this); Unlock(); @@ -176,11 +186,8 @@ int CefBrowserImpl::UIT_GetPagesCount(WebKit::WebFrame* frame) // static void CefBrowserImpl::UIT_CloseView(gfx::NativeView view) { - GtkWidget* window = - gtk_widget_get_parent(gtk_widget_get_parent(GTK_WIDGET(view))); - - MessageLoop::current()->PostTask(FROM_HERE, NewRunnableFunction( - >k_widget_destroy, GTK_WIDGET(window))); + GtkWidget* window = gtk_widget_get_toplevel(GTK_WIDGET(view)); + gtk_widget_destroy(window); } // static diff --git a/libcef/webwidget_host.h b/libcef/webwidget_host.h index 858dbc22b..4b350a3b0 100644 --- a/libcef/webwidget_host.h +++ b/libcef/webwidget_host.h @@ -194,7 +194,6 @@ class WebWidgetHost { // --------------------------------------------------------------------------- static gfx::NativeView CreateWidget(gfx::NativeView parent_view, WebWidgetHost* host); - void WindowDestroyed(); void Resize(const gfx::Size& size); virtual void KeyEvent(GdkEventKey* event); #endif diff --git a/libcef/webwidget_host_gtk.cc b/libcef/webwidget_host_gtk.cc index 2a7f2349f..1d13b7c07 100644 --- a/libcef/webwidget_host_gtk.cc +++ b/libcef/webwidget_host_gtk.cc @@ -84,8 +84,6 @@ class WebWidgetHostGtkWidget { G_CALLBACK(&HandleConfigure), host); g_signal_connect(widget, "expose-event", G_CALLBACK(&HandleExpose), host); - g_signal_connect(widget, "destroy", - G_CALLBACK(&HandleDestroy), host); g_signal_connect(widget, "key-press-event", G_CALLBACK(&HandleKeyPress), host); g_signal_connect(widget, "key-release-event", @@ -154,16 +152,6 @@ class WebWidgetHostGtkWidget { return FALSE; } - // The GdkWindow was destroyed. - static gboolean HandleDestroy(GtkWidget* widget, void* unused) { - // The associated WebWidgetHost instance may have already been destroyed. - WebWidgetHost* host = static_cast( - g_object_get_data(G_OBJECT(widget), kWebWidgetHostKey)); - if (host) - host->WindowDestroyed(); - return FALSE; - } - // Keyboard key pressed. static gboolean HandleKeyPress(GtkWidget* widget, GdkEventKey* event, @@ -455,10 +443,6 @@ void WebWidgetHost::PaintRect(const gfx::Rect& rect) { set_painting(false); } -void WebWidgetHost::WindowDestroyed() { - delete this; -} - void WebWidgetHost::SendKeyEvent(cef_key_type_t type, int key, int modifiers, bool sysChar, bool imeChar) { diff --git a/tests/cefclient/cefclient.cpp b/tests/cefclient/cefclient.cpp index f2c1212c7..81fb8ce2b 100644 --- a/tests/cefclient/cefclient.cpp +++ b/tests/cefclient/cefclient.cpp @@ -218,7 +218,7 @@ void AppGetSettings(CefSettings& settings, CefRefPtr& app) // Retrieve command-line proxy configuration, if any. bool has_proxy = false; - cef_proxy_type_t proxy_type; + cef_proxy_type_t proxy_type = PROXY_TYPE_DIRECT; CefString proxy_config; if (g_command_line->HasSwitch(cefclient::kProxyType)) { diff --git a/tests/cefclient/cefclient_gtk.cpp b/tests/cefclient/cefclient_gtk.cpp index 9fc122839..e62d3d217 100644 --- a/tests/cefclient/cefclient_gtk.cpp +++ b/tests/cefclient/cefclient_gtk.cpp @@ -20,8 +20,7 @@ char szWorkingDir[512]; // The current working directory extern CefRefPtr g_handler; void destroy(void) { - CefShutdown(); - exit(0); + CefQuitMessageLoop(); } void TerminationSignalHandler(int signatl) { @@ -421,6 +420,8 @@ int main(int argc, char *argv[]) { CefRunMessageLoop(); + CefShutdown(); + return 0; } diff --git a/tests/unittests/web_urlrequest_unittest.cc b/tests/unittests/web_urlrequest_unittest.cc index 3e80f2a20..26a51a42b 100644 --- a/tests/unittests/web_urlrequest_unittest.cc +++ b/tests/unittests/web_urlrequest_unittest.cc @@ -128,7 +128,7 @@ public: size_t len = contents_.length(); test_results_.contentLength = len; #ifdef WEB_URLREQUEST_DEBUG - printf("Response: %d - %s\n", len, contents_.c_str()); + printf("Response: %lu - %s\n", len, contents_.c_str()); #endif } TestCompleted(); @@ -455,15 +455,14 @@ TEST(WebURLRequestTest, CANCEL) cef_weburlrequest_state_t cancelAt[] = { WUR_STATE_STARTED, - WUR_STATE_HEADERS_RECEIVED, - WUR_STATE_LOADING + WUR_STATE_HEADERS_RECEIVED }; for (unsigned int i=0; i < COUNTOF_(cancelAt); ++i) { TestResults tr; CefRefPtr browser = new BrowserForTest(tr, cancelAt[i]); browser->ExecuteTest(); - EXPECT_TRUE(tr.got_abort); + EXPECT_TRUE(tr.got_abort) << "i = " << i; EXPECT_TRUE(tr.got_deleted); }