mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
embedding: redo browser creation, split after_created COM to separate function
this causes the callback to run at the expected time for applications that may depend on the browser loop having started or somesuch
This commit is contained in:
parent
8aceb59824
commit
d4ddfaa623
3 changed files with 72 additions and 80 deletions
|
@ -3,12 +3,10 @@
|
|||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use compositing::windowing::{WindowMethods};
|
||||
use geom::size::TypedSize2D;
|
||||
use glfw_app;
|
||||
use libc::{calloc, size_t,c_int};
|
||||
use servo::Browser;
|
||||
use servo_util::opts;
|
||||
use servo_util::opts::OpenGL;
|
||||
use std::cell::RefCell;
|
||||
use std::mem;
|
||||
use std::rc::Rc;
|
||||
|
@ -18,77 +16,49 @@ use types::{cef_browser_settings_t, cef_browser_t, cef_client_t, cef_request_con
|
|||
pub type servo_browser_t = servo_browser;
|
||||
pub struct servo_browser {
|
||||
pub browser: cef_browser_t,
|
||||
pub client: *mut cef_client_t,
|
||||
pub servo_browser: Option<Browser<glfw_app::window::Window>>,
|
||||
pub window: Rc<glfw_app::window::Window>,
|
||||
pub running: bool
|
||||
pub callback_executed: bool
|
||||
}
|
||||
|
||||
local_data_key!(pub GLOBAL_BROWSERS: RefCell<Vec<*mut servo_browser_t>>)
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn cef_browser_host_create_browser(window_info: *const cef_window_info_t,
|
||||
client: *mut cef_client_t,
|
||||
url: *const cef_string_t,
|
||||
settings: *const cef_browser_settings_t,
|
||||
request_context: *mut cef_request_context_t)
|
||||
-> c_int {
|
||||
cef_browser_host_create_browser_sync(window_info, client, url, settings, request_context);
|
||||
1
|
||||
pub fn browser_callback_after_created(browser: *mut servo_browser_t) {
|
||||
unsafe {
|
||||
if (*browser).client.is_null() { return; }
|
||||
let client = (*browser).client;
|
||||
(*client).get_life_span_handler.map(|cb| {
|
||||
let handler = cb(client);
|
||||
if handler.is_not_null() {
|
||||
(*handler).on_after_created.map(|createcb| createcb(handler, browser as *mut cef_browser_t));
|
||||
}
|
||||
});
|
||||
(*browser).callback_executed = true;
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn cef_browser_host_create_browser_sync(_window_info: *const cef_window_info_t,
|
||||
fn browser_host_create(_window_info: *const cef_window_info_t,
|
||||
client: *mut cef_client_t,
|
||||
url: *const cef_string_t,
|
||||
_settings: *const cef_browser_settings_t,
|
||||
_request_context: *mut cef_request_context_t)
|
||||
_request_context: *mut cef_request_context_t,
|
||||
callback_executed: bool)
|
||||
-> *mut cef_browser_t {
|
||||
unsafe {
|
||||
let mut urls = Vec::new();
|
||||
if url.is_null() || (*url).str.is_null() {
|
||||
urls.push("http://s27.postimg.org/vqbtrolyr/servo.jpg".to_string());
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
urls.push(string::raw::from_buf((*url).str as *const u8));
|
||||
}
|
||||
opts::set_opts(opts::Opts {
|
||||
urls: urls,
|
||||
n_render_threads: 1,
|
||||
gpu_painting: false,
|
||||
tile_size: 512,
|
||||
device_pixels_per_px: None,
|
||||
time_profiler_period: None,
|
||||
memory_profiler_period: None,
|
||||
enable_experimental: false,
|
||||
layout_threads: 1,
|
||||
nonincremental_layout: false,
|
||||
//layout_threads: cmp::max(rt::default_sched_threads() * 3 / 4, 1),
|
||||
exit_after_load: false,
|
||||
output_file: None,
|
||||
headless: false,
|
||||
hard_fail: false,
|
||||
bubble_inline_sizes_separately: false,
|
||||
show_debug_borders: false,
|
||||
show_debug_fragment_borders: false,
|
||||
enable_text_antialiasing: true,
|
||||
trace_layout: false,
|
||||
devtools_port: None,
|
||||
initial_window_size: TypedSize2D(800, 600),
|
||||
profile_tasks: false,
|
||||
user_agent: None,
|
||||
dump_flow_tree: false,
|
||||
validate_display_list_geometry: false,
|
||||
render_api: OpenGL,
|
||||
});
|
||||
let mut opts = opts::default_opts();
|
||||
opts.urls = urls;
|
||||
let browser = calloc(1, mem::size_of::<servo_browser_t>() as size_t) as *mut servo_browser_t;
|
||||
(*browser).browser.base.size = mem::size_of::<cef_browser_t>() as size_t;
|
||||
if client.is_not_null() {
|
||||
(*client).get_life_span_handler.map(|cb| {
|
||||
let handler = cb(client);
|
||||
if handler.is_not_null() {
|
||||
(*handler).on_after_created.map(|createcb| createcb(handler, mem::transmute(browser)));
|
||||
}
|
||||
});
|
||||
(*browser).client = client;
|
||||
if callback_executed {
|
||||
browser_callback_after_created(browser);
|
||||
}
|
||||
match GLOBAL_BROWSERS.replace(None) {
|
||||
Some(brs) => {
|
||||
|
@ -100,6 +70,27 @@ pub extern "C" fn cef_browser_host_create_browser_sync(_window_info: *const cef_
|
|||
GLOBAL_BROWSERS.replace(Some(brs));
|
||||
}
|
||||
}
|
||||
mem::transmute(browser)
|
||||
browser as *mut cef_browser_t
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn cef_browser_host_create_browser(window_info: *const cef_window_info_t,
|
||||
client: *mut cef_client_t,
|
||||
url: *const cef_string_t,
|
||||
settings: *const cef_browser_settings_t,
|
||||
request_context: *mut cef_request_context_t)
|
||||
-> c_int {
|
||||
browser_host_create(window_info, client, url, settings, request_context, false);
|
||||
1
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn cef_browser_host_create_browser_sync(window_info: *const cef_window_info_t,
|
||||
client: *mut cef_client_t,
|
||||
url: *const cef_string_t,
|
||||
settings: *const cef_browser_settings_t,
|
||||
request_context: *mut cef_request_context_t)
|
||||
-> *mut cef_browser_t {
|
||||
browser_host_create(window_info, client, url, settings, request_context, true)
|
||||
}
|
||||
|
|
|
@ -45,16 +45,17 @@ pub extern "C" fn cef_run_message_loop() {
|
|||
unsafe {
|
||||
let browsers = refcellbrowsers.borrow();
|
||||
let mut num = browsers.len();
|
||||
for servobrowser in browsers.iter() {
|
||||
(**servobrowser).window = glfw_app::create_window();
|
||||
(**servobrowser).servo_browser = Some(Browser::new(Some((**servobrowser).window.clone())));
|
||||
for active_browser in browsers.iter() {
|
||||
(**active_browser).window = glfw_app::create_window();
|
||||
(**active_browser).servo_browser = Some(Browser::new(Some((**active_browser).window.clone())));
|
||||
if !(**active_browser).callback_executed { browser_callback_after_created(*active_browser); }
|
||||
}
|
||||
while num > 0 {
|
||||
for servobrowser in browsers.iter().filter(|&servobrowser| (**servobrowser).servo_browser.is_some()) {
|
||||
let ref mut browser = **servobrowser;
|
||||
let mut optionlessservobrowser = browser.servo_browser.take().unwrap();
|
||||
if !optionlessservobrowser.handle_event(browser.window.wait_events()) {
|
||||
optionlessservobrowser.shutdown();
|
||||
for active_browser in browsers.iter().filter(|&active_browser| (**active_browser).servo_browser.is_some()) {
|
||||
let ref mut browser = **active_browser;
|
||||
let mut servobrowser = browser.servo_browser.take().unwrap();
|
||||
if !servobrowser.handle_event(browser.window.wait_events()) {
|
||||
servobrowser.shutdown();
|
||||
num -= 1;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue