Bug 1315601 part 15 - Move some common methods to a new CSSMediaRule binding class. r=heycam
MozReview-Commit-ID: GWpIzTex2le
--- a/dom/bindings/Bindings.conf
+++ b/dom/bindings/Bindings.conf
@@ -231,21 +231,16 @@ DOMInterfaces = {
'nativeType': 'nsCSSKeyframesRule',
'headerFile': 'nsCSSRules.h',
},
'CSSLexer': {
'wrapperCache': False
},
-'CSSMediaRule': {
- 'nativeType': 'mozilla::css::MediaRule',
- 'headerFile': 'nsCSSRules.h',
-},
-
'CSSMozDocumentRule': {
'nativeType': 'mozilla::css::DocumentRule',
'headerFile': 'nsCSSRules.h',
},
'CSSNamespaceRule': {
'nativeType': 'mozilla::css::NameSpaceRule',
},
new file mode 100644
--- /dev/null
+++ b/layout/style/CSSMediaRule.cpp
@@ -0,0 +1,72 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/CSSMediaRule.h"
+
+#include "mozilla/dom/CSSMediaRuleBinding.h"
+#include "mozilla/dom/MediaList.h"
+
+namespace mozilla {
+namespace dom {
+
+NS_IMPL_ADDREF_INHERITED(CSSMediaRule, css::ConditionRule)
+NS_IMPL_RELEASE_INHERITED(CSSMediaRule, css::ConditionRule)
+
+// QueryInterface implementation for CSSMediaRule
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(CSSMediaRule)
+ NS_INTERFACE_MAP_ENTRY(nsIDOMCSSGroupingRule)
+ NS_INTERFACE_MAP_ENTRY(nsIDOMCSSConditionRule)
+ NS_INTERFACE_MAP_ENTRY(nsIDOMCSSMediaRule)
+NS_INTERFACE_MAP_END_INHERITING(css::ConditionRule)
+
+// nsIDOMCSSGroupingRule methods
+NS_IMETHODIMP
+CSSMediaRule::GetCssRules(nsIDOMCSSRuleList** aRuleList)
+{
+ return GroupRule::GetCssRules(aRuleList);
+}
+
+NS_IMETHODIMP
+CSSMediaRule::InsertRule(const nsAString& aRule,
+ uint32_t aIndex, uint32_t* _retval)
+{
+ return GroupRule::InsertRule(aRule, aIndex, _retval);
+}
+
+NS_IMETHODIMP
+CSSMediaRule::DeleteRule(uint32_t aIndex)
+{
+ return GroupRule::DeleteRule(aIndex);
+}
+
+// nsIDOMCSSMediaRule methods
+NS_IMETHODIMP
+CSSMediaRule::GetMedia(nsIDOMMediaList* *aMedia)
+{
+ NS_ENSURE_ARG_POINTER(aMedia);
+ NS_IF_ADDREF(*aMedia = Media());
+ return NS_OK;
+}
+
+void
+CSSMediaRule::SetConditionText(const nsAString& aConditionText,
+ ErrorResult& aRv)
+{
+ nsresult rv = static_cast<nsIDOMCSSConditionRule*>(this)->
+ SetConditionText(aConditionText);
+ if (NS_FAILED(rv)) {
+ aRv.Throw(rv);
+ }
+}
+
+/* virtual */ JSObject*
+CSSMediaRule::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return CSSMediaRuleBinding::Wrap(aCx, this, aGivenProto);
+}
+
+} // namespace dom
+} // namespace mozilla
new file mode 100644
--- /dev/null
+++ b/layout/style/CSSMediaRule.h
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_CSSMediaRule_h
+#define mozilla_dom_CSSMediaRule_h
+
+#include "mozilla/css/GroupRule.h"
+#include "nsIDOMCSSMediaRule.h"
+
+namespace mozilla {
+namespace dom {
+
+class CSSMediaRule : public css::ConditionRule
+ , public nsIDOMCSSMediaRule
+{
+protected:
+ using ConditionRule::ConditionRule;
+ virtual ~CSSMediaRule() {}
+
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+
+ int32_t GetType() const override { return css::Rule::MEDIA_RULE; }
+
+ // XPCOM interface
+ using Rule::GetType;
+
+ // nsIDOMCSSGroupingRule interface
+ NS_DECL_NSIDOMCSSGROUPINGRULE
+
+ // nsIDOMCSSConditionRule interface
+ NS_IMETHOD SetConditionText(const nsAString& aConditionText) override = 0;
+
+ // nsIDOMCSSMediaRule interface
+ NS_DECL_NSIDOMCSSMEDIARULE
+
+ // WebIDL interface
+ uint16_t Type() const override { return nsIDOMCSSRule::MEDIA_RULE; }
+ // Our XPCOM GetConditionText is OK
+ void SetConditionText(const nsAString& aConditionText,
+ ErrorResult& aRv) final;
+ virtual MediaList* Media() = 0;
+
+ JSObject* WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto) override;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_CSSMediaRule_h
--- a/layout/style/moz.build
+++ b/layout/style/moz.build
@@ -121,16 +121,17 @@ EXPORTS.mozilla += [
'StyleSheet.h',
'StyleSheetInfo.h',
'StyleSheetInlines.h',
]
EXPORTS.mozilla.dom += [
'CSS.h',
'CSSLexer.h',
+ 'CSSMediaRule.h',
'CSSRuleList.h',
'CSSValue.h',
'FontFace.h',
'FontFaceSet.h',
'FontFaceSetIterator.h',
'MediaList.h',
'MediaQueryList.h',
]
@@ -149,16 +150,17 @@ EXPORTS.mozilla.css += [
]
UNIFIED_SOURCES += [
'AnimationCollection.cpp',
'BindingStyleRule.cpp',
'CounterStyleManager.cpp',
'CSS.cpp',
'CSSLexer.cpp',
+ 'CSSMediaRule.cpp',
'CSSRuleList.cpp',
'CSSStyleSheet.cpp',
'CSSVariableDeclarations.cpp',
'CSSVariableResolver.cpp',
'CSSVariableValues.cpp',
'Declaration.cpp',
'DocumentStyleRootIterator.cpp',
'ErrorReporter.cpp',
--- a/layout/style/nsCSSRules.cpp
+++ b/layout/style/nsCSSRules.cpp
@@ -31,17 +31,16 @@
#include "nsError.h"
#include "nsStyleUtil.h"
#include "mozilla/DeclarationBlockInlines.h"
#include "nsCSSParser.h"
#include "nsDOMClassInfoID.h"
#include "mozilla/dom/CSSStyleDeclarationBinding.h"
#include "mozilla/dom/CSSNamespaceRuleBinding.h"
#include "mozilla/dom/CSSImportRuleBinding.h"
-#include "mozilla/dom/CSSMediaRuleBinding.h"
#include "mozilla/dom/CSSSupportsRuleBinding.h"
#include "mozilla/dom/CSSMozDocumentRuleBinding.h"
#include "mozilla/dom/CSSPageRuleBinding.h"
#include "mozilla/dom/CSSFontFaceRuleBinding.h"
#include "mozilla/dom/CSSFontFeatureValuesRuleBinding.h"
#include "mozilla/dom/CSSKeyframeRuleBinding.h"
#include "mozilla/dom/CSSKeyframesRuleBinding.h"
#include "mozilla/dom/CSSCounterStyleRuleBinding.h"
@@ -359,48 +358,45 @@ ImportRule::WrapObject(JSContext* aCx,
{
return CSSImportRuleBinding::Wrap(aCx, this, aGivenProto);
}
// -------------------------------------------
// nsICSSMediaRule
//
MediaRule::MediaRule(uint32_t aLineNumber, uint32_t aColumnNumber)
- : ConditionRule(aLineNumber, aColumnNumber)
+ : CSSMediaRule(aLineNumber, aColumnNumber)
{
}
MediaRule::MediaRule(const MediaRule& aCopy)
- : ConditionRule(aCopy)
+ : CSSMediaRule(aCopy)
{
if (aCopy.mMedia) {
mMedia = aCopy.mMedia->Clone().downcast<nsMediaList>();
// XXXldb This doesn't really make sense.
mMedia->SetStyleSheet(aCopy.GetStyleSheet());
}
}
MediaRule::~MediaRule()
{
if (mMedia) {
mMedia->SetStyleSheet(nullptr);
}
}
-NS_IMPL_ADDREF_INHERITED(MediaRule, ConditionRule)
-NS_IMPL_RELEASE_INHERITED(MediaRule, ConditionRule)
+NS_IMPL_ADDREF_INHERITED(MediaRule, CSSMediaRule)
+NS_IMPL_RELEASE_INHERITED(MediaRule, CSSMediaRule)
// QueryInterface implementation for MediaRule
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaRule)
- NS_INTERFACE_MAP_ENTRY(nsIDOMCSSGroupingRule)
- NS_INTERFACE_MAP_ENTRY(nsIDOMCSSConditionRule)
- NS_INTERFACE_MAP_ENTRY(nsIDOMCSSMediaRule)
-NS_INTERFACE_MAP_END_INHERITING(ConditionRule)
-
-NS_IMPL_CYCLE_COLLECTION_INHERITED(MediaRule, ConditionRule,
+NS_INTERFACE_MAP_END_INHERITING(CSSMediaRule)
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(MediaRule, CSSMediaRule,
mMedia)
/* virtual */ void
MediaRule::SetStyleSheet(StyleSheet* aSheet)
{
if (mMedia) {
// Set to null so it knows it's leaving one sheet and joining another.
mMedia->SetStyleSheet(nullptr);
@@ -434,125 +430,71 @@ MediaRule::List(FILE* out, int32_t aInde
fprintf_stderr(out, "%s", str.get());
GroupRule::List(out, aIndent);
fprintf_stderr(out, "%s}\n", indentStr.get());
}
#endif
-/* virtual */ int32_t
-MediaRule::GetType() const
-{
- return Rule::MEDIA_RULE;
-}
-
/* virtual */ already_AddRefed<Rule>
MediaRule::Clone() const
{
RefPtr<Rule> clone = new MediaRule(*this);
return clone.forget();
}
nsresult
MediaRule::SetMedia(nsMediaList* aMedia)
{
mMedia = aMedia;
if (aMedia)
mMedia->SetStyleSheet(GetStyleSheet());
return NS_OK;
}
-uint16_t
-MediaRule::Type() const
-{
- return nsIDOMCSSRule::MEDIA_RULE;
-}
-
MediaList*
-MediaRule::Media() const
+MediaRule::Media()
{
// In practice, if we end up being parsed at all, we have non-null mMedia. So
// it's OK to claim we don't return null here.
return mMedia;
}
void
MediaRule::GetCssTextImpl(nsAString& aCssText) const
{
aCssText.AssignLiteral("@media ");
AppendConditionText(aCssText);
GroupRule::AppendRulesToCssText(aCssText);
}
-// nsIDOMCSSGroupingRule methods
-NS_IMETHODIMP
-MediaRule::GetCssRules(nsIDOMCSSRuleList* *aRuleList)
-{
- return GroupRule::GetCssRules(aRuleList);
-}
-
-NS_IMETHODIMP
-MediaRule::InsertRule(const nsAString & aRule, uint32_t aIndex, uint32_t* _retval)
-{
- return GroupRule::InsertRule(aRule, aIndex, _retval);
-}
-
-NS_IMETHODIMP
-MediaRule::DeleteRule(uint32_t aIndex)
-{
- return GroupRule::DeleteRule(aIndex);
-}
-
// nsIDOMCSSConditionRule methods
NS_IMETHODIMP
MediaRule::GetConditionText(nsAString& aConditionText)
{
aConditionText.Truncate(0);
AppendConditionText(aConditionText);
return NS_OK;
}
NS_IMETHODIMP
MediaRule::SetConditionText(const nsAString& aConditionText)
{
- ErrorResult rv;
- SetConditionText(aConditionText, rv);
- return rv.StealNSResult();
-}
-
-void
-MediaRule::SetConditionText(const nsAString& aConditionText,
- ErrorResult& aRv)
-{
if (!mMedia) {
RefPtr<nsMediaList> media = new nsMediaList();
media->SetStyleSheet(GetStyleSheet());
nsresult rv = media->SetMediaText(aConditionText);
if (NS_SUCCEEDED(rv)) {
mMedia = media;
- } else {
- aRv.Throw(rv);
}
- return;
- }
-
- nsresult rv = mMedia->SetMediaText(aConditionText);
- if (NS_FAILED(rv)) {
- aRv.Throw(rv);
+ return rv;
}
-}
-
-// nsIDOMCSSMediaRule methods
-NS_IMETHODIMP
-MediaRule::GetMedia(nsIDOMMediaList* *aMedia)
-{
- NS_ENSURE_ARG_POINTER(aMedia);
- NS_IF_ADDREF(*aMedia = mMedia);
- return NS_OK;
+
+ return mMedia->SetMediaText(aConditionText);
}
// GroupRule interface
/* virtual */ bool
MediaRule::UseForPresentation(nsPresContext* aPresContext,
nsMediaQueryResultCacheKey& aKey)
{
if (mMedia) {
@@ -569,23 +511,16 @@ MediaRule::SizeOfIncludingThis(MallocSiz
// Measurement of the following members may be added later if DMD finds it is
// worthwhile:
// - mMedia
return n;
}
-/* virtual */ JSObject*
-MediaRule::WrapObject(JSContext* aCx,
- JS::Handle<JSObject*> aGivenProto)
-{
- return CSSMediaRuleBinding::Wrap(aCx, this, aGivenProto);
-}
-
void
MediaRule::AppendConditionText(nsAString& aOutput) const
{
if (mMedia) {
nsAutoString mediaText;
mMedia->GetText(mediaText);
aOutput.Append(mediaText);
}
--- a/layout/style/nsCSSRules.h
+++ b/layout/style/nsCSSRules.h
@@ -12,27 +12,27 @@
#include "Declaration.h"
#include "StyleRule.h"
#include "gfxFontFeatures.h"
#include "mozilla/Attributes.h"
#include "mozilla/MemoryReporting.h"
#include "mozilla/Move.h"
#include "mozilla/SheetType.h"
#include "mozilla/css/GroupRule.h"
+#include "mozilla/dom/CSSMediaRule.h"
#include "mozilla/dom/FontFace.h"
#include "nsAutoPtr.h"
#include "nsCSSPropertyID.h"
#include "nsCSSValue.h"
#include "nsDOMCSSDeclaration.h"
#include "nsIDOMCSSConditionRule.h"
#include "nsIDOMCSSCounterStyleRule.h"
#include "nsIDOMCSSFontFaceRule.h"
#include "nsIDOMCSSFontFeatureValuesRule.h"
#include "nsIDOMCSSGroupingRule.h"
-#include "nsIDOMCSSMediaRule.h"
#include "nsIDOMCSSMozDocumentRule.h"
#include "nsIDOMCSSPageRule.h"
#include "nsIDOMCSSSupportsRule.h"
#include "nsIDOMCSSKeyframeRule.h"
#include "nsIDOMCSSKeyframesRule.h"
#include "nsTArray.h"
class nsMediaList;
@@ -42,73 +42,57 @@ namespace mozilla {
class ErrorResult;
namespace dom {
class MediaList;
}
namespace css {
-class MediaRule final : public ConditionRule,
- public nsIDOMCSSMediaRule
+class MediaRule final : public dom::CSSMediaRule
{
public:
MediaRule(uint32_t aLineNumber, uint32_t aColumnNumber);
private:
MediaRule(const MediaRule& aCopy);
~MediaRule();
public:
-
- NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaRule, ConditionRule)
NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaRule, dom::CSSMediaRule)
// Rule methods
#ifdef DEBUG
virtual void List(FILE* out = stdout, int32_t aIndent = 0) const override;
#endif
virtual void SetStyleSheet(mozilla::StyleSheet* aSheet) override; //override GroupRule
mozilla::CSSStyleSheet* GetStyleSheet() const
{
mozilla::StyleSheet* sheet = GroupRule::GetStyleSheet();
return sheet ? sheet->AsGecko() : nullptr;
}
- virtual int32_t GetType() const override;
- using Rule::GetType;
virtual already_AddRefed<Rule> Clone() const override;
- // nsIDOMCSSGroupingRule interface
- NS_DECL_NSIDOMCSSGROUPINGRULE
-
// nsIDOMCSSConditionRule interface
NS_DECL_NSIDOMCSSCONDITIONRULE
- // nsIDOMCSSMediaRule interface
- NS_DECL_NSIDOMCSSMEDIARULE
-
// rest of GroupRule
virtual bool UseForPresentation(nsPresContext* aPresContext,
nsMediaQueryResultCacheKey& aKey) override;
// @media rule methods
nsresult SetMedia(nsMediaList* aMedia);
// WebIDL interface
- uint16_t Type() const override;
void GetCssTextImpl(nsAString& aCssText) const override;
- // Our XPCOM GetConditionText is OK
- virtual void SetConditionText(const nsAString& aConditionText,
- ErrorResult& aRv) override;
- dom::MediaList* Media() const;
+ using CSSMediaRule::SetConditionText;
+ dom::MediaList* Media() override;
virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf)
const override MOZ_MUST_OVERRIDE;
- virtual JSObject* WrapObject(JSContext* aCx,
- JS::Handle<JSObject*> aGivenProto) override;
-
protected:
void AppendConditionText(nsAString& aOutput) const;
RefPtr<nsMediaList> mMedia;
};
class DocumentRule final : public ConditionRule,
public nsIDOMCSSMozDocumentRule