Bug 1315601 part 2 - Replace macros with template function with lambda in nsMediaList. r=heycam draft
authorXidorn Quan <me@upsuper.org>
Wed, 22 Feb 2017 15:41:44 +1100
changeset 497325 e7cbb83a6e205e6359e5a81ade6996a3b6a1cdd4
parent 497324 c73bec7d8ec0a86d8cc71b36f3c4b032afb40248
child 497326 40a9171307b6a30288169e27caa43595349d2df7
push id48868
push userxquan@mozilla.com
push dateMon, 13 Mar 2017 06:44:26 +0000
reviewersheycam
bugs1315601
milestone55.0a1
Bug 1315601 part 2 - Replace macros with template function with lambda in nsMediaList. r=heycam MozReview-Commit-ID: 2k2eMZDoBd9
layout/style/nsMediaList.cpp
layout/style/nsMediaList.h
--- 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;