aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2015-01-19 07:57:47 -0700
committerbors-servo <metajack+bors@gmail.com>2015-01-19 07:57:47 -0700
commitf3dfe04fa45bd723fac40d1452550d55240f80f8 (patch)
tree0e50bcb40399e7bb86085ea3659976e9a757fc3d
parent60a901328acb871c7cdad64e14777b91dc61cb05 (diff)
parent8c3e3b66b3ff10f228d0079de9a2f424b44356b2 (diff)
downloadservo-f3dfe04fa45bd723fac40d1452550d55240f80f8.tar.gz
servo-f3dfe04fa45bd723fac40d1452550d55240f80f8.zip
auto merge of #4657 : glennw/servo/cef-close, r=larsbergstrom
-rw-r--r--ports/cef/browser.rs17
-rw-r--r--ports/cef/browser_host.rs6
2 files changed, 20 insertions, 3 deletions
diff --git a/ports/cef/browser.rs b/ports/cef/browser.rs
index 2092f4cf824..c4572f7c7a7 100644
--- a/ports/cef/browser.rs
+++ b/ports/cef/browser.rs
@@ -17,7 +17,9 @@ use glfw_app;
use libc::c_int;
use servo_util::opts;
use std::cell::{Cell, RefCell};
+use std::sync::atomic::{AtomicInt, SeqCst};
+thread_local!(pub static ID_COUNTER: AtomicInt = AtomicInt::new(0))
thread_local!(pub static BROWSERS: RefCell<Vec<CefBrowser>> = RefCell::new(vec!()))
pub enum ServoBrowser {
@@ -83,6 +85,7 @@ pub struct ServoCefBrowser {
/// Whether the on-created callback has fired yet.
pub callback_executed: Cell<bool>,
+ id: int,
servo_browser: RefCell<ServoBrowser>,
message_queue: RefCell<Vec<WindowEvent>>,
}
@@ -100,6 +103,10 @@ impl ServoCefBrowser {
ServoBrowser::Invalid
};
+ let id = ID_COUNTER.with(|counter| {
+ counter.fetch_add(1, SeqCst)
+ });
+
ServoCefBrowser {
frame: frame,
host: host,
@@ -107,6 +114,7 @@ impl ServoCefBrowser {
callback_executed: Cell::new(false),
servo_browser: RefCell::new(servo_browser),
message_queue: RefCell::new(vec!()),
+ id: id,
}
}
}
@@ -170,6 +178,15 @@ pub fn update() {
});
}
+pub fn close(browser: CefBrowser) {
+ BROWSERS.with(|browsers| {
+ let mut browsers = browsers.borrow_mut();
+ browsers.iter()
+ .position(|&ref n| n.downcast().id == browser.downcast().id)
+ .map(|e| browsers.remove(e));
+ });
+}
+
pub fn browser_callback_after_created(browser: CefBrowser) {
if browser.downcast().client.is_null_cef_object() {
return
diff --git a/ports/cef/browser_host.rs b/ports/cef/browser_host.rs
index 7bfd0581ec7..8ed741eb05f 100644
--- a/ports/cef/browser_host.rs
+++ b/ports/cef/browser_host.rs
@@ -6,7 +6,7 @@ use eutil::Downcast;
use interfaces::{CefBrowser, CefBrowserHost, CefClient, cef_browser_host_t, cef_client_t};
use types::{cef_mouse_button_type_t, cef_mouse_event, cef_rect_t, cef_key_event};
use types::cef_key_event_type_t::{KEYEVENT_CHAR, KEYEVENT_KEYDOWN, KEYEVENT_KEYUP, KEYEVENT_RAWKEYDOWN};
-use browser::ServoCefBrowserExtensions;
+use browser::{mod, ServoCefBrowserExtensions};
use compositing::windowing::{WindowEvent, MouseWindowEvent};
use geom::point::TypedPoint2D;
@@ -37,8 +37,8 @@ cef_class_impl! {
this.downcast().send_window_event(WindowEvent::Resize(size));
}
- fn close_browser(&_this, _force: c_int) -> () {
- // TODO: Clean shutdown.
+ fn close_browser(&this, _force: c_int) -> () {
+ browser::close(this.downcast().browser.borrow_mut().take().unwrap());
}
fn send_focus_event(&this, focus: c_int) -> () {