From bba74b7a0b414809e29d8b19978db1996a8822ac Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Sat, 23 Feb 2013 17:44:20 +0000 Subject: Handle readonly attribute for text inputs and textareas. --- !NetSurf/Resources/CSS,f79 | 2 ++ desktop/textarea.c | 20 +++++++------------- render/box_textarea.c | 18 ++++++++++++++++-- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/!NetSurf/Resources/CSS,f79 b/!NetSurf/Resources/CSS,f79 index 9bc0f20c0..a7396acaf 100644 --- a/!NetSurf/Resources/CSS,f79 +++ b/!NetSurf/Resources/CSS,f79 @@ -116,6 +116,7 @@ form { display: block; } input, button { background-color: #fff; color: #000; text-align: left; font-family: sans-serif; width: auto; height: auto; overflow: hidden; border: 2px solid #333; padding: 1px 2px; line-height: 1.33; } +input[readonly] { background-color: #ddd; color: #333; } input[type=button], input[type=reset], input[type=submit], button { background-color: #d9d9d9; color: #000; text-align: center; border: medium outset #d9d9d9; padding: 1px 0.5em; } @@ -137,6 +138,7 @@ select:after { content: "\25bc"; border-left: 4px ridge #d9d9d9; } textarea { background-color: #fff; color: #000; text-align: left; font-family: monospace; width: auto; height: auto; overflow: scroll; margin: 1px; border: 2px solid #333; padding: 0 2px; } +textarea[readonly] { background-color: #ddd; color: #333; } fieldset { display: block; border: thin solid #888; margin: 1.12em 0; } diff --git a/desktop/textarea.c b/desktop/textarea.c index 7444c9f3f..73781f261 100644 --- a/desktop/textarea.c +++ b/desktop/textarea.c @@ -852,9 +852,6 @@ static bool textarea_set_caret_xy(struct textarea *ta, int x, int y) { unsigned int c_off; - if (ta->flags & TEXTAREA_READONLY) - return true; - textarea_get_xy_offset(ta, x, y, &c_off); return textarea_set_caret(ta, c_off); @@ -949,7 +946,9 @@ static bool textarea_replace_text(struct textarea *ta, unsigned int start, { size_t b_start, b_end; - if (ta->flags & TEXTAREA_READONLY) + if ((ta->flags & TEXTAREA_READONLY) && + !(rep == NULL && rep_len == 0 && add_to_clipboard)) + /* Can't edit if readonly, and we're not just copying */ return true; if (start > ta->text.utf8_len) @@ -1333,9 +1332,6 @@ bool textarea_set_caret(struct textarea *ta, int caret) struct textarea_msg msg; bool scrolled; - if (ta->flags & TEXTAREA_READONLY) - return true; - c_len = ta->show->utf8_len; if (caret != -1 && caret > (signed)c_len) @@ -2273,13 +2269,11 @@ bool textarea_mouse_action(struct textarea *ta, browser_mouse_state mouse, return textarea_select_paragraph(ta); } else if (mouse & BROWSER_MOUSE_PRESS_1) { - if (!(ta->flags & TEXTAREA_READONLY)) { - /* Place caret */ - textarea_get_xy_offset(ta, x, y, &c_off); - ta->drag_start_char = c_off; + /* Place caret */ + textarea_get_xy_offset(ta, x, y, &c_off); + ta->drag_start_char = c_off; - textarea_set_caret(ta, c_off); - } + textarea_set_caret(ta, c_off); if (ta->sel_start != -1) { /* Clear selection */ textarea_clear_selection(ta); diff --git a/render/box_textarea.c b/render/box_textarea.c index 3d9838fa1..b529fe65c 100644 --- a/render/box_textarea.c +++ b/render/box_textarea.c @@ -209,11 +209,10 @@ bool box_textarea_create_textarea(html_content *html, textarea_setup ta_setup; textarea_flags ta_flags; plot_font_style_t fstyle; + bool read_only = false; struct form_control *gadget = box->gadget; const char *text; - /** TODO: Read only textarea */ - assert(gadget != NULL); assert(gadget->type == GADGET_TEXTAREA || gadget->type == GADGET_TEXTBOX || @@ -221,6 +220,13 @@ bool box_textarea_create_textarea(html_content *html, if (gadget->type == GADGET_TEXTAREA) { ta_flags = TEXTAREA_MULTILINE; + dom_html_text_area_element *textarea = + (dom_html_text_area_element *) node; + + err = dom_html_text_area_element_get_read_only( + textarea, &read_only); + if (err != DOM_NO_ERR) + return false; /* Get the textarea's initial content */ err = dom_node_get_text_content(node, &dom_text); @@ -230,6 +236,11 @@ bool box_textarea_create_textarea(html_content *html, } else { dom_html_input_element *input = (dom_html_input_element *) node; + err = dom_html_input_element_get_read_only( + input, &read_only); + if (err != DOM_NO_ERR) + return false; + if (gadget->type == GADGET_PASSWORD) ta_flags = TEXTAREA_PASSWORD; else @@ -249,6 +260,9 @@ bool box_textarea_create_textarea(html_content *html, text = ""; } + if (read_only) + ta_flags |= TEXTAREA_READONLY; + gadget->data.text.data.html = html; gadget->data.text.data.gadget = gadget; -- cgit v1.2.3