mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +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,
|
||||
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 {
|
||||
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,
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1214,7 +1214,7 @@ pub struct cef_run_file_dialog_callback {
|
|||
// will be NULL.
|
||||
///
|
||||
pub cont: Option<extern "C" fn(run_file_dialog_callback: *mut cef_run_file_dialog_callback,
|
||||
browser_host: *mut cef_browser_host,
|
||||
browser_host: *mut cef_browser_host,
|
||||
file_paths: *mut cef_string_list_t)>,
|
||||
}
|
||||
|
||||
|
@ -1638,7 +1638,7 @@ pub struct cef_render_process_handler {
|
|||
// cannot be modified in this callback.
|
||||
///
|
||||
pub on_before_navigation: Option<extern "C" fn(render_handler: *mut cef_render_process_handler_t,
|
||||
browser: *mut cef_browser_t,
|
||||
browser: *mut cef_browser_t,
|
||||
frame: *mut cef_frame_t,
|
||||
request: *mut cef_request_t,
|
||||
navigation_type: *mut cef_navigation_type_t,
|
||||
|
@ -1653,7 +1653,7 @@ pub struct cef_render_process_handler {
|
|||
// cef_v8context_t::get_task_runner() function.
|
||||
///
|
||||
pub on_context_created: Option<extern "C" fn(render_handler: *mut cef_render_process_handler_t,
|
||||
browser: *mut cef_browser_t,
|
||||
browser: *mut cef_browser_t,
|
||||
frame: *mut cef_frame_t,
|
||||
context: *mut cef_v8context_t)>,
|
||||
|
||||
|
@ -1662,7 +1662,7 @@ pub struct cef_render_process_handler {
|
|||
// references to the context should be kept after this function is called.
|
||||
///
|
||||
pub on_context_released: Option<extern "C" fn(render_handler: *mut cef_render_process_handler_t,
|
||||
browser: *mut cef_browser_t,
|
||||
browser: *mut cef_browser_t,
|
||||
frame: *mut cef_frame_t,
|
||||
context: *mut cef_v8context_t)>,
|
||||
|
||||
|
@ -1672,7 +1672,7 @@ pub struct cef_render_process_handler {
|
|||
// CefSettings.uncaught_exception_stack_size 0.
|
||||
///
|
||||
pub on_uncaught_exception: Option<extern "C" fn(render_handler: *mut cef_render_process_handler_t,
|
||||
browser: *mut cef_browser_t,
|
||||
browser: *mut cef_browser_t,
|
||||
frame: *mut cef_frame_t,
|
||||
context: *mut cef_v8context_t,
|
||||
exception: *mut cef_v8exception_t,
|
||||
|
@ -1687,7 +1687,7 @@ pub struct cef_render_process_handler {
|
|||
// of this function.
|
||||
///
|
||||
pub on_focused_node_changed: Option<extern "C" fn(render_handler: *mut cef_render_process_handler_t,
|
||||
browser: *mut cef_browser_t,
|
||||
browser: *mut cef_browser_t,
|
||||
frame: *mut cef_frame_t,
|
||||
node: *mut cef_domnode_t)>,
|
||||
|
||||
|
@ -1697,7 +1697,7 @@ pub struct cef_render_process_handler {
|
|||
// reference to or attempt to access the message outside of this callback.
|
||||
///
|
||||
pub on_process_message_received: Option<extern "C" fn(render_handler: *mut cef_render_process_handler_t,
|
||||
browser: *mut cef_browser_t,
|
||||
browser: *mut cef_browser_t,
|
||||
source_process: cef_process_id_t,
|
||||
message: *mut cef_process_message) ->c_int>,
|
||||
}
|
||||
|
@ -1934,7 +1934,7 @@ pub struct cef_display_handler {
|
|||
// Called when the page title changes.
|
||||
///
|
||||
pub on_title_change: Option<extern "C" fn(h: *mut cef_display_handler_t,
|
||||
browser: *mut cef_browser_t, title: *const cef_string_t)>,
|
||||
browser: *mut cef_browser_t, title: *const cef_string_t)>,
|
||||
|
||||
///
|
||||
// Called when the browser is about to display a tooltip. |text| contains the
|
||||
|
@ -1945,21 +1945,21 @@ pub struct cef_display_handler {
|
|||
// for drawing tooltips and the return value is ignored.
|
||||
///
|
||||
pub on_tooltip: Option<extern "C" fn(h: *mut cef_display_handler_t,
|
||||
browser: *mut cef_browser_t, text: *mut cef_string_t) -> c_int>,
|
||||
browser: *mut cef_browser_t, text: *mut cef_string_t) -> c_int>,
|
||||
|
||||
///
|
||||
// Called when the browser receives a status message. |value| contains the
|
||||
// text that will be displayed in the status message.
|
||||
///
|
||||
pub on_status_message: Option<extern "C" fn(h: *mut cef_display_handler_t,
|
||||
browser: *mut cef_browser_t, value: *const cef_string_t)>,
|
||||
browser: *mut cef_browser_t, value: *const cef_string_t)>,
|
||||
|
||||
///
|
||||
// Called to display a console message. Return true (1) to stop the message
|
||||
// from being output to the console.
|
||||
///
|
||||
pub on_console_message: Option<extern "C" fn(h: *mut cef_display_handler_t,
|
||||
browser: *mut cef_browser_t, message: *const cef_string_t,
|
||||
browser: *mut cef_browser_t, message: *const cef_string_t,
|
||||
source: *const cef_string_t, line: c_int) -> c_int>
|
||||
}
|
||||
|
||||
|
@ -1988,7 +1988,7 @@ pub struct cef_life_span_handler {
|
|||
// indicates whether the new browser window should be scriptable and in the
|
||||
// same process as the source browser.
|
||||
pub on_before_popup: Option<extern "C" fn(h: *mut cef_life_span_handler_t,
|
||||
browser: *mut cef_browser_t, frame: *mut cef_frame_t,
|
||||
browser: *mut cef_browser_t, frame: *mut cef_frame_t,
|
||||
target_url: *const cef_string_t, target_frame_name: *const cef_string_t,
|
||||
popupFeatures: *const cef_popup_features_t,
|
||||
windowInfo: *mut cef_window_info_t, client: *mut *mut cef_client_t,
|
||||
|
@ -2162,8 +2162,8 @@ pub struct cef_client {
|
|||
// reference to or attempt to access the message outside of this callback.
|
||||
///
|
||||
pub on_process_message_received: Option<extern "C" fn(client: *mut cef_client_t,
|
||||
browser: *mut cef_browser_t, source_process: cef_process_id_t,
|
||||
message: *mut cef_process_message_t) -> c_int>,
|
||||
browser: *mut cef_browser_t, source_process: cef_process_id_t,
|
||||
message: *mut cef_process_message_t) -> c_int>,
|
||||
}
|
||||
|
||||
///
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue