file_select_helper.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // Copyright (c) 2020 Microsoft, Inc. All rights reserved.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #ifndef SHELL_BROWSER_FILE_SELECT_HELPER_H_
  5. #define SHELL_BROWSER_FILE_SELECT_HELPER_H_
  6. #include <memory>
  7. #include <string>
  8. #include <utility>
  9. #include <vector>
  10. #include "base/files/file_path.h"
  11. #include "chrome/common/pref_names.h"
  12. #include "content/public/browser/file_select_listener.h"
  13. #include "content/public/browser/render_frame_host.h"
  14. #include "content/public/browser/render_process_host.h"
  15. #include "content/public/browser/render_view_host.h"
  16. #include "content/public/browser/render_widget_host.h"
  17. #include "content/public/browser/render_widget_host_observer.h"
  18. #include "content/public/browser/web_contents.h"
  19. #include "content/public/browser/web_contents_observer.h"
  20. #include "gin/dictionary.h"
  21. #include "net/base/directory_lister.h"
  22. #include "shell/browser/electron_browser_context.h"
  23. #include "shell/browser/ui/file_dialog.h"
  24. #include "shell/common/gin_helper/dictionary.h"
  25. #include "ui/shell_dialogs/selected_file_info.h"
  26. using blink::mojom::FileChooserParams;
  27. class FileSelectHelper : public content::WebContentsObserver,
  28. public content::RenderWidgetHostObserver,
  29. public net::DirectoryLister::DirectoryListerDelegate {
  30. public:
  31. FileSelectHelper(content::RenderFrameHost* render_frame_host,
  32. std::unique_ptr<content::FileSelectListener> listener,
  33. FileChooserParams::Mode mode);
  34. ~FileSelectHelper() override;
  35. // WebDialogHelper::RunFileChooser
  36. void ShowOpenDialog(const file_dialog::DialogSettings& settings);
  37. void ShowSaveDialog(const file_dialog::DialogSettings& settings);
  38. private:
  39. // net::DirectoryLister::DirectoryListerDelegate overrides.
  40. void OnListFile(
  41. const net::DirectoryLister::DirectoryListerData& data) override;
  42. void OnListDone(int error) override;
  43. void DeleteTemporaryFiles();
  44. void EnumerateDirectory();
  45. void OnOpenDialogDone(gin_helper::Dictionary result);
  46. void OnSaveDialogDone(gin_helper::Dictionary result);
  47. void OnFilesSelected(
  48. std::vector<blink::mojom::FileChooserFileInfoPtr> file_info,
  49. base::FilePath base_dir);
  50. void RunFileChooserEnd();
  51. void ConvertToFileChooserFileInfoList(
  52. const std::vector<ui::SelectedFileInfo>& files);
  53. #if defined(OS_MACOSX)
  54. // Must be called from a MayBlock() task. Each selected file that is a package
  55. // will be zipped, and the zip will be passed to the render view host in place
  56. // of the package.
  57. void ProcessSelectedFilesMac(const std::vector<ui::SelectedFileInfo>& files);
  58. // Saves the paths of |zipped_files| for later deletion. Passes |files| to the
  59. // render view host.
  60. void ProcessSelectedFilesMacOnUIThread(
  61. const std::vector<ui::SelectedFileInfo>& files,
  62. const std::vector<base::FilePath>& zipped_files);
  63. // Zips the package at |path| into a temporary destination. Returns the
  64. // temporary destination, if the zip was successful. Otherwise returns an
  65. // empty path.
  66. static base::FilePath ZipPackage(const base::FilePath& path);
  67. #endif // defined(OS_MAC)
  68. // content::RenderWidgetHostObserver:
  69. void RenderWidgetHostDestroyed(
  70. content::RenderWidgetHost* widget_host) override;
  71. // content::WebContentsObserver:
  72. void RenderFrameHostChanged(content::RenderFrameHost* old_host,
  73. content::RenderFrameHost* new_host) override;
  74. void RenderFrameDeleted(content::RenderFrameHost* deleted_host) override;
  75. void WebContentsDestroyed() override;
  76. content::RenderFrameHost* render_frame_host_;
  77. content::WebContents* web_contents_;
  78. std::unique_ptr<content::FileSelectListener> listener_;
  79. FileChooserParams::Mode mode_;
  80. ScopedObserver<content::RenderWidgetHost, content::RenderWidgetHostObserver>
  81. observer_{this};
  82. // Temporary files only used on OSX. This class is responsible for deleting
  83. // these files when they are no longer needed.
  84. std::vector<base::FilePath> temporary_files_;
  85. // DirectoryLister-specific members
  86. std::unique_ptr<net::DirectoryLister> lister_;
  87. base::FilePath lister_base_dir_;
  88. std::vector<base::FilePath> lister_paths_;
  89. base::WeakPtrFactory<FileSelectHelper> weak_ptr_factory_{this};
  90. };
  91. #endif // SHELL_BROWSER_FILE_SELECT_HELPER_H_