Bug 426177 - Alert user when selecting unreadable input file r=emilio

The change is done at the nsFilePicker level, when it's in open mode.

Differential Revision: https://phabricator.services.mozilla.com/D166419
This commit is contained in:
serge-sans-paille 2023-01-16 16:13:45 +00:00
Родитель 7f1075b129
Коммит 92df009ab9
3 изменённых файлов: 53 добавлений и 0 удалений

Просмотреть файл

@ -15,3 +15,4 @@ audioTitle=Audio Files
videoTitle=Video Files
formatLabel=Format:
selectedFileNotReadableError=Selected file does not have read permission

Просмотреть файл

@ -16,6 +16,8 @@
#include "nsIURI.h"
#include "nsIWidget.h"
#include "nsIFile.h"
#include "nsIStringBundle.h"
#include "mozilla/Components.h"
#include "mozilla/Preferences.h"
#include "nsArrayEnumerator.h"
@ -511,6 +513,50 @@ void nsFilePicker::OnDestroy(GtkWidget* file_chooser, gpointer user_data) {
GTK_RESPONSE_CANCEL);
}
bool nsFilePicker::WarnForNonReadableFile(void* file_chooser) {
nsCOMPtr<nsIFile> file;
GetFile(getter_AddRefs(file));
if (!file) {
return false;
}
bool isReadable = false;
file->IsReadable(&isReadable);
if (isReadable) {
return false;
}
nsCOMPtr<nsIStringBundleService> stringService =
mozilla::components::StringBundle::Service();
if (!stringService) {
return false;
}
nsCOMPtr<nsIStringBundle> filepickerBundle;
nsresult rv = stringService->CreateBundle(
"chrome://global/locale/filepicker.properties",
getter_AddRefs(filepickerBundle));
if (NS_FAILED(rv)) {
return false;
}
nsAutoString errorMessage;
rv = filepickerBundle->GetStringFromName("selectedFileNotReadableError",
errorMessage);
if (NS_FAILED(rv)) {
return false;
}
GtkDialogFlags flags = GTK_DIALOG_DESTROY_WITH_PARENT;
auto* cancel_dialog = gtk_message_dialog_new(
GTK_WINDOW(file_chooser), flags, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
"%s", NS_ConvertUTF16toUTF8(errorMessage).get());
gtk_dialog_run(GTK_DIALOG(cancel_dialog));
gtk_widget_destroy(cancel_dialog);
return true;
}
void nsFilePicker::Done(void* file_chooser, gint response) {
mRunning = false;
@ -528,6 +574,10 @@ void nsFilePicker::Done(void* file_chooser, gint response) {
file->Exists(&exists);
if (exists) result = nsIFilePicker::returnReplace;
}
} else if (mMode == nsIFilePicker::modeOpen) {
if (WarnForNonReadableFile(file_chooser)) {
result = nsIFilePicker::returnCancel;
}
}
break;

Просмотреть файл

@ -48,6 +48,8 @@ class nsFilePicker : public nsBaseFilePicker {
nsresult Show(int16_t* aReturn) override;
void ReadValuesFromFileChooser(void* file_chooser);
bool WarnForNonReadableFile(void* file_chooser);
static void OnResponse(void* file_chooser, gint response_id,
gpointer user_data);
static void OnDestroy(GtkWidget* file_chooser, gpointer user_data);