Bug 1379585 part 1 - Add an RAII class for auto disable interrupt callback. r?baku
MozReview-Commit-ID: IInIukI0yI7
--- 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