Use DOMRefCell<T> for HTMLInputElement's field that is borrowed from other tasks.

This commit is contained in:
Tetsuharu OHZEKI 2014-10-16 11:17:00 +09:00
parent ab90c718eb
commit 2bdcc0e2c0

View file

@ -2,6 +2,7 @@
* 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 dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::AttrBinding::AttrMethods; use dom::bindings::codegen::Bindings::AttrBinding::AttrMethods;
use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::EventBinding::EventMethods;
@ -27,7 +28,6 @@ use string_cache::Atom;
use std::ascii::OwnedStrAsciiExt; use std::ascii::OwnedStrAsciiExt;
use std::cell::{Cell, RefCell}; use std::cell::{Cell, RefCell};
use std::mem;
static DEFAULT_SUBMIT_VALUE: &'static str = "Submit"; static DEFAULT_SUBMIT_VALUE: &'static str = "Submit";
static DEFAULT_RESET_VALUE: &'static str = "Reset"; static DEFAULT_RESET_VALUE: &'static str = "Reset";
@ -52,7 +52,7 @@ pub struct HTMLInputElement {
input_type: Cell<InputType>, input_type: Cell<InputType>,
checked: Cell<bool>, checked: Cell<bool>,
uncommitted_value: RefCell<Option<String>>, uncommitted_value: RefCell<Option<String>>,
value: RefCell<Option<String>>, value: DOMRefCell<Option<String>>,
size: Cell<u32>, size: Cell<u32>,
} }
@ -71,7 +71,7 @@ impl HTMLInputElement {
input_type: Cell::new(InputText), input_type: Cell::new(InputText),
checked: Cell::new(false), checked: Cell::new(false),
uncommitted_value: RefCell::new(None), uncommitted_value: RefCell::new(None),
value: RefCell::new(None), value: DOMRefCell::new(None),
size: Cell::new(DEFAULT_INPUT_SIZE), size: Cell::new(DEFAULT_INPUT_SIZE),
} }
} }
@ -91,21 +91,17 @@ pub trait LayoutHTMLInputElementHelpers {
impl LayoutHTMLInputElementHelpers for HTMLInputElement { impl LayoutHTMLInputElementHelpers for HTMLInputElement {
#[allow(unrooted_must_root)] #[allow(unrooted_must_root)]
unsafe fn get_value_for_layout(&self) -> String { unsafe fn get_value_for_layout(&self) -> String {
unsafe fn get_raw_value(input: &HTMLInputElement) -> Option<String> {
mem::transmute::<&RefCell<Option<String>>, &Option<String>>(&input.value).clone()
}
match self.input_type.get() { match self.input_type.get() {
InputCheckbox | InputRadio => "".to_string(), InputCheckbox | InputRadio => "".to_string(),
InputFile | InputImage => "".to_string(), InputFile | InputImage => "".to_string(),
InputButton(ref default) => get_raw_value(self) InputButton(ref default) => self.value.borrow_for_layout().clone()
.or_else(|| default.map(|v| v.to_string())) .or_else(|| default.map(|v| v.to_string()))
.unwrap_or_else(|| "".to_string()), .unwrap_or_else(|| "".to_string()),
InputPassword => { InputPassword => {
let raw = get_raw_value(self).unwrap_or_else(|| "".to_string()); let raw = self.value.borrow_for_layout().clone().unwrap_or_else(|| "".to_string());
String::from_char(raw.len(), '*') String::from_char(raw.len(), '*')
} }
_ => get_raw_value(self).unwrap_or_else(|| "".to_string()), _ => self.value.borrow_for_layout().clone().unwrap_or_else(|| "".to_string()),
} }
} }