Bug 1315601 part 2 - Replace macros with template function with lambda in nsMediaList. r=heycam
MozReview-Commit-ID: 2k2eMZDoBd9
--- a/layout/style/nsMediaList.cpp
+++ b/layout/style/nsMediaList.cpp
@@ -572,56 +572,58 @@ nsMediaList::Clone()
result->mArray.AppendElements(mArray.Length());
for (uint32_t i = 0, i_end = mArray.Length(); i < i_end; ++i) {
result->mArray[i] = mArray[i]->Clone();
MOZ_ASSERT(result->mArray[i]);
}
return result.forget();
}
+template<typename Func>
+nsresult
+nsMediaList::DoMediaChange(Func aCallback)
+{
+ nsCOMPtr<nsIDocument> doc;
+ if (mStyleSheet) {
+ doc = mStyleSheet->GetAssociatedDocument();
+ }
+ mozAutoDocUpdate updateBatch(doc, UPDATE_STYLE, true);
+ if (mStyleSheet) {
+ mStyleSheet->WillDirty();
+ }
+
+ nsresult rv = aCallback();
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ if (mStyleSheet) {
+ mStyleSheet->DidDirty();
+ }
+ /* XXXldb Pass something meaningful? */
+ if (doc) {
+ doc->StyleRuleChanged(mStyleSheet, nullptr);
+ }
+ return rv;
+}
+
NS_IMETHODIMP
nsMediaList::GetMediaText(nsAString& aMediaText)
{
GetText(aMediaText);
return NS_OK;
}
-// "sheet" should be a StyleSheet and "doc" should be an
-// nsCOMPtr<nsIDocument>
-#define BEGIN_MEDIA_CHANGE(sheet, doc) \
- if (sheet) { \
- doc = sheet->GetAssociatedDocument(); \
- } \
- mozAutoDocUpdate updateBatch(doc, UPDATE_STYLE, true); \
- if (sheet) { \
- sheet->WillDirty(); \
- }
-
-#define END_MEDIA_CHANGE(sheet, doc) \
- if (sheet) { \
- sheet->DidDirty(); \
- } \
- /* XXXldb Pass something meaningful? */ \
- if (doc) { \
- doc->StyleRuleChanged(sheet, nullptr); \
- }
-
-
NS_IMETHODIMP
nsMediaList::SetMediaText(const nsAString& aMediaText)
{
- nsCOMPtr<nsIDocument> doc;
-
- BEGIN_MEDIA_CHANGE(mStyleSheet, doc)
-
- SetText(aMediaText);
-
- END_MEDIA_CHANGE(mStyleSheet, doc)
-
- return NS_OK;
+ return DoMediaChange([&]() {
+ SetText(aMediaText);
+ return NS_OK;
+ });
}
NS_IMETHODIMP
nsMediaList::GetLength(uint32_t* aLength)
{
NS_ENSURE_ARG_POINTER(aLength);
*aLength = Length();
@@ -647,45 +649,23 @@ nsMediaList::IndexedGetter(uint32_t aInd
aFound = false;
SetDOMStringToNull(aReturn);
}
}
NS_IMETHODIMP
nsMediaList::DeleteMedium(const nsAString& aOldMedium)
{
- nsresult rv = NS_OK;
- nsCOMPtr<nsIDocument> doc;
-
- BEGIN_MEDIA_CHANGE(mStyleSheet, doc)
-
- rv = Delete(aOldMedium);
- if (NS_FAILED(rv))
- return rv;
-
- END_MEDIA_CHANGE(mStyleSheet, doc)
-
- return rv;
+ return DoMediaChange([&]() { return Delete(aOldMedium); });
}
NS_IMETHODIMP
nsMediaList::AppendMedium(const nsAString& aNewMedium)
{
- nsresult rv = NS_OK;
- nsCOMPtr<nsIDocument> doc;
-
- BEGIN_MEDIA_CHANGE(mStyleSheet, doc)
-
- rv = Append(aNewMedium);
- if (NS_FAILED(rv))
- return rv;
-
- END_MEDIA_CHANGE(mStyleSheet, doc)
-
- return rv;
+ return DoMediaChange([&]() { return Append(aNewMedium); });
}
nsresult
nsMediaList::Delete(const nsAString& aOldMedium)
{
if (aOldMedium.IsEmpty())
return NS_ERROR_DOM_NOT_FOUND_ERR;
--- a/layout/style/nsMediaList.h
+++ b/layout/style/nsMediaList.h
@@ -301,16 +301,19 @@ public:
void AppendMedium(const nsAString& aMedium, ErrorResult& aRv)
{
aRv = AppendMedium(aMedium);
}
protected:
~nsMediaList();
+ template<typename Func>
+ nsresult DoMediaChange(Func aCallback);
+
nsresult Delete(const nsAString & aOldMedium);
nsresult Append(const nsAString & aOldMedium);
InfallibleTArray<nsAutoPtr<nsMediaQuery> > 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
mozilla::StyleSheet* mStyleSheet;