diff options
author | Johannes Hofmann <Johannes.Hofmann@gmx.de> | 2014-04-01 21:48:15 +0200 |
---|---|---|
committer | Johannes Hofmann <Johannes.Hofmann@gmx.de> | 2014-04-01 21:48:15 +0200 |
commit | f284ce5c34cdf37854135524814bbacbd2932f25 (patch) | |
tree | 62047de8c15b27fab0caa0a9105a15dfea156c87 /src/cssparser.cc | |
parent | 4e3f41b9e5307fd951c710818687f96e8a68ca35 (diff) |
resolve CSS background-image URLs relative to styleheet URL
Diffstat (limited to 'src/cssparser.cc')
-rw-r--r-- | src/cssparser.cc | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/src/cssparser.cc b/src/cssparser.cc index c7a9c281..369dd67f 100644 --- a/src/cssparser.cc +++ b/src/cssparser.cc @@ -435,6 +435,7 @@ static const CssShorthandInfo Css_shorthand_info[] = { * ---------------------------------------------------------------------- */ CssParser::CssParser(CssContext *context, CssOrigin origin, + const DilloUrl *baseUrl, const char *buf, int buflen) { this->context = context; @@ -444,6 +445,7 @@ CssParser::CssParser(CssContext *context, CssOrigin origin, this->bufptr = 0; this->spaceSeparated = false; this->withinBlock = false; + this->baseUrl = baseUrl; nextToken (); } @@ -1558,15 +1560,17 @@ char * CssParser::parseUrl() } if (urlStr) { - char *url = urlStr->str; - dStr_free(urlStr, 0); + DilloUrl *dilloUrl = a_Url_new(urlStr->str, a_Url_str(this->baseUrl)); + char *url = dStrdup(a_Url_str(dilloUrl)); + a_Url_free(dilloUrl); + dStr_free(urlStr, 1); return url; } else { return NULL; } } -void CssParser::parseImport(DilloHtml *html, DilloUrl *baseUrl) +void CssParser::parseImport(DilloHtml *html) { char *urlStr = NULL; bool importSyntaxIsOK = false; @@ -1612,8 +1616,8 @@ void CssParser::parseImport(DilloHtml *html, DilloUrl *baseUrl) if (urlStr) { if (importSyntaxIsOK && mediaIsSelected) { MSG("CssParser::parseImport(): @import %s\n", urlStr); - DilloUrl *url = a_Html_url_new (html, urlStr, a_Url_str(baseUrl), - baseUrl ? 1 : 0); + DilloUrl *url = a_Html_url_new (html, urlStr, a_Url_str(this->baseUrl), + this->baseUrl ? 1 : 0); a_Html_load_stylesheet(html, url); a_Url_free(url); } @@ -1705,11 +1709,12 @@ void CssParser::ignoreStatement() } } -void CssParser::parse(DilloHtml *html, DilloUrl *url, CssContext *context, +void CssParser::parse(DilloHtml *html, const DilloUrl *baseUrl, + CssContext *context, const char *buf, int buflen, CssOrigin origin) { - CssParser parser (context, origin, buf, buflen); + CssParser parser (context, origin, baseUrl, buf, buflen); bool importsAreAllowed = true; while (parser.ttype != CSS_TK_END) { @@ -1720,7 +1725,7 @@ void CssParser::parse(DilloHtml *html, DilloUrl *url, CssContext *context, if (dStrAsciiCasecmp(parser.tval, "import") == 0 && html != NULL && importsAreAllowed) { - parser.parseImport(html, url); + parser.parseImport(html); } else if (dStrAsciiCasecmp(parser.tval, "media") == 0) { parser.parseMedia(); } else { @@ -1736,11 +1741,12 @@ void CssParser::parse(DilloHtml *html, DilloUrl *url, CssContext *context, } } -void CssParser::parseDeclarationBlock(const char *buf, int buflen, +void CssParser::parseDeclarationBlock(const DilloUrl *baseUrl, + const char *buf, int buflen, CssPropertyList *props, CssPropertyList *propsImortant) { - CssParser parser (NULL, CSS_ORIGIN_AUTHOR, buf, buflen); + CssParser parser (NULL, CSS_ORIGIN_AUTHOR, baseUrl, buf, buflen); parser.withinBlock = true; |