diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index 8ca412a04f9..1f8abb17992 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -120,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(), chan)), + textinput: DOMRefCell::new(TextInput::new(Single, "".to_owned(), Some(chan))), activation_state: DOMRefCell::new(InputActivationState::new()) } } diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 60bbd7a73d9..738c906e91b 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -94,7 +94,7 @@ impl 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(), chan)), + textinput: DOMRefCell::new(TextInput::new(Lines::Multiple, "".to_owned(), Some(chan))), cols: Cell::new(DEFAULT_COLS), rows: Cell::new(DEFAULT_ROWS), value_changed: Cell::new(false), diff --git a/components/script/textinput.rs b/components/script/textinput.rs index 315b44d8dcf..33c8ce90665 100644 --- a/components/script/textinput.rs +++ b/components/script/textinput.rs @@ -43,7 +43,7 @@ pub struct TextInput { selection_begin: Option, /// Is this a multiline input? multiline: bool, - constellation_channel: ConstellationChan + constellation_channel: Option } /// Resulting action to be taken by the owner of a text input that is handling an event. @@ -91,7 +91,7 @@ fn is_control_key(event: JSRef) -> bool { impl TextInput { /// Instantiate a new text input control - pub fn new(lines: Lines, initial: DOMString, cc: ConstellationChan) -> TextInput { + pub fn new(lines: Lines, initial: DOMString, cc: Option) -> TextInput { let mut i = TextInput { lines: vec!(), edit_point: Default::default(), @@ -298,9 +298,14 @@ impl TextInput { }, "v" if is_control_key(event) => { let (tx, rx) = channel(); - self.constellation_channel.0.send(ConstellationMsg::GetClipboardContents(tx)).unwrap(); - let contents = rx.recv().unwrap(); - self.insert_string(contents.as_slice()); + let mut contents = None; + if let Some(ref cc) = self.constellation_channel { + cc.0.send(ConstellationMsg::GetClipboardContents(tx)).unwrap(); + contents = Some(rx.recv().unwrap()); + } + if let Some(contents) = contents { + self.insert_string(contents.as_slice()); + } KeyReaction::DispatchInput }, // printable characters have single-character key values diff --git a/tests/unit/script/textinput.rs b/tests/unit/script/textinput.rs index 322ee63c1c5..0d7326685db 100644 --- a/tests/unit/script/textinput.rs +++ b/tests/unit/script/textinput.rs @@ -12,7 +12,7 @@ use std::borrow::ToOwned; #[test] fn test_textinput_delete_char() { - let mut textinput = TextInput::new(Lines::Single, "abcdefg".to_owned()); + let mut textinput = TextInput::new(Lines::Single, "abcdefg".to_owned(), None); textinput.adjust_horizontal(2, Selection::NotSelected); textinput.delete_char(DeleteDir::Backward); assert_eq!(textinput.get_content(), "acdefg"); @@ -27,7 +27,7 @@ fn test_textinput_delete_char() { #[test] fn test_textinput_insert_char() { - let mut textinput = TextInput::new(Lines::Single, "abcdefg".to_owned()); + let mut textinput = TextInput::new(Lines::Single, "abcdefg".to_owned(), None); textinput.adjust_horizontal(2, Selection::NotSelected); textinput.insert_char('a'); assert_eq!(textinput.get_content(), "abacdefg"); @@ -39,7 +39,7 @@ fn test_textinput_insert_char() { #[test] fn test_textinput_get_sorted_selection() { - let mut textinput = TextInput::new(Lines::Single, "abcdefg".to_owned()); + let mut textinput = TextInput::new(Lines::Single, "abcdefg".to_owned(), None); textinput.adjust_horizontal(2, Selection::NotSelected); textinput.adjust_horizontal(2, Selection::Selected); let (begin, end) = textinput.get_sorted_selection(); @@ -56,7 +56,7 @@ fn test_textinput_get_sorted_selection() { #[test] fn test_textinput_replace_selection() { - let mut textinput = TextInput::new(Lines::Single, "abcdefg".to_owned()); + let mut textinput = TextInput::new(Lines::Single, "abcdefg".to_owned(), None); textinput.adjust_horizontal(2, Selection::NotSelected); textinput.adjust_horizontal(2, Selection::Selected); @@ -66,7 +66,7 @@ fn test_textinput_replace_selection() { #[test] fn test_textinput_current_line_length() { - let mut textinput = TextInput::new(Lines::Multiple, "abc\nde\nf".to_owned()); + let mut textinput = TextInput::new(Lines::Multiple, "abc\nde\nf".to_owned(), None); assert_eq!(textinput.current_line_length(), 3); textinput.adjust_vertical(1, Selection::NotSelected); @@ -78,7 +78,7 @@ fn test_textinput_current_line_length() { #[test] fn test_textinput_adjust_vertical() { - let mut textinput = TextInput::new(Lines::Multiple, "abc\nde\nf".to_owned()); + let mut textinput = TextInput::new(Lines::Multiple, "abc\nde\nf".to_owned(), None); textinput.adjust_horizontal(3, Selection::NotSelected); textinput.adjust_vertical(1, Selection::NotSelected); assert_eq!(textinput.edit_point.line, 1); @@ -95,7 +95,7 @@ fn test_textinput_adjust_vertical() { #[test] fn test_textinput_adjust_horizontal() { - let mut textinput = TextInput::new(Lines::Multiple, "abc\nde\nf".to_owned()); + let mut textinput = TextInput::new(Lines::Multiple, "abc\nde\nf".to_owned(), None); textinput.adjust_horizontal(4, Selection::NotSelected); assert_eq!(textinput.edit_point.line, 1); assert_eq!(textinput.edit_point.index, 0); @@ -115,12 +115,12 @@ fn test_textinput_adjust_horizontal() { #[test] fn test_textinput_handle_return() { - let mut single_line_textinput = TextInput::new(Lines::Single, "abcdef".to_owned()); + let mut single_line_textinput = TextInput::new(Lines::Single, "abcdef".to_owned(), None); single_line_textinput.adjust_horizontal(3, Selection::NotSelected); single_line_textinput.handle_return(); assert_eq!(single_line_textinput.get_content(), "abcdef"); - let mut multi_line_textinput = TextInput::new(Lines::Multiple, "abcdef".to_owned()); + let mut multi_line_textinput = TextInput::new(Lines::Multiple, "abcdef".to_owned(), None); multi_line_textinput.adjust_horizontal(3, Selection::NotSelected); multi_line_textinput.handle_return(); assert_eq!(multi_line_textinput.get_content(), "abc\ndef"); @@ -128,7 +128,7 @@ fn test_textinput_handle_return() { #[test] fn test_textinput_select_all() { - let mut textinput = TextInput::new(Lines::Multiple, "abc\nde\nf".to_owned()); + let mut textinput = TextInput::new(Lines::Multiple, "abc\nde\nf".to_owned(), None); assert_eq!(textinput.edit_point.line, 0); assert_eq!(textinput.edit_point.index, 0); @@ -139,16 +139,16 @@ fn test_textinput_select_all() { #[test] fn test_textinput_get_content() { - let single_line_textinput = TextInput::new(Lines::Single, "abcdefg".to_owned()); + let single_line_textinput = TextInput::new(Lines::Single, "abcdefg".to_owned(), None); assert_eq!(single_line_textinput.get_content(), "abcdefg"); - let multi_line_textinput = TextInput::new(Lines::Multiple, "abc\nde\nf".to_owned()); + let multi_line_textinput = TextInput::new(Lines::Multiple, "abc\nde\nf".to_owned(), None); assert_eq!(multi_line_textinput.get_content(), "abc\nde\nf"); } #[test] fn test_textinput_set_content() { - let mut textinput = TextInput::new(Lines::Multiple, "abc\nde\nf".to_owned()); + let mut textinput = TextInput::new(Lines::Multiple, "abc\nde\nf".to_owned(), None); assert_eq!(textinput.get_content(), "abc\nde\nf"); textinput.set_content("abc\nf".to_owned());