aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Blumenkrantz <zmike@osg.samsung.com>2014-11-19 22:48:32 -0500
committerMike Blumenkrantz <zmike@osg.samsung.com>2014-11-21 21:54:09 -0500
commit8aceb59824b867ba371df6720efa02d84d142c34 (patch)
tree1f8f9cb55759dd6dc1e35c600ed919d94d309abe
parent0341444ce9f1f4154efd41c8e7250b812bb04056 (diff)
downloadservo-8aceb59824b867ba371df6720efa02d84d142c34.tar.gz
servo-8aceb59824b867ba371df6720efa02d84d142c34.zip
embedding: redo browser creation and message loop code to be more CEF-like
big thanks to @alexcrichton for his help with this
-rw-r--r--ports/cef/browser.rs96
-rw-r--r--ports/cef/core.rs59
-rw-r--r--ports/cef/lib.rs1
3 files changed, 107 insertions, 49 deletions
diff --git a/ports/cef/browser.rs b/ports/cef/browser.rs
index 4f1c71a26fb..33432846ab0 100644
--- a/ports/cef/browser.rs
+++ b/ports/cef/browser.rs
@@ -2,30 +2,104 @@
* 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/. */
-
+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;
+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};
+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]
-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)
+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 {
- 0
+ cef_browser_host_create_browser_sync(window_info, client, url, settings, request_context);
+ 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,
+ 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 {
unsafe {
- let browser = calloc(1, mem::size_of::<cef_browser_t>() as size_t) as *mut cef_browser_t;
- browser
+ 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 {
+ 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)
}
}
diff --git a/ports/cef/core.rs b/ports/cef/core.rs
index 62abedd4054..5dc5f805962 100644
--- a/ports/cef/core.rs
+++ b/ports/cef/core.rs
@@ -2,16 +2,13 @@
* 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/. */
-
+use browser::{GLOBAL_BROWSERS, browser_callback_after_created};
use command_line::command_line_init;
-use geom::size::TypedSize2D;
use glfw_app;
use libc::funcs::c95::string::strlen;
use libc::{c_int, c_void};
use native;
use servo::Browser;
-use servo_util::opts;
-use servo_util::opts::OpenGL;
use std::slice;
use switches::{KPROCESSTYPE, KWAITFORDEBUGGER};
use types::{cef_app_t, cef_main_args_t, cef_settings_t};
@@ -43,41 +40,27 @@ pub extern "C" fn cef_shutdown() {
#[no_mangle]
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() {
- let window = glfw_app::create_window();
- let mut browser = Browser::new(Some(window.clone()));
- while browser.handle_event(window.wait_events()) {}
- browser.shutdown()
+ GLOBAL_BROWSERS.get().map(|refcellbrowsers| {
+ 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())));
+ }
+ 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;
+ }
+ }
+ }
+ }
+ });
});
}
diff --git a/ports/cef/lib.rs b/ports/cef/lib.rs
index 5391c571799..fb61e3ef196 100644
--- a/ports/cef/lib.rs
+++ b/ports/cef/lib.rs
@@ -18,6 +18,7 @@ extern crate rustuv;
extern crate servo;
extern crate azure;
+extern crate compositing;
extern crate geom;
extern crate gfx;
extern crate glfw;