• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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