mirror of
https://github.com/netsurf-browser/netsurf
synced 2025-02-04 16:44:14 +03:00
Make F9 dump box tree to an editor for easier debugging.
svn path=/trunk/netsurf/; revision=3529
This commit is contained in:
parent
d1382c6d0e
commit
21db9de5f8
@ -97,8 +97,10 @@ int main(int argc, char *argv[])
|
||||
fetchcache_go(c, 0, callback, 0, 0, 1000, 1000,
|
||||
0, 0, true, 0);
|
||||
done = c->status == CONTENT_STATUS_DONE;
|
||||
while (!done)
|
||||
while (!done) {
|
||||
fetch_poll();
|
||||
sleep(1);
|
||||
}
|
||||
puts("=== SUCCESS, dumping cache");
|
||||
} else {
|
||||
destroyed = 1;
|
||||
@ -110,7 +112,7 @@ int main(int argc, char *argv[])
|
||||
/* content_reformat(c, 1, 1000); */
|
||||
/* save_complete(c, "save_complete");*/
|
||||
if (c->type == CONTENT_HTML)
|
||||
box_dump(c->data.html.layout, 0);
|
||||
box_dump(stderr, c->data.html.layout, 0);
|
||||
else if (c->type == CONTENT_CSS)
|
||||
css_dump_stylesheet(c->data.css.css);
|
||||
else if (c->type == CONTENT_GIF)
|
||||
|
93
render/box.c
93
render/box.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2005 James Bursa <bursa@users.sourceforge.net>
|
||||
* Copyright 2005-2007 James Bursa <bursa@users.sourceforge.net>
|
||||
* Copyright 2003 Phil Mellor <monkeyson@users.sourceforge.net>
|
||||
* Copyright 2005 John M Bell <jmb202@ecs.soton.ac.uk>
|
||||
*
|
||||
@ -24,6 +24,7 @@
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "content/content.h"
|
||||
#include "css/css.h"
|
||||
@ -498,110 +499,110 @@ bool box_visible(struct box *box)
|
||||
|
||||
|
||||
/**
|
||||
* Print a box tree to stderr.
|
||||
* Print a box tree to a file.
|
||||
*/
|
||||
|
||||
void box_dump(struct box *box, unsigned int depth)
|
||||
void box_dump(FILE *stream, struct box *box, unsigned int depth)
|
||||
{
|
||||
unsigned int i;
|
||||
struct box *c, *prev;
|
||||
|
||||
for (i = 0; i != depth; i++)
|
||||
fprintf(stderr, " ");
|
||||
fprintf(stream, " ");
|
||||
|
||||
fprintf(stderr, "%p ", box);
|
||||
fprintf(stderr, "x%i y%i w%i h%i ", box->x, box->y,
|
||||
fprintf(stream, "%p ", box);
|
||||
fprintf(stream, "x%i y%i w%i h%i ", box->x, box->y,
|
||||
box->width, box->height);
|
||||
if (box->max_width != UNKNOWN_MAX_WIDTH)
|
||||
fprintf(stderr, "min%i max%i ", box->min_width, box->max_width);
|
||||
fprintf(stderr, "(%i %i %i %i) ",
|
||||
fprintf(stream, "min%i max%i ", box->min_width, box->max_width);
|
||||
fprintf(stream, "(%i %i %i %i) ",
|
||||
box->descendant_x0, box->descendant_y0,
|
||||
box->descendant_x1, box->descendant_y1);
|
||||
|
||||
switch (box->type) {
|
||||
case BOX_BLOCK: fprintf(stderr, "BLOCK "); break;
|
||||
case BOX_INLINE_CONTAINER: fprintf(stderr, "INLINE_CONTAINER "); break;
|
||||
case BOX_INLINE: fprintf(stderr, "INLINE "); break;
|
||||
case BOX_INLINE_END: fprintf(stderr, "INLINE_END "); break;
|
||||
case BOX_INLINE_BLOCK: fprintf(stderr, "INLINE_BLOCK "); break;
|
||||
case BOX_TABLE: fprintf(stderr, "TABLE [columns %i] ",
|
||||
case BOX_BLOCK: fprintf(stream, "BLOCK "); break;
|
||||
case BOX_INLINE_CONTAINER: fprintf(stream, "INLINE_CONTAINER "); break;
|
||||
case BOX_INLINE: fprintf(stream, "INLINE "); break;
|
||||
case BOX_INLINE_END: fprintf(stream, "INLINE_END "); break;
|
||||
case BOX_INLINE_BLOCK: fprintf(stream, "INLINE_BLOCK "); break;
|
||||
case BOX_TABLE: fprintf(stream, "TABLE [columns %i] ",
|
||||
box->columns); break;
|
||||
case BOX_TABLE_ROW: fprintf(stderr, "TABLE_ROW "); break;
|
||||
case BOX_TABLE_CELL: fprintf(stderr, "TABLE_CELL [columns %i, "
|
||||
case BOX_TABLE_ROW: fprintf(stream, "TABLE_ROW "); break;
|
||||
case BOX_TABLE_CELL: fprintf(stream, "TABLE_CELL [columns %i, "
|
||||
"start %i, rows %i] ", box->columns,
|
||||
box->start_column, box->rows); break;
|
||||
case BOX_TABLE_ROW_GROUP: fprintf(stderr, "TABLE_ROW_GROUP "); break;
|
||||
case BOX_FLOAT_LEFT: fprintf(stderr, "FLOAT_LEFT "); break;
|
||||
case BOX_FLOAT_RIGHT: fprintf(stderr, "FLOAT_RIGHT "); break;
|
||||
case BOX_BR: fprintf(stderr, "BR "); break;
|
||||
case BOX_TEXT: fprintf(stderr, "TEXT "); break;
|
||||
default: fprintf(stderr, "Unknown box type ");
|
||||
case BOX_TABLE_ROW_GROUP: fprintf(stream, "TABLE_ROW_GROUP "); break;
|
||||
case BOX_FLOAT_LEFT: fprintf(stream, "FLOAT_LEFT "); break;
|
||||
case BOX_FLOAT_RIGHT: fprintf(stream, "FLOAT_RIGHT "); break;
|
||||
case BOX_BR: fprintf(stream, "BR "); break;
|
||||
case BOX_TEXT: fprintf(stream, "TEXT "); break;
|
||||
default: fprintf(stream, "Unknown box type ");
|
||||
}
|
||||
|
||||
if (box->text)
|
||||
fprintf(stderr, "%li '%.*s' ", (unsigned long) box->byte_offset,
|
||||
fprintf(stream, "%li '%.*s' ", (unsigned long) box->byte_offset,
|
||||
(int) box->length, box->text);
|
||||
if (box->space)
|
||||
fprintf(stderr, "space ");
|
||||
fprintf(stream, "space ");
|
||||
if (box->object)
|
||||
fprintf(stderr, "(object '%s') ", box->object->url);
|
||||
fprintf(stream, "(object '%s') ", box->object->url);
|
||||
if (box->style)
|
||||
css_dump_style(box->style);
|
||||
if (box->href)
|
||||
fprintf(stderr, " -> '%s'", box->href);
|
||||
fprintf(stream, " -> '%s'", box->href);
|
||||
if (box->target)
|
||||
fprintf(stderr, " |%s|", box->target);
|
||||
fprintf(stream, " |%s|", box->target);
|
||||
if (box->title)
|
||||
fprintf(stderr, " [%s]", box->title);
|
||||
fprintf(stream, " [%s]", box->title);
|
||||
if (box->id)
|
||||
fprintf(stderr, " <%s>", box->id);
|
||||
fprintf(stream, " <%s>", box->id);
|
||||
if (box->type == BOX_INLINE || box->type == BOX_INLINE_END)
|
||||
fprintf(stderr, " inline_end %p", box->inline_end);
|
||||
fprintf(stream, " inline_end %p", box->inline_end);
|
||||
if (box->float_children)
|
||||
fprintf(stderr, " float_children %p", box->float_children);
|
||||
fprintf(stream, " float_children %p", box->float_children);
|
||||
if (box->next_float)
|
||||
fprintf(stderr, " next_float %p", box->next_float);
|
||||
fprintf(stream, " next_float %p", box->next_float);
|
||||
if (box->col) {
|
||||
fprintf(stderr, " (columns");
|
||||
fprintf(stream, " (columns");
|
||||
for (i = 0; i != box->columns; i++)
|
||||
fprintf(stderr, " (%s %i %i %i)",
|
||||
fprintf(stream, " (%s %i %i %i)",
|
||||
((const char *[]) {"UNKNOWN", "FIXED",
|
||||
"AUTO", "PERCENT", "RELATIVE"})
|
||||
[box->col[i].type],
|
||||
box->col[i].width,
|
||||
box->col[i].min, box->col[i].max);
|
||||
fprintf(stderr, ")");
|
||||
fprintf(stream, ")");
|
||||
}
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stream, "\n");
|
||||
|
||||
if (box->list_marker) {
|
||||
for (i = 0; i != depth; i++)
|
||||
fprintf(stderr, " ");
|
||||
fprintf(stderr, "list_marker:\n");
|
||||
box_dump(box->list_marker, depth + 1);
|
||||
fprintf(stream, " ");
|
||||
fprintf(stream, "list_marker:\n");
|
||||
box_dump(stream, box->list_marker, depth + 1);
|
||||
}
|
||||
|
||||
for (c = box->children; c && c->next; c = c->next)
|
||||
;
|
||||
if (box->last != c)
|
||||
fprintf(stderr, "warning: box->last %p (should be %p) "
|
||||
fprintf(stream, "warning: box->last %p (should be %p) "
|
||||
"(box %p)\n", box->last, c, box);
|
||||
for (prev = 0, c = box->children; c; prev = c, c = c->next) {
|
||||
if (c->parent != box)
|
||||
fprintf(stderr, "warning: box->parent %p (should be "
|
||||
fprintf(stream, "warning: box->parent %p (should be "
|
||||
"%p) (box on next line)\n",
|
||||
c->parent, box);
|
||||
if (c->prev != prev)
|
||||
fprintf(stderr, "warning: box->prev %p (should be "
|
||||
fprintf(stream, "warning: box->prev %p (should be "
|
||||
"%p) (box on next line)\n",
|
||||
c->prev, prev);
|
||||
box_dump(c, depth + 1);
|
||||
box_dump(stream, c, depth + 1);
|
||||
}
|
||||
if (box->fallback) {
|
||||
for (i = 0; i != depth; i++)
|
||||
fprintf(stderr, " ");
|
||||
fprintf(stderr, "fallback:\n");
|
||||
fprintf(stream, " ");
|
||||
fprintf(stream, "fallback:\n");
|
||||
for (c = box->fallback; c; c = c->next)
|
||||
box_dump(c, depth + 1);
|
||||
box_dump(stream, c, depth + 1);
|
||||
}
|
||||
}
|
||||
|
@ -88,6 +88,7 @@
|
||||
|
||||
#include <limits.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <libxml/HTMLparser.h>
|
||||
|
||||
|
||||
@ -288,7 +289,7 @@ struct box *box_at_point(struct box *box, int x, int y,
|
||||
struct box *box_object_at_point(struct content *c, int x, int y);
|
||||
struct box *box_find_by_id(struct box *box, const char *id);
|
||||
bool box_visible(struct box *box);
|
||||
void box_dump(struct box *box, unsigned int depth);
|
||||
void box_dump(FILE *stream, struct box *box, unsigned int depth);
|
||||
bool box_extract_link(const char *rel, const char *base, char **result);
|
||||
|
||||
bool box_vscrollbar_present(const struct box *box);
|
||||
|
@ -628,7 +628,7 @@ bool box_construct_text(xmlNode *n, struct content *content,
|
||||
while (parent->parent &&
|
||||
parent->parent->parent)
|
||||
parent = parent->parent;
|
||||
box_dump(parent, 0);
|
||||
box_dump(stderr, parent, 0);
|
||||
}
|
||||
assert((*inline_container)->last != 0);
|
||||
(*inline_container)->last->space = 1;
|
||||
|
@ -477,7 +477,7 @@ void layout_minmax_block(struct box *block)
|
||||
}
|
||||
|
||||
if (max < min) {
|
||||
box_dump(block, 0);
|
||||
box_dump(stderr, block, 0);
|
||||
assert(0);
|
||||
}
|
||||
|
||||
@ -1338,7 +1338,7 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
}
|
||||
if (cont->float_children == b) {
|
||||
LOG(("float %p already placed", b));
|
||||
box_dump(cont, 0);
|
||||
box_dump(stderr, cont, 0);
|
||||
assert(0);
|
||||
}
|
||||
b->next_float = cont->float_children;
|
||||
@ -2349,7 +2349,7 @@ void layout_minmax_table(struct box *table)
|
||||
|
||||
for (i = 0; i != table->columns; i++) {
|
||||
if (col[i].max < col[i].min) {
|
||||
box_dump(table, 0);
|
||||
box_dump(stderr, table, 0);
|
||||
assert(0);
|
||||
}
|
||||
table_min += col[i].min;
|
||||
|
47
riscos/gui.c
47
riscos/gui.c
@ -847,7 +847,7 @@ void ro_gui_signal(int sig)
|
||||
for (c = content_list; c; c = c->next)
|
||||
if (c->type == CONTENT_HTML && c->data.html.layout) {
|
||||
LOG(("Dumping: '%s'", c->url));
|
||||
box_dump(c->data.html.layout, 0);
|
||||
box_dump(stderr, c->data.html.layout, 0);
|
||||
}
|
||||
options_dump();
|
||||
/*rufl_dump_state();*/
|
||||
@ -2108,6 +2108,7 @@ void ro_gui_open_help_page(const char *page)
|
||||
browser_window_create(url, NULL, 0, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Send the source of a content to a text editor.
|
||||
*/
|
||||
@ -2187,7 +2188,8 @@ void ro_gui_view_source(struct content *content)
|
||||
}
|
||||
|
||||
|
||||
void ro_gui_view_source_bounce(wimp_message *message) {
|
||||
void ro_gui_view_source_bounce(wimp_message *message)
|
||||
{
|
||||
char *filename;
|
||||
os_error *error;
|
||||
char command[256];
|
||||
@ -2204,6 +2206,47 @@ void ro_gui_view_source_bounce(wimp_message *message) {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Send the debug dump of a content to a text editor.
|
||||
*/
|
||||
|
||||
void ro_gui_dump_content(struct content *content)
|
||||
{
|
||||
os_error *error;
|
||||
|
||||
/* open file for dump */
|
||||
FILE *stream = fopen("<Wimp$ScrapDir>.WWW.NetSurf.dump", "w");
|
||||
if (!stream) {
|
||||
LOG(("fopen: errno %i", errno));
|
||||
warn_user("SaveError", strerror(errno));
|
||||
return;
|
||||
}
|
||||
|
||||
/* output debug information to file */
|
||||
switch (content->type) {
|
||||
case CONTENT_HTML:
|
||||
box_dump(stream, content->data.html.layout, 0);
|
||||
break;
|
||||
case CONTENT_CSS:
|
||||
css_dump_stylesheet(content->data.css.css);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
fclose(stream);
|
||||
|
||||
/* launch file in editor */
|
||||
error = xwimp_start_task("Filer_Run <Wimp$ScrapDir>.WWW.NetSurf.dump",
|
||||
0);
|
||||
if (error) {
|
||||
LOG(("xwimp_start_task failed: 0x%x: %s",
|
||||
error->errnum, error->errmess));
|
||||
warn_user("WimpError", error->errmess);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Broadcast an URL that we can't handle.
|
||||
*/
|
||||
|
@ -122,6 +122,7 @@ void ro_gui_open_window_request(wimp_open *open);
|
||||
void ro_gui_open_help_page(const char *page);
|
||||
void ro_gui_screen_size(int *width, int *height);
|
||||
void ro_gui_view_source(struct content *content);
|
||||
void ro_gui_dump_content(struct content *content);
|
||||
void ro_gui_drag_box_start(wimp_pointer *pointer);
|
||||
bool ro_gui_prequit(void);
|
||||
const char *ro_gui_default_language(void);
|
||||
|
@ -2439,16 +2439,7 @@ bool ro_gui_window_keypress(wimp_key *key)
|
||||
|
||||
case IS_WIMP_KEY + wimp_KEY_F9:
|
||||
/* Dump content for debugging. */
|
||||
switch (content->type) {
|
||||
case CONTENT_HTML:
|
||||
box_dump(content->data.html.layout, 0);
|
||||
break;
|
||||
case CONTENT_CSS:
|
||||
css_dump_stylesheet(content->data.css.css);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
ro_gui_dump_content(content);
|
||||
return true;
|
||||
|
||||
case IS_WIMP_KEY + wimp_KEY_CONTROL + wimp_KEY_F9:
|
||||
|
Loading…
x
Reference in New Issue
Block a user