123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* 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,
- bool* aIsExplicitlyEnabled)
- {
- aTitle.Truncate();
- aType.Truncate();
- aMedia.Truncate();
- *aIsScoped = false;
- *aIsAlternate = false;
- *aIsExplicitlyEnabled = 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
|