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

Reply via email to