Skip to content

Commit

Permalink
misc cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
codebytere committed Aug 19, 2020
1 parent db49735 commit 49421ca
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 109 deletions.
125 changes: 28 additions & 97 deletions shell/browser/file_select_helper.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,15 @@

#include "base/bind.h"
#include "base/files/file_enumerator.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/common/pref_names.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/file_select_listener.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
#include "gin/dictionary.h"
#include "net/base/directory_lister.h"
#include "net/base/mime_util.h"
#include "shell/browser/electron_browser_context.h"
#include "shell/browser/javascript_environment.h"
#include "shell/browser/native_window.h"
#include "shell/browser/ui/file_dialog.h"
#include "shell/common/gin_converters/callback_converter.h"
#include "shell/common/gin_converters/file_path_converter.h"
#include "shell/common/gin_helper/dictionary.h"

using blink::mojom::FileChooserFileInfo;
using blink::mojom::FileChooserFileInfoPtr;
Expand All @@ -53,9 +41,12 @@ FileSelectHelper::FileSelectHelper(
: render_frame_host_(render_frame_host),
listener_(std::move(listener)),
mode_(mode) {
auto* web_contents =
content::WebContents::FromRenderFrameHost(render_frame_host);
content::WebContentsObserver::Observe(web_contents);
DCHECK(render_frame_host_);
DCHECK(listener_);

web_contents_ = content::WebContents::FromRenderFrameHost(render_frame_host);
DCHECK(web_contents_);
content::WebContentsObserver::Observe(web_contents_);
}

FileSelectHelper::~FileSelectHelper() = default;
Expand Down Expand Up @@ -94,6 +85,20 @@ void FileSelectHelper::OnListFile(
lister_paths_.push_back(data.path);
}

void FileSelectHelper::RunSelectionEnd() {
// If there are temporary files, then this instance needs to stick around
// until web_contents_ is destroyed, so that this instance can delete the
// temporary files.
if (!temporary_files_.empty())
return;

if (listener_)
listener_->FileSelectionCanceled();

render_frame_host_ = nullptr;
web_contents_ = nullptr;
}

// net::DirectoryLister::DirectoryListerDelegate
void FileSelectHelper::OnListDone(int error) {
std::vector<FileChooserFileInfoPtr> file_info;
Expand All @@ -102,6 +107,7 @@ void FileSelectHelper::OnListDone(int error) {
NativeFileInfo::New(path, base::string16())));

OnFilesSelected(std::move(file_info), lister_base_dir_);
Release();
}

void FileSelectHelper::DeleteTemporaryFiles() {
Expand Down Expand Up @@ -133,8 +139,8 @@ void FileSelectHelper::OnOpenDialogDone(gin_helper::Dictionary result) {
bool canceled = true;
result.Get("canceled", &canceled);

if (canceled) {
OnSelectionCancelled();
if (!render_frame_host_ || canceled) {
RunSelectionEnd();
} else {
std::vector<base::FilePath> paths;
if (result.Get("filePaths", &paths)) {
Expand Down Expand Up @@ -185,8 +191,8 @@ void FileSelectHelper::OnSaveDialogDone(gin_helper::Dictionary result) {
bool canceled = true;
result.Get("canceled", &canceled);

if (canceled) {
OnSelectionCancelled();
if (!render_frame_host_ || canceled) {
RunSelectionEnd();
} else {
base::FilePath path;
if (result.Get("filePath", &path)) {
Expand All @@ -206,19 +212,6 @@ void FileSelectHelper::OnFilesSelected(
listener_.reset();
}
render_frame_host_ = nullptr;

if (!temporary_files_.empty())
DeleteTemporaryFiles();

Release();
}

void FileSelectHelper::OnSelectionCancelled() {
if (listener_) {
listener_->FileSelectionCanceled();
listener_.reset();
}
render_frame_host_ = nullptr;
}

// content::WebContentsObserver:
Expand All @@ -242,72 +235,10 @@ void FileSelectHelper::RenderFrameDeleted(
render_frame_host_ = nullptr;
}

// content::WebContentsObserver:
void FileSelectHelper::WebContentsDestroyed() {
render_frame_host_ = nullptr;
}

file_dialog::Filters GetFileTypesFromAcceptType(
const std::vector<base::string16>& accept_types) {
file_dialog::Filters filters;
if (accept_types.empty())
return filters;

std::vector<base::FilePath::StringType> extensions;

int valid_type_count = 0;
std::string description;

for (const auto& accept_type : accept_types) {
std::string ascii_type = base::UTF16ToASCII(accept_type);
auto old_extension_size = extensions.size();

if (ascii_type[0] == '.') {
// If the type starts with a period it is assumed to be a file
// extension, like `.txt`, // so we just have to add it to the list.
base::FilePath::StringType extension(ascii_type.begin(),
ascii_type.end());
// Skip the first character.
extensions.push_back(extension.substr(1));
} else {
if (ascii_type == "image/*")
description = "Image Files";
else if (ascii_type == "audio/*")
description = "Audio Files";
else if (ascii_type == "video/*")
description = "Video Files";

// For MIME Type, `audio/*, video/*, image/*
net::GetExtensionsForMimeType(ascii_type, &extensions);
}

if (extensions.size() > old_extension_size)
valid_type_count++;
}

// If no valid extension is added, return empty filters.
if (extensions.empty())
return filters;

filters.push_back(file_dialog::Filter());

if (valid_type_count > 1 || (valid_type_count == 1 && description.empty()))
description = "Custom Files";

DCHECK(!description.empty());
filters[0].first = description;

for (const auto& extension : extensions) {
#if defined(OS_WIN)
filters[0].second.push_back(base::UTF16ToASCII(extension));
#else
filters[0].second.push_back(extension);
#endif
}

// Allow all files when extension is specified.
filters.push_back(file_dialog::Filter());
filters.back().first = "All Files";
filters.back().second.emplace_back("*");
web_contents_ = nullptr;

return filters;
DeleteTemporaryFiles();
}
15 changes: 3 additions & 12 deletions shell/browser/file_select_helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,8 @@
#include <utility>
#include <vector>

#include "base/bind.h"
#include "base/files/file_enumerator.h"
#include "base/files/file_path.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/common/pref_names.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/file_select_listener.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
Expand All @@ -25,13 +21,8 @@
#include "content/public/browser/web_contents_observer.h"
#include "gin/dictionary.h"
#include "net/base/directory_lister.h"
#include "net/base/mime_util.h"
#include "shell/browser/electron_browser_context.h"
#include "shell/browser/javascript_environment.h"
#include "shell/browser/native_window.h"
#include "shell/browser/ui/file_dialog.h"
#include "shell/common/gin_converters/callback_converter.h"
#include "shell/common/gin_converters/file_path_converter.h"
#include "shell/common/gin_helper/dictionary.h"
#include "ui/shell_dialogs/selected_file_info.h"

Expand Down Expand Up @@ -71,14 +62,13 @@ class FileSelectHelper : public base::RefCountedThreadSafe<
void EnumerateDirectory();

void OnOpenDialogDone(gin_helper::Dictionary result);

void OnSaveDialogDone(gin_helper::Dictionary result);

void OnFilesSelected(
std::vector<blink::mojom::FileChooserFileInfoPtr> file_info,
base::FilePath base_dir);

void OnSelectionCancelled();
void RunSelectionEnd();

void ConvertToFileChooserFileInfoList(
const std::vector<ui::SelectedFileInfo>& files);
Expand Down Expand Up @@ -108,6 +98,7 @@ class FileSelectHelper : public base::RefCountedThreadSafe<
void WebContentsDestroyed() override;

content::RenderFrameHost* render_frame_host_;
content::WebContents* web_contents_;
scoped_refptr<content::FileSelectListener> listener_;
FileChooserParams::Mode mode_;

Expand All @@ -121,4 +112,4 @@ class FileSelectHelper : public base::RefCountedThreadSafe<
std::vector<base::FilePath> lister_paths_;
};

#endif // SHELL_BROWSER_FILE_SELECT_HELPER_H_
#endif // SHELL_BROWSER_FILE_SELECT_HELPER_H_
2 changes: 2 additions & 0 deletions shell/browser/file_select_helper_mac.mm
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

#include "shell/browser/file_select_helper.h"

#include <vector>

#include <Cocoa/Cocoa.h>
#include <sys/stat.h>

Expand Down

0 comments on commit 49421ca

Please sign in to comment.