mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-03-05 20:29:24 +01:00
Add support for the webkit-directory attribute (issue #958).
This commit is contained in:
parent
ae91d8f4e5
commit
505f11159a
@ -55,6 +55,7 @@
|
|||||||
#include "content/public/browser/render_view_host.h"
|
#include "content/public/browser/render_view_host.h"
|
||||||
#include "content/public/browser/resource_request_info.h"
|
#include "content/public/browser/resource_request_info.h"
|
||||||
#include "content/public/common/file_chooser_params.h"
|
#include "content/public/common/file_chooser_params.h"
|
||||||
|
#include "net/base/directory_lister.h"
|
||||||
#include "third_party/WebKit/public/web/WebFindOptions.h"
|
#include "third_party/WebKit/public/web/WebFindOptions.h"
|
||||||
#include "ui/shell_dialogs/selected_file_info.h"
|
#include "ui/shell_dialogs/selected_file_info.h"
|
||||||
|
|
||||||
@ -263,6 +264,54 @@ void RunFileDialogDismissed(
|
|||||||
callback->OnFileDialogDismissed(selected_accept_filter, paths);
|
callback->OnFileDialogDismissed(selected_accept_filter, paths);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class UploadFolderHelper :
|
||||||
|
public net::DirectoryLister::DirectoryListerDelegate {
|
||||||
|
public:
|
||||||
|
explicit UploadFolderHelper(
|
||||||
|
const CefBrowserHostImpl::RunFileChooserCallback& callback)
|
||||||
|
: callback_(callback) {
|
||||||
|
}
|
||||||
|
|
||||||
|
~UploadFolderHelper() override {
|
||||||
|
if (!callback_.is_null()) {
|
||||||
|
if (CEF_CURRENTLY_ON_UIT()) {
|
||||||
|
CancelNow(callback_);
|
||||||
|
} else {
|
||||||
|
CEF_POST_TASK(CEF_UIT,
|
||||||
|
base::Bind(&UploadFolderHelper::CancelNow, callback_));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnListFile(
|
||||||
|
const net::DirectoryLister::DirectoryListerData& data) override {
|
||||||
|
CEF_REQUIRE_UIT();
|
||||||
|
if (!data.info.IsDirectory())
|
||||||
|
select_files_.push_back(data.path);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnListDone(int error) override {
|
||||||
|
CEF_REQUIRE_UIT();
|
||||||
|
if (!callback_.is_null()) {
|
||||||
|
callback_.Run(0, select_files_);
|
||||||
|
callback_.Reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void CancelNow(
|
||||||
|
const CefBrowserHostImpl::RunFileChooserCallback& callback) {
|
||||||
|
CEF_REQUIRE_UIT();
|
||||||
|
std::vector<base::FilePath> file_paths;
|
||||||
|
callback.Run(0, file_paths);
|
||||||
|
}
|
||||||
|
|
||||||
|
CefBrowserHostImpl::RunFileChooserCallback callback_;
|
||||||
|
std::vector<base::FilePath> select_files_;
|
||||||
|
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(UploadFolderHelper);
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|
||||||
@ -2316,16 +2365,23 @@ void CefBrowserHostImpl::RunFileChooser(
|
|||||||
if (!render_view_host)
|
if (!render_view_host)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
FileChooserParams cef_params;
|
||||||
|
static_cast<content::FileChooserParams&>(cef_params) = params;
|
||||||
|
|
||||||
|
if (lister_) {
|
||||||
|
// Cancel the previous upload folder run.
|
||||||
|
lister_->Cancel();
|
||||||
|
lister_.reset();
|
||||||
|
}
|
||||||
|
|
||||||
if (params.mode == content::FileChooserParams::UploadFolder) {
|
if (params.mode == content::FileChooserParams::UploadFolder) {
|
||||||
// TODO(cef): Implement the logic necessary for the 'webkitdirectory'
|
RunFileChooserOnUIThread(cef_params,
|
||||||
// attribute. See CEF issue #958.
|
base::Bind(
|
||||||
OnRunFileChooserDelegateCallback(
|
&CefBrowserHostImpl::OnRunFileChooserUploadFolderDelegateCallback,
|
||||||
web_contents, params.mode, 0, std::vector<base::FilePath>());
|
this, web_contents, params.mode));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
FileChooserParams cef_params;
|
|
||||||
static_cast<content::FileChooserParams&>(cef_params) = params;
|
|
||||||
RunFileChooserOnUIThread(cef_params,
|
RunFileChooserOnUIThread(cef_params,
|
||||||
base::Bind(&CefBrowserHostImpl::OnRunFileChooserDelegateCallback, this,
|
base::Bind(&CefBrowserHostImpl::OnRunFileChooserDelegateCallback, this,
|
||||||
web_contents, params.mode));
|
web_contents, params.mode));
|
||||||
@ -3035,6 +3091,30 @@ void CefBrowserHostImpl::OnRunFileChooserCallback(
|
|||||||
base::Bind(callback, selected_accept_filter, file_paths));
|
base::Bind(callback, selected_accept_filter, file_paths));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CefBrowserHostImpl::OnRunFileChooserUploadFolderDelegateCallback(
|
||||||
|
content::WebContents* web_contents,
|
||||||
|
const content::FileChooserParams::Mode mode,
|
||||||
|
int selected_accept_filter,
|
||||||
|
const std::vector<base::FilePath>& file_paths) {
|
||||||
|
CEF_REQUIRE_UIT();
|
||||||
|
DCHECK (mode == content::FileChooserParams::UploadFolder);
|
||||||
|
|
||||||
|
if (file_paths.size() == 0) {
|
||||||
|
// Client canceled the file chooser.
|
||||||
|
OnRunFileChooserDelegateCallback(web_contents, mode,
|
||||||
|
selected_accept_filter, file_paths);
|
||||||
|
} else {
|
||||||
|
lister_.reset(new net::DirectoryLister(
|
||||||
|
file_paths[0],
|
||||||
|
true,
|
||||||
|
net::DirectoryLister::NO_SORT,
|
||||||
|
new UploadFolderHelper(
|
||||||
|
base::Bind(&CefBrowserHostImpl::OnRunFileChooserDelegateCallback,
|
||||||
|
this, web_contents, mode))));
|
||||||
|
lister_->Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CefBrowserHostImpl::OnRunFileChooserDelegateCallback(
|
void CefBrowserHostImpl::OnRunFileChooserDelegateCallback(
|
||||||
content::WebContents* web_contents,
|
content::WebContents* web_contents,
|
||||||
content::FileChooserParams::Mode mode,
|
content::FileChooserParams::Mode mode,
|
||||||
@ -3042,6 +3122,9 @@ void CefBrowserHostImpl::OnRunFileChooserDelegateCallback(
|
|||||||
const std::vector<base::FilePath>& file_paths) {
|
const std::vector<base::FilePath>& file_paths) {
|
||||||
CEF_REQUIRE_UIT();
|
CEF_REQUIRE_UIT();
|
||||||
|
|
||||||
|
if (lister_.get())
|
||||||
|
lister_.reset();
|
||||||
|
|
||||||
content::RenderViewHost* render_view_host = web_contents->GetRenderViewHost();
|
content::RenderViewHost* render_view_host = web_contents->GetRenderViewHost();
|
||||||
if (!render_view_host)
|
if (!render_view_host)
|
||||||
return;
|
return;
|
||||||
|
@ -50,6 +50,7 @@ class WebInputEvent;
|
|||||||
}
|
}
|
||||||
|
|
||||||
namespace net {
|
namespace net {
|
||||||
|
class DirectoryLister;
|
||||||
class URLRequest;
|
class URLRequest;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -580,6 +581,14 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
|||||||
int selected_accept_filter,
|
int selected_accept_filter,
|
||||||
const std::vector<base::FilePath>& file_paths);
|
const std::vector<base::FilePath>& file_paths);
|
||||||
|
|
||||||
|
// Used with WebContentsDelegate::RunFileChooser when mode is
|
||||||
|
// content::FileChooserParams::UploadFolder.
|
||||||
|
void OnRunFileChooserUploadFolderDelegateCallback(
|
||||||
|
content::WebContents* web_contents,
|
||||||
|
const content::FileChooserParams::Mode mode,
|
||||||
|
int selected_accept_filter,
|
||||||
|
const std::vector<base::FilePath>& file_paths);
|
||||||
|
|
||||||
// Used with WebContentsDelegate::RunFileChooser to notify the WebContents.
|
// Used with WebContentsDelegate::RunFileChooser to notify the WebContents.
|
||||||
void OnRunFileChooserDelegateCallback(
|
void OnRunFileChooserDelegateCallback(
|
||||||
content::WebContents* web_contents,
|
content::WebContents* web_contents,
|
||||||
@ -667,6 +676,9 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
|||||||
// True if a file chooser is currently pending.
|
// True if a file chooser is currently pending.
|
||||||
bool file_chooser_pending_;
|
bool file_chooser_pending_;
|
||||||
|
|
||||||
|
// Used for asynchronously listing directory contents.
|
||||||
|
scoped_ptr<net::DirectoryLister> lister_;
|
||||||
|
|
||||||
#if defined(USE_AURA)
|
#if defined(USE_AURA)
|
||||||
// Widget hosting the web contents. It will be deleted automatically when the
|
// Widget hosting the web contents. It will be deleted automatically when the
|
||||||
// associated root window is destroyed.
|
// associated root window is destroyed.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user