mirror of
https://github.com/servo/servo.git
synced 2025-08-04 21:20:23 +01:00
embedding: redo browser creation and message loop code to be more CEF-like
big thanks to @alexcrichton for his help with this
This commit is contained in:
parent
0341444ce9
commit
8aceb59824
3 changed files with 107 additions and 49 deletions
|
@ -2,30 +2,104 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* 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 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::mem;
|
||||||
|
use std::rc::Rc;
|
||||||
|
use std::string;
|
||||||
use types::{cef_browser_settings_t, cef_browser_t, cef_client_t, cef_request_context_t, cef_string_t, cef_window_info_t};
|
use types::{cef_browser_settings_t, cef_browser_t, cef_client_t, cef_request_context_t, cef_string_t, cef_window_info_t};
|
||||||
|
|
||||||
|
pub type servo_browser_t = servo_browser;
|
||||||
|
pub struct servo_browser {
|
||||||
|
pub browser: cef_browser_t,
|
||||||
|
pub servo_browser: Option<Browser<glfw_app::window::Window>>,
|
||||||
|
pub window: Rc<glfw_app::window::Window>,
|
||||||
|
pub running: bool
|
||||||
|
}
|
||||||
|
|
||||||
|
local_data_key!(pub GLOBAL_BROWSERS: RefCell<Vec<*mut servo_browser_t>>)
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn cef_browser_host_create_browser(_window_info: *const cef_window_info_t,
|
pub extern "C" fn cef_browser_host_create_browser(window_info: *const cef_window_info_t,
|
||||||
_client: *mut cef_client_t,
|
client: *mut cef_client_t,
|
||||||
_url: *const cef_string_t,
|
url: *const cef_string_t,
|
||||||
_settings: *const cef_browser_settings_t,
|
settings: *const cef_browser_settings_t,
|
||||||
_request_context: *mut cef_request_context_t)
|
request_context: *mut cef_request_context_t)
|
||||||
-> c_int {
|
-> c_int {
|
||||||
0
|
cef_browser_host_create_browser_sync(window_info, client, url, settings, request_context);
|
||||||
|
1
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn cef_browser_host_create_browser_sync(_window_info: *const cef_window_info_t,
|
pub extern "C" fn cef_browser_host_create_browser_sync(_window_info: *const cef_window_info_t,
|
||||||
_client: *mut cef_client_t,
|
client: *mut cef_client_t,
|
||||||
_url: *const cef_string_t,
|
url: *const cef_string_t,
|
||||||
_settings: *const cef_browser_settings_t,
|
_settings: *const cef_browser_settings_t,
|
||||||
_request_context: *mut cef_request_context_t)
|
_request_context: *mut cef_request_context_t)
|
||||||
-> *mut cef_browser_t {
|
-> *mut cef_browser_t {
|
||||||
unsafe {
|
unsafe {
|
||||||
let browser = calloc(1, mem::size_of::<cef_browser_t>() as size_t) as *mut cef_browser_t;
|
let mut urls = Vec::new();
|
||||||
browser
|
if url.is_null() || (*url).str.is_null() {
|
||||||
|
urls.push("http://s27.postimg.org/vqbtrolyr/servo.jpg".to_string());
|
||||||
|
}
|
||||||
|
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 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)));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
match GLOBAL_BROWSERS.replace(None) {
|
||||||
|
Some(brs) => {
|
||||||
|
brs.borrow_mut().push(browser);
|
||||||
|
GLOBAL_BROWSERS.replace(Some(brs));
|
||||||
|
},
|
||||||
|
None => {
|
||||||
|
let brs = RefCell::new(vec!(browser));
|
||||||
|
GLOBAL_BROWSERS.replace(Some(brs));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mem::transmute(browser)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,16 +2,13 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
use browser::{GLOBAL_BROWSERS, browser_callback_after_created};
|
||||||
use command_line::command_line_init;
|
use command_line::command_line_init;
|
||||||
use geom::size::TypedSize2D;
|
|
||||||
use glfw_app;
|
use glfw_app;
|
||||||
use libc::funcs::c95::string::strlen;
|
use libc::funcs::c95::string::strlen;
|
||||||
use libc::{c_int, c_void};
|
use libc::{c_int, c_void};
|
||||||
use native;
|
use native;
|
||||||
use servo::Browser;
|
use servo::Browser;
|
||||||
use servo_util::opts;
|
|
||||||
use servo_util::opts::OpenGL;
|
|
||||||
use std::slice;
|
use std::slice;
|
||||||
use switches::{KPROCESSTYPE, KWAITFORDEBUGGER};
|
use switches::{KPROCESSTYPE, KWAITFORDEBUGGER};
|
||||||
use types::{cef_app_t, cef_main_args_t, cef_settings_t};
|
use types::{cef_app_t, cef_main_args_t, cef_settings_t};
|
||||||
|
@ -43,41 +40,27 @@ pub extern "C" fn cef_shutdown() {
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn cef_run_message_loop() {
|
pub extern "C" fn cef_run_message_loop() {
|
||||||
let mut urls = Vec::new();
|
|
||||||
urls.push("http://s27.postimg.org/vqbtrolyr/servo.jpg".to_string());
|
|
||||||
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),
|
|
||||||
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,
|
|
||||||
});
|
|
||||||
native::start(0, 0 as *const *const u8, proc() {
|
native::start(0, 0 as *const *const u8, proc() {
|
||||||
let window = glfw_app::create_window();
|
GLOBAL_BROWSERS.get().map(|refcellbrowsers| {
|
||||||
let mut browser = Browser::new(Some(window.clone()));
|
unsafe {
|
||||||
while browser.handle_event(window.wait_events()) {}
|
let browsers = refcellbrowsers.borrow();
|
||||||
browser.shutdown()
|
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())));
|
||||||
|
}
|
||||||
|
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();
|
||||||
|
num -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ extern crate rustuv;
|
||||||
extern crate servo;
|
extern crate servo;
|
||||||
|
|
||||||
extern crate azure;
|
extern crate azure;
|
||||||
|
extern crate compositing;
|
||||||
extern crate geom;
|
extern crate geom;
|
||||||
extern crate gfx;
|
extern crate gfx;
|
||||||
extern crate glfw;
|
extern crate glfw;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue