blob: 97ea05e582b29184ddfb6da5e60d69fbdb103660 [file] [log] [blame]
Avi Drissman1a55a9d62020-03-10 18:56:451// Copyright 2020 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Avi Drissmanbd3e986442020-05-20 21:09:205#ifndef CONTENT_BROWSER_WEB_CONTENTS_FILE_CHOOSER_IMPL_H_
6#define CONTENT_BROWSER_WEB_CONTENTS_FILE_CHOOSER_IMPL_H_
Avi Drissman1a55a9d62020-03-10 18:56:457
8#include "base/callback_helpers.h"
9#include "content/common/content_export.h"
10#include "content/public/browser/file_select_listener.h"
11#include "content/public/browser/web_contents_observer.h"
12#include "third_party/blink/public/mojom/choosers/file_chooser.mojom.h"
13
14namespace content {
15
16class RenderFrameHostImpl;
17
18// An implementation of blink::mojom::FileChooser and FileSelectListener
19// associated to RenderFrameHost.
Sreeja Kamishettybfd828d2020-06-10 11:56:0520// TODO(sreejakshetty): Make FileChooserImpl per-frame and associate with
21// RenderDocumentHostUserData to ensure that the state is correctly tracked and
22// deleted.
Avi Drissman1a55a9d62020-03-10 18:56:4523class CONTENT_EXPORT FileChooserImpl : public blink::mojom::FileChooser,
Avi Drissmanbd3e986442020-05-20 21:09:2024 public WebContentsObserver {
Avi Drissman1a55a9d62020-03-10 18:56:4525 using FileChooserResult = blink::mojom::FileChooserResult;
26
27 public:
Avi Drissmanbd3e986442020-05-20 21:09:2028 class CONTENT_EXPORT FileSelectListenerImpl : public FileSelectListener {
Avi Drissman1a55a9d62020-03-10 18:56:4529 public:
30 explicit FileSelectListenerImpl(FileChooserImpl* owner) : owner_(owner) {}
31 ~FileSelectListenerImpl() override;
32 void SetFullscreenBlock(base::ScopedClosureRunner fullscreen_block);
33 void ResetOwner() { owner_ = nullptr; }
34
35 // FileSelectListener overrides:
36
37 void FileSelected(std::vector<blink::mojom::FileChooserFileInfoPtr> files,
38 const base::FilePath& base_dir,
39 blink::mojom::FileChooserParams::Mode mode) override;
40
41 void FileSelectionCanceled() override;
42
43 protected:
44 // This sets |was_file_select_listener_function_called_| to true so that
45 // tests can pass with mocked overrides of this class.
46 void SetListenerFunctionCalledTrueForTesting();
47
48 private:
49 FileChooserImpl* owner_;
50 base::ScopedClosureRunner fullscreen_block_;
51#if DCHECK_IS_ON()
52 bool was_file_select_listener_function_called_ = false;
53 bool was_fullscreen_block_set_ = false;
54#endif
55 };
56
57 static void Create(RenderFrameHostImpl* render_frame_host,
58 mojo::PendingReceiver<blink::mojom::FileChooser> receiver);
Avi Drissmanbd3e986442020-05-20 21:09:2059 static mojo::Remote<blink::mojom::FileChooser> CreateBoundForTesting(
60 RenderFrameHostImpl* render_frame_host);
Avi Drissman1a55a9d62020-03-10 18:56:4561
62 ~FileChooserImpl() override;
63
64 void FileSelected(std::vector<blink::mojom::FileChooserFileInfoPtr> files,
65 const base::FilePath& base_dir,
66 blink::mojom::FileChooserParams::Mode mode);
67
68 void FileSelectionCanceled();
69
70 void ResetListenerImpl();
71
Avi Drissmanbd3e986442020-05-20 21:09:2072 // blink::mojom::FileChooser overrides:
Avi Drissman1a55a9d62020-03-10 18:56:4573
74 void OpenFileChooser(blink::mojom::FileChooserParamsPtr params,
75 OpenFileChooserCallback callback) override;
Avi Drissman1a55a9d62020-03-10 18:56:4576 void EnumerateChosenDirectory(
77 const base::FilePath& directory_path,
78 EnumerateChosenDirectoryCallback callback) override;
79
80 private:
Avi Drissmanbd3e986442020-05-20 21:09:2081 explicit FileChooserImpl(RenderFrameHostImpl* render_frame_host);
82
83 // WebContentsObserver overrides:
Avi Drissman1a55a9d62020-03-10 18:56:4584
85 void RenderFrameHostChanged(RenderFrameHost* old_host,
86 RenderFrameHost* new_host) override;
Avi Drissman1a55a9d62020-03-10 18:56:4587 void RenderFrameDeleted(RenderFrameHost* render_frame_host) override;
Avi Drissman1a55a9d62020-03-10 18:56:4588 void WebContentsDestroyed() override;
89
90 RenderFrameHostImpl* render_frame_host_;
91 FileSelectListenerImpl* listener_impl_ = nullptr;
92 base::OnceCallback<void(blink::mojom::FileChooserResultPtr)> callback_;
93};
94
95} // namespace content
96
Avi Drissmanbd3e986442020-05-20 21:09:2097#endif // CONTENT_BROWSER_WEB_CONTENTS_FILE_CHOOSER_IMPL_H_