Exemplo n.º 1
0
nsresult FBMLContentSink::AddLeaf(const nsIParserNode& aNode) {
  PRInt32 tagId = aNode.GetNodeType();

#ifdef VERBOSE_LOGGING
  printf("AddLeaf: %d [%s] Attribute Count: [%d]\n", tagId,
         GetTagName((nsHTMLTag)tagId).c_str(), aNode.GetAttributeCount());
  string text;
  nsString stext(aNode.GetText());
  UTF16ToStdString(text, stext);
  printf("\tLeaf Text: [%s]\n", text.c_str());
#endif
  if (tagId == eHTMLTag_title || tagId == eHTMLTag_script ||
      (GetFlag(tagId) & FB_FLAG_STYLE)) {
    nsCOMPtr<nsIDTD> dtd;
    mParser->GetDTD(getter_AddRefs(dtd));
    nsAutoString script;
    PRInt32 lineNo = 0;
    dtd->CollectSkippedContent(tagId, script, lineNo);
    string text;
    UTF16ToStdString(text, script);
#ifdef VERBOSE_LOGGING
    printf("\tCollected Content:: [%s]\n", text.c_str());
#endif

    OpenContainer(aNode);
    fbml_node *node = fbml_node_add_child(mCurrent, tagId, GetFlag(tagId), lineNo);

    if (mCSSSanitizer && (GetFlag(tagId) & FB_FLAG_STYLE)) {
      char *sanitized_css = NULL;
      char *error = NULL;
      int ret = fbml_sanitize_css((char*)text.c_str(), 0, lineNo,
                                  mCSSSanitizer, &sanitized_css, &error);
      if (sanitized_css) {
        node->text = sanitized_css;
      }
      if (error) {
        mError += error;
        free(error);
      }
    } else if (mJSSanitizer && tagId == eHTMLTag_script) {
      char *sanitized_js = NULL;
      char *error = NULL;
      int ret = fbml_sanitize_js((char*)text.c_str(), text.length(), 0,
                                 lineNo, mJSSanitizer, &sanitized_js,
                                 &error);
      if (sanitized_js) {
        node->text = sanitized_js;
      }
      if (error) {
        mError += error;
        free(error);
      }
    } else {
      node->text = strdup(text.c_str());
    }

    CloseContainer((nsHTMLTag)tagId);
    return NS_OK;
  }


  switch (aNode.GetTokenType()) {
  case eToken_start:
    OpenContainer(aNode);
    CloseContainer((nsHTMLTag)tagId);
    break;
  case eToken_text:
  case eToken_whitespace:
  case eToken_newline:
    {
      PRInt32 lineNo = aNode.GetSourceLineNumber();
      fbml_node *node = fbml_node_add_child(mCurrent, tagId, GetFlag(tagId), lineNo);
      string text;
      nsString stext(aNode.GetText());
      UTF16ToStdString(text, stext);
      node->text = strdup(text.c_str());
    }
    break;
  }
  return NS_OK;
}