diff options
author | bors-servo <metajack+bors@gmail.com> | 2015-01-19 07:57:47 -0700 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2015-01-19 07:57:47 -0700 |
commit | f3dfe04fa45bd723fac40d1452550d55240f80f8 (patch) | |
tree | 0e50bcb40399e7bb86085ea3659976e9a757fc3d | |
parent | 60a901328acb871c7cdad64e14777b91dc61cb05 (diff) | |
parent | 8c3e3b66b3ff10f228d0079de9a2f424b44356b2 (diff) | |
download | servo-f3dfe04fa45bd723fac40d1452550d55240f80f8.tar.gz servo-f3dfe04fa45bd723fac40d1452550d55240f80f8.zip |
auto merge of #4657 : glennw/servo/cef-close, r=larsbergstrom
-rw-r--r-- | ports/cef/browser.rs | 17 | ||||
-rw-r--r-- | ports/cef/browser_host.rs | 6 |
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) -> () { |