зеркало из https://github.com/mozilla/gecko-dev.git
Fix the nsIDOMMediaList interface to have the right properties. Make
media rules implement nsIDOMCSSMediaRule. Fix insertRule() to be able to insert into the middle of a rule list. Fix issues with stylesheets not getting dirtied when media lists are modified. bug 93977, r=pierre, sr=jst
This commit is contained in:
Родитель
250ac4cd39
Коммит
a0c586aa4f
|
@ -52,7 +52,7 @@ public:
|
|||
NS_IMETHOD GetType(nsString& aType) const = 0;
|
||||
NS_IMETHOD GetMediumCount(PRInt32& aCount) const = 0;
|
||||
NS_IMETHOD GetMediumAt(PRInt32 aIndex, nsIAtom*& aMedium) const = 0;
|
||||
NS_IMETHOD UseForMedium(nsIAtom* aMedium) const = 0;
|
||||
NS_IMETHOD_(PRBool) UseForMedium(nsIAtom* aMedium) const = 0;
|
||||
|
||||
NS_IMETHOD GetEnabled(PRBool& aEnabled) const = 0;
|
||||
NS_IMETHOD SetEnabled(PRBool aEnabled) = 0;
|
||||
|
|
|
@ -75,6 +75,10 @@ public:
|
|||
PRBool aParseOnlyOneDecl,
|
||||
PRInt32* aHint) = 0;
|
||||
|
||||
NS_IMETHOD ParseRule(nsAReadableString& aRule,
|
||||
nsIURI* aBaseURL,
|
||||
nsIStyleRule** aResult) = 0;
|
||||
|
||||
// Charset management method:
|
||||
// Set the charset before calling any of the Parse emthods if you want the
|
||||
// charset to be anything other than the default
|
||||
|
|
|
@ -24,12 +24,14 @@
|
|||
|
||||
#include "nslayout.h"
|
||||
#include "nsIStyleSheet.h"
|
||||
#include "nsString.h"
|
||||
|
||||
class nsICSSRule;
|
||||
class nsIDOMNode;
|
||||
class nsINameSpace;
|
||||
class nsICSSStyleRuleProcessor;
|
||||
class nsIMediaList;
|
||||
class nsICSSGroupRule;
|
||||
|
||||
// IID for the nsICSSStyleSheet interface {8f83b0f0-b21a-11d1-8031-006008159b5a}
|
||||
#define NS_ICSS_STYLE_SHEET_IID \
|
||||
|
@ -50,6 +52,9 @@ public:
|
|||
NS_IMETHOD StyleRuleCount(PRInt32& aCount) const = 0;
|
||||
NS_IMETHOD GetStyleRuleAt(PRInt32 aIndex, nsICSSRule*& aRule) const = 0;
|
||||
|
||||
NS_IMETHOD DeleteRuleFromGroup(nsICSSGroupRule* aGroup, PRUint32 aIndex) = 0;
|
||||
NS_IMETHOD InsertRuleIntoGroup(nsAReadableString & aRule, nsICSSGroupRule* aGroup, PRUint32 aIndex, PRUint32* _retval) = 0;
|
||||
|
||||
NS_IMETHOD StyleSheetCount(PRInt32& aCount) const = 0;
|
||||
NS_IMETHOD GetStyleSheetAt(PRInt32 aIndex, nsICSSStyleSheet*& aSheet) const = 0;
|
||||
|
||||
|
|
|
@ -31,15 +31,25 @@ class nsIMediaList : public nsISupportsArray {
|
|||
public:
|
||||
static const nsIID& GetIID() { static nsIID iid = NS_IMEDIA_LIST_IID; return iid; }
|
||||
|
||||
NS_IMETHOD GetMediaText(nsAWritableString& aMediaText) = 0;
|
||||
NS_IMETHOD SetMediaText(nsAReadableString& aMediaText) = 0;
|
||||
|
||||
NS_IMETHOD GetText(nsAWritableString& aMediaText) = 0;
|
||||
NS_IMETHOD SetText(nsAReadableString& aMediaText) = 0;
|
||||
NS_IMETHOD MatchesMedium(nsIAtom* aMedium, PRBool* aMatch) = 0;
|
||||
NS_IMETHOD DropReference(void) = 0;
|
||||
};
|
||||
|
||||
/* Use this macro when declaring classes that implement this interface. */
|
||||
#define NS_DECL_NSIMEDIALIST \
|
||||
NS_IMETHOD GetText(nsAWritableString& aMediaText); \
|
||||
NS_IMETHOD SetText(nsAReadableString& aMediaText); \
|
||||
NS_IMETHOD MatchesMedium(nsIAtom* aMedium, PRBool* aMatch); \
|
||||
NS_IMETHOD DropReference(void);
|
||||
|
||||
extern NS_HTML nsresult
|
||||
NS_NewMediaList(nsIMediaList** aInstancePtrResult, const nsAReadableString& aMediaText);
|
||||
NS_NewMediaList(const nsAReadableString& aMediaText, nsIMediaList** aInstancePtrResult);
|
||||
|
||||
extern NS_HTML nsresult
|
||||
NS_NewMediaList(nsIMediaList** aInstancePtrResult);
|
||||
|
||||
extern NS_HTML nsresult
|
||||
NS_NewMediaList(nsISupportsArray* aArray, nsICSSStyleSheet* aSheet, nsIMediaList** aInstancePtrResult);
|
||||
#endif /* nsICSSLoader_h___ */
|
||||
|
|
|
@ -154,6 +154,10 @@ public:
|
|||
PRBool aParseOnlyOneDecl,
|
||||
PRInt32* aHint);
|
||||
|
||||
NS_IMETHOD ParseRule(nsAReadableString& aRule,
|
||||
nsIURI* aBaseURL,
|
||||
nsIStyleRule** aResult);
|
||||
|
||||
NS_IMETHOD GetCharset(/*out*/nsAWritableString &aCharsetDest) const;
|
||||
// sets the out-param to the current charset, as set by SetCharset
|
||||
NS_IMETHOD SetCharset(/*in*/ const nsAReadableString &aCharsetSrc);
|
||||
|
@ -180,18 +184,18 @@ protected:
|
|||
void PopGroup(void);
|
||||
void AppendRule(nsICSSRule* aRule);
|
||||
|
||||
PRBool ParseRuleSet(PRInt32& aErrorCode);
|
||||
PRBool ParseAtRule(PRInt32& aErrorCode);
|
||||
PRBool ParseCharsetRule(PRInt32& aErrorCode);
|
||||
PRBool ParseImportRule(PRInt32& aErrorCode);
|
||||
PRBool ParseRuleSet(PRInt32& aErrorCode, nsIStyleRule** aResult = nsnull);
|
||||
PRBool ParseAtRule(PRInt32& aErrorCode, nsIStyleRule** aResult = nsnull);
|
||||
PRBool ParseCharsetRule(PRInt32& aErrorCode, nsIStyleRule** aResult);
|
||||
PRBool ParseImportRule(PRInt32& aErrorCode, nsIStyleRule** aResult);
|
||||
PRBool GatherMedia(PRInt32& aErrorCode, nsString& aMedia, nsISupportsArray* aMediaAtoms);
|
||||
PRBool ProcessImport(PRInt32& aErrorCode, const nsString& aURLSpec, const nsString& aMedia);
|
||||
PRBool ParseMediaRule(PRInt32& aErrorCode);
|
||||
PRBool ParseNameSpaceRule(PRInt32& aErrorCode);
|
||||
PRBool ProcessImport(PRInt32& aErrorCode, const nsString& aURLSpec, const nsString& aMedia, nsIStyleRule** aResult);
|
||||
PRBool ParseMediaRule(PRInt32& aErrorCode, nsIStyleRule** aResult);
|
||||
PRBool ParseNameSpaceRule(PRInt32& aErrorCode, nsIStyleRule** aResult);
|
||||
PRBool ProcessNameSpace(PRInt32& aErrorCode, const nsString& aPrefix,
|
||||
const nsString& aURLSpec);
|
||||
PRBool ParseFontFaceRule(PRInt32& aErrorCode);
|
||||
PRBool ParsePageRule(PRInt32& aErrorCode);
|
||||
const nsString& aURLSpec, nsIStyleRule** aResult);
|
||||
PRBool ParseFontFaceRule(PRInt32& aErrorCode, nsIStyleRule** aResult);
|
||||
PRBool ParsePageRule(PRInt32& aErrorCode, nsIStyleRule** aResult);
|
||||
|
||||
void ParseIDSelector(PRInt32& aDataMask, nsCSSSelector& aSelector,
|
||||
PRInt32& aParsingStatus, PRInt32& aErrorCode);
|
||||
|
@ -677,6 +681,49 @@ CSSParserImpl::ParseAndAppendDeclaration(const nsAReadableString& aBuffer,
|
|||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSParserImpl::ParseRule(nsAReadableString& aRule,
|
||||
nsIURI* aBaseURL,
|
||||
nsIStyleRule** aResult)
|
||||
{
|
||||
NS_ASSERTION(nsnull != aBaseURL, "need base URL");
|
||||
NS_ENSURE_ARG_POINTER(aResult);
|
||||
*aResult = nsnull;
|
||||
|
||||
nsString* str = new nsString(aRule);
|
||||
if (nsnull == str) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
nsCOMPtr<nsIUnicharInputStream> input = nsnull;
|
||||
nsresult rv = NS_NewStringUnicharInputStream(getter_AddRefs(input), str);
|
||||
if (NS_OK != rv) {
|
||||
delete str;
|
||||
return rv;
|
||||
}
|
||||
|
||||
rv = InitScanner(input, aBaseURL);
|
||||
if (! NS_SUCCEEDED(rv)) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
mSection = eCSSSection_Charset; // callers are responsible for rejecting invalid rules. Maybe pass in the previous rule to this method?
|
||||
PRInt32 errorCode = NS_OK;
|
||||
|
||||
nsCSSToken* tk = &mToken;
|
||||
// Get first non-whitespace token
|
||||
if (!GetToken(errorCode, PR_TRUE)) {
|
||||
OUTPUT_ERROR();
|
||||
} else if (eCSSToken_AtKeyword == tk->mType) {
|
||||
ParseAtRule(errorCode, aResult);
|
||||
}
|
||||
else {
|
||||
UngetToken();
|
||||
ParseRuleSet(errorCode, aResult);
|
||||
}
|
||||
ReleaseScanner();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
PRBool CSSParserImpl::GetToken(PRInt32& aErrorCode, PRBool aSkipWS)
|
||||
|
@ -790,43 +837,43 @@ PRBool CSSParserImpl::SkipAtRule(PRInt32& aErrorCode)
|
|||
return PR_TRUE;
|
||||
}
|
||||
|
||||
PRBool CSSParserImpl::ParseAtRule(PRInt32& aErrorCode)
|
||||
PRBool CSSParserImpl::ParseAtRule(PRInt32& aErrorCode, nsIStyleRule** aResult)
|
||||
{
|
||||
if ((mSection <= eCSSSection_Charset) &&
|
||||
(mToken.mIdent.EqualsIgnoreCase("charset"))) {
|
||||
if (ParseCharsetRule(aErrorCode)) {
|
||||
if (ParseCharsetRule(aErrorCode, aResult)) {
|
||||
mSection = eCSSSection_Import; // only one charset allowed
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
if ((mSection <= eCSSSection_Import) &&
|
||||
mToken.mIdent.EqualsIgnoreCase("import")) {
|
||||
if (ParseImportRule(aErrorCode)) {
|
||||
if (ParseImportRule(aErrorCode, aResult)) {
|
||||
mSection = eCSSSection_Import;
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
if ((mSection <= eCSSSection_NameSpace) &&
|
||||
mToken.mIdent.EqualsIgnoreCase("namespace")) {
|
||||
if (ParseNameSpaceRule(aErrorCode)) {
|
||||
if (ParseNameSpaceRule(aErrorCode, aResult)) {
|
||||
mSection = eCSSSection_NameSpace;
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
if (mToken.mIdent.EqualsIgnoreCase("media")) {
|
||||
if (ParseMediaRule(aErrorCode)) {
|
||||
if (ParseMediaRule(aErrorCode, aResult)) {
|
||||
mSection = eCSSSection_General;
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
if (mToken.mIdent.EqualsIgnoreCase("font-face")) {
|
||||
if (ParseFontFaceRule(aErrorCode)) {
|
||||
if (ParseFontFaceRule(aErrorCode, aResult)) {
|
||||
mSection = eCSSSection_General;
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
if (mToken.mIdent.EqualsIgnoreCase("page")) {
|
||||
if (ParsePageRule(aErrorCode)) {
|
||||
if (ParsePageRule(aErrorCode, aResult)) {
|
||||
mSection = eCSSSection_General;
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
@ -839,7 +886,7 @@ PRBool CSSParserImpl::ParseAtRule(PRInt32& aErrorCode)
|
|||
return SkipAtRule(aErrorCode);
|
||||
}
|
||||
|
||||
PRBool CSSParserImpl::ParseCharsetRule(PRInt32& aErrorCode)
|
||||
PRBool CSSParserImpl::ParseCharsetRule(PRInt32& aErrorCode, nsIStyleRule** aResult)
|
||||
{
|
||||
// XXX not yet implemented
|
||||
return PR_FALSE;
|
||||
|
@ -914,7 +961,7 @@ PRBool CSSParserImpl::GatherMedia(PRInt32& aErrorCode, nsString& aMedia,
|
|||
}
|
||||
|
||||
// Parse a CSS2 import rule: "@import STRING | URL [medium [, mdeium]]"
|
||||
PRBool CSSParserImpl::ParseImportRule(PRInt32& aErrorCode)
|
||||
PRBool CSSParserImpl::ParseImportRule(PRInt32& aErrorCode, nsIStyleRule** aResult)
|
||||
{
|
||||
if (!GetToken(aErrorCode, PR_TRUE)) {
|
||||
REPORT_UNEXPECTED_EOF();
|
||||
|
@ -927,7 +974,7 @@ PRBool CSSParserImpl::ParseImportRule(PRInt32& aErrorCode)
|
|||
url = mToken.mIdent;
|
||||
if (GatherMedia(aErrorCode, media, nsnull)) {
|
||||
if (ExpectSymbol(aErrorCode, ';', PR_TRUE)) {
|
||||
ProcessImport(aErrorCode, url, media);
|
||||
ProcessImport(aErrorCode, url, media, aResult);
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
|
@ -941,7 +988,7 @@ PRBool CSSParserImpl::ParseImportRule(PRInt32& aErrorCode)
|
|||
if (ExpectSymbol(aErrorCode, ')', PR_TRUE)) {
|
||||
if (GatherMedia(aErrorCode, media, nsnull)) {
|
||||
if (ExpectSymbol(aErrorCode, ';', PR_TRUE)) {
|
||||
ProcessImport(aErrorCode, url, media);
|
||||
ProcessImport(aErrorCode, url, media, aResult);
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
|
@ -957,12 +1004,18 @@ PRBool CSSParserImpl::ParseImportRule(PRInt32& aErrorCode)
|
|||
}
|
||||
|
||||
|
||||
PRBool CSSParserImpl::ProcessImport(PRInt32& aErrorCode, const nsString& aURLSpec, const nsString& aMedia)
|
||||
PRBool CSSParserImpl::ProcessImport(PRInt32& aErrorCode, const nsString& aURLSpec, const nsString& aMedia, nsIStyleRule** aResult)
|
||||
{
|
||||
nsCOMPtr<nsICSSImportRule> rule;
|
||||
NS_NewCSSImportRule(getter_AddRefs(rule), aURLSpec, aMedia);
|
||||
if (rule) {
|
||||
AppendRule(rule);
|
||||
if (aResult) { // someone wants this rule
|
||||
*aResult = rule;
|
||||
NS_ADDREF(*aResult);
|
||||
}
|
||||
else {
|
||||
AppendRule(rule);
|
||||
}
|
||||
}
|
||||
|
||||
if (mChildLoader) {
|
||||
|
@ -989,18 +1042,18 @@ PRBool CSSParserImpl::ProcessImport(PRInt32& aErrorCode, const nsString& aURLSpe
|
|||
}
|
||||
|
||||
// Parse a CSS2 media rule: "@media medium [, medium] { ... }"
|
||||
PRBool CSSParserImpl::ParseMediaRule(PRInt32& aErrorCode)
|
||||
PRBool CSSParserImpl::ParseMediaRule(PRInt32& aErrorCode, nsIStyleRule** aResult)
|
||||
{
|
||||
nsAutoString mediaStr;
|
||||
nsISupportsArray* media = nsnull;
|
||||
NS_NewISupportsArray(&media);
|
||||
nsCOMPtr<nsISupportsArray> media;
|
||||
NS_NewISupportsArray(getter_AddRefs(media));
|
||||
if (media) {
|
||||
if (GatherMedia(aErrorCode, mediaStr, media)) {
|
||||
if ((0 < mediaStr.Length()) &&
|
||||
ExpectSymbol(aErrorCode, '{', PR_TRUE)) {
|
||||
// push media rule on stack, loop over children
|
||||
nsICSSMediaRule* rule = nsnull;
|
||||
NS_NewCSSMediaRule(&rule);
|
||||
nsCOMPtr<nsICSSMediaRule> rule;
|
||||
NS_NewCSSMediaRule(getter_AddRefs(rule));
|
||||
if (rule) {
|
||||
if (PushGroup(rule)) {
|
||||
|
||||
|
@ -1027,29 +1080,34 @@ PRBool CSSParserImpl::ParseMediaRule(PRInt32& aErrorCode)
|
|||
PopGroup();
|
||||
|
||||
if (ExpectSymbol(aErrorCode, '}', PR_TRUE)) {
|
||||
rule->SetMedia(media);
|
||||
AppendRule(rule);
|
||||
NS_RELEASE(rule);
|
||||
NS_RELEASE(media);
|
||||
if (aResult) { // someone wants this rule
|
||||
rule->SetMedia(media);
|
||||
*aResult = rule;
|
||||
NS_ADDREF(*aResult);
|
||||
}
|
||||
else {
|
||||
// Append first, so when we do SetMedia() the rule
|
||||
// knows what its stylesheet is.
|
||||
AppendRule(rule);
|
||||
rule->SetMedia(media);
|
||||
}
|
||||
return PR_TRUE;
|
||||
}
|
||||
mSection = holdSection;
|
||||
}
|
||||
NS_RELEASE(rule);
|
||||
}
|
||||
else { // failed to create rule, backup and skip block
|
||||
UngetToken();
|
||||
}
|
||||
}
|
||||
}
|
||||
NS_RELEASE(media);
|
||||
}
|
||||
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
// Parse a CSS3 namespace rule: "@namespace [prefix] STRING | URL;"
|
||||
PRBool CSSParserImpl::ParseNameSpaceRule(PRInt32& aErrorCode)
|
||||
PRBool CSSParserImpl::ParseNameSpaceRule(PRInt32& aErrorCode, nsIStyleRule** aResult)
|
||||
{
|
||||
if (!GetToken(aErrorCode, PR_TRUE)) {
|
||||
REPORT_UNEXPECTED_EOF();
|
||||
|
@ -1071,7 +1129,7 @@ PRBool CSSParserImpl::ParseNameSpaceRule(PRInt32& aErrorCode)
|
|||
if (eCSSToken_String == mToken.mType) {
|
||||
url = mToken.mIdent;
|
||||
if (ExpectSymbol(aErrorCode, ';', PR_TRUE)) {
|
||||
ProcessNameSpace(aErrorCode, prefix, url);
|
||||
ProcessNameSpace(aErrorCode, prefix, url, aResult);
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
|
@ -1083,7 +1141,7 @@ PRBool CSSParserImpl::ParseNameSpaceRule(PRInt32& aErrorCode)
|
|||
url = mToken.mIdent;
|
||||
if (ExpectSymbol(aErrorCode, ')', PR_TRUE)) {
|
||||
if (ExpectSymbol(aErrorCode, ';', PR_TRUE)) {
|
||||
ProcessNameSpace(aErrorCode, prefix, url);
|
||||
ProcessNameSpace(aErrorCode, prefix, url, aResult);
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
|
@ -1098,36 +1156,40 @@ PRBool CSSParserImpl::ParseNameSpaceRule(PRInt32& aErrorCode)
|
|||
}
|
||||
|
||||
PRBool CSSParserImpl::ProcessNameSpace(PRInt32& aErrorCode, const nsString& aPrefix,
|
||||
const nsString& aURLSpec)
|
||||
const nsString& aURLSpec, nsIStyleRule** aResult)
|
||||
{
|
||||
PRBool result = PR_FALSE;
|
||||
|
||||
nsICSSNameSpaceRule* rule = nsnull;
|
||||
nsIAtom* prefix = nsnull;
|
||||
nsCOMPtr<nsICSSNameSpaceRule> rule;
|
||||
nsCOMPtr<nsIAtom> prefix;
|
||||
|
||||
if (0 < aPrefix.Length()) {
|
||||
prefix = NS_NewAtom(aPrefix);
|
||||
prefix = dont_AddRef(NS_NewAtom(aPrefix));
|
||||
}
|
||||
|
||||
NS_NewCSSNameSpaceRule(&rule, prefix, aURLSpec);
|
||||
NS_NewCSSNameSpaceRule(getter_AddRefs(rule), prefix, aURLSpec);
|
||||
if (rule) {
|
||||
AppendRule(rule);
|
||||
NS_RELEASE(rule);
|
||||
NS_IF_RELEASE(mNameSpace);
|
||||
mSheet->GetNameSpace(mNameSpace);
|
||||
if (aResult) { // someone wants this rule
|
||||
*aResult = rule;
|
||||
NS_ADDREF(*aResult);
|
||||
}
|
||||
else {
|
||||
AppendRule(rule);
|
||||
NS_IF_RELEASE(mNameSpace);
|
||||
mSheet->GetNameSpace(mNameSpace);
|
||||
}
|
||||
}
|
||||
|
||||
NS_IF_RELEASE(prefix);
|
||||
return result;
|
||||
}
|
||||
|
||||
PRBool CSSParserImpl::ParseFontFaceRule(PRInt32& aErrorCode)
|
||||
PRBool CSSParserImpl::ParseFontFaceRule(PRInt32& aErrorCode, nsIStyleRule** aResult)
|
||||
{
|
||||
// XXX not yet implemented
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
PRBool CSSParserImpl::ParsePageRule(PRInt32& aErrorCode)
|
||||
PRBool CSSParserImpl::ParsePageRule(PRInt32& aErrorCode, nsIStyleRule** aResult)
|
||||
{
|
||||
// XXX not yet implemented
|
||||
return PR_FALSE;
|
||||
|
@ -1251,7 +1313,7 @@ void CSSParserImpl::AppendRule(nsICSSRule* aRule)
|
|||
}
|
||||
}
|
||||
|
||||
PRBool CSSParserImpl::ParseRuleSet(PRInt32& aErrorCode)
|
||||
PRBool CSSParserImpl::ParseRuleSet(PRInt32& aErrorCode, nsIStyleRule** aResult)
|
||||
{
|
||||
// First get the list of selectors for the rule
|
||||
SelectorList* slist = nsnull;
|
||||
|
@ -1299,7 +1361,13 @@ PRBool CSSParserImpl::ParseRuleSet(PRInt32& aErrorCode)
|
|||
rule->SetDeclaration(declaration);
|
||||
rule->SetWeight(list->mWeight);
|
||||
// rule->List();
|
||||
AppendRule(rule);
|
||||
if (aResult) { // someone wants this rule back; don't append it
|
||||
*aResult = rule;
|
||||
NS_ADDREF(*aResult);
|
||||
}
|
||||
else {
|
||||
AppendRule(rule);
|
||||
}
|
||||
NS_RELEASE(rule);
|
||||
}
|
||||
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Boris Zbarsky <bzbarsky@mit.edu>
|
||||
*
|
||||
*/
|
||||
#include "nsICSSCharsetRule.h"
|
||||
#include "nsICSSImportRule.h"
|
||||
|
@ -39,11 +41,16 @@
|
|||
#include "nsIDOMCSSStyleSheet.h"
|
||||
#include "nsIDOMCSSRule.h"
|
||||
#include "nsIDOMCSSImportRule.h"
|
||||
#include "nsIDOMCSSMediaRule.h"
|
||||
#include "nsIMediaList.h"
|
||||
#include "nsIDOMMediaList.h"
|
||||
#include "nsIDOMCSSRuleList.h"
|
||||
#include "nsIDOMStyleSheet.h"
|
||||
#include "nsIDocument.h"
|
||||
|
||||
#include "nsContentUtils.h"
|
||||
#include "nsStyleConsts.h"
|
||||
#include "nsDOMError.h"
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
|
||||
|
@ -64,6 +71,84 @@ NS_IMETHODIMP _class::GetStyleSheet(nsIStyleSheet*& aSheet) const { return super
|
|||
NS_IMETHODIMP _class::GetStrength(PRInt32& aStrength) const { return super::GetStrength(aStrength); } \
|
||||
NS_IMETHODIMP _class::MapRuleInfoInto(nsRuleData* aRuleData) { return NS_OK; }
|
||||
|
||||
// -------------------------------
|
||||
// Style Rule List for group rules
|
||||
//
|
||||
class CSSGroupRuleRuleListImpl : public nsIDOMCSSRuleList
|
||||
{
|
||||
public:
|
||||
CSSGroupRuleRuleListImpl(nsICSSGroupRule *aGroupRule);
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_DECL_NSIDOMCSSRULELIST
|
||||
|
||||
void DropReference() { mGroupRule = nsnull; }
|
||||
|
||||
protected:
|
||||
virtual ~CSSGroupRuleRuleListImpl(void);
|
||||
|
||||
private:
|
||||
nsICSSGroupRule* mGroupRule;
|
||||
};
|
||||
|
||||
CSSGroupRuleRuleListImpl::CSSGroupRuleRuleListImpl(nsICSSGroupRule *aGroupRule)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
// Not reference counted to avoid circular references.
|
||||
// The rule will tell us when its going away.
|
||||
mGroupRule = aGroupRule;
|
||||
}
|
||||
|
||||
CSSGroupRuleRuleListImpl::~CSSGroupRuleRuleListImpl()
|
||||
{
|
||||
}
|
||||
|
||||
// QueryInterface implementation for CSSGroupRuleRuleList
|
||||
NS_INTERFACE_MAP_BEGIN(CSSGroupRuleRuleListImpl)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSRuleList)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISupports)
|
||||
NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(CSSGroupRuleRuleList)
|
||||
NS_INTERFACE_MAP_END
|
||||
|
||||
|
||||
NS_IMPL_ADDREF(CSSGroupRuleRuleListImpl);
|
||||
NS_IMPL_RELEASE(CSSGroupRuleRuleListImpl);
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSGroupRuleRuleListImpl::GetLength(PRUint32* aLength)
|
||||
{
|
||||
if (mGroupRule) {
|
||||
PRInt32 count;
|
||||
mGroupRule->StyleRuleCount(count);
|
||||
*aLength = (PRUint32)count;
|
||||
} else {
|
||||
*aLength = 0;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSGroupRuleRuleListImpl::Item(PRUint32 aIndex, nsIDOMCSSRule** aReturn)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
|
||||
*aReturn = nsnull;
|
||||
if (mGroupRule) {
|
||||
nsCOMPtr<nsICSSRule> rule;
|
||||
|
||||
result = mGroupRule->GetStyleRuleAt(aIndex, *getter_AddRefs(rule));
|
||||
if (rule) {
|
||||
result = CallQueryInterface(rule, aReturn);
|
||||
} else if (result == NS_ERROR_ILLEGAL_VALUE) {
|
||||
result = NS_OK; // per spec: "Return Value ... null if ... not a valid index."
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// -------------------------------------------
|
||||
// nsICSSCharsetRule
|
||||
//
|
||||
|
@ -374,7 +459,7 @@ CSSImportRuleImpl::List(FILE* out, PRInt32 aIndent) const
|
|||
fputs("\" ", out);
|
||||
|
||||
nsAutoString mediaText;
|
||||
mMedia->GetMediaText(mediaText);
|
||||
mMedia->GetText(mediaText);
|
||||
fputs(mediaText, out);
|
||||
fputs("\n", out);
|
||||
|
||||
|
@ -456,7 +541,7 @@ NS_IMETHODIMP
|
|||
CSSImportRuleImpl::SetMedia(const nsString& aMedia)
|
||||
{
|
||||
if (mMedia) {
|
||||
return mMedia->SetMediaText(aMedia);
|
||||
return mMedia->SetText(aMedia);
|
||||
} else {
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -466,7 +551,7 @@ NS_IMETHODIMP
|
|||
CSSImportRuleImpl::GetMedia(nsString& aMedia) const
|
||||
{
|
||||
if (mMedia) {
|
||||
return mMedia->GetMediaText(aMedia);
|
||||
return mMedia->GetText(aMedia);
|
||||
} else {
|
||||
aMedia.Truncate();
|
||||
return NS_OK;
|
||||
|
@ -527,7 +612,7 @@ CSSImportRuleImpl::GetCssText(nsAWritableString& aCssText)
|
|||
aCssText.Append(NS_LITERAL_STRING(")"));
|
||||
if (mMedia) {
|
||||
nsAutoString mediaText;
|
||||
mMedia->GetMediaText(mediaText);
|
||||
mMedia->GetText(mediaText);
|
||||
if (!mediaText.IsEmpty()) {
|
||||
aCssText.Append(NS_LITERAL_STRING(" "));
|
||||
aCssText.Append(mediaText);
|
||||
|
@ -596,7 +681,7 @@ CSSImportRuleImpl::GetStyleSheet(nsIDOMCSSStyleSheet * *aStyleSheet)
|
|||
//
|
||||
class CSSMediaRuleImpl : public nsCSSRule,
|
||||
public nsICSSMediaRule,
|
||||
public nsIDOMCSSRule
|
||||
public nsIDOMCSSMediaRule
|
||||
{
|
||||
public:
|
||||
CSSMediaRuleImpl(void);
|
||||
|
@ -618,27 +703,33 @@ public:
|
|||
|
||||
// nsICSSMediaRule methods
|
||||
NS_IMETHOD SetMedia(nsISupportsArray* aMedia);
|
||||
NS_IMETHOD UseForMedium(nsIAtom* aMedium) const;
|
||||
NS_IMETHOD_(PRBool) UseForMedium(nsIAtom* aMedium) const;
|
||||
|
||||
// nsICSSGroupRule methods
|
||||
NS_IMETHOD AppendStyleRule(nsICSSRule* aRule);
|
||||
|
||||
NS_IMETHOD StyleRuleCount(PRInt32& aCount) const;
|
||||
NS_IMETHOD GetStyleRuleAt(PRInt32 aIndex, nsICSSRule*& aRule) const;
|
||||
|
||||
NS_IMETHOD EnumerateRulesForwards(nsISupportsArrayEnumFunc aFunc, void * aData) const;
|
||||
|
||||
NS_IMETHOD DeleteStyleRuleAt(PRUint32 aIndex);
|
||||
NS_IMETHOD InsertStyleRuleAt(PRUint32 aIndex, nsICSSRule* aRule);
|
||||
|
||||
// nsIDOMCSSRule interface
|
||||
NS_DECL_NSIDOMCSSRULE
|
||||
|
||||
// nsIDOMCSSMediaRule interface
|
||||
NS_DECL_NSIDOMCSSMEDIARULE
|
||||
|
||||
protected:
|
||||
nsISupportsArray* mMedia;
|
||||
nsCOMPtr<nsIMediaList> mMedia;
|
||||
nsISupportsArray* mRules;
|
||||
CSSGroupRuleRuleListImpl* mRuleCollection;
|
||||
};
|
||||
|
||||
CSSMediaRuleImpl::CSSMediaRuleImpl(void)
|
||||
: nsCSSRule(),
|
||||
mMedia(nsnull),
|
||||
mRules(nsnull)
|
||||
mRules(nsnull),
|
||||
mRuleCollection(nsnull)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -659,13 +750,11 @@ CloneRuleInto(nsISupports* aRule, void* aArray)
|
|||
CSSMediaRuleImpl::CSSMediaRuleImpl(const CSSMediaRuleImpl& aCopy)
|
||||
: nsCSSRule(aCopy),
|
||||
mMedia(nsnull),
|
||||
mRules(nsnull)
|
||||
mRules(nsnull),
|
||||
mRuleCollection(nsnull)
|
||||
{
|
||||
if (aCopy.mMedia) {
|
||||
NS_NewISupportsArray(&mMedia);
|
||||
if (mMedia) {
|
||||
mMedia->AppendElements(aCopy.mMedia);
|
||||
}
|
||||
NS_NewMediaList(aCopy.mMedia, aCopy.mSheet, getter_AddRefs(mMedia));
|
||||
}
|
||||
|
||||
if (aCopy.mRules) {
|
||||
|
@ -678,8 +767,14 @@ CSSMediaRuleImpl::CSSMediaRuleImpl(const CSSMediaRuleImpl& aCopy)
|
|||
|
||||
CSSMediaRuleImpl::~CSSMediaRuleImpl(void)
|
||||
{
|
||||
NS_IF_RELEASE(mMedia);
|
||||
NS_IF_RELEASE(mRules);
|
||||
if (mMedia) {
|
||||
mMedia->DropReference();
|
||||
}
|
||||
if (mRuleCollection) {
|
||||
mRuleCollection->DropReference();
|
||||
NS_RELEASE(mRuleCollection);
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMPL_ADDREF_INHERITED(CSSMediaRuleImpl, nsCSSRule);
|
||||
|
@ -691,6 +786,7 @@ NS_INTERFACE_MAP_BEGIN(CSSMediaRuleImpl)
|
|||
NS_INTERFACE_MAP_ENTRY(nsICSSRule)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIStyleRule)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSRule)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSMediaRule)
|
||||
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsICSSMediaRule)
|
||||
NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(CSSMediaRule)
|
||||
NS_INTERFACE_MAP_END
|
||||
|
@ -712,6 +808,17 @@ CSSMediaRuleImpl::SetStyleSheet(nsICSSStyleSheet* aSheet)
|
|||
if (mRules) {
|
||||
mRules->EnumerateForwards(SetStyleSheetReference, aSheet);
|
||||
}
|
||||
if (mMedia) {
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsISupportsArray> oldMedia(do_QueryInterface(mMedia, &rv));
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
mMedia->DropReference();
|
||||
rv = NS_NewMediaList(oldMedia, aSheet, getter_AddRefs(mMedia));
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
}
|
||||
|
||||
return nsCSSRule::SetStyleSheet(aSheet);
|
||||
}
|
||||
|
||||
|
@ -729,13 +836,13 @@ CSSMediaRuleImpl::List(FILE* out, PRInt32 aIndent) const
|
|||
PRUint32 count;
|
||||
mMedia->Count(&count);
|
||||
while (index < count) {
|
||||
nsIAtom* medium = (nsIAtom*)mMedia->ElementAt(index++);
|
||||
nsCOMPtr<nsIAtom> medium;
|
||||
mMedia->QueryElementAt(index++, NS_GET_IID(nsIAtom), getter_AddRefs(medium));
|
||||
medium->ToString(buffer);
|
||||
fputs(buffer, out);
|
||||
if (index < count) {
|
||||
fputs(", ", out);
|
||||
}
|
||||
NS_RELEASE(medium);
|
||||
}
|
||||
}
|
||||
fputs(" {\n", out);
|
||||
|
@ -745,9 +852,9 @@ CSSMediaRuleImpl::List(FILE* out, PRInt32 aIndent) const
|
|||
PRUint32 count;
|
||||
mRules->Count(&count);
|
||||
while (index < count) {
|
||||
nsICSSRule* rule = (nsICSSRule*)mRules->ElementAt(index++);
|
||||
nsCOMPtr<nsICSSRule> rule;
|
||||
mRules->QueryElementAt(index++, NS_GET_IID(nsICSSRule), getter_AddRefs(rule));
|
||||
rule->List(out, aIndent + 1);
|
||||
NS_RELEASE(rule);
|
||||
}
|
||||
}
|
||||
fputs("}\n", out);
|
||||
|
@ -791,12 +898,12 @@ void CSSMediaRuleImpl::SizeOf(nsISizeOfHandler *aSizeOfHandler, PRUint32 &aSize)
|
|||
PRUint32 count;
|
||||
mMedia->Count(&count);
|
||||
while (index < count) {
|
||||
nsIAtom* medium = (nsIAtom*)mMedia->ElementAt(index++);
|
||||
nsCOMPtr<nsIAtom> medium;
|
||||
mMedia->QueryElementAt(index++, NS_GET_IID(nsIAtom), getter_AddRefs(medium));
|
||||
if(medium && uniqueItems->AddItem(medium)){
|
||||
medium->SizeOf(aSizeOfHandler, &localSize);
|
||||
aSize += localSize;
|
||||
}
|
||||
NS_IF_RELEASE(medium);
|
||||
}
|
||||
}
|
||||
// we are done with the size we report for ourself
|
||||
|
@ -808,9 +915,9 @@ void CSSMediaRuleImpl::SizeOf(nsISizeOfHandler *aSizeOfHandler, PRUint32 &aSize)
|
|||
PRUint32 count;
|
||||
mRules->Count(&count);
|
||||
while (index < count) {
|
||||
nsICSSRule* rule = (nsICSSRule*)mRules->ElementAt(index++);
|
||||
nsCOMPtr<nsICSSRule> rule;
|
||||
mRules->QueryElementAt(index++, NS_GET_IID(nsICSSRule), getter_AddRefs(rule));
|
||||
rule->SizeOf(aSizeOfHandler, localSize);
|
||||
NS_RELEASE(rule);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -837,26 +944,18 @@ CSSMediaRuleImpl::Clone(nsICSSRule*& aClone) const
|
|||
NS_IMETHODIMP
|
||||
CSSMediaRuleImpl::SetMedia(nsISupportsArray* aMedia)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
NS_IF_RELEASE(mMedia);
|
||||
mMedia = aMedia;
|
||||
NS_IF_ADDREF(mMedia);
|
||||
return result;
|
||||
return NS_NewMediaList(aMedia, mSheet, getter_AddRefs(mMedia));
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
NS_IMETHODIMP_(PRBool)
|
||||
CSSMediaRuleImpl::UseForMedium(nsIAtom* aMedium) const
|
||||
{
|
||||
if (mMedia) {
|
||||
if (-1 != mMedia->IndexOf(aMedium)) {
|
||||
return NS_OK;
|
||||
}
|
||||
if (-1 != mMedia->IndexOf(nsLayoutAtoms::all)) {
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_COMFALSE;
|
||||
PRBool matches = PR_FALSE;
|
||||
mMedia->MatchesMedium(aMedium, &matches);
|
||||
return matches;
|
||||
}
|
||||
return NS_OK;
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -894,10 +993,17 @@ NS_IMETHODIMP
|
|||
CSSMediaRuleImpl::GetStyleRuleAt(PRInt32 aIndex, nsICSSRule*& aRule) const
|
||||
{
|
||||
if (mRules) {
|
||||
PRInt32 count = 0;
|
||||
nsresult rv = StyleRuleCount(count);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
if (aIndex >= count) {
|
||||
aRule = nsnull;
|
||||
return NS_ERROR_ILLEGAL_VALUE;
|
||||
}
|
||||
aRule = (nsICSSRule*)mRules->ElementAt(aIndex);
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
return NS_ERROR_ILLEGAL_VALUE;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -909,6 +1015,37 @@ CSSMediaRuleImpl::EnumerateRulesForwards(nsISupportsArrayEnumFunc aFunc, void *
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* The next two methods (DeleteStyleRuleAt and InsertStyleRuleAt)
|
||||
* should never be called unless you have first called WillDirty() on
|
||||
* the parents tylesheet. After they are called, DidDirty() needs to
|
||||
* be called on the sheet
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
CSSMediaRuleImpl::DeleteStyleRuleAt(PRUint32 aIndex)
|
||||
{
|
||||
NS_ENSURE_TRUE(mRules, NS_ERROR_FAILURE);
|
||||
|
||||
nsCOMPtr<nsICSSRule> rule;
|
||||
nsresult rv = mRules->QueryElementAt(aIndex, NS_GET_IID(nsICSSRule), getter_AddRefs(rule));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rule->SetStyleSheet(nsnull);
|
||||
return mRules->DeleteElementAt(aIndex);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSMediaRuleImpl::InsertStyleRuleAt(PRUint32 aIndex, nsICSSRule* aRule)
|
||||
{
|
||||
NS_ENSURE_TRUE(mRules, NS_ERROR_FAILURE);
|
||||
|
||||
// There is no xpcom-compatible version of InsertElementAt.... :(
|
||||
if (! mRules->InsertElementAt(aRule, aIndex)) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
aRule->SetStyleSheet(mSheet);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
nsresult
|
||||
NS_NewCSSMediaRule(nsICSSMediaRule** aInstancePtrResult)
|
||||
|
@ -926,6 +1063,7 @@ NS_NewCSSMediaRule(nsICSSMediaRule** aInstancePtrResult)
|
|||
return it->QueryInterface(NS_GET_IID(nsICSSMediaRule), (void **) aInstancePtrResult);
|
||||
}
|
||||
|
||||
// nsIDOMCSSRule methods
|
||||
NS_IMETHODIMP
|
||||
CSSMediaRuleImpl::GetType(PRUint16* aType)
|
||||
{
|
||||
|
@ -943,7 +1081,8 @@ CSSMediaRuleImpl::GetCssText(nsAWritableString& aCssText)
|
|||
if (mMedia) {
|
||||
mMedia->Count(&count);
|
||||
for (index = 0; index < count; index++) {
|
||||
nsCOMPtr<nsIAtom> medium (do_QueryInterface(mMedia->ElementAt(index)));
|
||||
nsCOMPtr<nsIAtom> medium;
|
||||
mMedia->QueryElementAt(index, NS_GET_IID(nsIAtom), getter_AddRefs(medium));
|
||||
if (medium) {
|
||||
nsAutoString tempString;
|
||||
if (index > 0)
|
||||
|
@ -960,7 +1099,8 @@ CSSMediaRuleImpl::GetCssText(nsAWritableString& aCssText)
|
|||
if (mRules) {
|
||||
mRules->Count(&count);
|
||||
for (index = 0; index < count; index++) {
|
||||
nsCOMPtr<nsIDOMCSSRule> rule (do_QueryInterface(mRules->ElementAt(index)));
|
||||
nsCOMPtr<nsIDOMCSSRule> rule;
|
||||
mRules->QueryElementAt(index, NS_GET_IID(nsIDOMCSSRule), getter_AddRefs(rule));
|
||||
if (rule) {
|
||||
nsAutoString tempString;
|
||||
rule->GetCssText(tempString);
|
||||
|
@ -998,6 +1138,60 @@ CSSMediaRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule)
|
|||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
// nsIDOMCSSMediaRule methods
|
||||
NS_IMETHODIMP
|
||||
CSSMediaRuleImpl::GetMedia(nsIDOMMediaList* *aMedia)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aMedia);
|
||||
if (!mMedia) {
|
||||
*aMedia = nsnull;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
return CallQueryInterface(mMedia, aMedia);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSMediaRuleImpl::GetCssRules(nsIDOMCSSRuleList* *aRuleList)
|
||||
{
|
||||
if (!mRuleCollection) {
|
||||
mRuleCollection = new CSSGroupRuleRuleListImpl(this);
|
||||
if (!mRuleCollection) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
NS_ADDREF(mRuleCollection);
|
||||
}
|
||||
|
||||
return CallQueryInterface(mRuleCollection, aRuleList);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSMediaRuleImpl::InsertRule(nsAReadableString & aRule, PRUint32 aIndex, PRUint32* _retval)
|
||||
{
|
||||
NS_ENSURE_TRUE(mSheet, NS_ERROR_FAILURE);
|
||||
NS_ENSURE_TRUE(mRules, NS_ERROR_FAILURE);
|
||||
|
||||
PRUint32 count;
|
||||
mRules->Count(&count);
|
||||
if (aIndex > count)
|
||||
return NS_ERROR_DOM_INDEX_SIZE_ERR;
|
||||
|
||||
return mSheet->InsertRuleIntoGroup(aRule, this, aIndex, _retval);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSMediaRuleImpl::DeleteRule(PRUint32 aIndex)
|
||||
{
|
||||
NS_ENSURE_TRUE(mSheet, NS_ERROR_FAILURE);
|
||||
NS_ENSURE_TRUE(mRules, NS_ERROR_FAILURE);
|
||||
|
||||
PRUint32 count;
|
||||
mRules->Count(&count);
|
||||
if (aIndex >= count)
|
||||
return NS_ERROR_DOM_INDEX_SIZE_ERR;
|
||||
|
||||
return mSheet->DeleteRuleFromGroup(this, aIndex);
|
||||
}
|
||||
|
||||
// -------------------------------------------
|
||||
// nsICSSNameSpaceRule
|
||||
|
@ -1251,3 +1445,4 @@ CSSNameSpaceRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule)
|
|||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include "nsIMediaList.h"
|
||||
#include "nsIHTMLContent.h"
|
||||
#include "nsIDocument.h"
|
||||
#include "nsIHTMLContentContainer.h"
|
||||
#include "nsIPresContext.h"
|
||||
#include "nsIEventStateManager.h"
|
||||
#include "nsHTMLAtoms.h"
|
||||
|
@ -61,6 +62,7 @@
|
|||
#include "nsDOMError.h"
|
||||
#include "nsIPresShell.h"
|
||||
#include "nsICSSParser.h"
|
||||
#include "nsICSSLoader.h"
|
||||
#include "nsIRuleWalker.h"
|
||||
#include "nsCSSAtoms.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
|
@ -679,7 +681,7 @@ public:
|
|||
|
||||
nsISupportsArray* mOrderedRules;
|
||||
|
||||
nsINameSpace* mNameSpace;
|
||||
nsCOMPtr<nsINameSpace> mNameSpace;
|
||||
PRInt32 mDefaultNameSpaceID;
|
||||
nsHashtable mRelevantAttributes;
|
||||
};
|
||||
|
@ -715,10 +717,12 @@ public:
|
|||
NS_IMETHOD GetType(nsString& aType) const;
|
||||
NS_IMETHOD GetMediumCount(PRInt32& aCount) const;
|
||||
NS_IMETHOD GetMediumAt(PRInt32 aIndex, nsIAtom*& aMedium) const;
|
||||
NS_IMETHOD UseForMedium(nsIAtom* aMedium) const;
|
||||
NS_IMETHOD_(PRBool) UseForMedium(nsIAtom* aMedium) const;
|
||||
NS_IMETHOD AppendMedium(nsIAtom* aMedium);
|
||||
NS_IMETHOD ClearMedia(void);
|
||||
|
||||
NS_IMETHOD DeleteRuleFromGroup(nsICSSGroupRule* aGroup, PRUint32 aIndex);
|
||||
NS_IMETHOD InsertRuleIntoGroup(nsAReadableString& aRule, nsICSSGroupRule* aGroup, PRUint32 aIndex, PRUint32* _retval);
|
||||
|
||||
NS_IMETHOD GetEnabled(PRBool& aEnabled) const;
|
||||
NS_IMETHOD SetEnabled(PRBool aEnabled);
|
||||
|
||||
|
@ -812,7 +816,8 @@ protected:
|
|||
|
||||
nsVoidArray* mRuleProcessors;
|
||||
|
||||
friend class CSSRuleProcessor;
|
||||
friend class CSSRuleProcessor;
|
||||
friend class DOMMediaListImpl;
|
||||
};
|
||||
|
||||
|
||||
|
@ -923,13 +928,22 @@ class DOMMediaListImpl : public nsIDOMMediaList,
|
|||
return mArray->ElementAt(aIndex);
|
||||
}
|
||||
|
||||
// nsIMediaList methods
|
||||
NS_DECL_NSIMEDIALIST
|
||||
|
||||
DOMMediaListImpl(nsISupportsArray *aArray, CSSStyleSheetImpl *aStyleSheet);
|
||||
virtual ~DOMMediaListImpl();
|
||||
|
||||
void DropReference() { mStyleSheet = nsnull; }
|
||||
|
||||
private:
|
||||
nsresult BeginMediaChange(void);
|
||||
nsresult EndMediaChange(void);
|
||||
nsresult Delete(nsAReadableString & aOldMedium);
|
||||
nsresult Append(nsAReadableString & aOldMedium);
|
||||
|
||||
nsCOMPtr<nsISupportsArray> mArray;
|
||||
// not refcounted; sheet will let us know when it goes away
|
||||
// mStyleSheet is the sheet that needs to be dirtied when this medialist
|
||||
// changes
|
||||
CSSStyleSheetImpl* mStyleSheet;
|
||||
};
|
||||
|
||||
|
@ -937,6 +951,7 @@ private:
|
|||
NS_INTERFACE_MAP_BEGIN(DOMMediaListImpl)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIDOMMediaList)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIMediaList)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISupportsArray)
|
||||
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMMediaList)
|
||||
NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(MediaList)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISerializable)
|
||||
|
@ -962,13 +977,13 @@ DOMMediaListImpl::~DOMMediaListImpl()
|
|||
|
||||
nsresult
|
||||
NS_NewMediaList(nsIMediaList** aInstancePtrResult) {
|
||||
return NS_NewMediaList(aInstancePtrResult, NS_LITERAL_STRING(""));
|
||||
return NS_NewMediaList(NS_LITERAL_STRING(""), aInstancePtrResult);
|
||||
}
|
||||
|
||||
nsresult
|
||||
NS_NewMediaList(nsIMediaList** aInstancePtrResult, const nsAReadableString& aMediaText) {
|
||||
NS_NewMediaList(const nsAReadableString& aMediaText, nsIMediaList** aInstancePtrResult) {
|
||||
nsresult rv;
|
||||
NS_ENSURE_ARG_POINTER(aInstancePtrResult);
|
||||
NS_ASSERTION(aInstancePtrResult, "Null out param.");
|
||||
|
||||
nsCOMPtr<nsISupportsArray> array;
|
||||
rv = NS_NewISupportsArray(getter_AddRefs(array));
|
||||
|
@ -976,15 +991,29 @@ NS_NewMediaList(nsIMediaList** aInstancePtrResult, const nsAReadableString& aMed
|
|||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
DOMMediaListImpl* medialist = new DOMMediaListImpl(array, nsnull);
|
||||
NS_ENSURE_TRUE(medialist, NS_ERROR_OUT_OF_MEMORY);
|
||||
rv = medialist->SetMediaText(aMediaText);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
*aInstancePtrResult = medialist;
|
||||
NS_ENSURE_TRUE(medialist, NS_ERROR_OUT_OF_MEMORY);
|
||||
NS_ADDREF(*aInstancePtrResult);
|
||||
rv = medialist->SetMediaText(aMediaText);
|
||||
if (NS_FAILED(rv)) {
|
||||
NS_RELEASE(*aInstancePtrResult);
|
||||
*aInstancePtrResult = nsnull;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult NS_NewMediaList(nsISupportsArray* aArray, nsICSSStyleSheet* aSheet, nsIMediaList** aInstancePtrResult)
|
||||
{
|
||||
NS_ASSERTION(aInstancePtrResult, "Null out param.");
|
||||
DOMMediaListImpl* medialist = new DOMMediaListImpl(aArray, NS_STATIC_CAST(CSSStyleSheetImpl*, aSheet));
|
||||
*aInstancePtrResult = medialist;
|
||||
NS_ENSURE_TRUE(medialist, NS_ERROR_OUT_OF_MEMORY);
|
||||
NS_ADDREF(*aInstancePtrResult);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::GetMediaText(nsAWritableString& aMediaText)
|
||||
DOMMediaListImpl::GetText(nsAWritableString& aMediaText)
|
||||
{
|
||||
aMediaText.Truncate();
|
||||
|
||||
|
@ -995,10 +1024,8 @@ DOMMediaListImpl::GetMediaText(nsAWritableString& aMediaText)
|
|||
PRInt32 count = cnt, index = 0;
|
||||
|
||||
while (index < count) {
|
||||
nsCOMPtr<nsISupports> tmp(dont_AddRef(ElementAt(index++)));
|
||||
NS_ENSURE_TRUE(tmp, NS_ERROR_FAILURE);
|
||||
|
||||
nsCOMPtr<nsIAtom> medium(do_QueryInterface(tmp));
|
||||
nsCOMPtr<nsIAtom> medium;
|
||||
QueryElementAt(index++, NS_GET_IID(nsIAtom), getter_AddRefs(medium));
|
||||
NS_ENSURE_TRUE(medium, NS_ERROR_FAILURE);
|
||||
|
||||
const PRUnichar *buffer;
|
||||
|
@ -1013,7 +1040,7 @@ DOMMediaListImpl::GetMediaText(nsAWritableString& aMediaText)
|
|||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::SetMediaText(const nsAReadableString& aMediaText)
|
||||
DOMMediaListImpl::SetText(const nsAReadableString& aMediaText)
|
||||
{
|
||||
nsresult rv = Clear();
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
@ -1044,6 +1071,57 @@ DOMMediaListImpl::SetMediaText(const nsAReadableString& aMediaText)
|
|||
return rv;
|
||||
}
|
||||
|
||||
/*
|
||||
* aMatch is true when we contain the desired medium or contain the
|
||||
* "all" medium or contain no media at all, which is the same as
|
||||
* containing "all"
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::MatchesMedium(nsIAtom* aMedium, PRBool* aMatch)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aMatch);
|
||||
*aMatch = PR_FALSE;
|
||||
*aMatch = (-1 != IndexOf(aMedium)) ||
|
||||
(-1 != IndexOf(nsLayoutAtoms::all));
|
||||
if (*aMatch)
|
||||
return NS_OK;
|
||||
PRUint32 count;
|
||||
nsresult rv = Count(&count);
|
||||
if(NS_FAILED(rv))
|
||||
return rv;
|
||||
*aMatch = (count == 0);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::DropReference(void)
|
||||
{
|
||||
mStyleSheet = nsnull;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::GetMediaText(nsAWritableString& aMediaText)
|
||||
{
|
||||
return GetText(aMediaText);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::SetMediaText(nsAReadableString& aMediaText)
|
||||
{
|
||||
nsresult rv;
|
||||
rv = BeginMediaChange();
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
rv = SetText(aMediaText);
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
rv = EndMediaChange();
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::GetLength(PRUint32* aLength)
|
||||
{
|
||||
|
@ -1079,6 +1157,38 @@ DOMMediaListImpl::Item(PRUint32 aIndex, nsAWritableString& aReturn)
|
|||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::DeleteMedium(const nsAReadableString& aOldMedium)
|
||||
{
|
||||
nsresult rv;
|
||||
rv = BeginMediaChange();
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
rv = Delete(aOldMedium);
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
rv = EndMediaChange();
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::AppendMedium(const nsAReadableString& aNewMedium)
|
||||
{
|
||||
nsresult rv;
|
||||
rv = BeginMediaChange();
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
rv = Append(aNewMedium);
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
rv = EndMediaChange();
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult
|
||||
DOMMediaListImpl::Delete(const nsAReadableString& aOldMedium)
|
||||
{
|
||||
if (!aOldMedium.Length())
|
||||
|
@ -1098,7 +1208,7 @@ DOMMediaListImpl::Delete(const nsAReadableString& aOldMedium)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsresult
|
||||
DOMMediaListImpl::Append(const nsAReadableString& aNewMedium)
|
||||
{
|
||||
if (!aNewMedium.Length())
|
||||
|
@ -1118,6 +1228,39 @@ DOMMediaListImpl::Append(const nsAReadableString& aNewMedium)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
DOMMediaListImpl::BeginMediaChange(void)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
|
||||
if (mStyleSheet) {
|
||||
rv = mStyleSheet->GetOwningDocument(*getter_AddRefs(doc));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = doc->BeginUpdate();
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = mStyleSheet->WillDirty();
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
DOMMediaListImpl::EndMediaChange(void)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
if (mStyleSheet) {
|
||||
mStyleSheet->DidDirty();
|
||||
rv = mStyleSheet->GetOwningDocument(*getter_AddRefs(doc));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = doc->StyleRuleChanged(mStyleSheet, nsnull, NS_STYLE_HINT_RECONSTRUCT_ALL);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = doc->EndUpdate();
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// -------------------------------
|
||||
// Imports Collection for the DOM
|
||||
|
@ -1286,7 +1429,6 @@ CSSStyleSheetInner::~CSSStyleSheetInner(void)
|
|||
mOrderedRules->EnumerateForwards(SetStyleSheetReference, nsnull);
|
||||
NS_RELEASE(mOrderedRules);
|
||||
}
|
||||
NS_IF_RELEASE(mNameSpace);
|
||||
}
|
||||
|
||||
CSSStyleSheetInner*
|
||||
|
@ -1326,7 +1468,7 @@ static PRBool
|
|||
CreateNameSpace(nsISupports* aRule, void* aNameSpacePtr)
|
||||
{
|
||||
nsICSSRule* rule = (nsICSSRule*)aRule;
|
||||
PRInt32 type;
|
||||
PRInt32 type = nsICSSRule::UNKNOWN_RULE;
|
||||
rule->GetType(type);
|
||||
if (nsICSSRule::NAMESPACE_RULE == type) {
|
||||
nsICSSNameSpaceRule* nameSpaceRule = (nsICSSNameSpaceRule*)rule;
|
||||
|
@ -1355,27 +1497,26 @@ CreateNameSpace(nsISupports* aRule, void* aNameSpacePtr)
|
|||
void
|
||||
CSSStyleSheetInner::RebuildNameSpaces(void)
|
||||
{
|
||||
nsINameSpaceManager* nameSpaceMgr;
|
||||
nsCOMPtr<nsINameSpaceManager> nameSpaceMgr;
|
||||
if (mNameSpace) {
|
||||
mNameSpace->GetNameSpaceManager(nameSpaceMgr);
|
||||
NS_RELEASE(mNameSpace);
|
||||
mNameSpace->GetNameSpaceManager(*getter_AddRefs(nameSpaceMgr));
|
||||
}
|
||||
else {
|
||||
NS_NewNameSpaceManager(&nameSpaceMgr);
|
||||
NS_NewNameSpaceManager(getter_AddRefs(nameSpaceMgr));
|
||||
}
|
||||
if (nameSpaceMgr) {
|
||||
nameSpaceMgr->CreateRootNameSpace(mNameSpace);
|
||||
nameSpaceMgr->CreateRootNameSpace(*getter_AddRefs(mNameSpace));
|
||||
if (kNameSpaceID_Unknown != mDefaultNameSpaceID) {
|
||||
nsINameSpace* defaultNameSpace;
|
||||
mNameSpace->CreateChildNameSpace(nsnull, mDefaultNameSpaceID, defaultNameSpace);
|
||||
nsCOMPtr<nsINameSpace> defaultNameSpace;
|
||||
mNameSpace->CreateChildNameSpace(nsnull, mDefaultNameSpaceID,
|
||||
*getter_AddRefs(defaultNameSpace));
|
||||
if (defaultNameSpace) {
|
||||
NS_RELEASE(mNameSpace);
|
||||
mNameSpace = defaultNameSpace;
|
||||
}
|
||||
}
|
||||
NS_RELEASE(nameSpaceMgr);
|
||||
if (mOrderedRules) {
|
||||
mOrderedRules->EnumerateForwards(CreateNameSpace, &mNameSpace);
|
||||
nsINameSpace* nameSpace = mNameSpace;
|
||||
mOrderedRules->EnumerateForwards(CreateNameSpace, &nameSpace);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1745,24 +1886,15 @@ CSSStyleSheetImpl::GetMediumAt(PRInt32 aIndex, nsIAtom*& aMedium) const
|
|||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
NS_IMETHODIMP_(PRBool)
|
||||
CSSStyleSheetImpl::UseForMedium(nsIAtom* aMedium) const
|
||||
{
|
||||
if (mMedia) {
|
||||
if (-1 != mMedia->IndexOf(aMedium)) {
|
||||
return NS_OK;
|
||||
}
|
||||
if (-1 != mMedia->IndexOf(nsLayoutAtoms::all)) {
|
||||
return NS_OK;
|
||||
}
|
||||
PRUint32 count;
|
||||
mMedia->Count(&count);
|
||||
if (count == 0) { // equivalent to having a medium of "all"
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_COMFALSE;
|
||||
PRBool matches = PR_FALSE;
|
||||
mMedia->MatchesMedium(aMedium, &matches);
|
||||
return matches;
|
||||
}
|
||||
return NS_OK;
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1976,7 +2108,7 @@ CSSStyleSheetImpl::PrependStyleRule(nsICSSRule* aRule)
|
|||
aRule->SetStyleSheet(this);
|
||||
DidDirty();
|
||||
|
||||
PRInt32 type;
|
||||
PRInt32 type = nsICSSRule::UNKNOWN_RULE;
|
||||
aRule->GetType(type);
|
||||
if (nsICSSRule::NAMESPACE_RULE == type) {
|
||||
// no api to prepend a namespace (ugh), release old ones and re-create them all
|
||||
|
@ -2003,31 +2135,29 @@ CSSStyleSheetImpl::AppendStyleRule(nsICSSRule* aRule)
|
|||
aRule->SetStyleSheet(this);
|
||||
DidDirty();
|
||||
|
||||
PRInt32 type;
|
||||
PRInt32 type = nsICSSRule::UNKNOWN_RULE;
|
||||
aRule->GetType(type);
|
||||
if (nsICSSRule::NAMESPACE_RULE == type) {
|
||||
if (! mInner->mNameSpace) {
|
||||
nsINameSpaceManager* nameSpaceMgr;
|
||||
NS_NewNameSpaceManager(&nameSpaceMgr);
|
||||
nsCOMPtr<nsINameSpaceManager> nameSpaceMgr;
|
||||
NS_NewNameSpaceManager(getter_AddRefs(nameSpaceMgr));
|
||||
if (nameSpaceMgr) {
|
||||
nameSpaceMgr->CreateRootNameSpace(mInner->mNameSpace);
|
||||
NS_RELEASE(nameSpaceMgr);
|
||||
nameSpaceMgr->CreateRootNameSpace(*getter_AddRefs(mInner->mNameSpace));
|
||||
}
|
||||
}
|
||||
|
||||
if (mInner->mNameSpace) {
|
||||
nsICSSNameSpaceRule* nameSpaceRule = (nsICSSNameSpaceRule*)aRule;
|
||||
nsINameSpace* newNameSpace = nsnull;
|
||||
nsCOMPtr<nsICSSNameSpaceRule> nameSpaceRule(do_QueryInterface(aRule));
|
||||
nsCOMPtr<nsINameSpace> newNameSpace;
|
||||
|
||||
nsIAtom* prefix = nsnull;
|
||||
nsCOMPtr<nsIAtom> prefix;
|
||||
nsAutoString urlSpec;
|
||||
nameSpaceRule->GetPrefix(prefix);
|
||||
nameSpaceRule->GetPrefix(*getter_AddRefs(prefix));
|
||||
nameSpaceRule->GetURLSpec(urlSpec);
|
||||
mInner->mNameSpace->CreateChildNameSpace(prefix, urlSpec, newNameSpace);
|
||||
NS_IF_RELEASE(prefix);
|
||||
mInner->mNameSpace->CreateChildNameSpace(prefix, urlSpec,
|
||||
*getter_AddRefs(newNameSpace));
|
||||
if (newNameSpace) {
|
||||
NS_RELEASE(mInner->mNameSpace);
|
||||
mInner->mNameSpace = newNameSpace; // takes ref
|
||||
mInner->mNameSpace = newNameSpace;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -2050,7 +2180,7 @@ CheckRuleForAttributesEnum(nsISupports *aRule, void *aData)
|
|||
NS_IMETHODIMP
|
||||
CSSStyleSheetImpl::CheckRuleForAttributes(nsICSSRule *aRule)
|
||||
{
|
||||
PRInt32 ruleType;
|
||||
PRInt32 ruleType = nsICSSRule::UNKNOWN_RULE;
|
||||
aRule->GetType(ruleType);
|
||||
switch (ruleType) {
|
||||
case nsICSSRule::MEDIA_RULE: {
|
||||
|
@ -2124,8 +2254,13 @@ CSSStyleSheetImpl::GetStyleRuleAt(PRInt32 aIndex, nsICSSRule*& aRule) const
|
|||
NS_IMETHODIMP
|
||||
CSSStyleSheetImpl::GetNameSpace(nsINameSpace*& aNameSpace) const
|
||||
{
|
||||
aNameSpace = ((mInner) ? mInner->mNameSpace : nsnull);
|
||||
NS_IF_ADDREF(aNameSpace);
|
||||
if (mInner) {
|
||||
aNameSpace = mInner->mNameSpace;
|
||||
NS_IF_ADDREF(aNameSpace);
|
||||
}
|
||||
else {
|
||||
aNameSpace = nsnull;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -2218,9 +2353,9 @@ ListRules(nsISupportsArray* aRules, FILE* aOut, PRInt32 aIndent)
|
|||
if (aRules) {
|
||||
aRules->Count(&count);
|
||||
for (index = 0; index < count; index++) {
|
||||
nsICSSRule* rule = (nsICSSRule*)aRules->ElementAt(index);
|
||||
nsCOMPtr<nsICSSRule> rule;
|
||||
aRules->QueryElementAt(index, NS_GET_IID(nsICSSRule), getter_AddRefs(rule));
|
||||
rule->List(aOut, aIndent);
|
||||
NS_RELEASE(rule);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2282,13 +2417,13 @@ void CSSStyleSheetImpl::List(FILE* out, PRInt32 aIndent) const
|
|||
mMedia->Count(&count);
|
||||
nsAutoString buffer;
|
||||
while (index < PRInt32(count)) {
|
||||
nsIAtom* medium = (nsIAtom*)mMedia->ElementAt(index++);
|
||||
nsCOMPtr<nsIAtom> medium;
|
||||
mMedia->QueryElementAt(index++, NS_GET_IID(nsIAtom), getter_AddRefs(medium));
|
||||
medium->ToString(buffer);
|
||||
fputs(buffer, out);
|
||||
if (index < PRInt32(count)) {
|
||||
fputs(", ", out);
|
||||
}
|
||||
NS_RELEASE(medium);
|
||||
}
|
||||
}
|
||||
fputs("\n", out);
|
||||
|
@ -2543,62 +2678,173 @@ CSSStyleSheetImpl::InsertRule(const nsAReadableString& aRule,
|
|||
PRUint32 aIndex,
|
||||
PRUint32* aReturn)
|
||||
{
|
||||
nsICSSParser* css;
|
||||
// XXX should get parser from CSS loader
|
||||
nsresult result = NS_NewCSSParser(&css);
|
||||
if (NS_OK == result) {
|
||||
nsString* str = new nsString(aRule); // will be deleted by the input stream
|
||||
nsIUnicharInputStream* input = nsnull;
|
||||
result = NS_NewStringUnicharInputStream(&input, str);
|
||||
if (NS_OK == result) {
|
||||
nsICSSStyleSheet* tmp;
|
||||
css->SetStyleSheet(this);
|
||||
// XXX Currently, the parser will append the rule to the
|
||||
// style sheet. We shouldn't ignore the index.
|
||||
result = css->Parse(input, mInner->mURL, tmp);
|
||||
NS_ASSERTION(tmp == this, "parser incorrectly created a new stylesheet");
|
||||
NS_RELEASE(tmp);
|
||||
NS_RELEASE(input);
|
||||
PRUint32 cnt;
|
||||
if (mInner && mInner->mOrderedRules) {
|
||||
result = mInner->mOrderedRules->Count(&cnt);
|
||||
if (NS_SUCCEEDED(result)) {
|
||||
*aReturn = cnt;
|
||||
if (nsnull != mDocument) {
|
||||
nsICSSRule* rule;
|
||||
NS_ENSURE_TRUE(mInner, NS_ERROR_FAILURE);
|
||||
nsresult result;
|
||||
if (! mInner->mOrderedRules) {
|
||||
result = NS_NewISupportsArray(&(mInner->mOrderedRules));
|
||||
}
|
||||
if (NS_FAILED(result))
|
||||
return result;
|
||||
|
||||
rule = (nsICSSRule*)(mInner->mOrderedRules->ElementAt(aIndex));
|
||||
mDocument->StyleRuleAdded(this, rule);
|
||||
NS_IF_RELEASE(rule);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
PRUint32 count;
|
||||
mInner->mOrderedRules->Count(&count);
|
||||
if (aIndex > count)
|
||||
return NS_ERROR_DOM_INDEX_SIZE_ERR;
|
||||
|
||||
result = WillDirty();
|
||||
if (NS_FAILED(result))
|
||||
return result;
|
||||
|
||||
NS_RELEASE(css);
|
||||
nsCOMPtr<nsICSSLoader> loader;
|
||||
nsCOMPtr<nsICSSParser> css;
|
||||
nsCOMPtr<nsIHTMLContentContainer> htmlContainer(do_QueryInterface(mDocument));
|
||||
if (htmlContainer) {
|
||||
htmlContainer->GetCSSLoader(*getter_AddRefs(loader));
|
||||
}
|
||||
if (loader) {
|
||||
result = loader->GetParserFor(this, getter_AddRefs(css));
|
||||
}
|
||||
else {
|
||||
result = NS_NewCSSParser(getter_AddRefs(css));
|
||||
css->SetStyleSheet(this);
|
||||
}
|
||||
if (NS_FAILED(result))
|
||||
return result;
|
||||
|
||||
if (mDocument) {
|
||||
result = mDocument->BeginUpdate();
|
||||
if (NS_FAILED(result))
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
nsCOMPtr<nsIStyleRule> rule;
|
||||
result = css->ParseRule(aRule, mInner->mURL, getter_AddRefs(rule));
|
||||
if (NS_FAILED(result))
|
||||
return result;
|
||||
if (! rule) // parsed successfully, but no rule resulted
|
||||
return NS_ERROR_DOM_SYNTAX_ERR;
|
||||
|
||||
nsCOMPtr<nsICSSRule> cssRule(do_QueryInterface(rule, &result));
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
PRInt32 type = nsICSSRule::UNKNOWN_RULE;
|
||||
cssRule->GetType(type);
|
||||
if (aIndex != 0) {
|
||||
if (type == nsICSSRule::CHARSET_RULE) { // no inserting charset at nonzero position
|
||||
return NS_ERROR_DOM_HIERARCHY_REQUEST_ERR;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsICSSRule> prevRule;
|
||||
result = mInner->mOrderedRules->QueryElementAt(aIndex-1, NS_GET_IID(nsICSSRule), getter_AddRefs(prevRule));
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
PRInt32 prevType = nsICSSRule::UNKNOWN_RULE;
|
||||
prevRule->GetType(prevType);
|
||||
|
||||
if (type == nsICSSRule::IMPORT_RULE &&
|
||||
prevType != nsICSSRule::CHARSET_RULE &&
|
||||
prevType != nsICSSRule::IMPORT_RULE) {
|
||||
return NS_ERROR_DOM_HIERARCHY_REQUEST_ERR;
|
||||
}
|
||||
|
||||
if (type == nsICSSRule::NAMESPACE_RULE &&
|
||||
prevType != nsICSSRule::CHARSET_RULE &&
|
||||
prevType != nsICSSRule::IMPORT_RULE &&
|
||||
prevType != nsICSSRule::NAMESPACE_RULE) {
|
||||
return NS_ERROR_DOM_HIERARCHY_REQUEST_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
if (type == nsICSSRule::CHARSET_RULE) {
|
||||
// check that we're not inserting before another chatset rule
|
||||
nsCOMPtr<nsICSSRule> nextRule;
|
||||
mInner->mOrderedRules->QueryElementAt(aIndex, NS_GET_IID(nsICSSRule), getter_AddRefs(nextRule));
|
||||
if (nextRule) {
|
||||
PRInt32 nextType = nsICSSRule::UNKNOWN_RULE;
|
||||
nextRule->GetType(nextType);
|
||||
if (nextType == nsICSSRule::CHARSET_RULE) {
|
||||
return NS_ERROR_DOM_HIERARCHY_REQUEST_ERR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result = mInner->mOrderedRules->InsertElementAt(cssRule, aIndex);
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
cssRule->SetStyleSheet(this);
|
||||
DidDirty();
|
||||
if (type == nsICSSRule::NAMESPACE_RULE) {
|
||||
if (! mInner->mNameSpace) {
|
||||
nsCOMPtr<nsINameSpaceManager> nameSpaceMgr;
|
||||
result = NS_NewNameSpaceManager(getter_AddRefs(nameSpaceMgr));
|
||||
if (NS_FAILED(result))
|
||||
return result;
|
||||
nameSpaceMgr->CreateRootNameSpace(*getter_AddRefs(mInner->mNameSpace));
|
||||
}
|
||||
|
||||
NS_ENSURE_TRUE(mInner->mNameSpace, NS_ERROR_FAILURE);
|
||||
|
||||
nsCOMPtr<nsICSSNameSpaceRule> nameSpaceRule(do_QueryInterface(cssRule));
|
||||
nsCOMPtr<nsINameSpace> newNameSpace;
|
||||
|
||||
nsCOMPtr<nsIAtom> prefix;
|
||||
nsAutoString urlSpec;
|
||||
nameSpaceRule->GetPrefix(*getter_AddRefs(prefix));
|
||||
nameSpaceRule->GetURLSpec(urlSpec);
|
||||
mInner->mNameSpace->CreateChildNameSpace(prefix, urlSpec,
|
||||
*getter_AddRefs(newNameSpace));
|
||||
if (newNameSpace) {
|
||||
mInner->mNameSpace = newNameSpace;
|
||||
}
|
||||
}
|
||||
else {
|
||||
CheckRuleForAttributes(cssRule);
|
||||
}
|
||||
if (mDocument) {
|
||||
result = mDocument->StyleRuleAdded(this, cssRule);
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
result = mDocument->EndUpdate();
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
}
|
||||
|
||||
*aReturn = aIndex;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSStyleSheetImpl::DeleteRule(PRUint32 aIndex)
|
||||
{
|
||||
nsresult result = NS_ERROR_INVALID_ARG;
|
||||
nsresult result = NS_ERROR_DOM_INDEX_SIZE_ERR;
|
||||
|
||||
// XXX TBI: handle @rule types
|
||||
if (mInner && mInner->mOrderedRules) {
|
||||
if (mDocument) {
|
||||
result = mDocument->BeginUpdate();
|
||||
if (NS_FAILED(result))
|
||||
return result;
|
||||
}
|
||||
result = WillDirty();
|
||||
|
||||
if (NS_SUCCEEDED(result)) {
|
||||
nsICSSRule *rule;
|
||||
|
||||
rule = (nsICSSRule*)(mInner->mOrderedRules->ElementAt(aIndex));
|
||||
if (nsnull != rule) {
|
||||
if (NS_SUCCEEDED(result)) {
|
||||
PRUint32 count;
|
||||
mInner->mOrderedRules->Count(&count);
|
||||
if (aIndex >= count)
|
||||
return NS_ERROR_DOM_INDEX_SIZE_ERR;
|
||||
|
||||
nsCOMPtr<nsICSSRule> rule;
|
||||
mInner->mOrderedRules->QueryElementAt(aIndex, NS_GET_IID(nsICSSRule),
|
||||
getter_AddRefs(rule));
|
||||
if (rule) {
|
||||
mInner->mOrderedRules->RemoveElementAt(aIndex);
|
||||
rule->SetStyleSheet(nsnull);
|
||||
DidDirty();
|
||||
NS_RELEASE(rule);
|
||||
|
||||
if (mDocument) {
|
||||
result = mDocument->StyleRuleRemoved(this, rule);
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
result = mDocument->EndUpdate();
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2606,6 +2852,122 @@ CSSStyleSheetImpl::DeleteRule(PRUint32 aIndex)
|
|||
return result;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSStyleSheetImpl::DeleteRuleFromGroup(nsICSSGroupRule* aGroup, PRUint32 aIndex)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aGroup);
|
||||
|
||||
nsresult result;
|
||||
nsCOMPtr<nsICSSRule> rule;
|
||||
result = aGroup->GetStyleRuleAt(aIndex, *getter_AddRefs(rule));
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
// check that the rule actually belongs to this sheet!
|
||||
nsCOMPtr<nsIDOMCSSRule> domRule(do_QueryInterface(rule));
|
||||
nsCOMPtr<nsIDOMCSSStyleSheet> ruleSheet;
|
||||
result = domRule->GetParentStyleSheet(getter_AddRefs(ruleSheet));
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
nsCOMPtr<nsIDOMCSSStyleSheet> thisSheet;
|
||||
this->QueryInterface(NS_GET_IID(nsIDOMCSSStyleSheet), getter_AddRefs(thisSheet));
|
||||
|
||||
if (thisSheet != ruleSheet) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
||||
result = mDocument->BeginUpdate();
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
result = WillDirty();
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
result = aGroup->DeleteStyleRuleAt(aIndex);
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
rule->SetStyleSheet(nsnull);
|
||||
|
||||
DidDirty();
|
||||
|
||||
result = mDocument->StyleRuleRemoved(this, rule);
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
result = mDocument->EndUpdate();
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSStyleSheetImpl::InsertRuleIntoGroup(nsAReadableString & aRule, nsICSSGroupRule* aGroup, PRUint32 aIndex, PRUint32* _retval)
|
||||
{
|
||||
nsresult result;
|
||||
// check that the group actually belongs to this sheet!
|
||||
nsCOMPtr<nsIDOMCSSRule> domGroup(do_QueryInterface(aGroup));
|
||||
nsCOMPtr<nsIDOMCSSStyleSheet> groupSheet;
|
||||
result = domGroup->GetParentStyleSheet(getter_AddRefs(groupSheet));
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
nsCOMPtr<nsIDOMCSSStyleSheet> thisSheet;
|
||||
this->QueryInterface(NS_GET_IID(nsIDOMCSSStyleSheet), getter_AddRefs(thisSheet));
|
||||
|
||||
if (thisSheet != groupSheet) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
||||
// get the css parser
|
||||
nsCOMPtr<nsICSSLoader> loader;
|
||||
nsCOMPtr<nsICSSParser> css;
|
||||
nsCOMPtr<nsIHTMLContentContainer> htmlContainer(do_QueryInterface(mDocument));
|
||||
if (htmlContainer) {
|
||||
htmlContainer->GetCSSLoader(*getter_AddRefs(loader));
|
||||
}
|
||||
if (loader) {
|
||||
result = loader->GetParserFor(this, getter_AddRefs(css));
|
||||
}
|
||||
else {
|
||||
result = NS_NewCSSParser(getter_AddRefs(css));
|
||||
css->SetStyleSheet(this);
|
||||
}
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
// parse and grab the rule
|
||||
result = mDocument->BeginUpdate();
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
result = WillDirty();
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
nsCOMPtr<nsIStyleRule> rule;
|
||||
result = css->ParseRule(aRule, mInner->mURL, getter_AddRefs(rule));
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
if (! rule) {
|
||||
return NS_ERROR_DOM_SYNTAX_ERR;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsICSSRule> cssRule(do_QueryInterface(rule, &result));
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
// Only rulesets are allowed in a group as of CSS2
|
||||
PRInt32 type = nsICSSRule::UNKNOWN_RULE;
|
||||
cssRule->GetType(type);
|
||||
if (type != nsICSSRule::STYLE_RULE) {
|
||||
return NS_ERROR_DOM_HIERARCHY_REQUEST_ERR;
|
||||
}
|
||||
|
||||
result = aGroup->InsertStyleRuleAt(aIndex, cssRule);
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
DidDirty();
|
||||
CheckRuleForAttributes(cssRule);
|
||||
|
||||
result = mDocument->StyleRuleAdded(this, cssRule);
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
result = mDocument->EndUpdate();
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
*_retval = aIndex;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// XXX for backwards compatibility and convenience
|
||||
NS_HTML nsresult
|
||||
NS_NewCSSStyleSheet(nsICSSStyleSheet** aInstancePtrResult, nsIURI* aURL)
|
||||
|
@ -3731,7 +4093,8 @@ void CSSRuleProcessor::SizeOf(nsISizeOfHandler *aSizeOfHandler, PRUint32 &aSize)
|
|||
PRUint32 sheetCount, curSheet, localSize2;
|
||||
mSheets->Count(&sheetCount);
|
||||
for(curSheet=0; curSheet < sheetCount; curSheet++){
|
||||
nsICSSStyleSheet *pSheet = (nsICSSStyleSheet *)mSheets->ElementAt(curSheet);
|
||||
nsCOMPtr<nsICSSStyleSheet> pSheet;
|
||||
mSheets->QueryElementAt(curSheet, NS_GET_IID(nsICSSStyleSheet), getter_AddRefs(pSheet));
|
||||
if(pSheet && uniqueItems->AddItem((void*)pSheet)){
|
||||
pSheet->SizeOf(aSizeOfHandler, localSize2);
|
||||
// XXX aSize += localSize2;
|
||||
|
@ -3765,6 +4128,7 @@ CSSRuleProcessor::ClearRuleCascades(void)
|
|||
delete data;
|
||||
data = next;
|
||||
}
|
||||
mRuleCascades = nsnull;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -3835,7 +4199,7 @@ InsertRuleByWeight(nsISupports* aRule, void* aData)
|
|||
{
|
||||
nsICSSRule* rule = (nsICSSRule*)aRule;
|
||||
CascadeEnumData* data = (CascadeEnumData*)aData;
|
||||
PRInt32 type;
|
||||
PRInt32 type = nsICSSRule::UNKNOWN_RULE;
|
||||
rule->GetType(type);
|
||||
|
||||
if (nsICSSRule::STYLE_RULE == type) {
|
||||
|
@ -3854,7 +4218,7 @@ InsertRuleByWeight(nsISupports* aRule, void* aData)
|
|||
}
|
||||
else if (nsICSSRule::MEDIA_RULE == type) {
|
||||
nsICSSMediaRule* mediaRule = (nsICSSMediaRule*)rule;
|
||||
if (NS_OK == mediaRule->UseForMedium(data->mMedium)) {
|
||||
if (mediaRule->UseForMedium(data->mMedium)) {
|
||||
mediaRule->EnumerateRulesForwards(InsertRuleByWeight, aData);
|
||||
}
|
||||
}
|
||||
|
@ -3871,7 +4235,7 @@ CSSRuleProcessor::CascadeSheetRulesInto(nsISupports* aSheet, void* aData)
|
|||
PRBool bSheetEnabled = PR_TRUE;
|
||||
sheet->GetEnabled(bSheetEnabled);
|
||||
|
||||
if ((bSheetEnabled) && (NS_OK == sheet->UseForMedium(data->mMedium))) {
|
||||
if ((bSheetEnabled) && (sheet->UseForMedium(data->mMedium))) {
|
||||
CSSStyleSheetImpl* child = sheet->mFirstChild;
|
||||
while (child) {
|
||||
CascadeSheetRulesInto((nsICSSStyleSheet*)child, data);
|
||||
|
|
|
@ -210,7 +210,7 @@ public:
|
|||
NS_IMETHOD GetType(nsString& aType) const;
|
||||
NS_IMETHOD GetMediumCount(PRInt32& aCount) const;
|
||||
NS_IMETHOD GetMediumAt(PRInt32 aIndex, nsIAtom*& aMedium) const;
|
||||
NS_IMETHOD UseForMedium(nsIAtom* aMedium) const;
|
||||
NS_IMETHOD_(PRBool) UseForMedium(nsIAtom* aMedium) const;
|
||||
|
||||
NS_IMETHOD GetEnabled(PRBool& aEnabled) const;
|
||||
NS_IMETHOD SetEnabled(PRBool aEnabled);
|
||||
|
@ -518,10 +518,10 @@ HTMLCSSStyleSheetImpl::GetMediumAt(PRInt32 aIndex, nsIAtom*& aMedium) const
|
|||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
NS_IMETHODIMP_(PRBool)
|
||||
HTMLCSSStyleSheetImpl::UseForMedium(nsIAtom* aMedium) const
|
||||
{
|
||||
return NS_OK; // works for all media
|
||||
return PR_TRUE; // works for all media
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
|
|
@ -536,7 +536,7 @@ public:
|
|||
NS_IMETHOD GetType(nsString& aType) const;
|
||||
NS_IMETHOD GetMediumCount(PRInt32& aCount) const;
|
||||
NS_IMETHOD GetMediumAt(PRInt32 aIndex, nsIAtom*& aMedium) const;
|
||||
NS_IMETHOD UseForMedium(nsIAtom* aMedium) const;
|
||||
NS_IMETHOD_(PRBool) UseForMedium(nsIAtom* aMedium) const;
|
||||
|
||||
NS_IMETHOD GetEnabled(PRBool& aEnabled) const;
|
||||
NS_IMETHOD SetEnabled(PRBool aEnabled);
|
||||
|
@ -952,10 +952,10 @@ HTMLStyleSheetImpl::GetMediumAt(PRInt32 aIndex, nsIAtom*& aMedium) const
|
|||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
NS_IMETHODIMP_(PRBool)
|
||||
HTMLStyleSheetImpl::UseForMedium(nsIAtom* aMedium) const
|
||||
{
|
||||
return NS_OK; // works for all media
|
||||
return PR_TRUE; // works for all media
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -42,6 +42,17 @@ public:
|
|||
NS_IMETHOD GetStyleRuleAt(PRInt32 aIndex, nsICSSRule*& aRule) const = 0;
|
||||
|
||||
NS_IMETHOD EnumerateRulesForwards(nsISupportsArrayEnumFunc aFunc, void * aData) const = 0;
|
||||
|
||||
/*
|
||||
* The next two methods (DeleteStyleRuleAt and InsertStyleRuleAt)
|
||||
* should never be called unless you have first called WillDirty()
|
||||
* on the parent stylesheet. After they are called, DidDirty()
|
||||
* needs to be called on the sheet
|
||||
*/
|
||||
NS_IMETHOD DeleteStyleRuleAt(PRUint32 aIndex) = 0;
|
||||
NS_IMETHOD InsertStyleRuleAt(PRUint32 aIndex, nsICSSRule* aRule) = 0;
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif /* nsICSSGroupRule_h___ */
|
||||
|
|
|
@ -37,7 +37,7 @@ public:
|
|||
static const nsIID& GetIID() { static nsIID iid = NS_ICSS_MEDIA_RULE_IID; return iid; }
|
||||
|
||||
NS_IMETHOD SetMedia(nsISupportsArray* aMedia) = 0;
|
||||
NS_IMETHOD UseForMedium(nsIAtom* aMedium) const = 0;
|
||||
NS_IMETHOD_(PRBool) UseForMedium(nsIAtom* aMedium) const = 0;
|
||||
};
|
||||
|
||||
extern NS_HTML nsresult
|
||||
|
|
|
@ -33,8 +33,8 @@ interface nsIDOMMediaList : nsISupports
|
|||
readonly attribute unsigned long length;
|
||||
DOMString item(in unsigned long index);
|
||||
|
||||
void delete(in DOMString oldMedium)
|
||||
void deleteMedium(in DOMString oldMedium)
|
||||
raises(DOMException);
|
||||
void append(in DOMString newMedium)
|
||||
void appendMedium(in DOMString newMedium)
|
||||
raises(DOMException);
|
||||
};
|
||||
|
|
|
@ -140,6 +140,7 @@ enum nsDOMClassInfoID {
|
|||
eDOMClassInfo_CSSMediaRule_id,
|
||||
eDOMClassInfo_CSSNameSpaceRule_id,
|
||||
eDOMClassInfo_CSSRuleList_id,
|
||||
eDOMClassInfo_CSSGroupRuleRuleList_id,
|
||||
eDOMClassInfo_MediaList_id,
|
||||
eDOMClassInfo_StyleSheetList_id,
|
||||
eDOMClassInfo_CSSStyleSheet_id,
|
||||
|
|
|
@ -570,6 +570,8 @@ static nsDOMClassInfoData sClassInfoData[] = {
|
|||
DOM_DEFAULT_SCRIPTABLE_FLAGS)
|
||||
NS_DEFINE_CLASSINFO_DATA(CSSRuleList, nsCSSRuleListSH,
|
||||
ARRAY_SCRIPTABLE_FLAGS)
|
||||
NS_DEFINE_CLASSINFO_DATA(CSSGroupRuleRuleList, nsCSSRuleListSH,
|
||||
ARRAY_SCRIPTABLE_FLAGS)
|
||||
NS_DEFINE_CLASSINFO_DATA(MediaList, nsMediaListSH,
|
||||
DOM_DEFAULT_SCRIPTABLE_FLAGS)
|
||||
NS_DEFINE_CLASSINFO_DATA(StyleSheetList, nsDOMGenericSH,
|
||||
|
@ -1409,7 +1411,7 @@ nsDOMClassInfo::Init()
|
|||
DOM_CLASSINFO_MAP_END
|
||||
|
||||
DOM_CLASSINFO_MAP_BEGIN(CSSMediaRule, nsIDOMCSSMediaRule)
|
||||
DOM_CLASSINFO_MAP_ENTRY(nsIDOMCSSRule)
|
||||
DOM_CLASSINFO_MAP_ENTRY(nsIDOMCSSMediaRule)
|
||||
DOM_CLASSINFO_MAP_END
|
||||
|
||||
DOM_CLASSINFO_MAP_BEGIN(CSSNameSpaceRule, nsIDOMCSSRule)
|
||||
|
@ -1420,6 +1422,10 @@ nsDOMClassInfo::Init()
|
|||
DOM_CLASSINFO_MAP_ENTRY(nsIDOMCSSRuleList)
|
||||
DOM_CLASSINFO_MAP_END
|
||||
|
||||
DOM_CLASSINFO_MAP_BEGIN(CSSGroupRuleRuleList, nsIDOMCSSRuleList)
|
||||
DOM_CLASSINFO_MAP_ENTRY(nsIDOMCSSRuleList)
|
||||
DOM_CLASSINFO_MAP_END
|
||||
|
||||
DOM_CLASSINFO_MAP_BEGIN(MediaList, nsIDOMMediaList)
|
||||
DOM_CLASSINFO_MAP_ENTRY(nsIDOMMediaList)
|
||||
DOM_CLASSINFO_MAP_END
|
||||
|
|
|
@ -154,6 +154,10 @@ public:
|
|||
PRBool aParseOnlyOneDecl,
|
||||
PRInt32* aHint);
|
||||
|
||||
NS_IMETHOD ParseRule(nsAReadableString& aRule,
|
||||
nsIURI* aBaseURL,
|
||||
nsIStyleRule** aResult);
|
||||
|
||||
NS_IMETHOD GetCharset(/*out*/nsAWritableString &aCharsetDest) const;
|
||||
// sets the out-param to the current charset, as set by SetCharset
|
||||
NS_IMETHOD SetCharset(/*in*/ const nsAReadableString &aCharsetSrc);
|
||||
|
@ -180,18 +184,18 @@ protected:
|
|||
void PopGroup(void);
|
||||
void AppendRule(nsICSSRule* aRule);
|
||||
|
||||
PRBool ParseRuleSet(PRInt32& aErrorCode);
|
||||
PRBool ParseAtRule(PRInt32& aErrorCode);
|
||||
PRBool ParseCharsetRule(PRInt32& aErrorCode);
|
||||
PRBool ParseImportRule(PRInt32& aErrorCode);
|
||||
PRBool ParseRuleSet(PRInt32& aErrorCode, nsIStyleRule** aResult = nsnull);
|
||||
PRBool ParseAtRule(PRInt32& aErrorCode, nsIStyleRule** aResult = nsnull);
|
||||
PRBool ParseCharsetRule(PRInt32& aErrorCode, nsIStyleRule** aResult);
|
||||
PRBool ParseImportRule(PRInt32& aErrorCode, nsIStyleRule** aResult);
|
||||
PRBool GatherMedia(PRInt32& aErrorCode, nsString& aMedia, nsISupportsArray* aMediaAtoms);
|
||||
PRBool ProcessImport(PRInt32& aErrorCode, const nsString& aURLSpec, const nsString& aMedia);
|
||||
PRBool ParseMediaRule(PRInt32& aErrorCode);
|
||||
PRBool ParseNameSpaceRule(PRInt32& aErrorCode);
|
||||
PRBool ProcessImport(PRInt32& aErrorCode, const nsString& aURLSpec, const nsString& aMedia, nsIStyleRule** aResult);
|
||||
PRBool ParseMediaRule(PRInt32& aErrorCode, nsIStyleRule** aResult);
|
||||
PRBool ParseNameSpaceRule(PRInt32& aErrorCode, nsIStyleRule** aResult);
|
||||
PRBool ProcessNameSpace(PRInt32& aErrorCode, const nsString& aPrefix,
|
||||
const nsString& aURLSpec);
|
||||
PRBool ParseFontFaceRule(PRInt32& aErrorCode);
|
||||
PRBool ParsePageRule(PRInt32& aErrorCode);
|
||||
const nsString& aURLSpec, nsIStyleRule** aResult);
|
||||
PRBool ParseFontFaceRule(PRInt32& aErrorCode, nsIStyleRule** aResult);
|
||||
PRBool ParsePageRule(PRInt32& aErrorCode, nsIStyleRule** aResult);
|
||||
|
||||
void ParseIDSelector(PRInt32& aDataMask, nsCSSSelector& aSelector,
|
||||
PRInt32& aParsingStatus, PRInt32& aErrorCode);
|
||||
|
@ -677,6 +681,49 @@ CSSParserImpl::ParseAndAppendDeclaration(const nsAReadableString& aBuffer,
|
|||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSParserImpl::ParseRule(nsAReadableString& aRule,
|
||||
nsIURI* aBaseURL,
|
||||
nsIStyleRule** aResult)
|
||||
{
|
||||
NS_ASSERTION(nsnull != aBaseURL, "need base URL");
|
||||
NS_ENSURE_ARG_POINTER(aResult);
|
||||
*aResult = nsnull;
|
||||
|
||||
nsString* str = new nsString(aRule);
|
||||
if (nsnull == str) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
nsCOMPtr<nsIUnicharInputStream> input = nsnull;
|
||||
nsresult rv = NS_NewStringUnicharInputStream(getter_AddRefs(input), str);
|
||||
if (NS_OK != rv) {
|
||||
delete str;
|
||||
return rv;
|
||||
}
|
||||
|
||||
rv = InitScanner(input, aBaseURL);
|
||||
if (! NS_SUCCEEDED(rv)) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
mSection = eCSSSection_Charset; // callers are responsible for rejecting invalid rules. Maybe pass in the previous rule to this method?
|
||||
PRInt32 errorCode = NS_OK;
|
||||
|
||||
nsCSSToken* tk = &mToken;
|
||||
// Get first non-whitespace token
|
||||
if (!GetToken(errorCode, PR_TRUE)) {
|
||||
OUTPUT_ERROR();
|
||||
} else if (eCSSToken_AtKeyword == tk->mType) {
|
||||
ParseAtRule(errorCode, aResult);
|
||||
}
|
||||
else {
|
||||
UngetToken();
|
||||
ParseRuleSet(errorCode, aResult);
|
||||
}
|
||||
ReleaseScanner();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
PRBool CSSParserImpl::GetToken(PRInt32& aErrorCode, PRBool aSkipWS)
|
||||
|
@ -790,43 +837,43 @@ PRBool CSSParserImpl::SkipAtRule(PRInt32& aErrorCode)
|
|||
return PR_TRUE;
|
||||
}
|
||||
|
||||
PRBool CSSParserImpl::ParseAtRule(PRInt32& aErrorCode)
|
||||
PRBool CSSParserImpl::ParseAtRule(PRInt32& aErrorCode, nsIStyleRule** aResult)
|
||||
{
|
||||
if ((mSection <= eCSSSection_Charset) &&
|
||||
(mToken.mIdent.EqualsIgnoreCase("charset"))) {
|
||||
if (ParseCharsetRule(aErrorCode)) {
|
||||
if (ParseCharsetRule(aErrorCode, aResult)) {
|
||||
mSection = eCSSSection_Import; // only one charset allowed
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
if ((mSection <= eCSSSection_Import) &&
|
||||
mToken.mIdent.EqualsIgnoreCase("import")) {
|
||||
if (ParseImportRule(aErrorCode)) {
|
||||
if (ParseImportRule(aErrorCode, aResult)) {
|
||||
mSection = eCSSSection_Import;
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
if ((mSection <= eCSSSection_NameSpace) &&
|
||||
mToken.mIdent.EqualsIgnoreCase("namespace")) {
|
||||
if (ParseNameSpaceRule(aErrorCode)) {
|
||||
if (ParseNameSpaceRule(aErrorCode, aResult)) {
|
||||
mSection = eCSSSection_NameSpace;
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
if (mToken.mIdent.EqualsIgnoreCase("media")) {
|
||||
if (ParseMediaRule(aErrorCode)) {
|
||||
if (ParseMediaRule(aErrorCode, aResult)) {
|
||||
mSection = eCSSSection_General;
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
if (mToken.mIdent.EqualsIgnoreCase("font-face")) {
|
||||
if (ParseFontFaceRule(aErrorCode)) {
|
||||
if (ParseFontFaceRule(aErrorCode, aResult)) {
|
||||
mSection = eCSSSection_General;
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
if (mToken.mIdent.EqualsIgnoreCase("page")) {
|
||||
if (ParsePageRule(aErrorCode)) {
|
||||
if (ParsePageRule(aErrorCode, aResult)) {
|
||||
mSection = eCSSSection_General;
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
@ -839,7 +886,7 @@ PRBool CSSParserImpl::ParseAtRule(PRInt32& aErrorCode)
|
|||
return SkipAtRule(aErrorCode);
|
||||
}
|
||||
|
||||
PRBool CSSParserImpl::ParseCharsetRule(PRInt32& aErrorCode)
|
||||
PRBool CSSParserImpl::ParseCharsetRule(PRInt32& aErrorCode, nsIStyleRule** aResult)
|
||||
{
|
||||
// XXX not yet implemented
|
||||
return PR_FALSE;
|
||||
|
@ -914,7 +961,7 @@ PRBool CSSParserImpl::GatherMedia(PRInt32& aErrorCode, nsString& aMedia,
|
|||
}
|
||||
|
||||
// Parse a CSS2 import rule: "@import STRING | URL [medium [, mdeium]]"
|
||||
PRBool CSSParserImpl::ParseImportRule(PRInt32& aErrorCode)
|
||||
PRBool CSSParserImpl::ParseImportRule(PRInt32& aErrorCode, nsIStyleRule** aResult)
|
||||
{
|
||||
if (!GetToken(aErrorCode, PR_TRUE)) {
|
||||
REPORT_UNEXPECTED_EOF();
|
||||
|
@ -927,7 +974,7 @@ PRBool CSSParserImpl::ParseImportRule(PRInt32& aErrorCode)
|
|||
url = mToken.mIdent;
|
||||
if (GatherMedia(aErrorCode, media, nsnull)) {
|
||||
if (ExpectSymbol(aErrorCode, ';', PR_TRUE)) {
|
||||
ProcessImport(aErrorCode, url, media);
|
||||
ProcessImport(aErrorCode, url, media, aResult);
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
|
@ -941,7 +988,7 @@ PRBool CSSParserImpl::ParseImportRule(PRInt32& aErrorCode)
|
|||
if (ExpectSymbol(aErrorCode, ')', PR_TRUE)) {
|
||||
if (GatherMedia(aErrorCode, media, nsnull)) {
|
||||
if (ExpectSymbol(aErrorCode, ';', PR_TRUE)) {
|
||||
ProcessImport(aErrorCode, url, media);
|
||||
ProcessImport(aErrorCode, url, media, aResult);
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
|
@ -957,12 +1004,18 @@ PRBool CSSParserImpl::ParseImportRule(PRInt32& aErrorCode)
|
|||
}
|
||||
|
||||
|
||||
PRBool CSSParserImpl::ProcessImport(PRInt32& aErrorCode, const nsString& aURLSpec, const nsString& aMedia)
|
||||
PRBool CSSParserImpl::ProcessImport(PRInt32& aErrorCode, const nsString& aURLSpec, const nsString& aMedia, nsIStyleRule** aResult)
|
||||
{
|
||||
nsCOMPtr<nsICSSImportRule> rule;
|
||||
NS_NewCSSImportRule(getter_AddRefs(rule), aURLSpec, aMedia);
|
||||
if (rule) {
|
||||
AppendRule(rule);
|
||||
if (aResult) { // someone wants this rule
|
||||
*aResult = rule;
|
||||
NS_ADDREF(*aResult);
|
||||
}
|
||||
else {
|
||||
AppendRule(rule);
|
||||
}
|
||||
}
|
||||
|
||||
if (mChildLoader) {
|
||||
|
@ -989,18 +1042,18 @@ PRBool CSSParserImpl::ProcessImport(PRInt32& aErrorCode, const nsString& aURLSpe
|
|||
}
|
||||
|
||||
// Parse a CSS2 media rule: "@media medium [, medium] { ... }"
|
||||
PRBool CSSParserImpl::ParseMediaRule(PRInt32& aErrorCode)
|
||||
PRBool CSSParserImpl::ParseMediaRule(PRInt32& aErrorCode, nsIStyleRule** aResult)
|
||||
{
|
||||
nsAutoString mediaStr;
|
||||
nsISupportsArray* media = nsnull;
|
||||
NS_NewISupportsArray(&media);
|
||||
nsCOMPtr<nsISupportsArray> media;
|
||||
NS_NewISupportsArray(getter_AddRefs(media));
|
||||
if (media) {
|
||||
if (GatherMedia(aErrorCode, mediaStr, media)) {
|
||||
if ((0 < mediaStr.Length()) &&
|
||||
ExpectSymbol(aErrorCode, '{', PR_TRUE)) {
|
||||
// push media rule on stack, loop over children
|
||||
nsICSSMediaRule* rule = nsnull;
|
||||
NS_NewCSSMediaRule(&rule);
|
||||
nsCOMPtr<nsICSSMediaRule> rule;
|
||||
NS_NewCSSMediaRule(getter_AddRefs(rule));
|
||||
if (rule) {
|
||||
if (PushGroup(rule)) {
|
||||
|
||||
|
@ -1027,29 +1080,34 @@ PRBool CSSParserImpl::ParseMediaRule(PRInt32& aErrorCode)
|
|||
PopGroup();
|
||||
|
||||
if (ExpectSymbol(aErrorCode, '}', PR_TRUE)) {
|
||||
rule->SetMedia(media);
|
||||
AppendRule(rule);
|
||||
NS_RELEASE(rule);
|
||||
NS_RELEASE(media);
|
||||
if (aResult) { // someone wants this rule
|
||||
rule->SetMedia(media);
|
||||
*aResult = rule;
|
||||
NS_ADDREF(*aResult);
|
||||
}
|
||||
else {
|
||||
// Append first, so when we do SetMedia() the rule
|
||||
// knows what its stylesheet is.
|
||||
AppendRule(rule);
|
||||
rule->SetMedia(media);
|
||||
}
|
||||
return PR_TRUE;
|
||||
}
|
||||
mSection = holdSection;
|
||||
}
|
||||
NS_RELEASE(rule);
|
||||
}
|
||||
else { // failed to create rule, backup and skip block
|
||||
UngetToken();
|
||||
}
|
||||
}
|
||||
}
|
||||
NS_RELEASE(media);
|
||||
}
|
||||
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
// Parse a CSS3 namespace rule: "@namespace [prefix] STRING | URL;"
|
||||
PRBool CSSParserImpl::ParseNameSpaceRule(PRInt32& aErrorCode)
|
||||
PRBool CSSParserImpl::ParseNameSpaceRule(PRInt32& aErrorCode, nsIStyleRule** aResult)
|
||||
{
|
||||
if (!GetToken(aErrorCode, PR_TRUE)) {
|
||||
REPORT_UNEXPECTED_EOF();
|
||||
|
@ -1071,7 +1129,7 @@ PRBool CSSParserImpl::ParseNameSpaceRule(PRInt32& aErrorCode)
|
|||
if (eCSSToken_String == mToken.mType) {
|
||||
url = mToken.mIdent;
|
||||
if (ExpectSymbol(aErrorCode, ';', PR_TRUE)) {
|
||||
ProcessNameSpace(aErrorCode, prefix, url);
|
||||
ProcessNameSpace(aErrorCode, prefix, url, aResult);
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
|
@ -1083,7 +1141,7 @@ PRBool CSSParserImpl::ParseNameSpaceRule(PRInt32& aErrorCode)
|
|||
url = mToken.mIdent;
|
||||
if (ExpectSymbol(aErrorCode, ')', PR_TRUE)) {
|
||||
if (ExpectSymbol(aErrorCode, ';', PR_TRUE)) {
|
||||
ProcessNameSpace(aErrorCode, prefix, url);
|
||||
ProcessNameSpace(aErrorCode, prefix, url, aResult);
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
|
@ -1098,36 +1156,40 @@ PRBool CSSParserImpl::ParseNameSpaceRule(PRInt32& aErrorCode)
|
|||
}
|
||||
|
||||
PRBool CSSParserImpl::ProcessNameSpace(PRInt32& aErrorCode, const nsString& aPrefix,
|
||||
const nsString& aURLSpec)
|
||||
const nsString& aURLSpec, nsIStyleRule** aResult)
|
||||
{
|
||||
PRBool result = PR_FALSE;
|
||||
|
||||
nsICSSNameSpaceRule* rule = nsnull;
|
||||
nsIAtom* prefix = nsnull;
|
||||
nsCOMPtr<nsICSSNameSpaceRule> rule;
|
||||
nsCOMPtr<nsIAtom> prefix;
|
||||
|
||||
if (0 < aPrefix.Length()) {
|
||||
prefix = NS_NewAtom(aPrefix);
|
||||
prefix = dont_AddRef(NS_NewAtom(aPrefix));
|
||||
}
|
||||
|
||||
NS_NewCSSNameSpaceRule(&rule, prefix, aURLSpec);
|
||||
NS_NewCSSNameSpaceRule(getter_AddRefs(rule), prefix, aURLSpec);
|
||||
if (rule) {
|
||||
AppendRule(rule);
|
||||
NS_RELEASE(rule);
|
||||
NS_IF_RELEASE(mNameSpace);
|
||||
mSheet->GetNameSpace(mNameSpace);
|
||||
if (aResult) { // someone wants this rule
|
||||
*aResult = rule;
|
||||
NS_ADDREF(*aResult);
|
||||
}
|
||||
else {
|
||||
AppendRule(rule);
|
||||
NS_IF_RELEASE(mNameSpace);
|
||||
mSheet->GetNameSpace(mNameSpace);
|
||||
}
|
||||
}
|
||||
|
||||
NS_IF_RELEASE(prefix);
|
||||
return result;
|
||||
}
|
||||
|
||||
PRBool CSSParserImpl::ParseFontFaceRule(PRInt32& aErrorCode)
|
||||
PRBool CSSParserImpl::ParseFontFaceRule(PRInt32& aErrorCode, nsIStyleRule** aResult)
|
||||
{
|
||||
// XXX not yet implemented
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
PRBool CSSParserImpl::ParsePageRule(PRInt32& aErrorCode)
|
||||
PRBool CSSParserImpl::ParsePageRule(PRInt32& aErrorCode, nsIStyleRule** aResult)
|
||||
{
|
||||
// XXX not yet implemented
|
||||
return PR_FALSE;
|
||||
|
@ -1251,7 +1313,7 @@ void CSSParserImpl::AppendRule(nsICSSRule* aRule)
|
|||
}
|
||||
}
|
||||
|
||||
PRBool CSSParserImpl::ParseRuleSet(PRInt32& aErrorCode)
|
||||
PRBool CSSParserImpl::ParseRuleSet(PRInt32& aErrorCode, nsIStyleRule** aResult)
|
||||
{
|
||||
// First get the list of selectors for the rule
|
||||
SelectorList* slist = nsnull;
|
||||
|
@ -1299,7 +1361,13 @@ PRBool CSSParserImpl::ParseRuleSet(PRInt32& aErrorCode)
|
|||
rule->SetDeclaration(declaration);
|
||||
rule->SetWeight(list->mWeight);
|
||||
// rule->List();
|
||||
AppendRule(rule);
|
||||
if (aResult) { // someone wants this rule back; don't append it
|
||||
*aResult = rule;
|
||||
NS_ADDREF(*aResult);
|
||||
}
|
||||
else {
|
||||
AppendRule(rule);
|
||||
}
|
||||
NS_RELEASE(rule);
|
||||
}
|
||||
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Boris Zbarsky <bzbarsky@mit.edu>
|
||||
*
|
||||
*/
|
||||
#include "nsICSSCharsetRule.h"
|
||||
#include "nsICSSImportRule.h"
|
||||
|
@ -39,11 +41,16 @@
|
|||
#include "nsIDOMCSSStyleSheet.h"
|
||||
#include "nsIDOMCSSRule.h"
|
||||
#include "nsIDOMCSSImportRule.h"
|
||||
#include "nsIDOMCSSMediaRule.h"
|
||||
#include "nsIMediaList.h"
|
||||
#include "nsIDOMMediaList.h"
|
||||
#include "nsIDOMCSSRuleList.h"
|
||||
#include "nsIDOMStyleSheet.h"
|
||||
#include "nsIDocument.h"
|
||||
|
||||
#include "nsContentUtils.h"
|
||||
#include "nsStyleConsts.h"
|
||||
#include "nsDOMError.h"
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
|
||||
|
@ -64,6 +71,84 @@ NS_IMETHODIMP _class::GetStyleSheet(nsIStyleSheet*& aSheet) const { return super
|
|||
NS_IMETHODIMP _class::GetStrength(PRInt32& aStrength) const { return super::GetStrength(aStrength); } \
|
||||
NS_IMETHODIMP _class::MapRuleInfoInto(nsRuleData* aRuleData) { return NS_OK; }
|
||||
|
||||
// -------------------------------
|
||||
// Style Rule List for group rules
|
||||
//
|
||||
class CSSGroupRuleRuleListImpl : public nsIDOMCSSRuleList
|
||||
{
|
||||
public:
|
||||
CSSGroupRuleRuleListImpl(nsICSSGroupRule *aGroupRule);
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_DECL_NSIDOMCSSRULELIST
|
||||
|
||||
void DropReference() { mGroupRule = nsnull; }
|
||||
|
||||
protected:
|
||||
virtual ~CSSGroupRuleRuleListImpl(void);
|
||||
|
||||
private:
|
||||
nsICSSGroupRule* mGroupRule;
|
||||
};
|
||||
|
||||
CSSGroupRuleRuleListImpl::CSSGroupRuleRuleListImpl(nsICSSGroupRule *aGroupRule)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
// Not reference counted to avoid circular references.
|
||||
// The rule will tell us when its going away.
|
||||
mGroupRule = aGroupRule;
|
||||
}
|
||||
|
||||
CSSGroupRuleRuleListImpl::~CSSGroupRuleRuleListImpl()
|
||||
{
|
||||
}
|
||||
|
||||
// QueryInterface implementation for CSSGroupRuleRuleList
|
||||
NS_INTERFACE_MAP_BEGIN(CSSGroupRuleRuleListImpl)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSRuleList)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISupports)
|
||||
NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(CSSGroupRuleRuleList)
|
||||
NS_INTERFACE_MAP_END
|
||||
|
||||
|
||||
NS_IMPL_ADDREF(CSSGroupRuleRuleListImpl);
|
||||
NS_IMPL_RELEASE(CSSGroupRuleRuleListImpl);
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSGroupRuleRuleListImpl::GetLength(PRUint32* aLength)
|
||||
{
|
||||
if (mGroupRule) {
|
||||
PRInt32 count;
|
||||
mGroupRule->StyleRuleCount(count);
|
||||
*aLength = (PRUint32)count;
|
||||
} else {
|
||||
*aLength = 0;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSGroupRuleRuleListImpl::Item(PRUint32 aIndex, nsIDOMCSSRule** aReturn)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
|
||||
*aReturn = nsnull;
|
||||
if (mGroupRule) {
|
||||
nsCOMPtr<nsICSSRule> rule;
|
||||
|
||||
result = mGroupRule->GetStyleRuleAt(aIndex, *getter_AddRefs(rule));
|
||||
if (rule) {
|
||||
result = CallQueryInterface(rule, aReturn);
|
||||
} else if (result == NS_ERROR_ILLEGAL_VALUE) {
|
||||
result = NS_OK; // per spec: "Return Value ... null if ... not a valid index."
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// -------------------------------------------
|
||||
// nsICSSCharsetRule
|
||||
//
|
||||
|
@ -374,7 +459,7 @@ CSSImportRuleImpl::List(FILE* out, PRInt32 aIndent) const
|
|||
fputs("\" ", out);
|
||||
|
||||
nsAutoString mediaText;
|
||||
mMedia->GetMediaText(mediaText);
|
||||
mMedia->GetText(mediaText);
|
||||
fputs(mediaText, out);
|
||||
fputs("\n", out);
|
||||
|
||||
|
@ -456,7 +541,7 @@ NS_IMETHODIMP
|
|||
CSSImportRuleImpl::SetMedia(const nsString& aMedia)
|
||||
{
|
||||
if (mMedia) {
|
||||
return mMedia->SetMediaText(aMedia);
|
||||
return mMedia->SetText(aMedia);
|
||||
} else {
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -466,7 +551,7 @@ NS_IMETHODIMP
|
|||
CSSImportRuleImpl::GetMedia(nsString& aMedia) const
|
||||
{
|
||||
if (mMedia) {
|
||||
return mMedia->GetMediaText(aMedia);
|
||||
return mMedia->GetText(aMedia);
|
||||
} else {
|
||||
aMedia.Truncate();
|
||||
return NS_OK;
|
||||
|
@ -527,7 +612,7 @@ CSSImportRuleImpl::GetCssText(nsAWritableString& aCssText)
|
|||
aCssText.Append(NS_LITERAL_STRING(")"));
|
||||
if (mMedia) {
|
||||
nsAutoString mediaText;
|
||||
mMedia->GetMediaText(mediaText);
|
||||
mMedia->GetText(mediaText);
|
||||
if (!mediaText.IsEmpty()) {
|
||||
aCssText.Append(NS_LITERAL_STRING(" "));
|
||||
aCssText.Append(mediaText);
|
||||
|
@ -596,7 +681,7 @@ CSSImportRuleImpl::GetStyleSheet(nsIDOMCSSStyleSheet * *aStyleSheet)
|
|||
//
|
||||
class CSSMediaRuleImpl : public nsCSSRule,
|
||||
public nsICSSMediaRule,
|
||||
public nsIDOMCSSRule
|
||||
public nsIDOMCSSMediaRule
|
||||
{
|
||||
public:
|
||||
CSSMediaRuleImpl(void);
|
||||
|
@ -618,27 +703,33 @@ public:
|
|||
|
||||
// nsICSSMediaRule methods
|
||||
NS_IMETHOD SetMedia(nsISupportsArray* aMedia);
|
||||
NS_IMETHOD UseForMedium(nsIAtom* aMedium) const;
|
||||
NS_IMETHOD_(PRBool) UseForMedium(nsIAtom* aMedium) const;
|
||||
|
||||
// nsICSSGroupRule methods
|
||||
NS_IMETHOD AppendStyleRule(nsICSSRule* aRule);
|
||||
|
||||
NS_IMETHOD StyleRuleCount(PRInt32& aCount) const;
|
||||
NS_IMETHOD GetStyleRuleAt(PRInt32 aIndex, nsICSSRule*& aRule) const;
|
||||
|
||||
NS_IMETHOD EnumerateRulesForwards(nsISupportsArrayEnumFunc aFunc, void * aData) const;
|
||||
|
||||
NS_IMETHOD DeleteStyleRuleAt(PRUint32 aIndex);
|
||||
NS_IMETHOD InsertStyleRuleAt(PRUint32 aIndex, nsICSSRule* aRule);
|
||||
|
||||
// nsIDOMCSSRule interface
|
||||
NS_DECL_NSIDOMCSSRULE
|
||||
|
||||
// nsIDOMCSSMediaRule interface
|
||||
NS_DECL_NSIDOMCSSMEDIARULE
|
||||
|
||||
protected:
|
||||
nsISupportsArray* mMedia;
|
||||
nsCOMPtr<nsIMediaList> mMedia;
|
||||
nsISupportsArray* mRules;
|
||||
CSSGroupRuleRuleListImpl* mRuleCollection;
|
||||
};
|
||||
|
||||
CSSMediaRuleImpl::CSSMediaRuleImpl(void)
|
||||
: nsCSSRule(),
|
||||
mMedia(nsnull),
|
||||
mRules(nsnull)
|
||||
mRules(nsnull),
|
||||
mRuleCollection(nsnull)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -659,13 +750,11 @@ CloneRuleInto(nsISupports* aRule, void* aArray)
|
|||
CSSMediaRuleImpl::CSSMediaRuleImpl(const CSSMediaRuleImpl& aCopy)
|
||||
: nsCSSRule(aCopy),
|
||||
mMedia(nsnull),
|
||||
mRules(nsnull)
|
||||
mRules(nsnull),
|
||||
mRuleCollection(nsnull)
|
||||
{
|
||||
if (aCopy.mMedia) {
|
||||
NS_NewISupportsArray(&mMedia);
|
||||
if (mMedia) {
|
||||
mMedia->AppendElements(aCopy.mMedia);
|
||||
}
|
||||
NS_NewMediaList(aCopy.mMedia, aCopy.mSheet, getter_AddRefs(mMedia));
|
||||
}
|
||||
|
||||
if (aCopy.mRules) {
|
||||
|
@ -678,8 +767,14 @@ CSSMediaRuleImpl::CSSMediaRuleImpl(const CSSMediaRuleImpl& aCopy)
|
|||
|
||||
CSSMediaRuleImpl::~CSSMediaRuleImpl(void)
|
||||
{
|
||||
NS_IF_RELEASE(mMedia);
|
||||
NS_IF_RELEASE(mRules);
|
||||
if (mMedia) {
|
||||
mMedia->DropReference();
|
||||
}
|
||||
if (mRuleCollection) {
|
||||
mRuleCollection->DropReference();
|
||||
NS_RELEASE(mRuleCollection);
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMPL_ADDREF_INHERITED(CSSMediaRuleImpl, nsCSSRule);
|
||||
|
@ -691,6 +786,7 @@ NS_INTERFACE_MAP_BEGIN(CSSMediaRuleImpl)
|
|||
NS_INTERFACE_MAP_ENTRY(nsICSSRule)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIStyleRule)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSRule)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSMediaRule)
|
||||
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsICSSMediaRule)
|
||||
NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(CSSMediaRule)
|
||||
NS_INTERFACE_MAP_END
|
||||
|
@ -712,6 +808,17 @@ CSSMediaRuleImpl::SetStyleSheet(nsICSSStyleSheet* aSheet)
|
|||
if (mRules) {
|
||||
mRules->EnumerateForwards(SetStyleSheetReference, aSheet);
|
||||
}
|
||||
if (mMedia) {
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsISupportsArray> oldMedia(do_QueryInterface(mMedia, &rv));
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
mMedia->DropReference();
|
||||
rv = NS_NewMediaList(oldMedia, aSheet, getter_AddRefs(mMedia));
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
}
|
||||
|
||||
return nsCSSRule::SetStyleSheet(aSheet);
|
||||
}
|
||||
|
||||
|
@ -729,13 +836,13 @@ CSSMediaRuleImpl::List(FILE* out, PRInt32 aIndent) const
|
|||
PRUint32 count;
|
||||
mMedia->Count(&count);
|
||||
while (index < count) {
|
||||
nsIAtom* medium = (nsIAtom*)mMedia->ElementAt(index++);
|
||||
nsCOMPtr<nsIAtom> medium;
|
||||
mMedia->QueryElementAt(index++, NS_GET_IID(nsIAtom), getter_AddRefs(medium));
|
||||
medium->ToString(buffer);
|
||||
fputs(buffer, out);
|
||||
if (index < count) {
|
||||
fputs(", ", out);
|
||||
}
|
||||
NS_RELEASE(medium);
|
||||
}
|
||||
}
|
||||
fputs(" {\n", out);
|
||||
|
@ -745,9 +852,9 @@ CSSMediaRuleImpl::List(FILE* out, PRInt32 aIndent) const
|
|||
PRUint32 count;
|
||||
mRules->Count(&count);
|
||||
while (index < count) {
|
||||
nsICSSRule* rule = (nsICSSRule*)mRules->ElementAt(index++);
|
||||
nsCOMPtr<nsICSSRule> rule;
|
||||
mRules->QueryElementAt(index++, NS_GET_IID(nsICSSRule), getter_AddRefs(rule));
|
||||
rule->List(out, aIndent + 1);
|
||||
NS_RELEASE(rule);
|
||||
}
|
||||
}
|
||||
fputs("}\n", out);
|
||||
|
@ -791,12 +898,12 @@ void CSSMediaRuleImpl::SizeOf(nsISizeOfHandler *aSizeOfHandler, PRUint32 &aSize)
|
|||
PRUint32 count;
|
||||
mMedia->Count(&count);
|
||||
while (index < count) {
|
||||
nsIAtom* medium = (nsIAtom*)mMedia->ElementAt(index++);
|
||||
nsCOMPtr<nsIAtom> medium;
|
||||
mMedia->QueryElementAt(index++, NS_GET_IID(nsIAtom), getter_AddRefs(medium));
|
||||
if(medium && uniqueItems->AddItem(medium)){
|
||||
medium->SizeOf(aSizeOfHandler, &localSize);
|
||||
aSize += localSize;
|
||||
}
|
||||
NS_IF_RELEASE(medium);
|
||||
}
|
||||
}
|
||||
// we are done with the size we report for ourself
|
||||
|
@ -808,9 +915,9 @@ void CSSMediaRuleImpl::SizeOf(nsISizeOfHandler *aSizeOfHandler, PRUint32 &aSize)
|
|||
PRUint32 count;
|
||||
mRules->Count(&count);
|
||||
while (index < count) {
|
||||
nsICSSRule* rule = (nsICSSRule*)mRules->ElementAt(index++);
|
||||
nsCOMPtr<nsICSSRule> rule;
|
||||
mRules->QueryElementAt(index++, NS_GET_IID(nsICSSRule), getter_AddRefs(rule));
|
||||
rule->SizeOf(aSizeOfHandler, localSize);
|
||||
NS_RELEASE(rule);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -837,26 +944,18 @@ CSSMediaRuleImpl::Clone(nsICSSRule*& aClone) const
|
|||
NS_IMETHODIMP
|
||||
CSSMediaRuleImpl::SetMedia(nsISupportsArray* aMedia)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
NS_IF_RELEASE(mMedia);
|
||||
mMedia = aMedia;
|
||||
NS_IF_ADDREF(mMedia);
|
||||
return result;
|
||||
return NS_NewMediaList(aMedia, mSheet, getter_AddRefs(mMedia));
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
NS_IMETHODIMP_(PRBool)
|
||||
CSSMediaRuleImpl::UseForMedium(nsIAtom* aMedium) const
|
||||
{
|
||||
if (mMedia) {
|
||||
if (-1 != mMedia->IndexOf(aMedium)) {
|
||||
return NS_OK;
|
||||
}
|
||||
if (-1 != mMedia->IndexOf(nsLayoutAtoms::all)) {
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_COMFALSE;
|
||||
PRBool matches = PR_FALSE;
|
||||
mMedia->MatchesMedium(aMedium, &matches);
|
||||
return matches;
|
||||
}
|
||||
return NS_OK;
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -894,10 +993,17 @@ NS_IMETHODIMP
|
|||
CSSMediaRuleImpl::GetStyleRuleAt(PRInt32 aIndex, nsICSSRule*& aRule) const
|
||||
{
|
||||
if (mRules) {
|
||||
PRInt32 count = 0;
|
||||
nsresult rv = StyleRuleCount(count);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
if (aIndex >= count) {
|
||||
aRule = nsnull;
|
||||
return NS_ERROR_ILLEGAL_VALUE;
|
||||
}
|
||||
aRule = (nsICSSRule*)mRules->ElementAt(aIndex);
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
return NS_ERROR_ILLEGAL_VALUE;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -909,6 +1015,37 @@ CSSMediaRuleImpl::EnumerateRulesForwards(nsISupportsArrayEnumFunc aFunc, void *
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* The next two methods (DeleteStyleRuleAt and InsertStyleRuleAt)
|
||||
* should never be called unless you have first called WillDirty() on
|
||||
* the parents tylesheet. After they are called, DidDirty() needs to
|
||||
* be called on the sheet
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
CSSMediaRuleImpl::DeleteStyleRuleAt(PRUint32 aIndex)
|
||||
{
|
||||
NS_ENSURE_TRUE(mRules, NS_ERROR_FAILURE);
|
||||
|
||||
nsCOMPtr<nsICSSRule> rule;
|
||||
nsresult rv = mRules->QueryElementAt(aIndex, NS_GET_IID(nsICSSRule), getter_AddRefs(rule));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rule->SetStyleSheet(nsnull);
|
||||
return mRules->DeleteElementAt(aIndex);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSMediaRuleImpl::InsertStyleRuleAt(PRUint32 aIndex, nsICSSRule* aRule)
|
||||
{
|
||||
NS_ENSURE_TRUE(mRules, NS_ERROR_FAILURE);
|
||||
|
||||
// There is no xpcom-compatible version of InsertElementAt.... :(
|
||||
if (! mRules->InsertElementAt(aRule, aIndex)) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
aRule->SetStyleSheet(mSheet);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
nsresult
|
||||
NS_NewCSSMediaRule(nsICSSMediaRule** aInstancePtrResult)
|
||||
|
@ -926,6 +1063,7 @@ NS_NewCSSMediaRule(nsICSSMediaRule** aInstancePtrResult)
|
|||
return it->QueryInterface(NS_GET_IID(nsICSSMediaRule), (void **) aInstancePtrResult);
|
||||
}
|
||||
|
||||
// nsIDOMCSSRule methods
|
||||
NS_IMETHODIMP
|
||||
CSSMediaRuleImpl::GetType(PRUint16* aType)
|
||||
{
|
||||
|
@ -943,7 +1081,8 @@ CSSMediaRuleImpl::GetCssText(nsAWritableString& aCssText)
|
|||
if (mMedia) {
|
||||
mMedia->Count(&count);
|
||||
for (index = 0; index < count; index++) {
|
||||
nsCOMPtr<nsIAtom> medium (do_QueryInterface(mMedia->ElementAt(index)));
|
||||
nsCOMPtr<nsIAtom> medium;
|
||||
mMedia->QueryElementAt(index, NS_GET_IID(nsIAtom), getter_AddRefs(medium));
|
||||
if (medium) {
|
||||
nsAutoString tempString;
|
||||
if (index > 0)
|
||||
|
@ -960,7 +1099,8 @@ CSSMediaRuleImpl::GetCssText(nsAWritableString& aCssText)
|
|||
if (mRules) {
|
||||
mRules->Count(&count);
|
||||
for (index = 0; index < count; index++) {
|
||||
nsCOMPtr<nsIDOMCSSRule> rule (do_QueryInterface(mRules->ElementAt(index)));
|
||||
nsCOMPtr<nsIDOMCSSRule> rule;
|
||||
mRules->QueryElementAt(index, NS_GET_IID(nsIDOMCSSRule), getter_AddRefs(rule));
|
||||
if (rule) {
|
||||
nsAutoString tempString;
|
||||
rule->GetCssText(tempString);
|
||||
|
@ -998,6 +1138,60 @@ CSSMediaRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule)
|
|||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
// nsIDOMCSSMediaRule methods
|
||||
NS_IMETHODIMP
|
||||
CSSMediaRuleImpl::GetMedia(nsIDOMMediaList* *aMedia)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aMedia);
|
||||
if (!mMedia) {
|
||||
*aMedia = nsnull;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
return CallQueryInterface(mMedia, aMedia);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSMediaRuleImpl::GetCssRules(nsIDOMCSSRuleList* *aRuleList)
|
||||
{
|
||||
if (!mRuleCollection) {
|
||||
mRuleCollection = new CSSGroupRuleRuleListImpl(this);
|
||||
if (!mRuleCollection) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
NS_ADDREF(mRuleCollection);
|
||||
}
|
||||
|
||||
return CallQueryInterface(mRuleCollection, aRuleList);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSMediaRuleImpl::InsertRule(nsAReadableString & aRule, PRUint32 aIndex, PRUint32* _retval)
|
||||
{
|
||||
NS_ENSURE_TRUE(mSheet, NS_ERROR_FAILURE);
|
||||
NS_ENSURE_TRUE(mRules, NS_ERROR_FAILURE);
|
||||
|
||||
PRUint32 count;
|
||||
mRules->Count(&count);
|
||||
if (aIndex > count)
|
||||
return NS_ERROR_DOM_INDEX_SIZE_ERR;
|
||||
|
||||
return mSheet->InsertRuleIntoGroup(aRule, this, aIndex, _retval);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSMediaRuleImpl::DeleteRule(PRUint32 aIndex)
|
||||
{
|
||||
NS_ENSURE_TRUE(mSheet, NS_ERROR_FAILURE);
|
||||
NS_ENSURE_TRUE(mRules, NS_ERROR_FAILURE);
|
||||
|
||||
PRUint32 count;
|
||||
mRules->Count(&count);
|
||||
if (aIndex >= count)
|
||||
return NS_ERROR_DOM_INDEX_SIZE_ERR;
|
||||
|
||||
return mSheet->DeleteRuleFromGroup(this, aIndex);
|
||||
}
|
||||
|
||||
// -------------------------------------------
|
||||
// nsICSSNameSpaceRule
|
||||
|
@ -1251,3 +1445,4 @@ CSSNameSpaceRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule)
|
|||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include "nsIMediaList.h"
|
||||
#include "nsIHTMLContent.h"
|
||||
#include "nsIDocument.h"
|
||||
#include "nsIHTMLContentContainer.h"
|
||||
#include "nsIPresContext.h"
|
||||
#include "nsIEventStateManager.h"
|
||||
#include "nsHTMLAtoms.h"
|
||||
|
@ -61,6 +62,7 @@
|
|||
#include "nsDOMError.h"
|
||||
#include "nsIPresShell.h"
|
||||
#include "nsICSSParser.h"
|
||||
#include "nsICSSLoader.h"
|
||||
#include "nsIRuleWalker.h"
|
||||
#include "nsCSSAtoms.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
|
@ -679,7 +681,7 @@ public:
|
|||
|
||||
nsISupportsArray* mOrderedRules;
|
||||
|
||||
nsINameSpace* mNameSpace;
|
||||
nsCOMPtr<nsINameSpace> mNameSpace;
|
||||
PRInt32 mDefaultNameSpaceID;
|
||||
nsHashtable mRelevantAttributes;
|
||||
};
|
||||
|
@ -715,10 +717,12 @@ public:
|
|||
NS_IMETHOD GetType(nsString& aType) const;
|
||||
NS_IMETHOD GetMediumCount(PRInt32& aCount) const;
|
||||
NS_IMETHOD GetMediumAt(PRInt32 aIndex, nsIAtom*& aMedium) const;
|
||||
NS_IMETHOD UseForMedium(nsIAtom* aMedium) const;
|
||||
NS_IMETHOD_(PRBool) UseForMedium(nsIAtom* aMedium) const;
|
||||
NS_IMETHOD AppendMedium(nsIAtom* aMedium);
|
||||
NS_IMETHOD ClearMedia(void);
|
||||
|
||||
NS_IMETHOD DeleteRuleFromGroup(nsICSSGroupRule* aGroup, PRUint32 aIndex);
|
||||
NS_IMETHOD InsertRuleIntoGroup(nsAReadableString& aRule, nsICSSGroupRule* aGroup, PRUint32 aIndex, PRUint32* _retval);
|
||||
|
||||
NS_IMETHOD GetEnabled(PRBool& aEnabled) const;
|
||||
NS_IMETHOD SetEnabled(PRBool aEnabled);
|
||||
|
||||
|
@ -812,7 +816,8 @@ protected:
|
|||
|
||||
nsVoidArray* mRuleProcessors;
|
||||
|
||||
friend class CSSRuleProcessor;
|
||||
friend class CSSRuleProcessor;
|
||||
friend class DOMMediaListImpl;
|
||||
};
|
||||
|
||||
|
||||
|
@ -923,13 +928,22 @@ class DOMMediaListImpl : public nsIDOMMediaList,
|
|||
return mArray->ElementAt(aIndex);
|
||||
}
|
||||
|
||||
// nsIMediaList methods
|
||||
NS_DECL_NSIMEDIALIST
|
||||
|
||||
DOMMediaListImpl(nsISupportsArray *aArray, CSSStyleSheetImpl *aStyleSheet);
|
||||
virtual ~DOMMediaListImpl();
|
||||
|
||||
void DropReference() { mStyleSheet = nsnull; }
|
||||
|
||||
private:
|
||||
nsresult BeginMediaChange(void);
|
||||
nsresult EndMediaChange(void);
|
||||
nsresult Delete(nsAReadableString & aOldMedium);
|
||||
nsresult Append(nsAReadableString & aOldMedium);
|
||||
|
||||
nsCOMPtr<nsISupportsArray> mArray;
|
||||
// not refcounted; sheet will let us know when it goes away
|
||||
// mStyleSheet is the sheet that needs to be dirtied when this medialist
|
||||
// changes
|
||||
CSSStyleSheetImpl* mStyleSheet;
|
||||
};
|
||||
|
||||
|
@ -937,6 +951,7 @@ private:
|
|||
NS_INTERFACE_MAP_BEGIN(DOMMediaListImpl)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIDOMMediaList)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIMediaList)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISupportsArray)
|
||||
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMMediaList)
|
||||
NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(MediaList)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISerializable)
|
||||
|
@ -962,13 +977,13 @@ DOMMediaListImpl::~DOMMediaListImpl()
|
|||
|
||||
nsresult
|
||||
NS_NewMediaList(nsIMediaList** aInstancePtrResult) {
|
||||
return NS_NewMediaList(aInstancePtrResult, NS_LITERAL_STRING(""));
|
||||
return NS_NewMediaList(NS_LITERAL_STRING(""), aInstancePtrResult);
|
||||
}
|
||||
|
||||
nsresult
|
||||
NS_NewMediaList(nsIMediaList** aInstancePtrResult, const nsAReadableString& aMediaText) {
|
||||
NS_NewMediaList(const nsAReadableString& aMediaText, nsIMediaList** aInstancePtrResult) {
|
||||
nsresult rv;
|
||||
NS_ENSURE_ARG_POINTER(aInstancePtrResult);
|
||||
NS_ASSERTION(aInstancePtrResult, "Null out param.");
|
||||
|
||||
nsCOMPtr<nsISupportsArray> array;
|
||||
rv = NS_NewISupportsArray(getter_AddRefs(array));
|
||||
|
@ -976,15 +991,29 @@ NS_NewMediaList(nsIMediaList** aInstancePtrResult, const nsAReadableString& aMed
|
|||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
DOMMediaListImpl* medialist = new DOMMediaListImpl(array, nsnull);
|
||||
NS_ENSURE_TRUE(medialist, NS_ERROR_OUT_OF_MEMORY);
|
||||
rv = medialist->SetMediaText(aMediaText);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
*aInstancePtrResult = medialist;
|
||||
NS_ENSURE_TRUE(medialist, NS_ERROR_OUT_OF_MEMORY);
|
||||
NS_ADDREF(*aInstancePtrResult);
|
||||
rv = medialist->SetMediaText(aMediaText);
|
||||
if (NS_FAILED(rv)) {
|
||||
NS_RELEASE(*aInstancePtrResult);
|
||||
*aInstancePtrResult = nsnull;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult NS_NewMediaList(nsISupportsArray* aArray, nsICSSStyleSheet* aSheet, nsIMediaList** aInstancePtrResult)
|
||||
{
|
||||
NS_ASSERTION(aInstancePtrResult, "Null out param.");
|
||||
DOMMediaListImpl* medialist = new DOMMediaListImpl(aArray, NS_STATIC_CAST(CSSStyleSheetImpl*, aSheet));
|
||||
*aInstancePtrResult = medialist;
|
||||
NS_ENSURE_TRUE(medialist, NS_ERROR_OUT_OF_MEMORY);
|
||||
NS_ADDREF(*aInstancePtrResult);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::GetMediaText(nsAWritableString& aMediaText)
|
||||
DOMMediaListImpl::GetText(nsAWritableString& aMediaText)
|
||||
{
|
||||
aMediaText.Truncate();
|
||||
|
||||
|
@ -995,10 +1024,8 @@ DOMMediaListImpl::GetMediaText(nsAWritableString& aMediaText)
|
|||
PRInt32 count = cnt, index = 0;
|
||||
|
||||
while (index < count) {
|
||||
nsCOMPtr<nsISupports> tmp(dont_AddRef(ElementAt(index++)));
|
||||
NS_ENSURE_TRUE(tmp, NS_ERROR_FAILURE);
|
||||
|
||||
nsCOMPtr<nsIAtom> medium(do_QueryInterface(tmp));
|
||||
nsCOMPtr<nsIAtom> medium;
|
||||
QueryElementAt(index++, NS_GET_IID(nsIAtom), getter_AddRefs(medium));
|
||||
NS_ENSURE_TRUE(medium, NS_ERROR_FAILURE);
|
||||
|
||||
const PRUnichar *buffer;
|
||||
|
@ -1013,7 +1040,7 @@ DOMMediaListImpl::GetMediaText(nsAWritableString& aMediaText)
|
|||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::SetMediaText(const nsAReadableString& aMediaText)
|
||||
DOMMediaListImpl::SetText(const nsAReadableString& aMediaText)
|
||||
{
|
||||
nsresult rv = Clear();
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
@ -1044,6 +1071,57 @@ DOMMediaListImpl::SetMediaText(const nsAReadableString& aMediaText)
|
|||
return rv;
|
||||
}
|
||||
|
||||
/*
|
||||
* aMatch is true when we contain the desired medium or contain the
|
||||
* "all" medium or contain no media at all, which is the same as
|
||||
* containing "all"
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::MatchesMedium(nsIAtom* aMedium, PRBool* aMatch)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aMatch);
|
||||
*aMatch = PR_FALSE;
|
||||
*aMatch = (-1 != IndexOf(aMedium)) ||
|
||||
(-1 != IndexOf(nsLayoutAtoms::all));
|
||||
if (*aMatch)
|
||||
return NS_OK;
|
||||
PRUint32 count;
|
||||
nsresult rv = Count(&count);
|
||||
if(NS_FAILED(rv))
|
||||
return rv;
|
||||
*aMatch = (count == 0);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::DropReference(void)
|
||||
{
|
||||
mStyleSheet = nsnull;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::GetMediaText(nsAWritableString& aMediaText)
|
||||
{
|
||||
return GetText(aMediaText);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::SetMediaText(nsAReadableString& aMediaText)
|
||||
{
|
||||
nsresult rv;
|
||||
rv = BeginMediaChange();
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
rv = SetText(aMediaText);
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
rv = EndMediaChange();
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::GetLength(PRUint32* aLength)
|
||||
{
|
||||
|
@ -1079,6 +1157,38 @@ DOMMediaListImpl::Item(PRUint32 aIndex, nsAWritableString& aReturn)
|
|||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::DeleteMedium(const nsAReadableString& aOldMedium)
|
||||
{
|
||||
nsresult rv;
|
||||
rv = BeginMediaChange();
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
rv = Delete(aOldMedium);
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
rv = EndMediaChange();
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
DOMMediaListImpl::AppendMedium(const nsAReadableString& aNewMedium)
|
||||
{
|
||||
nsresult rv;
|
||||
rv = BeginMediaChange();
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
rv = Append(aNewMedium);
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
rv = EndMediaChange();
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult
|
||||
DOMMediaListImpl::Delete(const nsAReadableString& aOldMedium)
|
||||
{
|
||||
if (!aOldMedium.Length())
|
||||
|
@ -1098,7 +1208,7 @@ DOMMediaListImpl::Delete(const nsAReadableString& aOldMedium)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsresult
|
||||
DOMMediaListImpl::Append(const nsAReadableString& aNewMedium)
|
||||
{
|
||||
if (!aNewMedium.Length())
|
||||
|
@ -1118,6 +1228,39 @@ DOMMediaListImpl::Append(const nsAReadableString& aNewMedium)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
DOMMediaListImpl::BeginMediaChange(void)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
|
||||
if (mStyleSheet) {
|
||||
rv = mStyleSheet->GetOwningDocument(*getter_AddRefs(doc));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = doc->BeginUpdate();
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = mStyleSheet->WillDirty();
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
DOMMediaListImpl::EndMediaChange(void)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
if (mStyleSheet) {
|
||||
mStyleSheet->DidDirty();
|
||||
rv = mStyleSheet->GetOwningDocument(*getter_AddRefs(doc));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = doc->StyleRuleChanged(mStyleSheet, nsnull, NS_STYLE_HINT_RECONSTRUCT_ALL);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = doc->EndUpdate();
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// -------------------------------
|
||||
// Imports Collection for the DOM
|
||||
|
@ -1286,7 +1429,6 @@ CSSStyleSheetInner::~CSSStyleSheetInner(void)
|
|||
mOrderedRules->EnumerateForwards(SetStyleSheetReference, nsnull);
|
||||
NS_RELEASE(mOrderedRules);
|
||||
}
|
||||
NS_IF_RELEASE(mNameSpace);
|
||||
}
|
||||
|
||||
CSSStyleSheetInner*
|
||||
|
@ -1326,7 +1468,7 @@ static PRBool
|
|||
CreateNameSpace(nsISupports* aRule, void* aNameSpacePtr)
|
||||
{
|
||||
nsICSSRule* rule = (nsICSSRule*)aRule;
|
||||
PRInt32 type;
|
||||
PRInt32 type = nsICSSRule::UNKNOWN_RULE;
|
||||
rule->GetType(type);
|
||||
if (nsICSSRule::NAMESPACE_RULE == type) {
|
||||
nsICSSNameSpaceRule* nameSpaceRule = (nsICSSNameSpaceRule*)rule;
|
||||
|
@ -1355,27 +1497,26 @@ CreateNameSpace(nsISupports* aRule, void* aNameSpacePtr)
|
|||
void
|
||||
CSSStyleSheetInner::RebuildNameSpaces(void)
|
||||
{
|
||||
nsINameSpaceManager* nameSpaceMgr;
|
||||
nsCOMPtr<nsINameSpaceManager> nameSpaceMgr;
|
||||
if (mNameSpace) {
|
||||
mNameSpace->GetNameSpaceManager(nameSpaceMgr);
|
||||
NS_RELEASE(mNameSpace);
|
||||
mNameSpace->GetNameSpaceManager(*getter_AddRefs(nameSpaceMgr));
|
||||
}
|
||||
else {
|
||||
NS_NewNameSpaceManager(&nameSpaceMgr);
|
||||
NS_NewNameSpaceManager(getter_AddRefs(nameSpaceMgr));
|
||||
}
|
||||
if (nameSpaceMgr) {
|
||||
nameSpaceMgr->CreateRootNameSpace(mNameSpace);
|
||||
nameSpaceMgr->CreateRootNameSpace(*getter_AddRefs(mNameSpace));
|
||||
if (kNameSpaceID_Unknown != mDefaultNameSpaceID) {
|
||||
nsINameSpace* defaultNameSpace;
|
||||
mNameSpace->CreateChildNameSpace(nsnull, mDefaultNameSpaceID, defaultNameSpace);
|
||||
nsCOMPtr<nsINameSpace> defaultNameSpace;
|
||||
mNameSpace->CreateChildNameSpace(nsnull, mDefaultNameSpaceID,
|
||||
*getter_AddRefs(defaultNameSpace));
|
||||
if (defaultNameSpace) {
|
||||
NS_RELEASE(mNameSpace);
|
||||
mNameSpace = defaultNameSpace;
|
||||
}
|
||||
}
|
||||
NS_RELEASE(nameSpaceMgr);
|
||||
if (mOrderedRules) {
|
||||
mOrderedRules->EnumerateForwards(CreateNameSpace, &mNameSpace);
|
||||
nsINameSpace* nameSpace = mNameSpace;
|
||||
mOrderedRules->EnumerateForwards(CreateNameSpace, &nameSpace);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1745,24 +1886,15 @@ CSSStyleSheetImpl::GetMediumAt(PRInt32 aIndex, nsIAtom*& aMedium) const
|
|||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
NS_IMETHODIMP_(PRBool)
|
||||
CSSStyleSheetImpl::UseForMedium(nsIAtom* aMedium) const
|
||||
{
|
||||
if (mMedia) {
|
||||
if (-1 != mMedia->IndexOf(aMedium)) {
|
||||
return NS_OK;
|
||||
}
|
||||
if (-1 != mMedia->IndexOf(nsLayoutAtoms::all)) {
|
||||
return NS_OK;
|
||||
}
|
||||
PRUint32 count;
|
||||
mMedia->Count(&count);
|
||||
if (count == 0) { // equivalent to having a medium of "all"
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_COMFALSE;
|
||||
PRBool matches = PR_FALSE;
|
||||
mMedia->MatchesMedium(aMedium, &matches);
|
||||
return matches;
|
||||
}
|
||||
return NS_OK;
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1976,7 +2108,7 @@ CSSStyleSheetImpl::PrependStyleRule(nsICSSRule* aRule)
|
|||
aRule->SetStyleSheet(this);
|
||||
DidDirty();
|
||||
|
||||
PRInt32 type;
|
||||
PRInt32 type = nsICSSRule::UNKNOWN_RULE;
|
||||
aRule->GetType(type);
|
||||
if (nsICSSRule::NAMESPACE_RULE == type) {
|
||||
// no api to prepend a namespace (ugh), release old ones and re-create them all
|
||||
|
@ -2003,31 +2135,29 @@ CSSStyleSheetImpl::AppendStyleRule(nsICSSRule* aRule)
|
|||
aRule->SetStyleSheet(this);
|
||||
DidDirty();
|
||||
|
||||
PRInt32 type;
|
||||
PRInt32 type = nsICSSRule::UNKNOWN_RULE;
|
||||
aRule->GetType(type);
|
||||
if (nsICSSRule::NAMESPACE_RULE == type) {
|
||||
if (! mInner->mNameSpace) {
|
||||
nsINameSpaceManager* nameSpaceMgr;
|
||||
NS_NewNameSpaceManager(&nameSpaceMgr);
|
||||
nsCOMPtr<nsINameSpaceManager> nameSpaceMgr;
|
||||
NS_NewNameSpaceManager(getter_AddRefs(nameSpaceMgr));
|
||||
if (nameSpaceMgr) {
|
||||
nameSpaceMgr->CreateRootNameSpace(mInner->mNameSpace);
|
||||
NS_RELEASE(nameSpaceMgr);
|
||||
nameSpaceMgr->CreateRootNameSpace(*getter_AddRefs(mInner->mNameSpace));
|
||||
}
|
||||
}
|
||||
|
||||
if (mInner->mNameSpace) {
|
||||
nsICSSNameSpaceRule* nameSpaceRule = (nsICSSNameSpaceRule*)aRule;
|
||||
nsINameSpace* newNameSpace = nsnull;
|
||||
nsCOMPtr<nsICSSNameSpaceRule> nameSpaceRule(do_QueryInterface(aRule));
|
||||
nsCOMPtr<nsINameSpace> newNameSpace;
|
||||
|
||||
nsIAtom* prefix = nsnull;
|
||||
nsCOMPtr<nsIAtom> prefix;
|
||||
nsAutoString urlSpec;
|
||||
nameSpaceRule->GetPrefix(prefix);
|
||||
nameSpaceRule->GetPrefix(*getter_AddRefs(prefix));
|
||||
nameSpaceRule->GetURLSpec(urlSpec);
|
||||
mInner->mNameSpace->CreateChildNameSpace(prefix, urlSpec, newNameSpace);
|
||||
NS_IF_RELEASE(prefix);
|
||||
mInner->mNameSpace->CreateChildNameSpace(prefix, urlSpec,
|
||||
*getter_AddRefs(newNameSpace));
|
||||
if (newNameSpace) {
|
||||
NS_RELEASE(mInner->mNameSpace);
|
||||
mInner->mNameSpace = newNameSpace; // takes ref
|
||||
mInner->mNameSpace = newNameSpace;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -2050,7 +2180,7 @@ CheckRuleForAttributesEnum(nsISupports *aRule, void *aData)
|
|||
NS_IMETHODIMP
|
||||
CSSStyleSheetImpl::CheckRuleForAttributes(nsICSSRule *aRule)
|
||||
{
|
||||
PRInt32 ruleType;
|
||||
PRInt32 ruleType = nsICSSRule::UNKNOWN_RULE;
|
||||
aRule->GetType(ruleType);
|
||||
switch (ruleType) {
|
||||
case nsICSSRule::MEDIA_RULE: {
|
||||
|
@ -2124,8 +2254,13 @@ CSSStyleSheetImpl::GetStyleRuleAt(PRInt32 aIndex, nsICSSRule*& aRule) const
|
|||
NS_IMETHODIMP
|
||||
CSSStyleSheetImpl::GetNameSpace(nsINameSpace*& aNameSpace) const
|
||||
{
|
||||
aNameSpace = ((mInner) ? mInner->mNameSpace : nsnull);
|
||||
NS_IF_ADDREF(aNameSpace);
|
||||
if (mInner) {
|
||||
aNameSpace = mInner->mNameSpace;
|
||||
NS_IF_ADDREF(aNameSpace);
|
||||
}
|
||||
else {
|
||||
aNameSpace = nsnull;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -2218,9 +2353,9 @@ ListRules(nsISupportsArray* aRules, FILE* aOut, PRInt32 aIndent)
|
|||
if (aRules) {
|
||||
aRules->Count(&count);
|
||||
for (index = 0; index < count; index++) {
|
||||
nsICSSRule* rule = (nsICSSRule*)aRules->ElementAt(index);
|
||||
nsCOMPtr<nsICSSRule> rule;
|
||||
aRules->QueryElementAt(index, NS_GET_IID(nsICSSRule), getter_AddRefs(rule));
|
||||
rule->List(aOut, aIndent);
|
||||
NS_RELEASE(rule);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2282,13 +2417,13 @@ void CSSStyleSheetImpl::List(FILE* out, PRInt32 aIndent) const
|
|||
mMedia->Count(&count);
|
||||
nsAutoString buffer;
|
||||
while (index < PRInt32(count)) {
|
||||
nsIAtom* medium = (nsIAtom*)mMedia->ElementAt(index++);
|
||||
nsCOMPtr<nsIAtom> medium;
|
||||
mMedia->QueryElementAt(index++, NS_GET_IID(nsIAtom), getter_AddRefs(medium));
|
||||
medium->ToString(buffer);
|
||||
fputs(buffer, out);
|
||||
if (index < PRInt32(count)) {
|
||||
fputs(", ", out);
|
||||
}
|
||||
NS_RELEASE(medium);
|
||||
}
|
||||
}
|
||||
fputs("\n", out);
|
||||
|
@ -2543,62 +2678,173 @@ CSSStyleSheetImpl::InsertRule(const nsAReadableString& aRule,
|
|||
PRUint32 aIndex,
|
||||
PRUint32* aReturn)
|
||||
{
|
||||
nsICSSParser* css;
|
||||
// XXX should get parser from CSS loader
|
||||
nsresult result = NS_NewCSSParser(&css);
|
||||
if (NS_OK == result) {
|
||||
nsString* str = new nsString(aRule); // will be deleted by the input stream
|
||||
nsIUnicharInputStream* input = nsnull;
|
||||
result = NS_NewStringUnicharInputStream(&input, str);
|
||||
if (NS_OK == result) {
|
||||
nsICSSStyleSheet* tmp;
|
||||
css->SetStyleSheet(this);
|
||||
// XXX Currently, the parser will append the rule to the
|
||||
// style sheet. We shouldn't ignore the index.
|
||||
result = css->Parse(input, mInner->mURL, tmp);
|
||||
NS_ASSERTION(tmp == this, "parser incorrectly created a new stylesheet");
|
||||
NS_RELEASE(tmp);
|
||||
NS_RELEASE(input);
|
||||
PRUint32 cnt;
|
||||
if (mInner && mInner->mOrderedRules) {
|
||||
result = mInner->mOrderedRules->Count(&cnt);
|
||||
if (NS_SUCCEEDED(result)) {
|
||||
*aReturn = cnt;
|
||||
if (nsnull != mDocument) {
|
||||
nsICSSRule* rule;
|
||||
NS_ENSURE_TRUE(mInner, NS_ERROR_FAILURE);
|
||||
nsresult result;
|
||||
if (! mInner->mOrderedRules) {
|
||||
result = NS_NewISupportsArray(&(mInner->mOrderedRules));
|
||||
}
|
||||
if (NS_FAILED(result))
|
||||
return result;
|
||||
|
||||
rule = (nsICSSRule*)(mInner->mOrderedRules->ElementAt(aIndex));
|
||||
mDocument->StyleRuleAdded(this, rule);
|
||||
NS_IF_RELEASE(rule);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
PRUint32 count;
|
||||
mInner->mOrderedRules->Count(&count);
|
||||
if (aIndex > count)
|
||||
return NS_ERROR_DOM_INDEX_SIZE_ERR;
|
||||
|
||||
result = WillDirty();
|
||||
if (NS_FAILED(result))
|
||||
return result;
|
||||
|
||||
NS_RELEASE(css);
|
||||
nsCOMPtr<nsICSSLoader> loader;
|
||||
nsCOMPtr<nsICSSParser> css;
|
||||
nsCOMPtr<nsIHTMLContentContainer> htmlContainer(do_QueryInterface(mDocument));
|
||||
if (htmlContainer) {
|
||||
htmlContainer->GetCSSLoader(*getter_AddRefs(loader));
|
||||
}
|
||||
if (loader) {
|
||||
result = loader->GetParserFor(this, getter_AddRefs(css));
|
||||
}
|
||||
else {
|
||||
result = NS_NewCSSParser(getter_AddRefs(css));
|
||||
css->SetStyleSheet(this);
|
||||
}
|
||||
if (NS_FAILED(result))
|
||||
return result;
|
||||
|
||||
if (mDocument) {
|
||||
result = mDocument->BeginUpdate();
|
||||
if (NS_FAILED(result))
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
nsCOMPtr<nsIStyleRule> rule;
|
||||
result = css->ParseRule(aRule, mInner->mURL, getter_AddRefs(rule));
|
||||
if (NS_FAILED(result))
|
||||
return result;
|
||||
if (! rule) // parsed successfully, but no rule resulted
|
||||
return NS_ERROR_DOM_SYNTAX_ERR;
|
||||
|
||||
nsCOMPtr<nsICSSRule> cssRule(do_QueryInterface(rule, &result));
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
PRInt32 type = nsICSSRule::UNKNOWN_RULE;
|
||||
cssRule->GetType(type);
|
||||
if (aIndex != 0) {
|
||||
if (type == nsICSSRule::CHARSET_RULE) { // no inserting charset at nonzero position
|
||||
return NS_ERROR_DOM_HIERARCHY_REQUEST_ERR;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsICSSRule> prevRule;
|
||||
result = mInner->mOrderedRules->QueryElementAt(aIndex-1, NS_GET_IID(nsICSSRule), getter_AddRefs(prevRule));
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
PRInt32 prevType = nsICSSRule::UNKNOWN_RULE;
|
||||
prevRule->GetType(prevType);
|
||||
|
||||
if (type == nsICSSRule::IMPORT_RULE &&
|
||||
prevType != nsICSSRule::CHARSET_RULE &&
|
||||
prevType != nsICSSRule::IMPORT_RULE) {
|
||||
return NS_ERROR_DOM_HIERARCHY_REQUEST_ERR;
|
||||
}
|
||||
|
||||
if (type == nsICSSRule::NAMESPACE_RULE &&
|
||||
prevType != nsICSSRule::CHARSET_RULE &&
|
||||
prevType != nsICSSRule::IMPORT_RULE &&
|
||||
prevType != nsICSSRule::NAMESPACE_RULE) {
|
||||
return NS_ERROR_DOM_HIERARCHY_REQUEST_ERR;
|
||||
}
|
||||
}
|
||||
|
||||
if (type == nsICSSRule::CHARSET_RULE) {
|
||||
// check that we're not inserting before another chatset rule
|
||||
nsCOMPtr<nsICSSRule> nextRule;
|
||||
mInner->mOrderedRules->QueryElementAt(aIndex, NS_GET_IID(nsICSSRule), getter_AddRefs(nextRule));
|
||||
if (nextRule) {
|
||||
PRInt32 nextType = nsICSSRule::UNKNOWN_RULE;
|
||||
nextRule->GetType(nextType);
|
||||
if (nextType == nsICSSRule::CHARSET_RULE) {
|
||||
return NS_ERROR_DOM_HIERARCHY_REQUEST_ERR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result = mInner->mOrderedRules->InsertElementAt(cssRule, aIndex);
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
cssRule->SetStyleSheet(this);
|
||||
DidDirty();
|
||||
if (type == nsICSSRule::NAMESPACE_RULE) {
|
||||
if (! mInner->mNameSpace) {
|
||||
nsCOMPtr<nsINameSpaceManager> nameSpaceMgr;
|
||||
result = NS_NewNameSpaceManager(getter_AddRefs(nameSpaceMgr));
|
||||
if (NS_FAILED(result))
|
||||
return result;
|
||||
nameSpaceMgr->CreateRootNameSpace(*getter_AddRefs(mInner->mNameSpace));
|
||||
}
|
||||
|
||||
NS_ENSURE_TRUE(mInner->mNameSpace, NS_ERROR_FAILURE);
|
||||
|
||||
nsCOMPtr<nsICSSNameSpaceRule> nameSpaceRule(do_QueryInterface(cssRule));
|
||||
nsCOMPtr<nsINameSpace> newNameSpace;
|
||||
|
||||
nsCOMPtr<nsIAtom> prefix;
|
||||
nsAutoString urlSpec;
|
||||
nameSpaceRule->GetPrefix(*getter_AddRefs(prefix));
|
||||
nameSpaceRule->GetURLSpec(urlSpec);
|
||||
mInner->mNameSpace->CreateChildNameSpace(prefix, urlSpec,
|
||||
*getter_AddRefs(newNameSpace));
|
||||
if (newNameSpace) {
|
||||
mInner->mNameSpace = newNameSpace;
|
||||
}
|
||||
}
|
||||
else {
|
||||
CheckRuleForAttributes(cssRule);
|
||||
}
|
||||
if (mDocument) {
|
||||
result = mDocument->StyleRuleAdded(this, cssRule);
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
result = mDocument->EndUpdate();
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
}
|
||||
|
||||
*aReturn = aIndex;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSStyleSheetImpl::DeleteRule(PRUint32 aIndex)
|
||||
{
|
||||
nsresult result = NS_ERROR_INVALID_ARG;
|
||||
nsresult result = NS_ERROR_DOM_INDEX_SIZE_ERR;
|
||||
|
||||
// XXX TBI: handle @rule types
|
||||
if (mInner && mInner->mOrderedRules) {
|
||||
if (mDocument) {
|
||||
result = mDocument->BeginUpdate();
|
||||
if (NS_FAILED(result))
|
||||
return result;
|
||||
}
|
||||
result = WillDirty();
|
||||
|
||||
if (NS_SUCCEEDED(result)) {
|
||||
nsICSSRule *rule;
|
||||
|
||||
rule = (nsICSSRule*)(mInner->mOrderedRules->ElementAt(aIndex));
|
||||
if (nsnull != rule) {
|
||||
if (NS_SUCCEEDED(result)) {
|
||||
PRUint32 count;
|
||||
mInner->mOrderedRules->Count(&count);
|
||||
if (aIndex >= count)
|
||||
return NS_ERROR_DOM_INDEX_SIZE_ERR;
|
||||
|
||||
nsCOMPtr<nsICSSRule> rule;
|
||||
mInner->mOrderedRules->QueryElementAt(aIndex, NS_GET_IID(nsICSSRule),
|
||||
getter_AddRefs(rule));
|
||||
if (rule) {
|
||||
mInner->mOrderedRules->RemoveElementAt(aIndex);
|
||||
rule->SetStyleSheet(nsnull);
|
||||
DidDirty();
|
||||
NS_RELEASE(rule);
|
||||
|
||||
if (mDocument) {
|
||||
result = mDocument->StyleRuleRemoved(this, rule);
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
result = mDocument->EndUpdate();
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2606,6 +2852,122 @@ CSSStyleSheetImpl::DeleteRule(PRUint32 aIndex)
|
|||
return result;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSStyleSheetImpl::DeleteRuleFromGroup(nsICSSGroupRule* aGroup, PRUint32 aIndex)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aGroup);
|
||||
|
||||
nsresult result;
|
||||
nsCOMPtr<nsICSSRule> rule;
|
||||
result = aGroup->GetStyleRuleAt(aIndex, *getter_AddRefs(rule));
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
// check that the rule actually belongs to this sheet!
|
||||
nsCOMPtr<nsIDOMCSSRule> domRule(do_QueryInterface(rule));
|
||||
nsCOMPtr<nsIDOMCSSStyleSheet> ruleSheet;
|
||||
result = domRule->GetParentStyleSheet(getter_AddRefs(ruleSheet));
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
nsCOMPtr<nsIDOMCSSStyleSheet> thisSheet;
|
||||
this->QueryInterface(NS_GET_IID(nsIDOMCSSStyleSheet), getter_AddRefs(thisSheet));
|
||||
|
||||
if (thisSheet != ruleSheet) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
||||
result = mDocument->BeginUpdate();
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
result = WillDirty();
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
result = aGroup->DeleteStyleRuleAt(aIndex);
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
rule->SetStyleSheet(nsnull);
|
||||
|
||||
DidDirty();
|
||||
|
||||
result = mDocument->StyleRuleRemoved(this, rule);
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
result = mDocument->EndUpdate();
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
CSSStyleSheetImpl::InsertRuleIntoGroup(nsAReadableString & aRule, nsICSSGroupRule* aGroup, PRUint32 aIndex, PRUint32* _retval)
|
||||
{
|
||||
nsresult result;
|
||||
// check that the group actually belongs to this sheet!
|
||||
nsCOMPtr<nsIDOMCSSRule> domGroup(do_QueryInterface(aGroup));
|
||||
nsCOMPtr<nsIDOMCSSStyleSheet> groupSheet;
|
||||
result = domGroup->GetParentStyleSheet(getter_AddRefs(groupSheet));
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
nsCOMPtr<nsIDOMCSSStyleSheet> thisSheet;
|
||||
this->QueryInterface(NS_GET_IID(nsIDOMCSSStyleSheet), getter_AddRefs(thisSheet));
|
||||
|
||||
if (thisSheet != groupSheet) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
||||
// get the css parser
|
||||
nsCOMPtr<nsICSSLoader> loader;
|
||||
nsCOMPtr<nsICSSParser> css;
|
||||
nsCOMPtr<nsIHTMLContentContainer> htmlContainer(do_QueryInterface(mDocument));
|
||||
if (htmlContainer) {
|
||||
htmlContainer->GetCSSLoader(*getter_AddRefs(loader));
|
||||
}
|
||||
if (loader) {
|
||||
result = loader->GetParserFor(this, getter_AddRefs(css));
|
||||
}
|
||||
else {
|
||||
result = NS_NewCSSParser(getter_AddRefs(css));
|
||||
css->SetStyleSheet(this);
|
||||
}
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
// parse and grab the rule
|
||||
result = mDocument->BeginUpdate();
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
result = WillDirty();
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
nsCOMPtr<nsIStyleRule> rule;
|
||||
result = css->ParseRule(aRule, mInner->mURL, getter_AddRefs(rule));
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
if (! rule) {
|
||||
return NS_ERROR_DOM_SYNTAX_ERR;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsICSSRule> cssRule(do_QueryInterface(rule, &result));
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
// Only rulesets are allowed in a group as of CSS2
|
||||
PRInt32 type = nsICSSRule::UNKNOWN_RULE;
|
||||
cssRule->GetType(type);
|
||||
if (type != nsICSSRule::STYLE_RULE) {
|
||||
return NS_ERROR_DOM_HIERARCHY_REQUEST_ERR;
|
||||
}
|
||||
|
||||
result = aGroup->InsertStyleRuleAt(aIndex, cssRule);
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
DidDirty();
|
||||
CheckRuleForAttributes(cssRule);
|
||||
|
||||
result = mDocument->StyleRuleAdded(this, cssRule);
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
result = mDocument->EndUpdate();
|
||||
NS_ENSURE_SUCCESS(result, result);
|
||||
|
||||
*_retval = aIndex;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// XXX for backwards compatibility and convenience
|
||||
NS_HTML nsresult
|
||||
NS_NewCSSStyleSheet(nsICSSStyleSheet** aInstancePtrResult, nsIURI* aURL)
|
||||
|
@ -3731,7 +4093,8 @@ void CSSRuleProcessor::SizeOf(nsISizeOfHandler *aSizeOfHandler, PRUint32 &aSize)
|
|||
PRUint32 sheetCount, curSheet, localSize2;
|
||||
mSheets->Count(&sheetCount);
|
||||
for(curSheet=0; curSheet < sheetCount; curSheet++){
|
||||
nsICSSStyleSheet *pSheet = (nsICSSStyleSheet *)mSheets->ElementAt(curSheet);
|
||||
nsCOMPtr<nsICSSStyleSheet> pSheet;
|
||||
mSheets->QueryElementAt(curSheet, NS_GET_IID(nsICSSStyleSheet), getter_AddRefs(pSheet));
|
||||
if(pSheet && uniqueItems->AddItem((void*)pSheet)){
|
||||
pSheet->SizeOf(aSizeOfHandler, localSize2);
|
||||
// XXX aSize += localSize2;
|
||||
|
@ -3765,6 +4128,7 @@ CSSRuleProcessor::ClearRuleCascades(void)
|
|||
delete data;
|
||||
data = next;
|
||||
}
|
||||
mRuleCascades = nsnull;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -3835,7 +4199,7 @@ InsertRuleByWeight(nsISupports* aRule, void* aData)
|
|||
{
|
||||
nsICSSRule* rule = (nsICSSRule*)aRule;
|
||||
CascadeEnumData* data = (CascadeEnumData*)aData;
|
||||
PRInt32 type;
|
||||
PRInt32 type = nsICSSRule::UNKNOWN_RULE;
|
||||
rule->GetType(type);
|
||||
|
||||
if (nsICSSRule::STYLE_RULE == type) {
|
||||
|
@ -3854,7 +4218,7 @@ InsertRuleByWeight(nsISupports* aRule, void* aData)
|
|||
}
|
||||
else if (nsICSSRule::MEDIA_RULE == type) {
|
||||
nsICSSMediaRule* mediaRule = (nsICSSMediaRule*)rule;
|
||||
if (NS_OK == mediaRule->UseForMedium(data->mMedium)) {
|
||||
if (mediaRule->UseForMedium(data->mMedium)) {
|
||||
mediaRule->EnumerateRulesForwards(InsertRuleByWeight, aData);
|
||||
}
|
||||
}
|
||||
|
@ -3871,7 +4235,7 @@ CSSRuleProcessor::CascadeSheetRulesInto(nsISupports* aSheet, void* aData)
|
|||
PRBool bSheetEnabled = PR_TRUE;
|
||||
sheet->GetEnabled(bSheetEnabled);
|
||||
|
||||
if ((bSheetEnabled) && (NS_OK == sheet->UseForMedium(data->mMedium))) {
|
||||
if ((bSheetEnabled) && (sheet->UseForMedium(data->mMedium))) {
|
||||
CSSStyleSheetImpl* child = sheet->mFirstChild;
|
||||
while (child) {
|
||||
CascadeSheetRulesInto((nsICSSStyleSheet*)child, data);
|
||||
|
|
|
@ -210,7 +210,7 @@ public:
|
|||
NS_IMETHOD GetType(nsString& aType) const;
|
||||
NS_IMETHOD GetMediumCount(PRInt32& aCount) const;
|
||||
NS_IMETHOD GetMediumAt(PRInt32 aIndex, nsIAtom*& aMedium) const;
|
||||
NS_IMETHOD UseForMedium(nsIAtom* aMedium) const;
|
||||
NS_IMETHOD_(PRBool) UseForMedium(nsIAtom* aMedium) const;
|
||||
|
||||
NS_IMETHOD GetEnabled(PRBool& aEnabled) const;
|
||||
NS_IMETHOD SetEnabled(PRBool aEnabled);
|
||||
|
@ -518,10 +518,10 @@ HTMLCSSStyleSheetImpl::GetMediumAt(PRInt32 aIndex, nsIAtom*& aMedium) const
|
|||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
NS_IMETHODIMP_(PRBool)
|
||||
HTMLCSSStyleSheetImpl::UseForMedium(nsIAtom* aMedium) const
|
||||
{
|
||||
return NS_OK; // works for all media
|
||||
return PR_TRUE; // works for all media
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
|
|
@ -536,7 +536,7 @@ public:
|
|||
NS_IMETHOD GetType(nsString& aType) const;
|
||||
NS_IMETHOD GetMediumCount(PRInt32& aCount) const;
|
||||
NS_IMETHOD GetMediumAt(PRInt32 aIndex, nsIAtom*& aMedium) const;
|
||||
NS_IMETHOD UseForMedium(nsIAtom* aMedium) const;
|
||||
NS_IMETHOD_(PRBool) UseForMedium(nsIAtom* aMedium) const;
|
||||
|
||||
NS_IMETHOD GetEnabled(PRBool& aEnabled) const;
|
||||
NS_IMETHOD SetEnabled(PRBool aEnabled);
|
||||
|
@ -952,10 +952,10 @@ HTMLStyleSheetImpl::GetMediumAt(PRInt32 aIndex, nsIAtom*& aMedium) const
|
|||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
NS_IMETHODIMP_(PRBool)
|
||||
HTMLStyleSheetImpl::UseForMedium(nsIAtom* aMedium) const
|
||||
{
|
||||
return NS_OK; // works for all media
|
||||
return PR_TRUE; // works for all media
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -42,6 +42,17 @@ public:
|
|||
NS_IMETHOD GetStyleRuleAt(PRInt32 aIndex, nsICSSRule*& aRule) const = 0;
|
||||
|
||||
NS_IMETHOD EnumerateRulesForwards(nsISupportsArrayEnumFunc aFunc, void * aData) const = 0;
|
||||
|
||||
/*
|
||||
* The next two methods (DeleteStyleRuleAt and InsertStyleRuleAt)
|
||||
* should never be called unless you have first called WillDirty()
|
||||
* on the parent stylesheet. After they are called, DidDirty()
|
||||
* needs to be called on the sheet
|
||||
*/
|
||||
NS_IMETHOD DeleteStyleRuleAt(PRUint32 aIndex) = 0;
|
||||
NS_IMETHOD InsertStyleRuleAt(PRUint32 aIndex, nsICSSRule* aRule) = 0;
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif /* nsICSSGroupRule_h___ */
|
||||
|
|
|
@ -75,6 +75,10 @@ public:
|
|||
PRBool aParseOnlyOneDecl,
|
||||
PRInt32* aHint) = 0;
|
||||
|
||||
NS_IMETHOD ParseRule(nsAReadableString& aRule,
|
||||
nsIURI* aBaseURL,
|
||||
nsIStyleRule** aResult) = 0;
|
||||
|
||||
// Charset management method:
|
||||
// Set the charset before calling any of the Parse emthods if you want the
|
||||
// charset to be anything other than the default
|
||||
|
|
|
@ -24,12 +24,14 @@
|
|||
|
||||
#include "nslayout.h"
|
||||
#include "nsIStyleSheet.h"
|
||||
#include "nsString.h"
|
||||
|
||||
class nsICSSRule;
|
||||
class nsIDOMNode;
|
||||
class nsINameSpace;
|
||||
class nsICSSStyleRuleProcessor;
|
||||
class nsIMediaList;
|
||||
class nsICSSGroupRule;
|
||||
|
||||
// IID for the nsICSSStyleSheet interface {8f83b0f0-b21a-11d1-8031-006008159b5a}
|
||||
#define NS_ICSS_STYLE_SHEET_IID \
|
||||
|
@ -50,6 +52,9 @@ public:
|
|||
NS_IMETHOD StyleRuleCount(PRInt32& aCount) const = 0;
|
||||
NS_IMETHOD GetStyleRuleAt(PRInt32 aIndex, nsICSSRule*& aRule) const = 0;
|
||||
|
||||
NS_IMETHOD DeleteRuleFromGroup(nsICSSGroupRule* aGroup, PRUint32 aIndex) = 0;
|
||||
NS_IMETHOD InsertRuleIntoGroup(nsAReadableString & aRule, nsICSSGroupRule* aGroup, PRUint32 aIndex, PRUint32* _retval) = 0;
|
||||
|
||||
NS_IMETHOD StyleSheetCount(PRInt32& aCount) const = 0;
|
||||
NS_IMETHOD GetStyleSheetAt(PRInt32 aIndex, nsICSSStyleSheet*& aSheet) const = 0;
|
||||
|
||||
|
|
|
@ -31,15 +31,25 @@ class nsIMediaList : public nsISupportsArray {
|
|||
public:
|
||||
static const nsIID& GetIID() { static nsIID iid = NS_IMEDIA_LIST_IID; return iid; }
|
||||
|
||||
NS_IMETHOD GetMediaText(nsAWritableString& aMediaText) = 0;
|
||||
NS_IMETHOD SetMediaText(nsAReadableString& aMediaText) = 0;
|
||||
|
||||
NS_IMETHOD GetText(nsAWritableString& aMediaText) = 0;
|
||||
NS_IMETHOD SetText(nsAReadableString& aMediaText) = 0;
|
||||
NS_IMETHOD MatchesMedium(nsIAtom* aMedium, PRBool* aMatch) = 0;
|
||||
NS_IMETHOD DropReference(void) = 0;
|
||||
};
|
||||
|
||||
/* Use this macro when declaring classes that implement this interface. */
|
||||
#define NS_DECL_NSIMEDIALIST \
|
||||
NS_IMETHOD GetText(nsAWritableString& aMediaText); \
|
||||
NS_IMETHOD SetText(nsAReadableString& aMediaText); \
|
||||
NS_IMETHOD MatchesMedium(nsIAtom* aMedium, PRBool* aMatch); \
|
||||
NS_IMETHOD DropReference(void);
|
||||
|
||||
extern NS_HTML nsresult
|
||||
NS_NewMediaList(nsIMediaList** aInstancePtrResult, const nsAReadableString& aMediaText);
|
||||
NS_NewMediaList(const nsAReadableString& aMediaText, nsIMediaList** aInstancePtrResult);
|
||||
|
||||
extern NS_HTML nsresult
|
||||
NS_NewMediaList(nsIMediaList** aInstancePtrResult);
|
||||
|
||||
extern NS_HTML nsresult
|
||||
NS_NewMediaList(nsISupportsArray* aArray, nsICSSStyleSheet* aSheet, nsIMediaList** aInstancePtrResult);
|
||||
#endif /* nsICSSLoader_h___ */
|
||||
|
|
|
@ -52,7 +52,7 @@ public:
|
|||
NS_IMETHOD GetType(nsString& aType) const = 0;
|
||||
NS_IMETHOD GetMediumCount(PRInt32& aCount) const = 0;
|
||||
NS_IMETHOD GetMediumAt(PRInt32 aIndex, nsIAtom*& aMedium) const = 0;
|
||||
NS_IMETHOD UseForMedium(nsIAtom* aMedium) const = 0;
|
||||
NS_IMETHOD_(PRBool) UseForMedium(nsIAtom* aMedium) const = 0;
|
||||
|
||||
NS_IMETHOD GetEnabled(PRBool& aEnabled) const = 0;
|
||||
NS_IMETHOD SetEnabled(PRBool aEnabled) = 0;
|
||||
|
|
Загрузка…
Ссылка в новой задаче