diff options
Diffstat (limited to 'dom/xml/XMLStylesheetProcessingInstruction.cpp')
-rw-r--r-- | dom/xml/XMLStylesheetProcessingInstruction.cpp | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/dom/xml/XMLStylesheetProcessingInstruction.cpp b/dom/xml/XMLStylesheetProcessingInstruction.cpp new file mode 100644 index 000000000..3d94e179b --- /dev/null +++ b/dom/xml/XMLStylesheetProcessingInstruction.cpp @@ -0,0 +1,196 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "XMLStylesheetProcessingInstruction.h" +#include "mozilla/dom/XMLStylesheetProcessingInstructionBinding.h" +#include "nsContentUtils.h" +#include "nsNetUtil.h" + +namespace mozilla { +namespace dom { + +// nsISupports implementation + +NS_INTERFACE_TABLE_HEAD_CYCLE_COLLECTION_INHERITED(XMLStylesheetProcessingInstruction) + NS_INTERFACE_TABLE_INHERITED(XMLStylesheetProcessingInstruction, nsIDOMNode, + nsIDOMProcessingInstruction, + nsIStyleSheetLinkingElement) +NS_INTERFACE_TABLE_TAIL_INHERITING(ProcessingInstruction) + +NS_IMPL_ADDREF_INHERITED(XMLStylesheetProcessingInstruction, + ProcessingInstruction) +NS_IMPL_RELEASE_INHERITED(XMLStylesheetProcessingInstruction, + ProcessingInstruction) + +NS_IMPL_CYCLE_COLLECTION_CLASS(XMLStylesheetProcessingInstruction) + +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(XMLStylesheetProcessingInstruction, + ProcessingInstruction) + tmp->nsStyleLinkElement::Traverse(cb); +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END + +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(XMLStylesheetProcessingInstruction, + ProcessingInstruction) + tmp->nsStyleLinkElement::Unlink(); +NS_IMPL_CYCLE_COLLECTION_UNLINK_END + + +XMLStylesheetProcessingInstruction::~XMLStylesheetProcessingInstruction() +{ +} + +JSObject* +XMLStylesheetProcessingInstruction::WrapNode(JSContext *aCx, JS::Handle<JSObject*> aGivenProto) +{ + return XMLStylesheetProcessingInstructionBinding::Wrap(aCx, this, aGivenProto); +} + +// nsIContent + +nsresult +XMLStylesheetProcessingInstruction::BindToTree(nsIDocument* aDocument, + nsIContent* aParent, + nsIContent* aBindingParent, + bool aCompileEventHandlers) +{ + nsresult rv = ProcessingInstruction::BindToTree(aDocument, aParent, + aBindingParent, + aCompileEventHandlers); + NS_ENSURE_SUCCESS(rv, rv); + + void (XMLStylesheetProcessingInstruction::*update)() = + &XMLStylesheetProcessingInstruction::UpdateStyleSheetInternal; + nsContentUtils::AddScriptRunner(NewRunnableMethod(this, update)); + + return rv; +} + +void +XMLStylesheetProcessingInstruction::UnbindFromTree(bool aDeep, bool aNullParent) +{ + nsCOMPtr<nsIDocument> oldDoc = GetUncomposedDoc(); + + ProcessingInstruction::UnbindFromTree(aDeep, aNullParent); + UpdateStyleSheetInternal(oldDoc, nullptr); +} + +// nsIDOMNode + +void +XMLStylesheetProcessingInstruction::SetNodeValueInternal(const nsAString& aNodeValue, + ErrorResult& aError) +{ + nsGenericDOMDataNode::SetNodeValueInternal(aNodeValue, aError); + if (!aError.Failed()) { + UpdateStyleSheetInternal(nullptr, nullptr, true); + } +} + +// nsStyleLinkElement + +NS_IMETHODIMP +XMLStylesheetProcessingInstruction::GetCharset(nsAString& aCharset) +{ + return GetAttrValue(nsGkAtoms::charset, aCharset) ? NS_OK : NS_ERROR_FAILURE; +} + +/* virtual */ void +XMLStylesheetProcessingInstruction::OverrideBaseURI(nsIURI* aNewBaseURI) +{ + mOverriddenBaseURI = aNewBaseURI; +} + +already_AddRefed<nsIURI> +XMLStylesheetProcessingInstruction::GetStyleSheetURL(bool* aIsInline) +{ + *aIsInline = false; + + nsAutoString href; + if (!GetAttrValue(nsGkAtoms::href, href)) { + return nullptr; + } + + nsIURI *baseURL; + nsAutoCString charset; + nsIDocument *document = OwnerDoc(); + baseURL = mOverriddenBaseURI ? + mOverriddenBaseURI.get() : + document->GetDocBaseURI(); + charset = document->GetDocumentCharacterSet(); + + nsCOMPtr<nsIURI> aURI; + NS_NewURI(getter_AddRefs(aURI), href, charset.get(), baseURL); + return aURI.forget(); +} + +void +XMLStylesheetProcessingInstruction::GetStyleSheetInfo(nsAString& aTitle, + nsAString& aType, + nsAString& aMedia, + bool* aIsScoped, + bool* aIsAlternate) +{ + aTitle.Truncate(); + aType.Truncate(); + aMedia.Truncate(); + *aIsScoped = false; + *aIsAlternate = false; + + // xml-stylesheet PI is special only in prolog + if (!nsContentUtils::InProlog(this)) { + return; + } + + nsAutoString data; + GetData(data); + + nsContentUtils::GetPseudoAttributeValue(data, nsGkAtoms::title, aTitle); + + nsAutoString alternate; + nsContentUtils::GetPseudoAttributeValue(data, + nsGkAtoms::alternate, + alternate); + + // if alternate, does it have title? + if (alternate.EqualsLiteral("yes")) { + if (aTitle.IsEmpty()) { // alternates must have title + return; + } + + *aIsAlternate = true; + } + + nsContentUtils::GetPseudoAttributeValue(data, nsGkAtoms::media, aMedia); + + nsAutoString type; + nsContentUtils::GetPseudoAttributeValue(data, nsGkAtoms::type, type); + + nsAutoString mimeType, notUsed; + nsContentUtils::SplitMimeType(type, mimeType, notUsed); + if (!mimeType.IsEmpty() && !mimeType.LowerCaseEqualsLiteral("text/css")) { + aType.Assign(type); + return; + } + + // If we get here we assume that we're loading a css file, so set the + // type to 'text/css' + aType.AssignLiteral("text/css"); + + return; +} + +nsGenericDOMDataNode* +XMLStylesheetProcessingInstruction::CloneDataNode(mozilla::dom::NodeInfo *aNodeInfo, + bool aCloneText) const +{ + nsAutoString data; + nsGenericDOMDataNode::GetData(data); + RefPtr<mozilla::dom::NodeInfo> ni = aNodeInfo; + return new XMLStylesheetProcessingInstruction(ni.forget(), data); +} + +} // namespace dom +} // namespace mozilla |