Bug 1379585 part 1 - Add an RAII class for auto disable interrupt callback. r?baku draft
authorXidorn Quan <me@upsuper.org>
Fri, 14 Jul 2017 10:02:59 +1000
changeset 608831 d69ae4fc18e2765d420692ea973c3ec5bf044910
parent 608660 3025ec9f749047ee03dddf5d5bcd4fa7c8eb747d
child 608832 f8c9f353c22350c199c5dd7f80cec4a94c708db0
push id68412
push userxquan@mozilla.com
push dateFri, 14 Jul 2017 06:56:30 +0000
reviewersbaku
bugs1379585
milestone56.0a1
Bug 1379585 part 1 - Add an RAII class for auto disable interrupt callback. r?baku MozReview-Commit-ID: IInIukI0yI7
dom/base/nsGlobalWindow.cpp
dom/script/ScriptSettings.h
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -12052,25 +12052,24 @@ nsGlobalWindow::ShowSlowScriptDialog()
   uint32_t buttonFlags = nsIPrompt::BUTTON_POS_1_DEFAULT +
                          (nsIPrompt::BUTTON_TITLE_IS_STRING *
                           (nsIPrompt::BUTTON_POS_0 + nsIPrompt::BUTTON_POS_1));
 
   // Add a third button if necessary.
   if (showDebugButton)
     buttonFlags += nsIPrompt::BUTTON_TITLE_IS_STRING * nsIPrompt::BUTTON_POS_2;
 
-  // Null out the operation callback while we're re-entering JS here.
-  bool old = JS_DisableInterruptCallback(cx);
-
-  // Open the dialog.
-  rv = prompt->ConfirmEx(title, msg, buttonFlags, waitButton, stopButton,
-                         debugButton, neverShowDlg, &neverShowDlgChk,
-                         &buttonPressed);
-
-  JS_ResetInterruptCallback(cx, old);
+  {
+    // Null out the operation callback while we're re-entering JS here.
+    AutoDisableJSInterruptCallback disabler(cx);
+    // Open the dialog.
+    rv = prompt->ConfirmEx(title, msg, buttonFlags, waitButton, stopButton,
+                          debugButton, neverShowDlg, &neverShowDlgChk,
+                          &buttonPressed);
+  }
 
   if (NS_SUCCEEDED(rv) && (buttonPressed == 0)) {
     return neverShowDlgChk ? AlwaysContinueSlowScript : ContinueSlowScript;
   }
   if (buttonPressed == 2) {
     if (debugCallback) {
       rv = debugCallback->HandleSlowScriptDebug(this);
       return NS_SUCCEEDED(rv) ? ContinueSlowScript : KillSlowScript;
--- a/dom/script/ScriptSettings.h
+++ b/dom/script/ScriptSettings.h
@@ -456,11 +456,31 @@ class MOZ_RAII AutoSlowOperation : publi
 {
 public:
   explicit AutoSlowOperation(MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM);
   void CheckForInterrupt();
 private:
   MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
 };
 
+/**
+ * A class to disable interrupt callback temporary.
+ */
+class MOZ_RAII AutoDisableJSInterruptCallback
+{
+public:
+  explicit AutoDisableJSInterruptCallback(JSContext* aCx)
+    : mCx(aCx)
+    , mOld(JS_DisableInterruptCallback(aCx))
+  { }
+
+  ~AutoDisableJSInterruptCallback() {
+    JS_ResetInterruptCallback(mCx, mOld);
+  }
+
+private:
+  JSContext* mCx;
+  bool mOld;
+};
+
 } // namespace mozilla
 
 #endif // mozilla_dom_ScriptSettings_h