NS_IMETHODIMP nsAsyncAlert::Run() { nsresult rv; // Get user's preference for this alert bool prefValue; rv = mPrefBranch->GetBoolPref(mPrefName.get(), &prefValue); if (NS_FAILED(rv)) prefValue = true; // Stop if alert is not requested if (!prefValue) return NS_OK; mozilla::Telemetry::Accumulate(mozilla::Telemetry::SECURITY_UI, mBucket); // Check for a show-once pref for this dialog. // If the show-once pref is set to true: // - The default value of the "show every time" checkbox is unchecked // - If the user checks the checkbox, we clear the show-once pref. nsCAutoString showOncePref(mPrefName); showOncePref += ".show_once"; bool showOnce = false; mPrefBranch->GetBoolPref(showOncePref.get(), &showOnce); if (showOnce) prefValue = false; // Get messages strings from localization file nsXPIDLString windowTitle, message, dontShowAgain; mStringBundle->GetStringFromName(NS_LITERAL_STRING("Title").get(), getter_Copies(windowTitle)); mStringBundle->GetStringFromName(mDialogMessageName.get(), getter_Copies(message)); mStringBundle->GetStringFromName(mShowAgainName.get(), getter_Copies(dontShowAgain)); if (!windowTitle || !message || !dontShowAgain) return NS_ERROR_FAILURE; rv = mPrompt->AlertCheck(windowTitle, message, dontShowAgain, &prefValue); if (NS_FAILED(rv)) return rv; if (!prefValue) { mPrefBranch->SetBoolPref(mPrefName.get(), false); } else if (showOnce) { mPrefBranch->SetBoolPref(showOncePref.get(), false); } return rv; }
nsresult nsSecurityWarningDialogs::ConfirmDialog(nsIInterfaceRequestor *ctx, const char *prefName, const char16_t *messageName, const char16_t *showAgainName, const uint32_t aBucket, bool* _result) { nsresult rv; // Get user's preference for this alert // prefName, showAgainName are null if there is no preference for this dialog bool prefValue = true; if (prefName) { rv = mPrefBranch->GetBoolPref(prefName, &prefValue); if (NS_FAILED(rv)) prefValue = true; } // Stop if confirm is not requested if (!prefValue) { *_result = true; return NS_OK; } MOZ_ASSERT(NS_IsMainThread()); mozilla::Telemetry::Accumulate(mozilla::Telemetry::SECURITY_UI, aBucket); // See AlertDialog() for a description of how showOnce works. nsAutoCString showOncePref(prefName); showOncePref += ".show_once"; bool showOnce = false; mPrefBranch->GetBoolPref(showOncePref.get(), &showOnce); if (showOnce) prefValue = false; // Get Prompt to use nsCOMPtr<nsIPrompt> prompt = do_GetInterface(ctx); if (!prompt) return NS_ERROR_FAILURE; // Get messages strings from localization file nsXPIDLString windowTitle, message, alertMe, cont; mStringBundle->GetStringFromName(MOZ_UTF16("Title"), getter_Copies(windowTitle)); mStringBundle->GetStringFromName(messageName, getter_Copies(message)); if (showAgainName) { mStringBundle->GetStringFromName(showAgainName, getter_Copies(alertMe)); } mStringBundle->GetStringFromName(MOZ_UTF16("Continue"), getter_Copies(cont)); // alertMe is allowed to be null if (!windowTitle || !message || !cont) return NS_ERROR_FAILURE; // Replace # characters with newlines to lay out the dialog. char16_t* msgchars = message.BeginWriting(); uint32_t i = 0; for (i = 0; msgchars[i] != '\0'; i++) { if (msgchars[i] == '#') { msgchars[i] = '\n'; } } int32_t buttonPressed; rv = prompt->ConfirmEx(windowTitle, message, (nsIPrompt::BUTTON_TITLE_IS_STRING * nsIPrompt::BUTTON_POS_0) + (nsIPrompt::BUTTON_TITLE_CANCEL * nsIPrompt::BUTTON_POS_1), cont, nullptr, nullptr, alertMe, &prefValue, &buttonPressed); if (NS_FAILED(rv)) return rv; *_result = (buttonPressed != 1); if (*_result) { // For confirmation dialogs, the clickthrough constant is 1 more // than the constant for the dialog. mozilla::Telemetry::Accumulate(mozilla::Telemetry::SECURITY_UI, aBucket + 1); } if (!prefValue && prefName) { mPrefBranch->SetBoolPref(prefName, false); } else if (prefValue && showOnce) { mPrefBranch->SetBoolPref(showOncePref.get(), false); } return rv; }