зеркало из https://github.com/mozilla/gecko-dev.git
Move nsDOMCSSAttributeDeclaration into its own file to progress towards moving all of the style system code back into the layout library. r=jst sr=hyatt b=108750
This commit is contained in:
Родитель
4a1f8a8889
Коммит
8e721c4e39
|
@ -47,6 +47,7 @@
|
|||
#include "nsContentPolicyUtils.h"
|
||||
#include "nsContentUtils.h"
|
||||
#include "nsDOMCID.h"
|
||||
#include "nsCSSOMFactory.h"
|
||||
#include "nsEventStateManager.h"
|
||||
#include "nsGenericElement.h"
|
||||
#include "nsHTMLAtoms.h"
|
||||
|
@ -227,6 +228,7 @@ Shutdown(nsIModule* aSelf)
|
|||
NS_IF_RELEASE(nsContentDLF::gUAStyleSheet);
|
||||
|
||||
nsContentUtils::Shutdown();
|
||||
nsGenericHTMLElement::Shutdown();
|
||||
|
||||
NS_NameSpaceManagerShutdown();
|
||||
}
|
||||
|
@ -325,6 +327,7 @@ MAKE_CTOR(CreateXULElementFactory, nsIElementFactory, NS_NewXUL
|
|||
MAKE_CTOR(CreateControllerCommandManager, nsIControllerCommandManager, NS_NewControllerCommandManager)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsContentHTTPStartup)
|
||||
MAKE_CTOR(CreateContentDLF, nsIDocumentLoaderFactory, NS_NewContentDocumentLoaderFactory)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsCSSOMFactory)
|
||||
|
||||
static NS_IMETHODIMP
|
||||
CreateHTMLImgElement(nsISupports* aOuter, REFNSIID aIID, void** aResult)
|
||||
|
@ -563,6 +566,11 @@ static nsModuleComponentInfo gComponents[] = {
|
|||
nsnull,
|
||||
CreateSubtreeIterator },
|
||||
|
||||
{ "CSS Object Model Factory",
|
||||
NS_CSSOMFACTORY_CID,
|
||||
nsnull,
|
||||
nsCSSOMFactoryConstructor },
|
||||
|
||||
// Needed to support "new Option;" and "new Image;" in JavaScript
|
||||
{ "HTML img element",
|
||||
NS_HTMLIMAGEELEMENT_CID,
|
||||
|
|
|
@ -95,8 +95,8 @@
|
|||
#include "nsIPrivateDOMEvent.h"
|
||||
#include "nsDOMCID.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsIDOMCSSStyleDeclaration.h"
|
||||
#include "nsDOMCSSDeclaration.h"
|
||||
#include "nsICSSOMFactory.h"
|
||||
#include "prprf.h"
|
||||
#include "prmem.h"
|
||||
#include "nsIFormControlFrame.h"
|
||||
|
@ -132,359 +132,6 @@ static NS_DEFINE_CID(kPresStateCID, NS_PRESSTATE_CID);
|
|||
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
class nsDOMCSSAttributeDeclaration : public nsDOMCSSDeclaration
|
||||
{
|
||||
public:
|
||||
nsDOMCSSAttributeDeclaration(nsIHTMLContent *aContent);
|
||||
~nsDOMCSSAttributeDeclaration();
|
||||
|
||||
NS_IMETHOD RemoveProperty(const nsAReadableString& aPropertyName,
|
||||
nsAWritableString& aReturn);
|
||||
|
||||
virtual void DropReference();
|
||||
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
PRBool aAllocate);
|
||||
virtual nsresult SetCSSDeclaration(nsICSSDeclaration *aDecl);
|
||||
virtual nsresult GetCSSParsingEnvironment(nsIContent* aContent,
|
||||
nsIURI** aBaseURI,
|
||||
nsICSSLoader** aCSSLoader,
|
||||
nsICSSParser** aCSSParser);
|
||||
virtual nsresult ParsePropertyValue(const nsAReadableString& aPropName,
|
||||
const nsAReadableString& aPropValue);
|
||||
virtual nsresult ParseDeclaration(const nsAReadableString& aDecl,
|
||||
PRBool aParseOnlyOneDecl,
|
||||
PRBool aClearOldDecl);
|
||||
virtual nsresult GetParent(nsISupports **aParent);
|
||||
|
||||
protected:
|
||||
nsIHTMLContent *mContent;
|
||||
};
|
||||
|
||||
MOZ_DECL_CTOR_COUNTER(nsDOMCSSAttributeDeclaration)
|
||||
|
||||
nsDOMCSSAttributeDeclaration::nsDOMCSSAttributeDeclaration(nsIHTMLContent *aContent)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsDOMCSSAttributeDeclaration);
|
||||
|
||||
// This reference is not reference-counted. The content
|
||||
// object tells us when its about to go away.
|
||||
mContent = aContent;
|
||||
}
|
||||
|
||||
nsDOMCSSAttributeDeclaration::~nsDOMCSSAttributeDeclaration()
|
||||
{
|
||||
MOZ_COUNT_DTOR(nsDOMCSSAttributeDeclaration);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDOMCSSAttributeDeclaration::RemoveProperty(const nsAReadableString& aPropertyName,
|
||||
nsAWritableString& aReturn)
|
||||
{
|
||||
nsCOMPtr<nsICSSDeclaration> decl;
|
||||
nsresult rv = GetCSSDeclaration(getter_AddRefs(decl), PR_TRUE);
|
||||
|
||||
if (NS_SUCCEEDED(rv) && decl && mContent) {
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
mContent->GetDocument(*getter_AddRefs(doc));
|
||||
|
||||
if (doc) {
|
||||
doc->BeginUpdate();
|
||||
|
||||
doc->AttributeWillChange(mContent, kNameSpaceID_None,
|
||||
nsHTMLAtoms::style);
|
||||
}
|
||||
|
||||
PRInt32 hint;
|
||||
decl->GetStyleImpact(&hint);
|
||||
|
||||
nsCSSProperty prop = nsCSSProps::LookupProperty(aPropertyName);
|
||||
nsCSSValue val;
|
||||
|
||||
rv = decl->RemoveProperty(prop, val);
|
||||
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
// We pass in eCSSProperty_UNKNOWN here so that we don't get the
|
||||
// property name in the return string.
|
||||
val.ToString(aReturn, eCSSProperty_UNKNOWN);
|
||||
} else {
|
||||
// If we tried to remove an invalid property or a property that wasn't
|
||||
// set we simply return success and an empty string
|
||||
rv = NS_OK;
|
||||
}
|
||||
|
||||
if (doc) {
|
||||
doc->AttributeChanged(mContent, kNameSpaceID_None, nsHTMLAtoms::style,
|
||||
nsIDOMMutationEvent::MODIFICATION,
|
||||
hint);
|
||||
doc->EndUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void
|
||||
nsDOMCSSAttributeDeclaration::DropReference()
|
||||
{
|
||||
mContent = nsnull;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
PRBool aAllocate)
|
||||
{
|
||||
nsHTMLValue val;
|
||||
nsIStyleRule* rule;
|
||||
nsICSSStyleRule* cssRule;
|
||||
nsresult result = NS_OK;
|
||||
|
||||
*aDecl = nsnull;
|
||||
if (nsnull != mContent) {
|
||||
mContent->GetHTMLAttribute(nsHTMLAtoms::style, val);
|
||||
if (eHTMLUnit_ISupports == val.GetUnit()) {
|
||||
rule = (nsIStyleRule*) val.GetISupportsValue();
|
||||
result = rule->QueryInterface(NS_GET_IID(nsICSSStyleRule), (void**)&cssRule);
|
||||
if (NS_OK == result) {
|
||||
*aDecl = cssRule->GetDeclaration();
|
||||
NS_RELEASE(cssRule);
|
||||
}
|
||||
NS_RELEASE(rule);
|
||||
}
|
||||
else if (PR_TRUE == aAllocate) {
|
||||
result = NS_NewCSSDeclaration(aDecl);
|
||||
if (NS_OK == result) {
|
||||
result = NS_NewCSSStyleRule(&cssRule, nsCSSSelector());
|
||||
if (NS_OK == result) {
|
||||
cssRule->SetDeclaration(*aDecl);
|
||||
cssRule->SetWeight(0x7fffffff);
|
||||
rule = (nsIStyleRule *)cssRule;
|
||||
result = mContent->SetHTMLAttribute(nsHTMLAtoms::style,
|
||||
nsHTMLValue(cssRule),
|
||||
PR_FALSE);
|
||||
NS_RELEASE(cssRule);
|
||||
}
|
||||
else {
|
||||
NS_RELEASE(*aDecl);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::SetCSSDeclaration(nsICSSDeclaration *aDecl)
|
||||
{
|
||||
nsHTMLValue val;
|
||||
nsIStyleRule* rule;
|
||||
nsICSSStyleRule* cssRule;
|
||||
nsresult result = NS_OK;
|
||||
|
||||
if (nsnull != mContent) {
|
||||
mContent->GetHTMLAttribute(nsHTMLAtoms::style, val);
|
||||
if (eHTMLUnit_ISupports == val.GetUnit()) {
|
||||
rule = (nsIStyleRule*) val.GetISupportsValue();
|
||||
result = rule->QueryInterface(NS_GET_IID(nsICSSStyleRule), (void**)&cssRule);
|
||||
if (NS_OK == result) {
|
||||
cssRule->SetDeclaration(aDecl);
|
||||
NS_RELEASE(cssRule);
|
||||
}
|
||||
NS_RELEASE(rule);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a utility function. It will only fail if it can't get a
|
||||
* parser. This means it can return NS_OK without aURI or aCSSLoader
|
||||
* being initialized
|
||||
*/
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::GetCSSParsingEnvironment(nsIContent* aContent,
|
||||
nsIURI** aBaseURI,
|
||||
nsICSSLoader** aCSSLoader,
|
||||
nsICSSParser** aCSSParser)
|
||||
{
|
||||
NS_ASSERTION(aContent, "Something is severely broken -- there should be an nsIContent here!");
|
||||
// null out the out params since some of them may not get initialized below
|
||||
*aBaseURI = nsnull;
|
||||
*aCSSLoader = nsnull;
|
||||
*aCSSParser = nsnull;
|
||||
|
||||
nsCOMPtr<nsINodeInfo> nodeInfo;
|
||||
nsresult result = aContent->GetNodeInfo(*getter_AddRefs(nodeInfo));
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
result = nodeInfo->GetDocument(*getter_AddRefs(doc));
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (doc) {
|
||||
doc->GetBaseURL(*aBaseURI);
|
||||
nsCOMPtr<nsIHTMLContentContainer> htmlContainer(do_QueryInterface(doc));
|
||||
if (htmlContainer) {
|
||||
htmlContainer->GetCSSLoader(*aCSSLoader);
|
||||
}
|
||||
NS_ASSERTION(*aCSSLoader, "Document with no CSS loader!");
|
||||
}
|
||||
if (*aCSSLoader) {
|
||||
result = (*aCSSLoader)->GetParserFor(nsnull, aCSSParser);
|
||||
} else {
|
||||
result = NS_NewCSSParser(aCSSParser);
|
||||
}
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
// look up our namespace. If we're XHTML, we need to be case-sensitive
|
||||
// Otherwise, we should not be
|
||||
(*aCSSParser)->SetCaseSensitive(nodeInfo->NamespaceEquals(kNameSpaceID_XHTML));
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::ParsePropertyValue(const nsAReadableString& aPropName,
|
||||
const nsAReadableString& aPropValue)
|
||||
{
|
||||
nsCOMPtr<nsICSSDeclaration> decl;
|
||||
nsresult result = GetCSSDeclaration(getter_AddRefs(decl), PR_TRUE);
|
||||
|
||||
if (!decl) {
|
||||
return result;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsICSSLoader> cssLoader;
|
||||
nsCOMPtr<nsICSSParser> cssParser;
|
||||
nsCOMPtr<nsIURI> baseURI;
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
|
||||
result = mContent->GetDocument(*getter_AddRefs(doc));
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
result = GetCSSParsingEnvironment(mContent,
|
||||
getter_AddRefs(baseURI),
|
||||
getter_AddRefs(cssLoader),
|
||||
getter_AddRefs(cssParser));
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
PRInt32 hint;
|
||||
if (doc) {
|
||||
doc->BeginUpdate();
|
||||
doc->AttributeWillChange(mContent, kNameSpaceID_None, nsHTMLAtoms::style);
|
||||
}
|
||||
|
||||
result = cssParser->ParseProperty(aPropName, aPropValue, baseURI, decl, &hint);
|
||||
if (doc) {
|
||||
doc->AttributeChanged(mContent, kNameSpaceID_None,
|
||||
nsHTMLAtoms::style,
|
||||
nsIDOMMutationEvent::MODIFICATION, hint);
|
||||
doc->EndUpdate();
|
||||
}
|
||||
|
||||
if (cssLoader) {
|
||||
cssLoader->RecycleParser(cssParser);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::ParseDeclaration(const nsAReadableString& aDecl,
|
||||
PRBool aParseOnlyOneDecl,
|
||||
PRBool aClearOldDecl)
|
||||
{
|
||||
nsCOMPtr<nsICSSDeclaration> decl;
|
||||
nsresult result = GetCSSDeclaration(getter_AddRefs(decl), PR_TRUE);
|
||||
|
||||
if (decl) {
|
||||
nsCOMPtr<nsICSSLoader> cssLoader;
|
||||
nsCOMPtr<nsICSSParser> cssParser;
|
||||
nsCOMPtr<nsIURI> baseURI;
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
|
||||
result = mContent->GetDocument(*getter_AddRefs(doc));
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
result = GetCSSParsingEnvironment(mContent,
|
||||
getter_AddRefs(baseURI),
|
||||
getter_AddRefs(cssLoader),
|
||||
getter_AddRefs(cssParser));
|
||||
|
||||
if (NS_SUCCEEDED(result)) {
|
||||
PRInt32 hint;
|
||||
if (doc) {
|
||||
doc->BeginUpdate();
|
||||
|
||||
doc->AttributeWillChange(mContent, kNameSpaceID_None,
|
||||
nsHTMLAtoms::style);
|
||||
}
|
||||
nsCOMPtr<nsICSSDeclaration> declClone;
|
||||
decl->Clone(*getter_AddRefs(declClone));
|
||||
|
||||
if (aClearOldDecl) {
|
||||
// This should be done with decl->Clear() once such a method exists.
|
||||
nsAutoString propName;
|
||||
PRUint32 count, i;
|
||||
|
||||
decl->Count(&count);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
decl->GetNthProperty(0, propName);
|
||||
|
||||
nsCSSProperty prop = nsCSSProps::LookupProperty(propName);
|
||||
nsCSSValue val;
|
||||
|
||||
decl->RemoveProperty(prop, val);
|
||||
}
|
||||
}
|
||||
|
||||
result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl,
|
||||
aParseOnlyOneDecl, &hint);
|
||||
if (result == NS_CSS_PARSER_DROP_DECLARATION) {
|
||||
SetCSSDeclaration(declClone);
|
||||
result = NS_OK;
|
||||
}
|
||||
if (doc) {
|
||||
if (NS_SUCCEEDED(result) && result != NS_CSS_PARSER_DROP_DECLARATION) {
|
||||
doc->AttributeChanged(mContent, kNameSpaceID_None,
|
||||
nsHTMLAtoms::style, nsIDOMMutationEvent::MODIFICATION, hint);
|
||||
}
|
||||
doc->EndUpdate();
|
||||
}
|
||||
if (cssLoader) {
|
||||
cssLoader->RecycleParser(cssParser);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::GetParent(nsISupports **aParent)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aParent);
|
||||
|
||||
*aParent = mContent;
|
||||
NS_IF_ADDREF(*aParent);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
|
||||
#ifdef GATHER_ELEMENT_USEAGE_STATISTICS
|
||||
|
||||
|
@ -612,6 +259,8 @@ nsGenericHTMLElementTearoff::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
static nsICSSOMFactory* gCSSOMFactory = nsnull;
|
||||
static NS_DEFINE_CID(kCSSOMFactoryCID, NS_CSSOMFACTORY_CID);
|
||||
|
||||
nsGenericHTMLElement::nsGenericHTMLElement()
|
||||
{
|
||||
|
@ -681,6 +330,12 @@ nsGenericHTMLElement::DOMQueryInterface(nsIDOMHTMLElement *aElement,
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
/* static */ void
|
||||
nsGenericHTMLElement::Shutdown()
|
||||
{
|
||||
NS_IF_RELEASE(gCSSOMFactory);
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsGenericHTMLElement::CopyInnerTo(nsIContent* aSrcContent,
|
||||
nsGenericHTMLElement* aDst,
|
||||
|
@ -854,18 +509,21 @@ nsGenericHTMLElement::GetStyle(nsIDOMCSSStyleDeclaration** aStyle)
|
|||
nsDOMSlots *slots = GetDOMSlots();
|
||||
|
||||
if (nsnull == slots->mStyle) {
|
||||
slots->mStyle = new nsDOMCSSAttributeDeclaration(this);
|
||||
|
||||
if (nsnull == slots->mStyle) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
if (!gCSSOMFactory) {
|
||||
res = CallGetService(kCSSOMFactoryCID, &gCSSOMFactory);
|
||||
if (NS_FAILED(res))
|
||||
return res;
|
||||
}
|
||||
NS_ADDREF(slots->mStyle);
|
||||
|
||||
res = gCSSOMFactory->CreateDOMCSSAttributeDeclaration(this,
|
||||
&slots->mStyle);
|
||||
if (NS_FAILED(res))
|
||||
return res;
|
||||
}
|
||||
|
||||
res = slots->mStyle->QueryInterface(NS_GET_IID(nsIDOMCSSStyleDeclaration),
|
||||
(void **)aStyle);
|
||||
|
||||
return res;
|
||||
// Why bother with QI?
|
||||
NS_IF_ADDREF(*aStyle = slots->mStyle);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
|
|
|
@ -80,6 +80,8 @@ public:
|
|||
nsresult Init(nsINodeInfo *aNodeInfo);
|
||||
#endif
|
||||
|
||||
static void Shutdown();
|
||||
|
||||
NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr);
|
||||
|
||||
nsresult DOMQueryInterface(nsIDOMHTMLElement *aElement, REFNSIID aIID,
|
||||
|
|
|
@ -9,6 +9,7 @@ nsICSSGroupRule.h
|
|||
nsICSSImportRule.h
|
||||
nsICSSMediaRule.h
|
||||
nsICSSNameSpaceRule.h
|
||||
nsICSSOMFactory.h
|
||||
nsICSSRule.h
|
||||
nsICSSStyleRule.h
|
||||
nsICSSStyleRuleProcessor.h
|
||||
|
|
|
@ -52,6 +52,7 @@ REQUIRES = xpcom \
|
|||
CPPSRCS = \
|
||||
nsCSSDeclaration.cpp \
|
||||
nsCSSLoader.cpp \
|
||||
nsCSSOMFactory.cpp \
|
||||
nsCSSParser.cpp \
|
||||
nsCSSScanner.cpp \
|
||||
nsCSSRule.cpp \
|
||||
|
@ -60,6 +61,7 @@ CPPSRCS = \
|
|||
nsCSSStyleSheet.cpp \
|
||||
nsCSSValue.cpp \
|
||||
nsComputedDOMStyle.cpp \
|
||||
nsDOMCSSAttrDeclaration.cpp \
|
||||
nsDOMCSSDeclaration.cpp \
|
||||
nsHTMLAttributes.cpp \
|
||||
nsHTMLStyleSheet.cpp \
|
||||
|
@ -79,6 +81,7 @@ EXPORTS = \
|
|||
nsICSSMediaRule.h \
|
||||
nsICSSNameSpaceRule.h \
|
||||
nsICSSDeclaration.h \
|
||||
nsICSSOMFactory.h \
|
||||
nsIHTMLCSSStyleSheet.h \
|
||||
nsIHTMLAttributes.h \
|
||||
$(NULL)
|
||||
|
|
|
@ -56,6 +56,7 @@ EXPORTS = \
|
|||
nsICSSMediaRule.h \
|
||||
nsICSSNameSpaceRule.h \
|
||||
nsICSSDeclaration.h \
|
||||
nsICSSOMFactory.h \
|
||||
nsIHTMLCSSStyleSheet.h \
|
||||
nsDOMCSSDeclaration.h \
|
||||
nsIHTMLAttributes.h \
|
||||
|
@ -65,6 +66,7 @@ CPPSRCS= \
|
|||
nsHTMLStyleSheet.cpp \
|
||||
nsCSSDeclaration.cpp \
|
||||
nsCSSLoader.cpp \
|
||||
nsCSSOMFactory.cpp \
|
||||
nsCSSParser.cpp \
|
||||
nsCSSScanner.cpp \
|
||||
nsCSSRule.cpp \
|
||||
|
@ -74,6 +76,7 @@ CPPSRCS= \
|
|||
nsCSSValue.cpp \
|
||||
nsHTMLAttributes.cpp \
|
||||
nsHTMLCSSStyleSheet.cpp \
|
||||
nsDOMCSSAttrDeclaration.cpp \
|
||||
nsDOMCSSDeclaration.cpp \
|
||||
nsComputedDOMStyle.cpp \
|
||||
nsROCSSPrimitiveValue.cpp \
|
||||
|
@ -83,6 +86,7 @@ CPP_OBJS = \
|
|||
.\$(OBJDIR)\nsHTMLStyleSheet.obj \
|
||||
.\$(OBJDIR)\nsCSSDeclaration.obj \
|
||||
.\$(OBJDIR)\nsCSSLoader.obj \
|
||||
.\$(OBJDIR)\nsCSSOMFactory.obj \
|
||||
.\$(OBJDIR)\nsCSSParser.obj \
|
||||
.\$(OBJDIR)\nsCSSScanner.obj \
|
||||
.\$(OBJDIR)\nsCSSRule.obj \
|
||||
|
@ -92,6 +96,7 @@ CPP_OBJS = \
|
|||
.\$(OBJDIR)\nsCSSValue.obj \
|
||||
.\$(OBJDIR)\nsHTMLAttributes.obj \
|
||||
.\$(OBJDIR)\nsHTMLCSSStyleSheet.obj \
|
||||
.\$(OBJDIR)\nsDOMCSSAttrDeclaration.obj \
|
||||
.\$(OBJDIR)\nsDOMCSSDeclaration.obj \
|
||||
.\$(OBJDIR)\nsComputedDOMStyle.obj \
|
||||
.\$(OBJDIR)\nsROCSSPrimitiveValue.obj \
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// vim:cindent:ts=8:et:sw=4:
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2001
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* L. David Baron <dbaron@fas.harvard.edu> (original author)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsCSSOMFactory.h"
|
||||
#include "nsDOMCSSAttrDeclaration.h"
|
||||
|
||||
nsCSSOMFactory::nsCSSOMFactory()
|
||||
{
|
||||
}
|
||||
|
||||
nsCSSOMFactory::~nsCSSOMFactory()
|
||||
{
|
||||
}
|
||||
|
||||
NS_IMPL_ISUPPORTS1(nsCSSOMFactory, nsICSSOMFactory)
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCSSOMFactory::CreateDOMCSSAttributeDeclaration(nsIHTMLContent *aContent,
|
||||
nsDOMCSSDeclaration **aResult)
|
||||
{
|
||||
nsDOMCSSDeclaration *result = new nsDOMCSSAttributeDeclaration(aContent);
|
||||
if (!result) {
|
||||
*aResult = 0;
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
NS_ADDREF(result);
|
||||
*aResult = result;
|
||||
return NS_OK;
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// vim:cindent:ts=8:et:sw=4:
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2001
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* L. David Baron <dbaron@fas.harvard.edu> (original author)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef nsCSSOMFactory_h___
|
||||
#define nsCSSOMFactory_h___
|
||||
|
||||
#include "nsICSSOMFactory.h"
|
||||
|
||||
class nsCSSOMFactory : public nsICSSOMFactory {
|
||||
|
||||
public:
|
||||
|
||||
nsCSSOMFactory();
|
||||
virtual ~nsCSSOMFactory();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD CreateDOMCSSAttributeDeclaration(nsIHTMLContent *aContent,
|
||||
nsDOMCSSDeclaration **aResult);
|
||||
|
||||
};
|
||||
|
||||
#endif /* nsCSSOMFactory_h___ */
|
|
@ -0,0 +1,377 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator client code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsDOMCSSAttrDeclaration.h"
|
||||
#include "nsICSSDeclaration.h"
|
||||
#include "nsIDocument.h"
|
||||
#include "nsHTMLAtoms.h"
|
||||
#include "nsIHTMLContent.h"
|
||||
#include "nsIDOMMutationEvent.h"
|
||||
#include "nsHTMLValue.h"
|
||||
#include "nsICSSStyleRule.h"
|
||||
#include "nsINodeInfo.h"
|
||||
#include "nsICSSLoader.h"
|
||||
#include "nsICSSParser.h"
|
||||
#include "nsICSSDeclaration.h"
|
||||
#include "nsIURI.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsIHTMLContentContainer.h"
|
||||
|
||||
MOZ_DECL_CTOR_COUNTER(nsDOMCSSAttributeDeclaration)
|
||||
|
||||
nsDOMCSSAttributeDeclaration::nsDOMCSSAttributeDeclaration(nsIHTMLContent *aContent)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsDOMCSSAttributeDeclaration);
|
||||
|
||||
// This reference is not reference-counted. The content
|
||||
// object tells us when its about to go away.
|
||||
mContent = aContent;
|
||||
}
|
||||
|
||||
nsDOMCSSAttributeDeclaration::~nsDOMCSSAttributeDeclaration()
|
||||
{
|
||||
MOZ_COUNT_DTOR(nsDOMCSSAttributeDeclaration);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDOMCSSAttributeDeclaration::RemoveProperty(const nsAReadableString& aPropertyName,
|
||||
nsAWritableString& aReturn)
|
||||
{
|
||||
nsCOMPtr<nsICSSDeclaration> decl;
|
||||
nsresult rv = GetCSSDeclaration(getter_AddRefs(decl), PR_TRUE);
|
||||
|
||||
if (NS_SUCCEEDED(rv) && decl && mContent) {
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
mContent->GetDocument(*getter_AddRefs(doc));
|
||||
|
||||
if (doc) {
|
||||
doc->BeginUpdate();
|
||||
|
||||
doc->AttributeWillChange(mContent, kNameSpaceID_None,
|
||||
nsHTMLAtoms::style);
|
||||
}
|
||||
|
||||
PRInt32 hint;
|
||||
decl->GetStyleImpact(&hint);
|
||||
|
||||
nsCSSProperty prop = nsCSSProps::LookupProperty(aPropertyName);
|
||||
nsCSSValue val;
|
||||
|
||||
rv = decl->RemoveProperty(prop, val);
|
||||
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
// We pass in eCSSProperty_UNKNOWN here so that we don't get the
|
||||
// property name in the return string.
|
||||
val.ToString(aReturn, eCSSProperty_UNKNOWN);
|
||||
} else {
|
||||
// If we tried to remove an invalid property or a property that wasn't
|
||||
// set we simply return success and an empty string
|
||||
rv = NS_OK;
|
||||
}
|
||||
|
||||
if (doc) {
|
||||
doc->AttributeChanged(mContent, kNameSpaceID_None, nsHTMLAtoms::style,
|
||||
nsIDOMMutationEvent::MODIFICATION,
|
||||
hint);
|
||||
doc->EndUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void
|
||||
nsDOMCSSAttributeDeclaration::DropReference()
|
||||
{
|
||||
mContent = nsnull;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
PRBool aAllocate)
|
||||
{
|
||||
nsHTMLValue val;
|
||||
nsIStyleRule* rule;
|
||||
nsICSSStyleRule* cssRule;
|
||||
nsresult result = NS_OK;
|
||||
|
||||
*aDecl = nsnull;
|
||||
if (nsnull != mContent) {
|
||||
mContent->GetHTMLAttribute(nsHTMLAtoms::style, val);
|
||||
if (eHTMLUnit_ISupports == val.GetUnit()) {
|
||||
rule = (nsIStyleRule*) val.GetISupportsValue();
|
||||
result = rule->QueryInterface(NS_GET_IID(nsICSSStyleRule), (void**)&cssRule);
|
||||
if (NS_OK == result) {
|
||||
*aDecl = cssRule->GetDeclaration();
|
||||
NS_RELEASE(cssRule);
|
||||
}
|
||||
NS_RELEASE(rule);
|
||||
}
|
||||
else if (PR_TRUE == aAllocate) {
|
||||
result = NS_NewCSSDeclaration(aDecl);
|
||||
if (NS_OK == result) {
|
||||
result = NS_NewCSSStyleRule(&cssRule, nsCSSSelector());
|
||||
if (NS_OK == result) {
|
||||
cssRule->SetDeclaration(*aDecl);
|
||||
cssRule->SetWeight(0x7fffffff);
|
||||
rule = (nsIStyleRule *)cssRule;
|
||||
result = mContent->SetHTMLAttribute(nsHTMLAtoms::style,
|
||||
nsHTMLValue(cssRule),
|
||||
PR_FALSE);
|
||||
NS_RELEASE(cssRule);
|
||||
}
|
||||
else {
|
||||
NS_RELEASE(*aDecl);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::SetCSSDeclaration(nsICSSDeclaration *aDecl)
|
||||
{
|
||||
nsHTMLValue val;
|
||||
nsIStyleRule* rule;
|
||||
nsICSSStyleRule* cssRule;
|
||||
nsresult result = NS_OK;
|
||||
|
||||
if (nsnull != mContent) {
|
||||
mContent->GetHTMLAttribute(nsHTMLAtoms::style, val);
|
||||
if (eHTMLUnit_ISupports == val.GetUnit()) {
|
||||
rule = (nsIStyleRule*) val.GetISupportsValue();
|
||||
result = rule->QueryInterface(NS_GET_IID(nsICSSStyleRule), (void**)&cssRule);
|
||||
if (NS_OK == result) {
|
||||
cssRule->SetDeclaration(aDecl);
|
||||
NS_RELEASE(cssRule);
|
||||
}
|
||||
NS_RELEASE(rule);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a utility function. It will only fail if it can't get a
|
||||
* parser. This means it can return NS_OK without aURI or aCSSLoader
|
||||
* being initialized
|
||||
*/
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::GetCSSParsingEnvironment(nsIContent* aContent,
|
||||
nsIURI** aBaseURI,
|
||||
nsICSSLoader** aCSSLoader,
|
||||
nsICSSParser** aCSSParser)
|
||||
{
|
||||
NS_ASSERTION(aContent, "Something is severely broken -- there should be an nsIContent here!");
|
||||
// null out the out params since some of them may not get initialized below
|
||||
*aBaseURI = nsnull;
|
||||
*aCSSLoader = nsnull;
|
||||
*aCSSParser = nsnull;
|
||||
|
||||
nsCOMPtr<nsINodeInfo> nodeInfo;
|
||||
nsresult result = aContent->GetNodeInfo(*getter_AddRefs(nodeInfo));
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
result = nodeInfo->GetDocument(*getter_AddRefs(doc));
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (doc) {
|
||||
doc->GetBaseURL(*aBaseURI);
|
||||
nsCOMPtr<nsIHTMLContentContainer> htmlContainer(do_QueryInterface(doc));
|
||||
if (htmlContainer) {
|
||||
htmlContainer->GetCSSLoader(*aCSSLoader);
|
||||
}
|
||||
NS_ASSERTION(*aCSSLoader, "Document with no CSS loader!");
|
||||
}
|
||||
if (*aCSSLoader) {
|
||||
result = (*aCSSLoader)->GetParserFor(nsnull, aCSSParser);
|
||||
} else {
|
||||
result = NS_NewCSSParser(aCSSParser);
|
||||
}
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
// look up our namespace. If we're XHTML, we need to be case-sensitive
|
||||
// Otherwise, we should not be
|
||||
(*aCSSParser)->SetCaseSensitive(nodeInfo->NamespaceEquals(kNameSpaceID_XHTML));
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::ParsePropertyValue(const nsAReadableString& aPropName,
|
||||
const nsAReadableString& aPropValue)
|
||||
{
|
||||
nsCOMPtr<nsICSSDeclaration> decl;
|
||||
nsresult result = GetCSSDeclaration(getter_AddRefs(decl), PR_TRUE);
|
||||
|
||||
if (!decl) {
|
||||
return result;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsICSSLoader> cssLoader;
|
||||
nsCOMPtr<nsICSSParser> cssParser;
|
||||
nsCOMPtr<nsIURI> baseURI;
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
|
||||
result = mContent->GetDocument(*getter_AddRefs(doc));
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
result = GetCSSParsingEnvironment(mContent,
|
||||
getter_AddRefs(baseURI),
|
||||
getter_AddRefs(cssLoader),
|
||||
getter_AddRefs(cssParser));
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
PRInt32 hint;
|
||||
if (doc) {
|
||||
doc->BeginUpdate();
|
||||
doc->AttributeWillChange(mContent, kNameSpaceID_None, nsHTMLAtoms::style);
|
||||
}
|
||||
|
||||
result = cssParser->ParseProperty(aPropName, aPropValue, baseURI, decl, &hint);
|
||||
if (doc) {
|
||||
doc->AttributeChanged(mContent, kNameSpaceID_None,
|
||||
nsHTMLAtoms::style,
|
||||
nsIDOMMutationEvent::MODIFICATION, hint);
|
||||
doc->EndUpdate();
|
||||
}
|
||||
|
||||
if (cssLoader) {
|
||||
cssLoader->RecycleParser(cssParser);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::ParseDeclaration(const nsAReadableString& aDecl,
|
||||
PRBool aParseOnlyOneDecl,
|
||||
PRBool aClearOldDecl)
|
||||
{
|
||||
nsCOMPtr<nsICSSDeclaration> decl;
|
||||
nsresult result = GetCSSDeclaration(getter_AddRefs(decl), PR_TRUE);
|
||||
|
||||
if (decl) {
|
||||
nsCOMPtr<nsICSSLoader> cssLoader;
|
||||
nsCOMPtr<nsICSSParser> cssParser;
|
||||
nsCOMPtr<nsIURI> baseURI;
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
|
||||
result = mContent->GetDocument(*getter_AddRefs(doc));
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
result = GetCSSParsingEnvironment(mContent,
|
||||
getter_AddRefs(baseURI),
|
||||
getter_AddRefs(cssLoader),
|
||||
getter_AddRefs(cssParser));
|
||||
|
||||
if (NS_SUCCEEDED(result)) {
|
||||
PRInt32 hint;
|
||||
if (doc) {
|
||||
doc->BeginUpdate();
|
||||
|
||||
doc->AttributeWillChange(mContent, kNameSpaceID_None,
|
||||
nsHTMLAtoms::style);
|
||||
}
|
||||
nsCOMPtr<nsICSSDeclaration> declClone;
|
||||
decl->Clone(*getter_AddRefs(declClone));
|
||||
|
||||
if (aClearOldDecl) {
|
||||
// This should be done with decl->Clear() once such a method exists.
|
||||
nsAutoString propName;
|
||||
PRUint32 count, i;
|
||||
|
||||
decl->Count(&count);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
decl->GetNthProperty(0, propName);
|
||||
|
||||
nsCSSProperty prop = nsCSSProps::LookupProperty(propName);
|
||||
nsCSSValue val;
|
||||
|
||||
decl->RemoveProperty(prop, val);
|
||||
}
|
||||
}
|
||||
|
||||
result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl,
|
||||
aParseOnlyOneDecl, &hint);
|
||||
if (result == NS_CSS_PARSER_DROP_DECLARATION) {
|
||||
SetCSSDeclaration(declClone);
|
||||
result = NS_OK;
|
||||
}
|
||||
if (doc) {
|
||||
if (NS_SUCCEEDED(result) && result != NS_CSS_PARSER_DROP_DECLARATION) {
|
||||
doc->AttributeChanged(mContent, kNameSpaceID_None,
|
||||
nsHTMLAtoms::style, nsIDOMMutationEvent::MODIFICATION, hint);
|
||||
}
|
||||
doc->EndUpdate();
|
||||
}
|
||||
if (cssLoader) {
|
||||
cssLoader->RecycleParser(cssParser);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::GetParent(nsISupports **aParent)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aParent);
|
||||
|
||||
*aParent = mContent;
|
||||
NS_IF_ADDREF(*aParent);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
@ -0,0 +1,80 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator client code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef nsDOMCSSAttributeDeclaration_h___
|
||||
#define nsDOMCSSAttributeDeclaration_h___
|
||||
|
||||
#include "nsIDOMCSSStyleDeclaration.h"
|
||||
#include "nsDOMCSSDeclaration.h"
|
||||
|
||||
#include "nsString.h"
|
||||
|
||||
class nsIContent;
|
||||
class nsIHTMLContent;
|
||||
class nsICSSLoader;
|
||||
class nsICSSParser;
|
||||
|
||||
class nsDOMCSSAttributeDeclaration : public nsDOMCSSDeclaration
|
||||
{
|
||||
public:
|
||||
nsDOMCSSAttributeDeclaration(nsIHTMLContent *aContent);
|
||||
~nsDOMCSSAttributeDeclaration();
|
||||
|
||||
NS_IMETHOD RemoveProperty(const nsAReadableString& aPropertyName,
|
||||
nsAWritableString& aReturn);
|
||||
|
||||
virtual void DropReference();
|
||||
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
PRBool aAllocate);
|
||||
virtual nsresult SetCSSDeclaration(nsICSSDeclaration *aDecl);
|
||||
virtual nsresult GetCSSParsingEnvironment(nsIContent* aContent,
|
||||
nsIURI** aBaseURI,
|
||||
nsICSSLoader** aCSSLoader,
|
||||
nsICSSParser** aCSSParser);
|
||||
virtual nsresult ParsePropertyValue(const nsAReadableString& aPropName,
|
||||
const nsAReadableString& aPropValue);
|
||||
virtual nsresult ParseDeclaration(const nsAReadableString& aDecl,
|
||||
PRBool aParseOnlyOneDecl,
|
||||
PRBool aClearOldDecl);
|
||||
virtual nsresult GetParent(nsISupports **aParent);
|
||||
|
||||
protected:
|
||||
nsIHTMLContent *mContent;
|
||||
};
|
||||
|
||||
#endif /* nsDOMCSSAttributeDeclaration_h___ */
|
|
@ -0,0 +1,65 @@
|
|||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// vim:cindent:ts=8:et:sw=4:
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2001
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* L. David Baron <dbaron@fas.harvard.edu> (original author)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef nsICSSOMFactory_h___
|
||||
#define nsICSSOMFactory_h___
|
||||
|
||||
#include "nsISupports.h"
|
||||
class nsDOMCSSDeclaration;
|
||||
class nsIHTMLContent;
|
||||
|
||||
// bfdd87bd-79c8-4041-ae14-91fa8536ce61
|
||||
#define NS_ICSSOMFACTORY_IID \
|
||||
{ 0xbfdd87bd, 0x79c8, 0x4041, \
|
||||
{0xae, 0x14, 0x91, 0xfa, 0x85, 0x36, 0xce, 0x61 } }
|
||||
|
||||
// 5fcaa2c1-7ca4-4f73-a357-93e79d709376
|
||||
#define NS_CSSOMFACTORY_CID \
|
||||
{ 0x5fcaa2c1, 0x7ca4, 0x4f73, \
|
||||
{0xa3, 0x57, 0x93, 0xe7, 0x9d, 0x70, 0x93, 0x76 } }
|
||||
|
||||
class nsICSSOMFactory : public nsISupports {
|
||||
public:
|
||||
NS_DEFINE_STATIC_IID_ACCESSOR(NS_ICSSOMFACTORY_IID)
|
||||
|
||||
NS_IMETHOD CreateDOMCSSAttributeDeclaration(nsIHTMLContent *aContent,
|
||||
nsDOMCSSDeclaration **aResult) = 0;
|
||||
};
|
||||
|
||||
#endif /* nsICSSOMFactory_h___ */
|
Двоичные данные
content/macbuild/content.mcp
Двоичные данные
content/macbuild/content.mcp
Двоичный файл не отображается.
|
@ -0,0 +1,65 @@
|
|||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// vim:cindent:ts=8:et:sw=4:
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2001
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* L. David Baron <dbaron@fas.harvard.edu> (original author)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsCSSOMFactory.h"
|
||||
#include "nsDOMCSSAttrDeclaration.h"
|
||||
|
||||
nsCSSOMFactory::nsCSSOMFactory()
|
||||
{
|
||||
}
|
||||
|
||||
nsCSSOMFactory::~nsCSSOMFactory()
|
||||
{
|
||||
}
|
||||
|
||||
NS_IMPL_ISUPPORTS1(nsCSSOMFactory, nsICSSOMFactory)
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCSSOMFactory::CreateDOMCSSAttributeDeclaration(nsIHTMLContent *aContent,
|
||||
nsDOMCSSDeclaration **aResult)
|
||||
{
|
||||
nsDOMCSSDeclaration *result = new nsDOMCSSAttributeDeclaration(aContent);
|
||||
if (!result) {
|
||||
*aResult = 0;
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
NS_ADDREF(result);
|
||||
*aResult = result;
|
||||
return NS_OK;
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// vim:cindent:ts=8:et:sw=4:
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2001
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* L. David Baron <dbaron@fas.harvard.edu> (original author)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef nsCSSOMFactory_h___
|
||||
#define nsCSSOMFactory_h___
|
||||
|
||||
#include "nsICSSOMFactory.h"
|
||||
|
||||
class nsCSSOMFactory : public nsICSSOMFactory {
|
||||
|
||||
public:
|
||||
|
||||
nsCSSOMFactory();
|
||||
virtual ~nsCSSOMFactory();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD CreateDOMCSSAttributeDeclaration(nsIHTMLContent *aContent,
|
||||
nsDOMCSSDeclaration **aResult);
|
||||
|
||||
};
|
||||
|
||||
#endif /* nsCSSOMFactory_h___ */
|
|
@ -0,0 +1,377 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator client code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsDOMCSSAttrDeclaration.h"
|
||||
#include "nsICSSDeclaration.h"
|
||||
#include "nsIDocument.h"
|
||||
#include "nsHTMLAtoms.h"
|
||||
#include "nsIHTMLContent.h"
|
||||
#include "nsIDOMMutationEvent.h"
|
||||
#include "nsHTMLValue.h"
|
||||
#include "nsICSSStyleRule.h"
|
||||
#include "nsINodeInfo.h"
|
||||
#include "nsICSSLoader.h"
|
||||
#include "nsICSSParser.h"
|
||||
#include "nsICSSDeclaration.h"
|
||||
#include "nsIURI.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsIHTMLContentContainer.h"
|
||||
|
||||
MOZ_DECL_CTOR_COUNTER(nsDOMCSSAttributeDeclaration)
|
||||
|
||||
nsDOMCSSAttributeDeclaration::nsDOMCSSAttributeDeclaration(nsIHTMLContent *aContent)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsDOMCSSAttributeDeclaration);
|
||||
|
||||
// This reference is not reference-counted. The content
|
||||
// object tells us when its about to go away.
|
||||
mContent = aContent;
|
||||
}
|
||||
|
||||
nsDOMCSSAttributeDeclaration::~nsDOMCSSAttributeDeclaration()
|
||||
{
|
||||
MOZ_COUNT_DTOR(nsDOMCSSAttributeDeclaration);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDOMCSSAttributeDeclaration::RemoveProperty(const nsAReadableString& aPropertyName,
|
||||
nsAWritableString& aReturn)
|
||||
{
|
||||
nsCOMPtr<nsICSSDeclaration> decl;
|
||||
nsresult rv = GetCSSDeclaration(getter_AddRefs(decl), PR_TRUE);
|
||||
|
||||
if (NS_SUCCEEDED(rv) && decl && mContent) {
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
mContent->GetDocument(*getter_AddRefs(doc));
|
||||
|
||||
if (doc) {
|
||||
doc->BeginUpdate();
|
||||
|
||||
doc->AttributeWillChange(mContent, kNameSpaceID_None,
|
||||
nsHTMLAtoms::style);
|
||||
}
|
||||
|
||||
PRInt32 hint;
|
||||
decl->GetStyleImpact(&hint);
|
||||
|
||||
nsCSSProperty prop = nsCSSProps::LookupProperty(aPropertyName);
|
||||
nsCSSValue val;
|
||||
|
||||
rv = decl->RemoveProperty(prop, val);
|
||||
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
// We pass in eCSSProperty_UNKNOWN here so that we don't get the
|
||||
// property name in the return string.
|
||||
val.ToString(aReturn, eCSSProperty_UNKNOWN);
|
||||
} else {
|
||||
// If we tried to remove an invalid property or a property that wasn't
|
||||
// set we simply return success and an empty string
|
||||
rv = NS_OK;
|
||||
}
|
||||
|
||||
if (doc) {
|
||||
doc->AttributeChanged(mContent, kNameSpaceID_None, nsHTMLAtoms::style,
|
||||
nsIDOMMutationEvent::MODIFICATION,
|
||||
hint);
|
||||
doc->EndUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void
|
||||
nsDOMCSSAttributeDeclaration::DropReference()
|
||||
{
|
||||
mContent = nsnull;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
PRBool aAllocate)
|
||||
{
|
||||
nsHTMLValue val;
|
||||
nsIStyleRule* rule;
|
||||
nsICSSStyleRule* cssRule;
|
||||
nsresult result = NS_OK;
|
||||
|
||||
*aDecl = nsnull;
|
||||
if (nsnull != mContent) {
|
||||
mContent->GetHTMLAttribute(nsHTMLAtoms::style, val);
|
||||
if (eHTMLUnit_ISupports == val.GetUnit()) {
|
||||
rule = (nsIStyleRule*) val.GetISupportsValue();
|
||||
result = rule->QueryInterface(NS_GET_IID(nsICSSStyleRule), (void**)&cssRule);
|
||||
if (NS_OK == result) {
|
||||
*aDecl = cssRule->GetDeclaration();
|
||||
NS_RELEASE(cssRule);
|
||||
}
|
||||
NS_RELEASE(rule);
|
||||
}
|
||||
else if (PR_TRUE == aAllocate) {
|
||||
result = NS_NewCSSDeclaration(aDecl);
|
||||
if (NS_OK == result) {
|
||||
result = NS_NewCSSStyleRule(&cssRule, nsCSSSelector());
|
||||
if (NS_OK == result) {
|
||||
cssRule->SetDeclaration(*aDecl);
|
||||
cssRule->SetWeight(0x7fffffff);
|
||||
rule = (nsIStyleRule *)cssRule;
|
||||
result = mContent->SetHTMLAttribute(nsHTMLAtoms::style,
|
||||
nsHTMLValue(cssRule),
|
||||
PR_FALSE);
|
||||
NS_RELEASE(cssRule);
|
||||
}
|
||||
else {
|
||||
NS_RELEASE(*aDecl);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::SetCSSDeclaration(nsICSSDeclaration *aDecl)
|
||||
{
|
||||
nsHTMLValue val;
|
||||
nsIStyleRule* rule;
|
||||
nsICSSStyleRule* cssRule;
|
||||
nsresult result = NS_OK;
|
||||
|
||||
if (nsnull != mContent) {
|
||||
mContent->GetHTMLAttribute(nsHTMLAtoms::style, val);
|
||||
if (eHTMLUnit_ISupports == val.GetUnit()) {
|
||||
rule = (nsIStyleRule*) val.GetISupportsValue();
|
||||
result = rule->QueryInterface(NS_GET_IID(nsICSSStyleRule), (void**)&cssRule);
|
||||
if (NS_OK == result) {
|
||||
cssRule->SetDeclaration(aDecl);
|
||||
NS_RELEASE(cssRule);
|
||||
}
|
||||
NS_RELEASE(rule);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a utility function. It will only fail if it can't get a
|
||||
* parser. This means it can return NS_OK without aURI or aCSSLoader
|
||||
* being initialized
|
||||
*/
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::GetCSSParsingEnvironment(nsIContent* aContent,
|
||||
nsIURI** aBaseURI,
|
||||
nsICSSLoader** aCSSLoader,
|
||||
nsICSSParser** aCSSParser)
|
||||
{
|
||||
NS_ASSERTION(aContent, "Something is severely broken -- there should be an nsIContent here!");
|
||||
// null out the out params since some of them may not get initialized below
|
||||
*aBaseURI = nsnull;
|
||||
*aCSSLoader = nsnull;
|
||||
*aCSSParser = nsnull;
|
||||
|
||||
nsCOMPtr<nsINodeInfo> nodeInfo;
|
||||
nsresult result = aContent->GetNodeInfo(*getter_AddRefs(nodeInfo));
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
result = nodeInfo->GetDocument(*getter_AddRefs(doc));
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
if (doc) {
|
||||
doc->GetBaseURL(*aBaseURI);
|
||||
nsCOMPtr<nsIHTMLContentContainer> htmlContainer(do_QueryInterface(doc));
|
||||
if (htmlContainer) {
|
||||
htmlContainer->GetCSSLoader(*aCSSLoader);
|
||||
}
|
||||
NS_ASSERTION(*aCSSLoader, "Document with no CSS loader!");
|
||||
}
|
||||
if (*aCSSLoader) {
|
||||
result = (*aCSSLoader)->GetParserFor(nsnull, aCSSParser);
|
||||
} else {
|
||||
result = NS_NewCSSParser(aCSSParser);
|
||||
}
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
// look up our namespace. If we're XHTML, we need to be case-sensitive
|
||||
// Otherwise, we should not be
|
||||
(*aCSSParser)->SetCaseSensitive(nodeInfo->NamespaceEquals(kNameSpaceID_XHTML));
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::ParsePropertyValue(const nsAReadableString& aPropName,
|
||||
const nsAReadableString& aPropValue)
|
||||
{
|
||||
nsCOMPtr<nsICSSDeclaration> decl;
|
||||
nsresult result = GetCSSDeclaration(getter_AddRefs(decl), PR_TRUE);
|
||||
|
||||
if (!decl) {
|
||||
return result;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsICSSLoader> cssLoader;
|
||||
nsCOMPtr<nsICSSParser> cssParser;
|
||||
nsCOMPtr<nsIURI> baseURI;
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
|
||||
result = mContent->GetDocument(*getter_AddRefs(doc));
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
result = GetCSSParsingEnvironment(mContent,
|
||||
getter_AddRefs(baseURI),
|
||||
getter_AddRefs(cssLoader),
|
||||
getter_AddRefs(cssParser));
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
PRInt32 hint;
|
||||
if (doc) {
|
||||
doc->BeginUpdate();
|
||||
doc->AttributeWillChange(mContent, kNameSpaceID_None, nsHTMLAtoms::style);
|
||||
}
|
||||
|
||||
result = cssParser->ParseProperty(aPropName, aPropValue, baseURI, decl, &hint);
|
||||
if (doc) {
|
||||
doc->AttributeChanged(mContent, kNameSpaceID_None,
|
||||
nsHTMLAtoms::style,
|
||||
nsIDOMMutationEvent::MODIFICATION, hint);
|
||||
doc->EndUpdate();
|
||||
}
|
||||
|
||||
if (cssLoader) {
|
||||
cssLoader->RecycleParser(cssParser);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::ParseDeclaration(const nsAReadableString& aDecl,
|
||||
PRBool aParseOnlyOneDecl,
|
||||
PRBool aClearOldDecl)
|
||||
{
|
||||
nsCOMPtr<nsICSSDeclaration> decl;
|
||||
nsresult result = GetCSSDeclaration(getter_AddRefs(decl), PR_TRUE);
|
||||
|
||||
if (decl) {
|
||||
nsCOMPtr<nsICSSLoader> cssLoader;
|
||||
nsCOMPtr<nsICSSParser> cssParser;
|
||||
nsCOMPtr<nsIURI> baseURI;
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
|
||||
result = mContent->GetDocument(*getter_AddRefs(doc));
|
||||
if (NS_FAILED(result)) {
|
||||
return result;
|
||||
}
|
||||
result = GetCSSParsingEnvironment(mContent,
|
||||
getter_AddRefs(baseURI),
|
||||
getter_AddRefs(cssLoader),
|
||||
getter_AddRefs(cssParser));
|
||||
|
||||
if (NS_SUCCEEDED(result)) {
|
||||
PRInt32 hint;
|
||||
if (doc) {
|
||||
doc->BeginUpdate();
|
||||
|
||||
doc->AttributeWillChange(mContent, kNameSpaceID_None,
|
||||
nsHTMLAtoms::style);
|
||||
}
|
||||
nsCOMPtr<nsICSSDeclaration> declClone;
|
||||
decl->Clone(*getter_AddRefs(declClone));
|
||||
|
||||
if (aClearOldDecl) {
|
||||
// This should be done with decl->Clear() once such a method exists.
|
||||
nsAutoString propName;
|
||||
PRUint32 count, i;
|
||||
|
||||
decl->Count(&count);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
decl->GetNthProperty(0, propName);
|
||||
|
||||
nsCSSProperty prop = nsCSSProps::LookupProperty(propName);
|
||||
nsCSSValue val;
|
||||
|
||||
decl->RemoveProperty(prop, val);
|
||||
}
|
||||
}
|
||||
|
||||
result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl,
|
||||
aParseOnlyOneDecl, &hint);
|
||||
if (result == NS_CSS_PARSER_DROP_DECLARATION) {
|
||||
SetCSSDeclaration(declClone);
|
||||
result = NS_OK;
|
||||
}
|
||||
if (doc) {
|
||||
if (NS_SUCCEEDED(result) && result != NS_CSS_PARSER_DROP_DECLARATION) {
|
||||
doc->AttributeChanged(mContent, kNameSpaceID_None,
|
||||
nsHTMLAtoms::style, nsIDOMMutationEvent::MODIFICATION, hint);
|
||||
}
|
||||
doc->EndUpdate();
|
||||
}
|
||||
if (cssLoader) {
|
||||
cssLoader->RecycleParser(cssParser);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDOMCSSAttributeDeclaration::GetParent(nsISupports **aParent)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aParent);
|
||||
|
||||
*aParent = mContent;
|
||||
NS_IF_ADDREF(*aParent);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
@ -0,0 +1,80 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator client code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef nsDOMCSSAttributeDeclaration_h___
|
||||
#define nsDOMCSSAttributeDeclaration_h___
|
||||
|
||||
#include "nsIDOMCSSStyleDeclaration.h"
|
||||
#include "nsDOMCSSDeclaration.h"
|
||||
|
||||
#include "nsString.h"
|
||||
|
||||
class nsIContent;
|
||||
class nsIHTMLContent;
|
||||
class nsICSSLoader;
|
||||
class nsICSSParser;
|
||||
|
||||
class nsDOMCSSAttributeDeclaration : public nsDOMCSSDeclaration
|
||||
{
|
||||
public:
|
||||
nsDOMCSSAttributeDeclaration(nsIHTMLContent *aContent);
|
||||
~nsDOMCSSAttributeDeclaration();
|
||||
|
||||
NS_IMETHOD RemoveProperty(const nsAReadableString& aPropertyName,
|
||||
nsAWritableString& aReturn);
|
||||
|
||||
virtual void DropReference();
|
||||
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
PRBool aAllocate);
|
||||
virtual nsresult SetCSSDeclaration(nsICSSDeclaration *aDecl);
|
||||
virtual nsresult GetCSSParsingEnvironment(nsIContent* aContent,
|
||||
nsIURI** aBaseURI,
|
||||
nsICSSLoader** aCSSLoader,
|
||||
nsICSSParser** aCSSParser);
|
||||
virtual nsresult ParsePropertyValue(const nsAReadableString& aPropName,
|
||||
const nsAReadableString& aPropValue);
|
||||
virtual nsresult ParseDeclaration(const nsAReadableString& aDecl,
|
||||
PRBool aParseOnlyOneDecl,
|
||||
PRBool aClearOldDecl);
|
||||
virtual nsresult GetParent(nsISupports **aParent);
|
||||
|
||||
protected:
|
||||
nsIHTMLContent *mContent;
|
||||
};
|
||||
|
||||
#endif /* nsDOMCSSAttributeDeclaration_h___ */
|
|
@ -0,0 +1,65 @@
|
|||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
// vim:cindent:ts=8:et:sw=4:
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2001
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* L. David Baron <dbaron@fas.harvard.edu> (original author)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef nsICSSOMFactory_h___
|
||||
#define nsICSSOMFactory_h___
|
||||
|
||||
#include "nsISupports.h"
|
||||
class nsDOMCSSDeclaration;
|
||||
class nsIHTMLContent;
|
||||
|
||||
// bfdd87bd-79c8-4041-ae14-91fa8536ce61
|
||||
#define NS_ICSSOMFACTORY_IID \
|
||||
{ 0xbfdd87bd, 0x79c8, 0x4041, \
|
||||
{0xae, 0x14, 0x91, 0xfa, 0x85, 0x36, 0xce, 0x61 } }
|
||||
|
||||
// 5fcaa2c1-7ca4-4f73-a357-93e79d709376
|
||||
#define NS_CSSOMFACTORY_CID \
|
||||
{ 0x5fcaa2c1, 0x7ca4, 0x4f73, \
|
||||
{0xa3, 0x57, 0x93, 0xe7, 0x9d, 0x70, 0x93, 0x76 } }
|
||||
|
||||
class nsICSSOMFactory : public nsISupports {
|
||||
public:
|
||||
NS_DEFINE_STATIC_IID_ACCESSOR(NS_ICSSOMFACTORY_IID)
|
||||
|
||||
NS_IMETHOD CreateDOMCSSAttributeDeclaration(nsIHTMLContent *aContent,
|
||||
nsDOMCSSDeclaration **aResult) = 0;
|
||||
};
|
||||
|
||||
#endif /* nsICSSOMFactory_h___ */
|
Загрузка…
Ссылка в новой задаче