diff --git a/components/compositing/Cargo.toml b/components/compositing/Cargo.toml index d9fc51499fb..37035dec23f 100644 --- a/components/compositing/Cargo.toml +++ b/components/compositing/Cargo.toml @@ -58,6 +58,9 @@ git = "https://github.com/servo/rust-core-text" [dependencies.gleam] git = "https://github.com/servo/gleam" +[dependencies.clipboard] +git = "https://github.com/aweinstock314/rust-x11-clipboard" + [dependencies] url = "0.2.16" time = "0.1.17" diff --git a/components/compositing/constellation.rs b/components/compositing/constellation.rs index 0520fa4859f..5867a871096 100644 --- a/components/compositing/constellation.rs +++ b/components/compositing/constellation.rs @@ -38,6 +38,7 @@ use util::cursor::Cursor; use util::geometry::PagePx; use util::opts; use util::task::spawn_named; +use clipboard::ClipboardContext; /// Maintains the pipelines and navigation context and grants permission to composite. pub struct Constellation { @@ -102,6 +103,9 @@ pub struct Constellation { phantom: PhantomData<(LTF, STF)>, pub window_size: WindowSizeData, + + /// Means of accessing the clipboard + clipboard_ctx: ClipboardContext, } /// Stores the navigation context for a single frame in the frame tree. @@ -212,6 +216,7 @@ impl Constellation { device_pixel_ratio: ScaleFactor::new(1.0), }, phantom: PhantomData, + clipboard_ctx: ClipboardContext::new().unwrap(), }; constellation.run(); }); @@ -395,6 +400,16 @@ impl Constellation { debug!("constellation got focus message"); self.handle_focus_msg(pipeline_id); } + ConstellationMsg::GetClipboardContents(sender) => { + let result = match self.clipboard_ctx.get_contents() { + Ok(s) => s, + Err(e) => { + debug!("Error getting clipboard contents ({}), defaulting to empty string", e); + "".to_string() + }, + }; + sender.send(result).unwrap(); + } } true } diff --git a/components/compositing/lib.rs b/components/compositing/lib.rs index e98f03f4a73..f3f54cad388 100644 --- a/components/compositing/lib.rs +++ b/components/compositing/lib.rs @@ -28,6 +28,7 @@ extern crate net_traits; extern crate util; extern crate gleam; extern crate webdriver_server; +extern crate clipboard; extern crate libc; extern crate time; diff --git a/components/msg/constellation_msg.rs b/components/msg/constellation_msg.rs index 0f911a7e523..6029541336f 100644 --- a/components/msg/constellation_msg.rs +++ b/components/msg/constellation_msg.rs @@ -229,6 +229,8 @@ pub enum Msg { GetRootPipeline(Sender>), /// Notifies the constellation that this frame has received focus. FocusMsg(PipelineId), + /// Requests that the constellation retrieve the current contents of the clipboard + GetClipboardContents(Sender), } // https://developer.mozilla.org/en-US/docs/Web/API/Using_the_Browser_API#Events diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index f304ad155a6..63eaea80142 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -69,12 +69,6 @@ git = "https://github.com/servo/string-cache" [dependencies.string_cache_plugin] git = "https://github.com/servo/string-cache" -[dependencies.xlib] -git = "https://github.com/servo/rust-xlib" - -[dependencies.clipboard] -git = "https://github.com/aweinstock314/rust-x11-clipboard" - [dependencies] encoding = "0.2" url = "0.2.16" diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index 8d492ab8c65..8ca412a04f9 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -29,6 +29,7 @@ use dom::htmlformelement::{SubmittedFrom, ResetFrom}; use dom::node::{DisabledStateHelpers, Node, NodeHelpers, NodeDamage, NodeTypeId}; use dom::node::{document_from_node, window_from_node}; use dom::virtualmethods::VirtualMethods; +use dom::window::WindowHelpers; use textinput::TextInput; use textinput::KeyReaction::{TriggerDefaultAction, DispatchInput, Nothing}; use textinput::Lines::Single; @@ -109,6 +110,7 @@ static DEFAULT_INPUT_SIZE: u32 = 20; impl HTMLInputElement { fn new_inherited(localName: DOMString, prefix: Option, document: JSRef) -> HTMLInputElement { + let chan = document.window().root().r().constellation_chan(); HTMLInputElement { htmlelement: HTMLElement::new_inherited(HTMLElementTypeId::HTMLInputElement, localName, prefix, document), input_type: Cell::new(InputType::InputText), @@ -118,7 +120,7 @@ impl HTMLInputElement { checked_changed: Cell::new(false), value_changed: Cell::new(false), size: Cell::new(DEFAULT_INPUT_SIZE), - textinput: DOMRefCell::new(TextInput::new(Single, "".to_owned())), + textinput: DOMRefCell::new(TextInput::new(Single, "".to_owned(), chan)), activation_state: DOMRefCell::new(InputActivationState::new()) } } diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 41a1da8620e..60bbd7a73d9 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -27,6 +27,7 @@ use dom::node::{DisabledStateHelpers, Node, NodeHelpers, NodeDamage, NodeTypeId} use dom::node::{document_from_node, window_from_node}; use textinput::{TextInput, Lines, KeyReaction}; use dom::virtualmethods::VirtualMethods; +use dom::window::WindowHelpers; use script_task::{ScriptMsg, Runnable}; use util::str::DOMString; @@ -90,9 +91,10 @@ static DEFAULT_ROWS: u32 = 2; impl HTMLTextAreaElement { fn new_inherited(localName: DOMString, prefix: Option, document: JSRef) -> HTMLTextAreaElement { + let chan = document.window().root().r().constellation_chan(); HTMLTextAreaElement { htmlelement: HTMLElement::new_inherited(HTMLElementTypeId::HTMLTextAreaElement, localName, prefix, document), - textinput: DOMRefCell::new(TextInput::new(Lines::Multiple, "".to_owned())), + textinput: DOMRefCell::new(TextInput::new(Lines::Multiple, "".to_owned(), chan)), cols: Cell::new(DEFAULT_COLS), rows: Cell::new(DEFAULT_ROWS), value_changed: Cell::new(false), diff --git a/components/script/lib.rs b/components/script/lib.rs index f9a66321767..b9f4b42f84d 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -52,7 +52,6 @@ extern crate style; extern crate url; extern crate uuid; extern crate string_cache; -extern crate clipboard; pub mod cors; diff --git a/components/script/textinput.rs b/components/script/textinput.rs index 85bedec22d8..315b44d8dcf 100644 --- a/components/script/textinput.rs +++ b/components/script/textinput.rs @@ -6,6 +6,8 @@ use dom::bindings::codegen::Bindings::KeyboardEventBinding::KeyboardEventMethods; use dom::bindings::js::JSRef; +use msg::constellation_msg::ConstellationChan; +use msg::constellation_msg::Msg as ConstellationMsg; use dom::keyboardevent::KeyboardEvent; use util::str::DOMString; @@ -13,8 +15,7 @@ use std::borrow::ToOwned; use std::cmp::{min, max}; use std::default::Default; use std::num::SignedInt; - -use clipboard::ClipboardContext; +use std::sync::mpsc::channel; #[derive(Copy, PartialEq)] pub enum Selection { @@ -31,8 +32,6 @@ pub struct TextPoint { pub index: usize, } -no_jsmanaged_fields!(ClipboardContext); - /// Encapsulated state for handling keyboard input in a single or multiline text input control. #[jstraceable] pub struct TextInput { @@ -44,8 +43,7 @@ pub struct TextInput { selection_begin: Option, /// Is this a multiline input? multiline: bool, - /// Means of accessing the clipboard - clipboard_ctx: ClipboardContext, + constellation_channel: ConstellationChan } /// Resulting action to be taken by the owner of a text input that is handling an event. @@ -93,13 +91,13 @@ fn is_control_key(event: JSRef) -> bool { impl TextInput { /// Instantiate a new text input control - pub fn new(lines: Lines, initial: DOMString) -> TextInput { + pub fn new(lines: Lines, initial: DOMString, cc: ConstellationChan) -> TextInput { let mut i = TextInput { lines: vec!(), edit_point: Default::default(), selection_begin: None, multiline: lines == Lines::Multiple, - clipboard_ctx: ClipboardContext::new().unwrap(), + constellation_channel: cc, }; i.set_content(initial); i @@ -299,7 +297,9 @@ impl TextInput { KeyReaction::Nothing }, "v" if is_control_key(event) => { - let contents = self.clipboard_ctx.get_contents().unwrap(); + let (tx, rx) = channel(); + self.constellation_channel.0.send(ConstellationMsg::GetClipboardContents(tx)).unwrap(); + let contents = rx.recv().unwrap(); self.insert_string(contents.as_slice()); KeyReaction::DispatchInput }, diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index a4810689b05..5b6f32e64c1 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -75,6 +75,15 @@ dependencies = [ "gleam 0.0.1 (git+https://github.com/servo/gleam)", ] +[[package]] +name = "clipboard" +version = "0.0.1" +source = "git+https://github.com/aweinstock314/rust-x11-clipboard#eae9596e7e407c8b6037b934c1a8e42a309423fd" +dependencies = [ + "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "xlib 0.1.0 (git+https://github.com/servo/rust-xlib)", +] + [[package]] name = "clock_ticks" version = "0.0.4" @@ -94,6 +103,7 @@ name = "compositing" version = "0.0.1" dependencies = [ "azure 0.1.0 (git+https://github.com/servo/rust-azure)", + "clipboard 0.0.1 (git+https://github.com/aweinstock314/rust-x11-clipboard)", "core_graphics 0.1.0 (git+https://github.com/servo/rust-core-graphics)", "core_text 0.1.0 (git+https://github.com/servo/rust-core-text)", "devtools_traits 0.0.1", @@ -822,7 +832,6 @@ dependencies = [ "url 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", "uuid 0.1.11 (git+https://github.com/rust-lang/uuid)", - "xlib 0.1.0 (git+https://github.com/servo/rust-xlib)", ] [[package]]