bool
nsXHTMLContentSerializer::CheckElementEnd(nsIContent * aContent,
                                          bool & aForceFormat,
                                          nsAString& aStr)
{
  NS_ASSERTION(!mIsHTMLSerializer, "nsHTMLContentSerializer shouldn't call this method !");

  aForceFormat = aContent->HasAttr(kNameSpaceID_None,
                                   nsGkAtoms::mozdirty);

  nsIAtom *name = aContent->Tag();
  PRInt32 namespaceID = aContent->GetNameSpaceID();

  // this method is not called by nsHTMLContentSerializer
  // so we don't have to check HTML element, just XHTML
  if (namespaceID == kNameSpaceID_XHTML) {
    if (mIsCopying && name == nsGkAtoms::ol) {
      NS_ASSERTION((!mOLStateStack.IsEmpty()), "Cannot have an empty OL Stack");
      /* Though at this point we must always have an state to be deleted as all 
      the OL opening tags are supposed to push an olState object to the stack*/
      if (!mOLStateStack.IsEmpty()) {
        mOLStateStack.RemoveElementAt(mOLStateStack.Length() -1);
      }
    }

    if (HasNoChildren(aContent)) {
      nsIParserService* parserService = nsContentUtils::GetParserService();

      if (parserService) {
        bool isContainer;

        parserService->
          IsContainer(parserService->HTMLCaseSensitiveAtomTagToId(name),
                      isContainer);
        if (!isContainer) {
          // non-container HTML elements are already closed,
          // see AppendEndOfElementStart
          return false;
        }
      }
    }
    // for backward compatibility with old HTML user agents,
    // empty elements should have an ending tag, so we mustn't call
    // nsXMLContentSerializer::CheckElementEnd
    return true;
  }

  bool dummyFormat;
  return nsXMLContentSerializer::CheckElementEnd(aContent, dummyFormat, aStr);
}
void 
nsXHTMLContentSerializer::AppendEndOfElementStart(nsIContent *aOriginalElement,
                                                  nsIAtom * aName,
                                                  PRInt32 aNamespaceID,
                                                  nsAString& aStr)
{
  // this method is not called by nsHTMLContentSerializer
  // so we don't have to check HTML element, just XHTML
  NS_ASSERTION(!mIsHTMLSerializer, "nsHTMLContentSerializer shouldn't call this method !");

  if (kNameSpaceID_XHTML != aNamespaceID) {
    nsXMLContentSerializer::AppendEndOfElementStart(aOriginalElement, aName,
                                                    aNamespaceID, aStr);
    return;
  }

  nsIContent* content = aOriginalElement;

  // for non empty elements, even if they are not a container, we always
  // serialize their content, because the XHTML element could contain non XHTML
  // nodes useful in some context, like in an XSLT stylesheet
  if (HasNoChildren(content)) {

    nsIParserService* parserService = nsContentUtils::GetParserService();
  
    if (parserService) {
      bool isContainer;
      parserService->
        IsContainer(parserService->HTMLCaseSensitiveAtomTagToId(aName),
                    isContainer);
      if (!isContainer) {
        // for backward compatibility with HTML 4 user agents
        // only non-container HTML elements can be closed immediatly,
        // and a space is added before />
        AppendToString(NS_LITERAL_STRING(" />"), aStr);
        return;
      }
    }
  }
  AppendToString(kGreaterThan, aStr);
}
Exemple #3
0
    Status Update() override
    {
        if (HasNoChildren()) {
            return Status::Success;
        }

        // Keep going until a child behavior says it's running.
        while (1) {
            auto &child = children.at(index);
            auto status = child->Tick();
            
            // If the child fails, or keeps running, do the same.
            if (status != Status::Success) {
                return status;
            }

            // Hit the end of the array, job done!
            if (++index == children.size()) {
                return Status::Success;
            }
        }
    }