зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
7565f7c8e9
Коммит
8c4b2aa734
|
@ -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) -> () {
|
||||
|
|
Загрузка…
Ссылка в новой задаче