Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * This file is part of Hubbub.
  3.  * Licensed under the MIT License,
  4.  *                http://www.opensource.org/licenses/mit-license.php
  5.  * Copyright 2008 John-Mark Bell <jmb@netsurf-browser.org>
  6.  */
  7.  
  8. #include <assert.h>
  9. #include <string.h>
  10.  
  11. #include "treebuilder/modes.h"
  12. #include "treebuilder/internal.h"
  13. #include "treebuilder/treebuilder.h"
  14. #include "utils/utils.h"
  15.  
  16.  
  17. /**
  18.  * Handle tokens in "in head noscript" insertion mode
  19.  *
  20.  * \param treebuilder  The treebuilder instance
  21.  * \param token        The token to process
  22.  * \return True to reprocess the token, false otherwise
  23.  */
  24. hubbub_error handle_in_head_noscript(hubbub_treebuilder *treebuilder,
  25.                 const hubbub_token *token)
  26. {
  27.         hubbub_error err = HUBBUB_OK;
  28.         bool handled = false;
  29.  
  30.         switch (token->type) {
  31.         case HUBBUB_TOKEN_CHARACTER:
  32.                 err = process_characters_expect_whitespace(treebuilder,
  33.                                 token, true);
  34.                 break;
  35.         case HUBBUB_TOKEN_COMMENT:
  36.                 err = handle_in_head(treebuilder, token);
  37.                 break;
  38.         case HUBBUB_TOKEN_DOCTYPE:
  39.                 /** \todo parse error */
  40.                 break;
  41.         case HUBBUB_TOKEN_START_TAG:
  42.         {
  43.                 element_type type = element_type_from_name(treebuilder,
  44.                                 &token->data.tag.name);
  45.  
  46.                 if (type == HTML) {
  47.                         /* Process as "in body" */
  48.                         err = handle_in_body(treebuilder, token);
  49.                 } else if (type == NOSCRIPT) {
  50.                         handled = true;
  51.                 } else if (type == LINK || type == META || type == NOFRAMES ||
  52.                                 type == STYLE) {
  53.                         /* Process as "in head" */
  54.                         err = handle_in_head(treebuilder, token);
  55.                 } else if (type == HEAD || type == NOSCRIPT) {
  56.                         /** \todo parse error */
  57.                 } else {
  58.                         /** \todo parse error */
  59.                         err = HUBBUB_REPROCESS;
  60.                 }
  61.         }
  62.                 break;
  63.         case HUBBUB_TOKEN_END_TAG:
  64.         {
  65.                 element_type type = element_type_from_name(treebuilder,
  66.                                 &token->data.tag.name);
  67.  
  68.                 if (type == NOSCRIPT) {
  69.                         handled = true;
  70.                 } else if (type == BR) {
  71.                         /** \todo parse error */
  72.                         err = HUBBUB_REPROCESS;
  73.                 } else {
  74.                         /** \todo parse error */
  75.                 }
  76.         }
  77.                 break;
  78.         case HUBBUB_TOKEN_EOF:
  79.                 /** \todo parse error */
  80.                 err = HUBBUB_REPROCESS;
  81.                 break;
  82.         }
  83.  
  84.         if (handled || err == HUBBUB_REPROCESS) {
  85.                 hubbub_ns ns;
  86.                 element_type otype;
  87.                 void *node;
  88.  
  89.                 element_stack_pop(treebuilder, &ns, &otype, &node);
  90.  
  91.                 treebuilder->tree_handler->unref_node(
  92.                                 treebuilder->tree_handler->ctx,
  93.                                 node);
  94.  
  95.                 treebuilder->context.mode = IN_HEAD;
  96.         }
  97.  
  98.         return err;
  99. }
  100.  
  101.