servo: Merge #4657 - Add basic support for closing cef tabs. Prevents crashes, but leaks memory for now (from glennw:cef-close); r=larsbergstrom

Source-Repo: https://github.com/servo/servo
Source-Revision: f3dfe04fa45bd723fac40d1452550d55240f80f8
This commit is contained in:
Glenn Watson 2015-01-19 07:57:47 -07:00
Родитель 7565f7c8e9
Коммит 8c4b2aa734
2 изменённых файлов: 20 добавлений и 3 удалений

Просмотреть файл

@ -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

Просмотреть файл

@ -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) -> () {