mirror of
https://git.yoctoproject.org/poky
synced 2026-05-01 15:32:12 +02:00
update gtkhtml2 patches and update to a newer more functional Web snapshot git-svn-id: https://svn.o-hand.com/repos/poky@251 311d38ba-8fff-0310-9ca6-ca027cbcb966
687 lines
24 KiB
Diff
687 lines
24 KiB
Diff
Index: libgtkhtml/css/cssmatcher.c
|
|
===================================================================
|
|
--- libgtkhtml/css/cssmatcher.c.orig 2006-02-04 20:10:47.000000000 +0000
|
|
+++ libgtkhtml/css/cssmatcher.c 2006-02-05 18:19:15.000000000 +0000
|
|
@@ -79,7 +79,7 @@ css_matcher_match_simple_selector (CssSi
|
|
element_name = html_atom_list_get_atom (html_atom_list, node->name);
|
|
|
|
/* Look at the element name */
|
|
- if (!simple->is_star && simple->element_name != element_name)
|
|
+ if ((!simple->is_star) && (simple->element_name != element_name))
|
|
return FALSE;
|
|
|
|
str = xmlGetProp (node, "id");
|
|
@@ -2384,7 +2384,7 @@ css_matcher_sheet_stream_close (HtmlStre
|
|
CssStylesheet *ss;
|
|
|
|
if (html_stream_get_written (stream) != 0) {
|
|
- ss = css_parser_parse_stylesheet (context->str->str, context->str->len);
|
|
+ ss = css_parser_parse_stylesheet (context->str->str, context->str->len, NULL);
|
|
|
|
context->stat->s.import_rule.fetched = TRUE;
|
|
|
|
@@ -2781,7 +2781,7 @@ css_matcher_get_style (HtmlDocument *doc
|
|
css_matcher_html_to_css (doc, style, node);
|
|
|
|
if (!default_stylesheet) {
|
|
- default_stylesheet = css_parser_parse_stylesheet (html_css, strlen (html_css));
|
|
+ default_stylesheet = css_parser_parse_stylesheet (html_css, strlen (html_css), NULL);
|
|
}
|
|
|
|
css_matcher_apply_stylesheet (doc, default_stylesheet, node, &declaration_list, CSS_STYLESHEET_DEFAULT, pseudo);
|
|
@@ -2800,7 +2800,7 @@ css_matcher_get_style (HtmlDocument *doc
|
|
prop = xmlGetProp (node, "style");
|
|
|
|
if (prop) {
|
|
- CssRuleset *rs = css_parser_parse_style_attr (prop, strlen (prop));
|
|
+ CssRuleset *rs = css_parser_parse_style_attr (prop, strlen (prop), NULL);
|
|
gint i;
|
|
|
|
if (rs) {
|
|
Index: libgtkhtml/css/cssparser.c
|
|
===================================================================
|
|
--- libgtkhtml/css/cssparser.c.orig 2006-02-04 20:10:47.000000000 +0000
|
|
+++ libgtkhtml/css/cssparser.c 2006-02-05 18:19:15.000000000 +0000
|
|
@@ -49,7 +49,7 @@ const gchar *css_dimensions[] = {
|
|
|
|
const gint css_n_dimensions = sizeof (css_dimensions) / sizeof (css_dimensions[0]);
|
|
|
|
-static gint css_parser_parse_value (const gchar *buffer, gint start_pos, gint end_pos, CssValue **ret_val);
|
|
+static gint css_parser_parse_value (const gchar *buffer, gint start_pos, gint end_pos, CssValue **ret_val, const gchar *base_url);
|
|
|
|
/* FIXME: Needs more whitespace types */
|
|
static gint
|
|
@@ -443,7 +443,7 @@ css_parser_parse_number (const gchar *bu
|
|
}
|
|
|
|
static gint
|
|
-css_parser_parse_term (const gchar *buffer, gint start_pos, gint end_pos, CssValue **ret_val)
|
|
+css_parser_parse_term (const gchar *buffer, gint start_pos, gint end_pos, CssValue **ret_val, const gchar *base_url)
|
|
{
|
|
gint pos;
|
|
HtmlAtom atom;
|
|
@@ -481,7 +481,7 @@ css_parser_parse_term (const gchar *buff
|
|
return -1;
|
|
}
|
|
|
|
- pos = css_parser_parse_value (buffer, save_pos + 1, func_end, &val);
|
|
+ pos = css_parser_parse_value (buffer, save_pos + 1, func_end, &val, base_url);
|
|
|
|
if (pos == -1) {
|
|
/*
|
|
@@ -495,10 +495,48 @@ css_parser_parse_term (const gchar *buff
|
|
pos = func_end;
|
|
}
|
|
if (pos != -1) {
|
|
- if (ret_val)
|
|
+ if (ret_val) {
|
|
*ret_val = css_value_function_new (atom, val);
|
|
- else
|
|
+
|
|
+ if ((*ret_val)->v.function->name == HTML_ATOM_URL &&
|
|
+ (*ret_val)->v.function->args) {
|
|
+ gchar *str = css_value_to_string ((*ret_val)->v.function->args);
|
|
+
|
|
+ if (base_url && str) {
|
|
+ regex_t reg;
|
|
+
|
|
+ regcomp (®, "^[a-zA-Z][a-zA-Z0-9.+-]*:", REG_NOSUB);
|
|
+ if (((*ret_val)->v.function->args->v.s[0] != '/') && (regexec (®, (*ret_val)->v.function->args->v.s, 0, NULL, 0))) {
|
|
+ gchar *temp_base, *eptr;
|
|
+
|
|
+ temp_base = g_strdup(base_url);
|
|
+ eptr = strrchr(temp_base, '?');
|
|
+
|
|
+ if (eptr != NULL)
|
|
+ *eptr = '\0';
|
|
+
|
|
+ eptr = strrchr(temp_base, '/');
|
|
+ if (eptr != NULL) {
|
|
+ gchar *temp_arg = g_strdup((*ret_val)->v.function->args->v.s);
|
|
+
|
|
+ *eptr = '\0';
|
|
+
|
|
+ g_free((*ret_val)->v.function->args->v.s);
|
|
+ (*ret_val)->v.function->args->v.s = g_strconcat(temp_base, "/", temp_arg, NULL);
|
|
+ g_free(temp_arg);
|
|
+ }
|
|
+
|
|
+ g_free(temp_base);
|
|
+ }
|
|
+ regfree (®);
|
|
+ }
|
|
+
|
|
+ g_free (str);
|
|
+ }
|
|
+ }
|
|
+ else {
|
|
css_value_unref (val);
|
|
+ }
|
|
}
|
|
|
|
/* This is due to the ) */
|
|
@@ -566,7 +604,7 @@ css_parser_parse_term (const gchar *buff
|
|
}
|
|
|
|
static gint
|
|
-css_parser_parse_value (const gchar *buffer, gint start_pos, gint end_pos, CssValue **ret_val)
|
|
+css_parser_parse_value (const gchar *buffer, gint start_pos, gint end_pos, CssValue **ret_val, const gchar *base_url)
|
|
{
|
|
gint pos = start_pos;
|
|
gint n = 0;
|
|
@@ -589,7 +627,7 @@ css_parser_parse_value (const gchar *buf
|
|
css_value_list_append (list, term, list_sep);
|
|
}
|
|
|
|
- pos = css_parser_parse_term (buffer, pos, end_pos, &term);
|
|
+ pos = css_parser_parse_term (buffer, pos, end_pos, &term, base_url);
|
|
|
|
if (pos == -1) {
|
|
if (list)
|
|
@@ -618,7 +656,7 @@ css_parser_parse_value (const gchar *buf
|
|
}
|
|
else {
|
|
/* Try and parse the term to see if it's valid */
|
|
- if (css_parser_parse_term (buffer, pos, end_pos, NULL) == -1) {
|
|
+ if (css_parser_parse_term (buffer, pos, end_pos, NULL, base_url) == -1) {
|
|
if (term)
|
|
css_value_unref (term);
|
|
if (list)
|
|
@@ -1005,7 +1043,7 @@ css_parser_parse_selectors (const gchar
|
|
}
|
|
|
|
static gint
|
|
-css_parser_parse_declaration (const gchar *buffer, gint start_pos, gint end_pos, CssDeclaration **ret_val)
|
|
+css_parser_parse_declaration (const gchar *buffer, gint start_pos, gint end_pos, CssDeclaration **ret_val, const gchar *base_url)
|
|
{
|
|
CssValue *value;
|
|
CssDeclaration *result;
|
|
@@ -1040,7 +1078,7 @@ css_parser_parse_declaration (const gcha
|
|
|
|
pos = css_parser_parse_whitespace (buffer, pos, prio_pos);
|
|
|
|
- pos = css_parser_parse_value (buffer, pos, prio_pos, &value);
|
|
+ pos = css_parser_parse_value (buffer, pos, prio_pos, &value, base_url);
|
|
|
|
if (pos == -1) {
|
|
return end_pos;
|
|
@@ -1063,7 +1101,7 @@ css_parser_parse_declaration (const gcha
|
|
}
|
|
|
|
static CssDeclaration **
|
|
-css_parser_parse_declarations (const gchar *buffer, gint start_pos, gint end_pos, gint *num_decl)
|
|
+css_parser_parse_declarations (const gchar *buffer, gint start_pos, gint end_pos, gint *num_decl, const gchar *base_url)
|
|
{
|
|
gint pos = start_pos;
|
|
gint cur_pos = start_pos;
|
|
@@ -1079,7 +1117,7 @@ css_parser_parse_declarations (const gch
|
|
|
|
pos = css_parser_parse_to_char (buffer, ';', pos, end_pos);
|
|
|
|
- pos = css_parser_parse_declaration (buffer, cur_pos, pos, &declaration);
|
|
+ pos = css_parser_parse_declaration (buffer, cur_pos, pos, &declaration, base_url);
|
|
|
|
if (declaration) {
|
|
if (n_decl == n_decl_max)
|
|
@@ -1100,7 +1138,7 @@ css_parser_parse_declarations (const gch
|
|
}
|
|
|
|
static gint
|
|
-css_parser_parse_ruleset (const gchar *buffer, gint start_pos, gint end_pos, CssRuleset **ret_val)
|
|
+css_parser_parse_ruleset (const gchar *buffer, gint start_pos, gint end_pos, CssRuleset **ret_val, const gchar *base_url)
|
|
{
|
|
gint cur_pos;
|
|
gint pos;
|
|
@@ -1143,7 +1181,7 @@ css_parser_parse_ruleset (const gchar *b
|
|
}
|
|
cur_pos = css_parser_parse_whitespace (buffer, cur_pos, end_pos);
|
|
|
|
- decl = css_parser_parse_declarations (buffer, cur_pos, pos, &n_decl);
|
|
+ decl = css_parser_parse_declarations (buffer, cur_pos, pos, &n_decl, base_url);
|
|
|
|
pos++;
|
|
|
|
@@ -1186,7 +1224,8 @@ css_parser_prepare_stylesheet (const gch
|
|
}
|
|
else if (str[pos] == '/' &&
|
|
pos + 1 <= len &&
|
|
- str[pos + 1] == '/') {
|
|
+ str[pos + 1] == '/' &&
|
|
+ (pos == 0 || str[pos-1] != ':')) {
|
|
while (pos < len &&
|
|
str[pos] != '\n')
|
|
pos++;
|
|
@@ -1204,7 +1243,7 @@ css_parser_prepare_stylesheet (const gch
|
|
}
|
|
|
|
static gint
|
|
-css_parser_parse_atkeyword (const gchar *buffer, gint start_pos, gint end_pos, CssStatement **ret_val)
|
|
+css_parser_parse_atkeyword (const gchar *buffer, gint start_pos, gint end_pos, CssStatement **ret_val, const gchar *base_url)
|
|
{
|
|
gint pos = start_pos;
|
|
gint tmp_pos, cur_pos;
|
|
@@ -1257,14 +1296,14 @@ css_parser_parse_atkeyword (const gchar
|
|
tmp_pos++;
|
|
|
|
|
|
- rs = g_new (CssRuleset *, n_rs_max);
|
|
+ rs = g_new0 (CssRuleset *, n_rs_max);
|
|
|
|
/* g_print ("wheee: \"%s\"\n", g_strndup (buffer + cur_pos, tmp_pos - cur_pos )); */
|
|
pos = cur_pos;
|
|
while (pos < tmp_pos) {
|
|
CssRuleset *ruleset;
|
|
|
|
- pos = css_parser_parse_ruleset (buffer, pos, tmp_pos, &ruleset);
|
|
+ pos = css_parser_parse_ruleset (buffer, pos, tmp_pos, &ruleset, base_url);
|
|
|
|
if (n_rs == n_rs_max)
|
|
rs = g_realloc (rs, sizeof (CssRuleset *) *
|
|
@@ -1277,7 +1316,7 @@ css_parser_parse_atkeyword (const gchar
|
|
|
|
pos = css_parser_parse_whitespace (buffer, tmp_pos + 1, end_pos);
|
|
|
|
- result = g_new (CssStatement, 1);
|
|
+ result = g_new0 (CssStatement, 1);
|
|
result->type = CSS_MEDIA_RULE;
|
|
result->s.media_rule.rs = rs;
|
|
result->s.media_rule.n_rs = n_rs;
|
|
@@ -1318,11 +1357,11 @@ css_parser_parse_atkeyword (const gchar
|
|
|
|
pos = css_parser_parse_whitespace (buffer, pos, cur_pos);
|
|
|
|
- decl = css_parser_parse_declarations (buffer, pos, cur_pos, &n_decl);
|
|
+ decl = css_parser_parse_declarations (buffer, pos, cur_pos, &n_decl, base_url);
|
|
|
|
g_print ("N_decl is: %d\n", n_decl);
|
|
|
|
- result = g_new (CssStatement, 1);
|
|
+ result = g_new0 (CssStatement, 1);
|
|
result->type = CSS_PAGE_RULE;
|
|
result->s.page_rule.name = name;
|
|
result->s.page_rule.pseudo = pseudo;
|
|
@@ -1337,8 +1376,8 @@ css_parser_parse_atkeyword (const gchar
|
|
pos = css_parser_parse_whitespace (buffer, pos + 1, end_pos);
|
|
cur_pos = css_parser_parse_to_char (buffer, '}', pos, end_pos);
|
|
|
|
- decl = css_parser_parse_declarations (buffer, pos, cur_pos, &n_decl);
|
|
- result = g_new (CssStatement, 1);
|
|
+ decl = css_parser_parse_declarations (buffer, pos, cur_pos, &n_decl, base_url);
|
|
+ result = g_new0 (CssStatement, 1);
|
|
result->type = CSS_FONT_FACE_RULE;
|
|
|
|
result->s.font_face_rule.n_decl = n_decl;
|
|
@@ -1349,8 +1388,61 @@ css_parser_parse_atkeyword (const gchar
|
|
return cur_pos + 1;
|
|
|
|
break;
|
|
+ case HTML_ATOM_IMPORT: {
|
|
+ gchar *import_url;
|
|
+ const gchar *s_url, *e_url;
|
|
+
|
|
+ cur_pos = css_parser_parse_to_char (buffer, ';', pos, end_pos);
|
|
+
|
|
+ if (strchr (buffer + pos, '(')) {
|
|
+ s_url = strchr (buffer + pos, '(');
|
|
+ e_url = strchr (s_url, ')');
|
|
+ } else if (strchr (buffer + pos, '\"')) {
|
|
+ s_url = strchr (buffer + pos, '\"');
|
|
+ e_url = strchr (s_url + 1, '\"');
|
|
+ } else if (strchr (buffer + pos, '\'')) {
|
|
+ s_url = strchr (buffer + pos, '\'');
|
|
+ e_url = strchr (s_url + 1, '\'');
|
|
+ }
|
|
+
|
|
+ if (!s_url || !e_url || ((e_url - s_url) < 1)) {
|
|
+ g_warning ("Invalid @import line");
|
|
+ *ret_val = NULL;
|
|
+ return cur_pos + 1;
|
|
+ }
|
|
+
|
|
+ s_url++;
|
|
+ e_url--;
|
|
+
|
|
+ if ((*s_url == '\"') && (*e_url == '\"')) {
|
|
+ s_url++;
|
|
+ e_url--;
|
|
+ } else if ((*s_url == '\'') && (*e_url == '\'')) {
|
|
+ s_url++;
|
|
+ e_url--;
|
|
+ }
|
|
+
|
|
+ if (s_url > e_url) {
|
|
+ g_warning ("Invalid @import line");
|
|
+ *ret_val = NULL;
|
|
+ return cur_pos + 1;
|
|
+ }
|
|
+
|
|
+ import_url = g_strndup (s_url, strlen (s_url) - strlen (e_url) + 1);
|
|
+
|
|
+ result = g_new0 (CssStatement, 1);
|
|
+ result->type = CSS_IMPORT_RULE;
|
|
|
|
+ result->s.import_rule.url = css_value_string_new (import_url);
|
|
+
|
|
+ *ret_val = result;
|
|
+
|
|
+ return cur_pos + 1;
|
|
+
|
|
+ break;
|
|
+ }
|
|
default:
|
|
+ g_warning ("Unhandled keyword %d - %s", keyword, buffer);
|
|
/* Unknown keyword detected, skip to next block */
|
|
while (pos < end_pos) {
|
|
/* Handle a dangling semi-colon */
|
|
@@ -1373,7 +1465,7 @@ css_parser_parse_atkeyword (const gchar
|
|
}
|
|
|
|
CssRuleset *
|
|
-css_parser_parse_style_attr (const gchar *buffer, gint len)
|
|
+css_parser_parse_style_attr (const gchar *buffer, gint len, const gchar *base_url)
|
|
{
|
|
CssRuleset *result;
|
|
|
|
@@ -1382,7 +1474,7 @@ css_parser_parse_style_attr (const gchar
|
|
|
|
/* FIXME: Are comments allowed here? */
|
|
|
|
- decl = css_parser_parse_declarations (buffer, 0, len, &n_decl);
|
|
+ decl = css_parser_parse_declarations (buffer, 0, len, &n_decl, base_url);
|
|
|
|
if (!decl)
|
|
return NULL;
|
|
@@ -1397,9 +1489,8 @@ css_parser_parse_style_attr (const gchar
|
|
}
|
|
|
|
CssStylesheet *
|
|
-css_parser_parse_stylesheet (const gchar *str, gint len)
|
|
+css_parser_parse_stylesheet (const gchar *str, gint len, const gchar *base_url)
|
|
{
|
|
- CssStatement *statement;
|
|
CssStylesheet *result;
|
|
GSList *stat = NULL;
|
|
gchar *buffer;
|
|
@@ -1413,26 +1504,23 @@ css_parser_parse_stylesheet (const gchar
|
|
end_pos = len;
|
|
while (pos < len) {
|
|
if (buffer[pos] == '@') {
|
|
- pos = css_parser_parse_atkeyword (buffer, pos + 1, len, &statement);
|
|
-#if 0
|
|
- if (statement) {
|
|
- if (n_stat == n_stat_max)
|
|
- stat = g_realloc (stat, sizeof (CssStatement) *
|
|
- (n_stat_max <<= 1));
|
|
- stat[n_stat++] = statement;
|
|
+ CssStatement *atstatement = NULL;
|
|
+ pos = css_parser_parse_atkeyword (buffer, pos + 1, len, &atstatement, base_url);
|
|
+ if (atstatement) {
|
|
+ stat = g_slist_append (stat, atstatement);
|
|
}
|
|
-#endif
|
|
}
|
|
else {
|
|
CssRuleset *ruleset;
|
|
- pos = css_parser_parse_ruleset (buffer, pos, end_pos, &ruleset);
|
|
+ pos = css_parser_parse_ruleset (buffer, pos, end_pos, &ruleset, base_url);
|
|
|
|
if (ruleset) {
|
|
- statement = g_new (CssStatement, 1);
|
|
- statement->type = CSS_RULESET;
|
|
- statement->s.ruleset = ruleset;
|
|
+ CssStatement *rulestatement;
|
|
+ rulestatement = g_new0 (CssStatement, 1);
|
|
+ rulestatement->type = CSS_RULESET;
|
|
+ rulestatement->s.ruleset = ruleset;
|
|
|
|
- stat = g_slist_append (stat, statement);
|
|
+ stat = g_slist_append (stat, rulestatement);
|
|
}
|
|
|
|
if (pos == -1)
|
|
@@ -1444,7 +1532,7 @@ css_parser_parse_stylesheet (const gchar
|
|
|
|
g_free (buffer);
|
|
|
|
- result = g_new (CssStylesheet, 1);
|
|
+ result = g_new0 (CssStylesheet, 1);
|
|
result->stat = stat;
|
|
|
|
return result;
|
|
Index: libgtkhtml/css/cssparser.h
|
|
===================================================================
|
|
--- libgtkhtml/css/cssparser.h.orig 2006-02-04 20:10:47.000000000 +0000
|
|
+++ libgtkhtml/css/cssparser.h 2006-02-05 18:19:15.000000000 +0000
|
|
@@ -24,13 +24,14 @@
|
|
#define __CSSPARSER_H__
|
|
|
|
#include <glib.h>
|
|
+#include <regex.h>
|
|
|
|
#include "cssstylesheet.h"
|
|
|
|
G_BEGIN_DECLS
|
|
|
|
-CssStylesheet *css_parser_parse_stylesheet (const gchar *str, gint len);
|
|
-CssRuleset *css_parser_parse_style_attr (const gchar *buffer, gint len);
|
|
+CssStylesheet *css_parser_parse_stylesheet (const gchar *str, gint len, const gchar *base_url);
|
|
+CssRuleset *css_parser_parse_style_attr (const gchar *buffer, gint len, const gchar *base_url);
|
|
|
|
G_END_DECLS
|
|
|
|
Index: libgtkhtml/css/cssstylesheet.h
|
|
===================================================================
|
|
--- libgtkhtml/css/cssstylesheet.h.orig 2006-02-04 20:10:47.000000000 +0000
|
|
+++ libgtkhtml/css/cssstylesheet.h 2006-02-05 18:19:15.000000000 +0000
|
|
@@ -181,6 +181,7 @@ struct _CssTail {
|
|
};
|
|
|
|
struct _CssStylesheet {
|
|
+ gchar *url;
|
|
gboolean disabled;
|
|
GSList *stat;
|
|
};
|
|
Index: libgtkhtml/css/cssvalue.c
|
|
===================================================================
|
|
--- libgtkhtml/css/cssvalue.c.orig 2006-02-04 20:10:47.000000000 +0000
|
|
+++ libgtkhtml/css/cssvalue.c 2006-02-04 20:13:33.000000000 +0000
|
|
@@ -64,7 +64,7 @@ css_value_function_new (HtmlAtom name, C
|
|
function->name = name;
|
|
function->args = args;
|
|
|
|
- result = g_new (CssValue, 1);
|
|
+ result = g_new0 (CssValue, 1);
|
|
result->ref_count = 1;
|
|
result->value_type = CSS_FUNCTION;
|
|
result->v.function = function;
|
|
Index: libgtkhtml/document/htmldocument.c
|
|
===================================================================
|
|
--- libgtkhtml/document/htmldocument.c.orig 2006-02-04 20:10:47.000000000 +0000
|
|
+++ libgtkhtml/document/htmldocument.c 2006-02-05 18:19:17.000000000 +0000
|
|
@@ -134,14 +134,42 @@ static void
|
|
html_document_stylesheet_stream_close (const gchar *buffer, gint len, gpointer data)
|
|
{
|
|
CssStylesheet *sheet;
|
|
- HtmlDocument *document = HTML_DOCUMENT (data);
|
|
+ HtmlDocumentStreamData *stream_data = (HtmlDocumentStreamData *) data;
|
|
+ HtmlDocument *document = stream_data->document;
|
|
HtmlStyleChange style_change;
|
|
-
|
|
+ GSList *list;
|
|
+
|
|
if (!buffer)
|
|
return;
|
|
|
|
- sheet = css_parser_parse_stylesheet (buffer, len);
|
|
+ sheet = css_parser_parse_stylesheet (buffer, len, (gchar *) stream_data->internal_data);
|
|
+ g_free(stream_data->internal_data);
|
|
+ stream_data->internal_data = NULL;
|
|
+
|
|
+ for (list = sheet->stat; list; list = list->next) {
|
|
+ CssStatement *statement = list->data;
|
|
+ HtmlStream *stream;
|
|
+
|
|
+ switch (statement->type) {
|
|
+ case CSS_IMPORT_RULE: {
|
|
+ HtmlDocumentStreamData *stream_data_import;
|
|
+ gchar *url;
|
|
+
|
|
+ url = css_value_to_string (statement->s.import_rule.url);
|
|
+ stream_data_import = g_new (HtmlDocumentStreamData, 1);
|
|
+ stream_data_import->document = stream_data->document;
|
|
+ stream_data_import->internal_data = g_strdup(url);
|
|
+ stream = html_stream_buffer_new (html_document_stylesheet_stream_close, stream_data_import);
|
|
+ g_signal_emit (G_OBJECT (document), document_signals [REQUEST_URL], 0, url, stream);
|
|
+ g_free (url);
|
|
+ break;
|
|
+ }
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
|
|
+ g_free (stream_data);
|
|
document->stylesheets = g_slist_append (document->stylesheets, sheet);
|
|
|
|
/* Restyle the document */
|
|
@@ -179,9 +207,15 @@ html_document_node_inserted_traverser (H
|
|
|
|
if (str && (strcasecmp (str, "stylesheet") == 0)) {
|
|
gchar *url = xmlGetProp (node->xmlnode, "href");
|
|
-
|
|
if (url) {
|
|
- HtmlStream *stream = html_stream_buffer_new (html_document_stylesheet_stream_close, document);
|
|
+ HtmlDocumentStreamData *stream_data;
|
|
+ HtmlStream *stream;
|
|
+
|
|
+ stream_data = g_new (HtmlDocumentStreamData, 1);
|
|
+ stream_data->document = document;
|
|
+ stream_data->internal_data = g_strdup(url);
|
|
+
|
|
+ stream = html_stream_buffer_new (html_document_stylesheet_stream_close, stream_data);
|
|
|
|
g_signal_emit (G_OBJECT (document), document_signals [REQUEST_URL], 0, url, stream);
|
|
}
|
|
@@ -242,12 +276,39 @@ html_document_node_inserted_traverser (H
|
|
|
|
CssStylesheet *ss;
|
|
HtmlStyleChange style_change;
|
|
-
|
|
- ss = css_parser_parse_stylesheet (node->xmlnode->content, strlen (node->xmlnode->content));
|
|
- document->stylesheets = g_slist_append (document->stylesheets, ss);
|
|
+ GSList *list;
|
|
+
|
|
+ ss = css_parser_parse_stylesheet (node->xmlnode->content, strlen (node->xmlnode->content), NULL);
|
|
+
|
|
+ for (list = ss->stat; list; list = list->next) {
|
|
+ CssStatement *statement = list->data;
|
|
+ HtmlStream *stream;
|
|
+
|
|
+ switch (statement->type) {
|
|
+ case CSS_IMPORT_RULE: {
|
|
+ gchar *cssurl;
|
|
+ HtmlDocumentStreamData *stream_data;
|
|
+
|
|
+ cssurl = css_value_to_string (statement->s.import_rule.url);
|
|
+
|
|
+ stream_data = g_new (HtmlDocumentStreamData, 1);
|
|
+ stream_data->document = document;
|
|
+ stream_data->internal_data = g_strdup(cssurl);
|
|
+
|
|
+ stream = html_stream_buffer_new (html_document_stylesheet_stream_close, stream_data);
|
|
+ g_signal_emit (G_OBJECT (document), document_signals [REQUEST_URL], 0, cssurl, stream);
|
|
+ g_free (cssurl);
|
|
+ break;
|
|
+ }
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ document->stylesheets = g_slist_append ( document->stylesheets, ss);
|
|
|
|
/* Restyle the document */
|
|
- style_change = html_document_restyle_node (document, DOM_NODE (dom_Document__get_documentElement (document->dom_document)), NULL, TRUE);
|
|
+ style_change = html_document_restyle_node (document, DOM_NODE (dom_Document__get_documentElement ( document->dom_document)), NULL, TRUE);
|
|
g_signal_emit (G_OBJECT (document), document_signals [STYLE_UPDATED], 0, DOM_NODE (dom_Document__get_documentElement (document->dom_document)), style_change);
|
|
}
|
|
else if ((node->xmlnode->type == XML_TEXT_NODE || node->xmlnode->type == XML_COMMENT_NODE) && node->xmlnode->parent && strcasecmp (node->xmlnode->parent->name, "script") == 0) {
|
|
Index: libgtkhtml/document/htmldocument.h
|
|
===================================================================
|
|
--- libgtkhtml/document/htmldocument.h.orig 2006-02-04 20:10:47.000000000 +0000
|
|
+++ libgtkhtml/document/htmldocument.h 2006-02-05 18:19:17.000000000 +0000
|
|
@@ -25,6 +25,7 @@
|
|
|
|
typedef struct _HtmlDocument HtmlDocument;
|
|
typedef struct _HtmlDocumentClass HtmlDocumentClass;
|
|
+typedef struct _HtmlDocumentStreamData HtmlDocumentStreamData;
|
|
|
|
#include <gtk/gtk.h>
|
|
|
|
@@ -93,6 +94,10 @@ struct _HtmlDocumentClass {
|
|
gboolean (*dom_mouse_out) (HtmlDocument *document, DomEvent *event);
|
|
};
|
|
|
|
+struct _HtmlDocumentStreamData {
|
|
+ HtmlDocument *document;
|
|
+ gpointer internal_data;
|
|
+};
|
|
|
|
GType html_document_get_type (void);
|
|
|
|
Index: libgtkhtml/layout/htmlboxblock.c
|
|
===================================================================
|
|
--- libgtkhtml/layout/htmlboxblock.c.orig 2006-02-04 20:10:47.000000000 +0000
|
|
+++ libgtkhtml/layout/htmlboxblock.c 2006-02-04 20:13:33.000000000 +0000
|
|
@@ -100,17 +100,21 @@ html_real_box_block_update_geometry (Htm
|
|
HtmlBoxBlock *block = HTML_BOX_BLOCK (self);
|
|
gint full_width;
|
|
|
|
+#if 0
|
|
if (relayout->get_min_width || relayout->get_max_width) {
|
|
+#endif
|
|
|
|
/* Only expand the width of the block box if the width is of type "auto" */
|
|
if (HTML_BOX_GET_STYLE (self)->box->width.type == HTML_LENGTH_AUTO && line->width > *boxwidth) {
|
|
-
|
|
+
|
|
*boxwidth = line->width;
|
|
block->containing_width = line->width;
|
|
self->width = *boxwidth + html_box_horizontal_mbp_sum (self);
|
|
block->force_relayout = TRUE;
|
|
}
|
|
+#if 0
|
|
}
|
|
+#endif
|
|
full_width = MAX (line->width, line->full_width);
|
|
|
|
if (full_width > block->full_width)
|
|
Index: libgtkhtml/view/htmlevent.c
|
|
===================================================================
|
|
--- libgtkhtml/view/htmlevent.c.orig 2006-02-04 20:10:47.000000000 +0000
|
|
+++ libgtkhtml/view/htmlevent.c 2006-02-04 20:13:33.000000000 +0000
|
|
@@ -46,14 +46,48 @@ html_event_find_parent_dom_node (HtmlBox
|
|
static gboolean
|
|
html_event_xy_in_box (HtmlBox *box, gint tx, gint ty, gint x, gint y)
|
|
{
|
|
+ gint ox, oy;
|
|
+ gboolean rv;
|
|
+
|
|
+ ox = box->x;
|
|
+ oy = box->y;
|
|
+
|
|
+ rv = TRUE;
|
|
+
|
|
+ if ((HTML_BOX_GET_STYLE (box)->position == HTML_POSITION_RELATIVE ||
|
|
+ HTML_BOX_GET_STYLE (box)->position == HTML_POSITION_ABSOLUTE)) {
|
|
+ gint width = html_box_get_containing_block_width (box);
|
|
+ gint height = html_box_get_containing_block_height (box);
|
|
+
|
|
+ if (HTML_BOX_GET_STYLE (box)->surround->position.left.type != HTML_LENGTH_AUTO)
|
|
+ box->x += html_length_get_value (&HTML_BOX_GET_STYLE (box)->surround->position.left, width);
|
|
+ else if (HTML_BOX_GET_STYLE (box)->surround->position.right.type != HTML_LENGTH_AUTO) {
|
|
+ if (HTML_BOX_GET_STYLE (box)->display == HTML_DISPLAY_INLINE)
|
|
+ box->x -= html_length_get_value (&HTML_BOX_GET_STYLE (box)->surround->position.right, width);
|
|
+ else
|
|
+ box->x += width - box->width - html_length_get_value (&HTML_BOX_GET_STYLE (box)->surround->position.right, width);
|
|
+ }
|
|
+ if (HTML_BOX_GET_STYLE (box)->surround->position.top.type != HTML_LENGTH_AUTO)
|
|
+ box->y += html_length_get_value (&HTML_BOX_GET_STYLE (box)->surround->position.top, height);
|
|
+
|
|
+ else if (HTML_BOX_GET_STYLE (box)->surround->position.bottom.type != HTML_LENGTH_AUTO) {
|
|
+ if (HTML_BOX_GET_STYLE (box)->display == HTML_DISPLAY_INLINE)
|
|
+ box->y -= html_length_get_value (&HTML_BOX_GET_STYLE (box)->surround->position.bottom, height);
|
|
+ else
|
|
+ box->y += height - box->height - html_length_get_value (&HTML_BOX_GET_STYLE (box)->surround->position.bottom, height);
|
|
+ }
|
|
+ }
|
|
|
|
if (x < box->x + tx ||
|
|
x > box->x + tx + box->width ||
|
|
y < box->y + ty ||
|
|
y > box->y + ty + box->height)
|
|
- return FALSE;
|
|
+ rv = FALSE;
|
|
+
|
|
+ box->x = ox;
|
|
+ box->y = oy;
|
|
|
|
- return TRUE;
|
|
+ return rv;
|
|
}
|
|
|
|
static void
|
|
@@ -64,12 +98,6 @@ html_event_find_box_traverser (HtmlBox *
|
|
box = self->children;
|
|
|
|
while (box) {
|
|
-
|
|
- /* Ignore positioned boxes, because their ->x and->y positions is not their correct positions */
|
|
- if (HTML_BOX_GET_STYLE (box)->position != HTML_POSITION_STATIC) {
|
|
- box = box->next;
|
|
- continue;
|
|
- }
|
|
/* These boxes always has x = 0, y = 0, w = 0 and h = 0 so we have to do
|
|
* a special case for these */
|
|
if (HTML_IS_BOX_INLINE (box) || HTML_IS_BOX_TABLE_ROW_GROUP (box) || HTML_IS_BOX_FORM (box)) {
|