From 16b92d1613e245919743be5f168abe77712ec84b Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Tue, 26 Jul 2011 13:53:42 +0000 Subject: [PATCH] Selection is now subordinate to html and text content types, and disassociated from browser windows. Note: search currently uses hlcache_handle_get_content() to go from bw to h to get at c for search highlighting via selection. svn path=/trunk/netsurf/; revision=12626 --- desktop/search.c | 71 ++++++++++++++------------ desktop/selection.c | 87 +++++++++++++++----------------- desktop/selection.h | 10 ++-- render/html.c | 21 ++++++-- render/html_internal.h | 2 + render/textplain.c | 111 +++++++++++++++++++++-------------------- render/textplain.h | 16 +++--- 7 files changed, 167 insertions(+), 151 deletions(-) diff --git a/desktop/search.c b/desktop/search.c index 29455d8d5..014014e71 100644 --- a/desktop/search.c +++ b/desktop/search.c @@ -81,7 +81,7 @@ static bool find_occurrences_html(const char *pattern, int p_len, struct box *cur, bool case_sens, struct search_context *context); static bool find_occurrences_text(const char *pattern, int p_len, - hlcache_handle *c, bool case_sens, + struct content *c, bool case_sens, struct search_context *context); static struct list_entry *add_entry(unsigned start_idx, unsigned end_idx, struct search_context *context); @@ -236,7 +236,7 @@ void search_text(const char *string, int string_len, struct search_context *context, search_flags_t flags) { struct rect bounds; - hlcache_handle *c; + hlcache_handle *h; struct box *box = NULL; bool case_sensitive, forwards, showall; @@ -247,15 +247,15 @@ void search_text(const char *string, int string_len, if (context->bw == NULL) return; - c = context->bw->current_content; + h = context->bw->current_content; /* only handle html contents */ - if ((!c) || (content_get_type(c) != CONTENT_HTML && - content_get_type(c) != CONTENT_TEXTPLAIN)) + if ((!h) || (content_get_type(h) != CONTENT_HTML && + content_get_type(h) != CONTENT_TEXTPLAIN)) return; - if (content_get_type(c) == CONTENT_HTML) { - box = html_get_box_tree(c); + if (content_get_type(h) == CONTENT_HTML) { + box = html_get_box_tree(h); if (!box) return; @@ -284,13 +284,14 @@ void search_text(const char *string, int string_len, (context->callbacks->hourglass != NULL)) context->callbacks->hourglass(true, context->p); - if (content_get_type(c) == CONTENT_HTML) + if (content_get_type(h) == CONTENT_HTML) res = find_occurrences_html(string, string_len, box, case_sensitive, context); else { - assert(content_get_type(c) == CONTENT_TEXTPLAIN); + assert(content_get_type(h) == CONTENT_TEXTPLAIN); res = find_occurrences_text(string, string_len, - c, case_sensitive, context); + hlcache_handle_get_content(h), + case_sensitive, context); } if (!res) { @@ -343,7 +344,7 @@ void search_text(const char *string, int string_len, if (context->current == NULL) return; - switch (content_get_type(c)) { + switch (content_get_type(h)) { case CONTENT_HTML: /* get box position and jump to it */ box_coords(context->current->start_box, @@ -357,8 +358,9 @@ void search_text(const char *string, int string_len, break; default: - assert(content_get_type(c) == CONTENT_TEXTPLAIN); - textplain_coords_from_range(c, + assert(content_get_type(h) == CONTENT_TEXTPLAIN); + textplain_coords_from_range( + hlcache_handle_get_content(h), context->current->start_idx, context->current->end_idx, &bounds); break; @@ -551,7 +553,7 @@ bool find_occurrences_html(const char *pattern, int p_len, struct box *cur, */ bool find_occurrences_text(const char *pattern, int p_len, - hlcache_handle *c, bool case_sens, + struct content *c, bool case_sens, struct search_context *context) { int nlines = textplain_line_count(c); @@ -640,25 +642,30 @@ void search_show_all(bool all, struct search_context *context) } } if (add && !a->sel) { - a->sel = selection_create(); - selection_set_browser_window(a->sel, context->bw); - if (a->sel) { - hlcache_handle *c = context->bw-> - current_content; - switch (content_get_type(c)) { - case CONTENT_HTML: - selection_init(a->sel, - html_get_box_tree(c)); - break; - default: - assert(content_get_type(c) == - CONTENT_TEXTPLAIN); - selection_init(a->sel, NULL); - break; - } - selection_set_start(a->sel, a->start_idx); - selection_set_end(a->sel, a->end_idx); + hlcache_handle *h = context->bw->current_content; + struct content *c = hlcache_handle_get_content(h); + + switch (content_get_type(h)) { + case CONTENT_HTML: + a->sel = selection_create(c, true); + if (!a->sel) + continue; + + selection_init(a->sel, html_get_box_tree(h)); + break; + default: + assert(content_get_type(h) == + CONTENT_TEXTPLAIN); + a->sel = selection_create(c, false); + if (!a->sel) + continue; + + selection_init(a->sel, NULL); + break; } + + selection_set_start(a->sel, a->start_idx); + selection_set_end(a->sel, a->end_idx); } } } diff --git a/desktop/selection.c b/desktop/selection.c index 7c775f4c2..2c61c511e 100644 --- a/desktop/selection.c +++ b/desktop/selection.c @@ -27,7 +27,6 @@ #include #include -#include "content/hlcache.h" #include "desktop/gui.h" #include "desktop/mouse.h" #include "desktop/plotters.h" @@ -36,6 +35,7 @@ #include "render/box.h" #include "render/font.h" #include "render/form.h" +#include "render/html_internal.h" #include "render/textplain.h" #include "utils/log.h" #include "utils/utf8.h" @@ -87,32 +87,51 @@ static bool traverse_tree(struct box *box, unsigned start_idx, unsigned end_idx, bool do_marker); static struct box *get_box(struct box *b, unsigned offset, size_t *pidx); + +/** + * Get the browser window containing the content a selection object belongs to. + * + * \param s selection object + * \return the browser window + */ +static struct browser_window * selection_get_browser_window(struct selection *s) +{ + if (s->is_html) + return html_get_browser_window(s->c); + else + return textplain_get_browser_window(s->c); +} + + /** * Creates a new selection object associated with a browser window. * * \return new selection context */ -struct selection *selection_create(void) +struct selection *selection_create(struct content *c, bool is_html) { struct selection *s = calloc(1, sizeof(struct selection)); if (s) { - selection_prepare(s); + selection_prepare(s, c, is_html); } + return s; } /** * Prepare a newly created selection object for use. * - * \param s selection object - * \param bw browser window + * \param s selection object + * \param c content + * \param is_html true if content is html false if content is textplain */ -void selection_prepare(struct selection *s) +void selection_prepare(struct selection *s, struct content *c, bool is_html) { if (s) { - s->bw = NULL; + s->c = c; + s->is_html = is_html; s->root = NULL; s->drag_state = DRAG_NONE; s->max_idx = 0; @@ -120,21 +139,6 @@ void selection_prepare(struct selection *s) } } -/** - * Set the browser window that contains the selection within a selection - * object. - * - * \param bw browser window - */ - -void selection_set_browser_window(struct selection *s, - struct browser_window *bw) -{ - assert(s); - - s->bw = bw; -} - /** * Destroys a selection object, without updating the @@ -188,11 +192,9 @@ void selection_reinit(struct selection *s, struct box *root) s->root = root; if (root) { s->max_idx = selection_label_subtree(root, root_idx); - } - else { - hlcache_handle *c = s->bw->current_content; - if (c && content_get_type(c) == CONTENT_TEXTPLAIN) - s->max_idx = textplain_size(c); + } else { + if (s->is_html == false) + s->max_idx = textplain_size(s->c); else s->max_idx = 0; } @@ -291,11 +293,13 @@ bool selection_click(struct selection *s, browser_mouse_state mouse, browser_mouse_state modkeys = (mouse & (BROWSER_MOUSE_MOD_1 | BROWSER_MOUSE_MOD_2)); int pos = -1; /* 0 = inside selection, 1 = after it */ - struct browser_window *top; + struct browser_window *top = selection_get_browser_window(s); - if (s->bw == NULL) + if (top == NULL) return false; /* not our problem */ + top = browser_window_get_root(top); + if (!SAME_SPACE(s, idx)) return false; /* not our problem */ @@ -308,8 +312,6 @@ bool selection_click(struct selection *s, browser_mouse_state mouse, } } - top = browser_window_get_root(s->bw); - if (!pos && ((mouse & BROWSER_MOUSE_DRAG_1) || (modkeys && (mouse & BROWSER_MOUSE_DRAG_2)))) { @@ -612,7 +614,6 @@ bool traverse_tree(struct box *box, unsigned start_idx, unsigned end_idx, bool selection_traverse(struct selection *s, seln_traverse_handler handler, void *handle) { - hlcache_handle *c; save_text_whitespace before = WHITESPACE_NONE; bool first = true; const char *text; @@ -629,10 +630,7 @@ bool selection_traverse(struct selection *s, seln_traverse_handler handler, } /* Text */ - c = s->bw->current_content; - if (!c) return true; - - text = textplain_get_raw_data(c, s->start_idx, s->end_idx, &length); + text = textplain_get_raw_data(s->c, s->start_idx, s->end_idx, &length); if (text && !handler(text, length, NULL, handle, NULL, 0)) return false; @@ -717,17 +715,15 @@ void selection_redraw(struct selection *s, unsigned start_idx, unsigned end_idx) return; } else { - hlcache_handle *c = s->bw->current_content; - if (c && content_get_type(c) == CONTENT_TEXTPLAIN && - end_idx > start_idx) { - textplain_coords_from_range(c, start_idx, + if (s->is_html == false && end_idx > start_idx) { + textplain_coords_from_range(s->c, start_idx, end_idx, &rdw.r); rdw.inited = true; } } if (rdw.inited) - browser_window_redraw_rect(s->bw, rdw.r.x0, rdw.r.y0, + content__request_redraw(s->c, rdw.r.x0, rdw.r.y0, rdw.r.x1 - rdw.r.x0, rdw.r.y1 - rdw.r.y0); } @@ -744,7 +740,7 @@ void selection_clear(struct selection *s, bool redraw) { int old_start, old_end; bool was_defined; - struct browser_window *top; + struct browser_window *top = selection_get_browser_window(s); assert(s); was_defined = selection_defined(s); @@ -755,10 +751,10 @@ void selection_clear(struct selection *s, bool redraw) s->start_idx = 0; s->end_idx = 0; - if (!s->bw) + if (!top) return; - top = browser_window_get_root(s->bw); + top = browser_window_get_root(top); gui_clear_selection(top->window); @@ -1015,14 +1011,11 @@ bool save_handler(const char *text, size_t length, struct box *box, bool selection_save_text(struct selection *s, const char *path) { - hlcache_handle *c = s->bw->current_content; struct save_text_state sv = { NULL, 0, 0 }; utf8_convert_ret ret; char *result; FILE *out; - assert(c); - if (!selection_traverse(s, save_handler, &sv)) { free(sv.block); return false; diff --git a/desktop/selection.h b/desktop/selection.h index 4b8bd8ec8..b4e4b31e9 100644 --- a/desktop/selection.h +++ b/desktop/selection.h @@ -40,7 +40,7 @@ typedef enum { struct selection { - struct browser_window *bw; + struct content *c; struct box *root; unsigned max_idx; /* total bytes in text representation */ @@ -49,6 +49,7 @@ struct selection unsigned end_idx; bool defined; + bool is_html; seln_drag_state drag_state; }; @@ -59,16 +60,13 @@ typedef bool (*seln_traverse_handler)(const char *text, size_t length, size_t whitespace_length); -struct selection *selection_create(void); -void selection_prepare(struct selection *s); +struct selection *selection_create(struct content *c, bool is_html); +void selection_prepare(struct selection *s, struct content *c, bool is_html); void selection_destroy(struct selection *s); void selection_init(struct selection *s, struct box *root); void selection_reinit(struct selection *s, struct box *root); -void selection_set_browser_window(struct selection *s, - struct browser_window *bw); - /* struct box *selection_root(struct selection *s); */ #define selection_root(s) ((s)->root) diff --git a/render/html.c b/render/html.c index 5284f53c2..00db1e541 100644 --- a/render/html.c +++ b/render/html.c @@ -258,7 +258,7 @@ nserror html_create_html_data(html_content *c, const http_parameter *params) c->font_func = &nsfont; c->scrollbar = NULL; - selection_prepare(&c->sel); + selection_prepare(&c->sel, (struct content *)c, true); nerror = http_parameter_list_find_item(params, html_charset, &charset); if (nerror == NSERROR_OK) { @@ -2040,7 +2040,6 @@ void html_open(struct content *c, struct browser_window *bw, /* text selection */ selection_init(&html->sel, html->layout); - selection_set_browser_window(&html->sel, bw); for (object = html->object_list; object != NULL; object = next) { next = object->next; @@ -2068,8 +2067,6 @@ void html_close(struct content *c) html_content *html = (html_content *) c; struct content_html_object *object, *next; - selection_set_browser_window(&html->sel, NULL); - html->bw = NULL; for (object = html->object_list; object != NULL; object = next) { @@ -2367,3 +2364,19 @@ content_type html_content_type(lwc_string *mime_type) return CONTENT_HTML; } +/** + * Get the browser window containing an HTML content + * + * \param c HTML content + * \return the browser window + */ +struct browser_window *html_get_browser_window(struct content *c) +{ + html_content *html = (html_content *) c; + + assert(c != NULL); + assert(c->handler == &html_content_handler); + + return html->bw; +} + diff --git a/render/html_internal.h b/render/html_internal.h index 5eaab97b3..3a3e9f528 100644 --- a/render/html_internal.h +++ b/render/html_internal.h @@ -111,6 +111,8 @@ void html_set_status(html_content *c, const char *extra); void html__redraw_a_box(struct content *c, struct box *box); +struct browser_window *html_get_browser_window(struct content *c); + /* in render/html_redraw.c */ bool html_redraw(struct content *c, struct content_redraw_data *data, const struct rect *clip, const struct redraw_context *ctx); diff --git a/render/textplain.c b/render/textplain.c index 58a94c41d..a3b8ea68e 100644 --- a/render/textplain.c +++ b/render/textplain.c @@ -292,7 +292,7 @@ nserror textplain_create_internal(textplain_content *c, lwc_string *encoding) c->formatted_width = 0; c->bw = NULL; - selection_prepare(&c->sel); + selection_prepare(&c->sel, (struct content *)c, false); return NSERROR_OK; @@ -623,7 +623,6 @@ void textplain_mouse_track(struct content *c, struct browser_window *bw, browser_mouse_state mouse, int x, int y) { textplain_content *text = (textplain_content *) c; - hlcache_handle *h = bw->current_content; if (bw->drag_type == DRAGGING_SELECTION && !mouse) { int dir = -1; @@ -632,7 +631,7 @@ void textplain_mouse_track(struct content *c, struct browser_window *bw, if (selection_dragging_start(&text->sel)) dir = 1; - idx = textplain_offset_from_coords(h, x, y, dir); + idx = textplain_offset_from_coords(c, x, y, dir); selection_track(&text->sel, mouse, idx); browser_window_set_drag_type(bw, DRAGGING_NONE); @@ -641,13 +640,12 @@ void textplain_mouse_track(struct content *c, struct browser_window *bw, switch (bw->drag_type) { case DRAGGING_SELECTION: { - hlcache_handle *h = bw->current_content; int dir = -1; size_t idx; if (selection_dragging_start(&text->sel)) dir = 1; - idx = textplain_offset_from_coords(h, x, y, dir); + idx = textplain_offset_from_coords(c, x, y, dir); selection_track(&text->sel, mouse, idx); } break; @@ -673,7 +671,6 @@ void textplain_mouse_action(struct content *c, struct browser_window *bw, browser_mouse_state mouse, int x, int y) { textplain_content *text = (textplain_content *) c; - hlcache_handle *h = bw->current_content; gui_pointer_shape pointer = GUI_POINTER_DEFAULT; const char *status = 0; size_t idx; @@ -681,7 +678,7 @@ void textplain_mouse_action(struct content *c, struct browser_window *bw, browser_window_set_drag_type(bw, DRAGGING_NONE); - idx = textplain_offset_from_coords(h, x, y, dir); + idx = textplain_offset_from_coords(c, x, y, dir); if (selection_click(&text->sel, mouse, idx)) { if (selection_dragging(&text->sel)) { @@ -689,14 +686,14 @@ void textplain_mouse_action(struct content *c, struct browser_window *bw, status = messages_get("Selecting"); } else - status = content_get_status_message(h); + status = content__get_status_message(c); } else { if (bw->loading_content) status = content_get_status_message( bw->loading_content); else - status = content_get_status_message(h); + status = content__get_status_message(c); if (mouse & (BROWSER_MOUSE_DRAG_1 | BROWSER_MOUSE_DRAG_2)) { browser_window_page_drag_start(bw, x, y); @@ -867,7 +864,6 @@ void textplain_open(struct content *c, struct browser_window *bw, text->bw = bw; /* text selection */ - selection_set_browser_window(&text->sel, bw); selection_init(&text->sel, NULL); } @@ -880,8 +876,6 @@ void textplain_close(struct content *c) { textplain_content *text = (textplain_content *) c; - selection_set_browser_window(&text->sel, NULL); - text->bw = NULL; } @@ -903,14 +897,13 @@ struct selection *textplain_get_selection(struct content *c) * \param h Content to retrieve line count from * \return Number of lines */ -unsigned long textplain_line_count(hlcache_handle *h) +unsigned long textplain_line_count(struct content *c) { - textplain_content *c = - (textplain_content *) hlcache_handle_get_content(h); + textplain_content *text = (textplain_content *) c; assert(c != NULL); - return c->physical_line_count; + return text->physical_line_count; } /** @@ -919,14 +912,13 @@ unsigned long textplain_line_count(hlcache_handle *h) * \param h Content to retrieve size of * \return Size, in bytes, of data */ -size_t textplain_size(hlcache_handle *h) +size_t textplain_size(struct content *c) { - textplain_content *c = - (textplain_content *) hlcache_handle_get_content(h); + textplain_content *text = (textplain_content *) c; assert(c != NULL); - return c->utf8_data_size; + return text->utf8_data_size; } /** @@ -942,10 +934,9 @@ size_t textplain_size(hlcache_handle *h) * \return byte offset of character containing (or nearest to) point */ -size_t textplain_offset_from_coords(hlcache_handle *h, int x, int y, int dir) +size_t textplain_offset_from_coords(struct content *c, int x, int y, int dir) { - textplain_content *c = - (textplain_content *) hlcache_handle_get_content(h); + textplain_content *textc = (textplain_content *) c; float line_height = textplain_line_height(); struct textplain_line *line; const char *text; @@ -958,7 +949,7 @@ size_t textplain_offset_from_coords(hlcache_handle *h, int x, int y, int dir) y = (int)((float)(y - MARGIN) / line_height); x -= MARGIN; - nlines = c->physical_line_count; + nlines = textc->physical_line_count; if (!nlines) return 0; @@ -966,8 +957,8 @@ size_t textplain_offset_from_coords(hlcache_handle *h, int x, int y, int dir) else if ((unsigned)y >= nlines) y = nlines - 1; - line = &c->physical_line[y]; - text = c->utf8_data + line->start; + line = &textc->physical_line[y]; + text = textc->utf8_data + line->start; length = line->length; idx = 0; @@ -1016,25 +1007,24 @@ size_t textplain_offset_from_coords(hlcache_handle *h, int x, int y, int dir) * Given a byte offset within the text, return the line number * of the line containing that offset (or -1 if offset invalid) * - * \param h content of type CONTENT_TEXTPLAIN + * \param c content of type CONTENT_TEXTPLAIN * \param offset byte offset within textual representation * \return line number, or -1 if offset invalid (larger than size) */ -int textplain_find_line(hlcache_handle *h, unsigned offset) +int textplain_find_line(struct content *c, unsigned offset) { - textplain_content *c = - (textplain_content *) hlcache_handle_get_content(h); + textplain_content *text = (textplain_content *) c; struct textplain_line *line; int nlines; int lineno = 0; assert(c != NULL); - line = c->physical_line; - nlines = c->physical_line_count; + line = text->physical_line; + nlines = text->physical_line_count; - if (offset > c->utf8_data_size) + if (offset > text->utf8_data_size) return -1; /* \todo - implement binary search here */ @@ -1097,11 +1087,10 @@ int textplain_coord_from_offset(const char *text, size_t offset, size_t length) * \param r rectangle to be completed */ -void textplain_coords_from_range(hlcache_handle *h, unsigned start, +void textplain_coords_from_range(struct content *c, unsigned start, unsigned end, struct rect *r) { - textplain_content *c = - (textplain_content *) hlcache_handle_get_content(h); + textplain_content *text = (textplain_content *) c; float line_height = textplain_line_height(); char *utf8_data; struct textplain_line *line; @@ -1110,14 +1099,14 @@ void textplain_coords_from_range(hlcache_handle *h, unsigned start, assert(c != NULL); assert(start <= end); - assert(end <= c->utf8_data_size); + assert(end <= text->utf8_data_size); - utf8_data = c->utf8_data; - nlines = c->physical_line_count; - line = c->physical_line; + utf8_data = text->utf8_data; + nlines = text->physical_line_count; + line = text->physical_line; /* find start */ - lineno = textplain_find_line(h, start); + lineno = textplain_find_line(c, start); r->y0 = (int)(MARGIN + lineno * line_height); @@ -1126,10 +1115,10 @@ void textplain_coords_from_range(hlcache_handle *h, unsigned start, forwards most of the time */ /* find end */ - lineno = textplain_find_line(h, end); + lineno = textplain_find_line(c, end); r->x0 = 0; - r->x1 = c->formatted_width; + r->x1 = text->formatted_width; } else { /* single line */ @@ -1156,22 +1145,21 @@ void textplain_coords_from_range(hlcache_handle *h, unsigned start, * \return pointer to text, or NULL if invalid line number */ -char *textplain_get_line(hlcache_handle *h, unsigned lineno, +char *textplain_get_line(struct content *c, unsigned lineno, size_t *poffset, size_t *plen) { - textplain_content *c = - (textplain_content *) hlcache_handle_get_content(h); + textplain_content *text = (textplain_content *) c; struct textplain_line *line; assert(c != NULL); - if (lineno >= c->physical_line_count) + if (lineno >= text->physical_line_count) return NULL; - line = &c->physical_line[lineno]; + line = &text->physical_line[lineno]; *poffset = line->start; *plen = line->length; - return c->utf8_data + line->start; + return text->utf8_data + line->start; } @@ -1187,16 +1175,15 @@ char *textplain_get_line(hlcache_handle *h, unsigned lineno, * \return pointer to text, or NULL if no text */ -char *textplain_get_raw_data(hlcache_handle *h, unsigned start, unsigned end, +char *textplain_get_raw_data(struct content *c, unsigned start, unsigned end, size_t *plen) { - textplain_content *c = - (textplain_content *) hlcache_handle_get_content(h); + textplain_content *text = (textplain_content *) c; size_t utf8_size; assert(c != NULL); - utf8_size = c->utf8_data_size; + utf8_size = text->utf8_data_size; /* any text at all? */ if (!utf8_size) return NULL; @@ -1207,7 +1194,7 @@ char *textplain_get_raw_data(hlcache_handle *h, unsigned start, unsigned end, *plen = end - start; - return c->utf8_data + start; + return text->utf8_data + start; } /** @@ -1224,3 +1211,19 @@ float textplain_line_height(void) INTTOFIX((textplain_style.size / FONT_SIZE_SCALE))))), F_72)); } +/** + * Get the browser window containing a textplain content + * + * \param c text/plain content + * \return the browser window + */ +struct browser_window *textplain_get_browser_window(struct content *c) +{ + textplain_content *text = (textplain_content *) c; + + assert(c != NULL); + assert(c->handler == &textplain_content_handler); + + return text->bw; +} + diff --git a/render/textplain.h b/render/textplain.h index 66e4e83ee..75e84b114 100644 --- a/render/textplain.h +++ b/render/textplain.h @@ -36,17 +36,17 @@ nserror textplain_init(void); void textplain_fini(void); /* access to lines for text selection and searching */ -unsigned long textplain_line_count(struct hlcache_handle *h); -size_t textplain_size(struct hlcache_handle *h); +unsigned long textplain_line_count(struct content *c); +size_t textplain_size(struct content *c); -size_t textplain_offset_from_coords(struct hlcache_handle *h, int x, int y, - int dir); -void textplain_coords_from_range(struct hlcache_handle *h, +size_t textplain_offset_from_coords(struct content *c, int x, int y, int dir); +void textplain_coords_from_range(struct content *c, unsigned start, unsigned end, struct rect *r); -char *textplain_get_line(struct hlcache_handle *h, unsigned lineno, +char *textplain_get_line(struct content *c, unsigned lineno, size_t *poffset, size_t *plen); -int textplain_find_line(struct hlcache_handle *h, unsigned offset); -char *textplain_get_raw_data(struct hlcache_handle *h, +int textplain_find_line(struct content *c, unsigned offset); +char *textplain_get_raw_data(struct content *c, unsigned start, unsigned end, size_t *plen); +struct browser_window *textplain_get_browser_window(struct content *c); #endif