Author: jmb
Date: Sun Jan 25 15:59:06 2009
New Revision: 6269
URL: http://source.netsurf-browser.org?rev=6269&view=rev
Log:
Destroy rules
Modified:
trunk/libcss/src/stylesheet.c
Modified: trunk/libcss/src/stylesheet.c
URL:
http://source.netsurf-browser.org/trunk/libcss/src/stylesheet.c?rev=6269&r1=6268&r2=6269&view=diff
==============================================================================
--- trunk/libcss/src/stylesheet.c (original)
+++ trunk/libcss/src/stylesheet.c Sun Jan 25 15:59:06 2009
@@ -630,11 +630,88 @@
*/
css_error css_stylesheet_rule_destroy(css_stylesheet *sheet, css_rule *rule)
{
- UNUSED(sheet);
- UNUSED(rule);
-
- /** \todo should this be recursive? */
- /** \todo what happens to non-rule objects owned by this rule? */
+ if (sheet == NULL || rule == NULL)
+ return CSS_BADPARM;
+
+ /* Must be detached from parent/siblings */
+ if (rule->parent != NULL || rule->next != NULL || rule->prev != NULL)
+ return CSS_INVALID;
+
+ /* Destroy type-specific contents */
+ switch (rule->type) {
+ case CSS_RULE_UNKNOWN:
+ break;
+ case CSS_RULE_SELECTOR:
+ {
+ css_rule_selector *s = (css_rule_selector *) rule;
+ uint32_t i;
+
+ for (i = 0; i < rule->items; i++) {
+ css_selector *sel = s->selectors[i];
+
+ /* Detach from rule */
+ sel->rule = NULL;
+
+ css_stylesheet_selector_destroy(sheet, sel);
+ }
+
+ css_stylesheet_style_destroy(sheet, s->style);
+ }
+ break;
+ case CSS_RULE_CHARSET:
+ break;
+ case CSS_RULE_IMPORT:
+ {
+ css_rule_import *import = (css_rule_import *) rule;
+
+ css_stylesheet_destroy(import->sheet);
+ }
+ break;
+ case CSS_RULE_MEDIA:
+ {
+ css_rule_media *media = (css_rule_media *) rule;
+ css_rule *c, *d;
+
+ for (c = media->first_child; c != NULL; c = d) {
+ d = c->next;
+
+ /* Detach from list */
+ c->parent = NULL;
+ c->prev = NULL;
+ c->next = NULL;
+
+ css_stylesheet_rule_destroy(sheet, c);
+ }
+ }
+ break;
+ case CSS_RULE_FONT_FACE:
+ {
+ css_rule_font_face *font_face = (css_rule_font_face *) rule;
+
+ css_stylesheet_style_destroy(sheet, font_face->style);
+ }
+ break;
+ case CSS_RULE_PAGE:
+ {
+ css_rule_page *page = (css_rule_page *) rule;
+ uint32_t i;
+
+ for (i = 0; i < rule->items; i++) {
+ css_selector *sel = page->selectors[i];
+
+ /* Detach from rule */
+ sel->rule = NULL;
+
+ css_stylesheet_selector_destroy(sheet, sel);
+ }
+
+ css_stylesheet_style_destroy(sheet, page->style);
+ }
+ break;
+ }
+
+ /* Destroy rule */
+ sheet->alloc(rule, 0, sheet->pw);
return CSS_OK;
}
_______________________________________________
netsurf-commits mailing list
[email protected]
http://vlists.pepperfish.net/cgi-bin/mailman/listinfo/netsurf-commits-netsurf-browser.org