1 // Copyright (c) 2012 The Chromium Embedded Framework Authors. 2 // Portions copyright (c) 2012 The Chromium Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 6 #ifndef CEF_LIBCEF_BROWSER_FILE_DIALOG_MANAGER_H_ 7 #define CEF_LIBCEF_BROWSER_FILE_DIALOG_MANAGER_H_ 8 #pragma once 9 10 #include "include/cef_browser.h" 11 #include "libcef/browser/file_dialog_runner.h" 12 13 #include "base/compiler_specific.h" 14 #include "base/memory/weak_ptr.h" 15 #include "content/public/browser/web_contents_observer.h" 16 17 namespace content { 18 class FileSelectListener; 19 class WebContents; 20 } // namespace content 21 22 namespace net { 23 class DirectoryLister; 24 } 25 26 class AlloyBrowserHostImpl; 27 28 class CefFileDialogManager { 29 public: 30 // |runner| may be NULL if the platform doesn't implement dialogs. 31 CefFileDialogManager(AlloyBrowserHostImpl* browser, 32 std::unique_ptr<CefFileDialogRunner> runner); 33 34 CefFileDialogManager(const CefFileDialogManager&) = delete; 35 CefFileDialogManager& operator=(const CefFileDialogManager&) = delete; 36 37 ~CefFileDialogManager(); 38 39 // Delete the runner to free any platform constructs. 40 void Destroy(); 41 42 // Called from AlloyBrowserHostImpl::RunFileChooser. 43 // See CefBrowserHost::RunFileDialog documentation. 44 void RunFileDialog(cef_file_dialog_mode_t mode, 45 const CefString& title, 46 const CefString& default_file_path, 47 const std::vector<CefString>& accept_filters, 48 int selected_accept_filter, 49 CefRefPtr<CefRunFileDialogCallback> callback); 50 51 // Called from AlloyBrowserHostImpl::RunFileChooser. 52 // See WebContentsDelegate::RunFileChooser documentation. 53 void RunFileChooser(scoped_refptr<content::FileSelectListener> listener, 54 const blink::mojom::FileChooserParams& params); 55 56 // Run the file chooser dialog specified by |params|. Only a single dialog may 57 // be pending at any given time. |callback| will be executed asynchronously 58 // after the dialog is dismissed or if another dialog is already pending. 59 void RunFileChooser(const CefFileDialogRunner::FileChooserParams& params, 60 CefFileDialogRunner::RunFileChooserCallback callback); 61 62 private: 63 void RunFileChooserInternal( 64 const CefFileDialogRunner::FileChooserParams& params, 65 CefFileDialogRunner::RunFileChooserCallback callback); 66 67 // Used with the RunFileChooser variant where the caller specifies a callback 68 // (no associated RenderFrameHost). 69 void OnRunFileChooserCallback( 70 CefFileDialogRunner::RunFileChooserCallback callback, 71 int selected_accept_filter, 72 const std::vector<base::FilePath>& file_paths); 73 74 // Used with WebContentsDelegate::RunFileChooser when mode is 75 // blink::mojom::FileChooserParams::Mode::kUploadFolder. 76 void OnRunFileChooserUploadFolderDelegateCallback( 77 const blink::mojom::FileChooserParams::Mode mode, 78 scoped_refptr<content::FileSelectListener> listener, 79 int selected_accept_filter, 80 const std::vector<base::FilePath>& file_paths); 81 82 // Used with WebContentsDelegate::RunFileChooser to notify the 83 // RenderFrameHost. 84 void OnRunFileChooserDelegateCallback( 85 blink::mojom::FileChooserParams::Mode mode, 86 scoped_refptr<content::FileSelectListener> listener, 87 int selected_accept_filter, 88 const std::vector<base::FilePath>& file_paths); 89 90 // Clean up state associated with the last run. 91 void Cleanup(); 92 93 // AlloyBrowserHostImpl pointer is guaranteed to outlive this object. 94 AlloyBrowserHostImpl* browser_; 95 96 std::unique_ptr<CefFileDialogRunner> runner_; 97 98 // True if a file chooser is currently pending. 99 bool file_chooser_pending_; 100 101 // Used for asynchronously listing directory contents. 102 std::unique_ptr<net::DirectoryLister> lister_; 103 104 // Must be the last member. 105 base::WeakPtrFactory<CefFileDialogManager> weak_ptr_factory_; 106 }; 107 108 #endif // CEF_LIBCEF_BROWSER_JAVASCRIPT_DIALOG_MANAGER_H_ 109