diff options
author | paulg@google.com <paulg@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-29 01:53:05 +0000 |
---|---|---|
committer | paulg@google.com <paulg@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-29 01:53:05 +0000 |
commit | a6c712d9b9f2459273ad7616e03ee5f823d539ca (patch) | |
tree | 23e12a6a9613eb38ce7ccf4461084edef6b5e588 | |
parent | 5a6e27ee83d4cc43959f10145b66a1115cfe6e96 (diff) | |
download | chromium_src-a6c712d9b9f2459273ad7616e03ee5f823d539ca.zip chromium_src-a6c712d9b9f2459273ad7616e03ee5f823d539ca.tar.gz chromium_src-a6c712d9b9f2459273ad7616e03ee5f823d539ca.tar.bz2 |
Generate a proper file name when dragging an image from a
web page to the desktop.
We receive information about the image from WebKit in the
render which includes the image URL, MIME type and a guess
as to what the file name is. If the filename is empty, we
synthesize a file name based on the URL. In all cases, we
set the file extension to the MIME type that was detected
by WebKit.
This change is the Chromium portion of image dragging. The
WebKit portion has been committed as:
http://trac.webkit.org/changeset/40294
BUG=6481 (http://crbug.com/6481)
Review URL: http://codereview.chromium.org/19417
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@8854 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/tab_contents/web_contents_view_win.cc | 14 | ||||
-rw-r--r-- | chrome/common/render_messages.h | 2 | ||||
-rw-r--r-- | webkit/glue/clipboard_conversion.cc | 4 | ||||
-rw-r--r-- | webkit/glue/webdropdata.h | 3 |
4 files changed, 21 insertions, 2 deletions
diff --git a/chrome/browser/tab_contents/web_contents_view_win.cc b/chrome/browser/tab_contents/web_contents_view_win.cc index 9f6ee1a..f2cee8b 100644 --- a/chrome/browser/tab_contents/web_contents_view_win.cc +++ b/chrome/browser/tab_contents/web_contents_view_win.cc @@ -24,6 +24,7 @@ #include "chrome/browser/views/sad_tab_view.h" #include "chrome/common/gfx/chrome_canvas.h" #include "chrome/common/os_exchange_data.h" +#include "net/base/net_util.h" #include "webkit/glue/plugins/webplugin_delegate_impl.h" namespace { @@ -96,8 +97,17 @@ void WebContentsViewWin::StartDragging(const WebDropData& drop_data) { // contents (to a .URL shortcut). We want to prefer file content data over a // shortcut so we add it first. if (!drop_data.file_contents.empty()) { - data->SetFileContents(drop_data.file_description_filename, - drop_data.file_contents); + // Images without ALT text will only have a file extension so we need to + // synthesize one from the provided extension and URL. + FilePath file_name(drop_data.file_description_filename); + file_name = file_name.BaseName().RemoveExtension(); + if (file_name.value().empty()) { + // Retrieve the name from the URL. + file_name = FilePath::FromWStringHack( + net::GetSuggestedFilename(drop_data.url, L"", L"")); + } + file_name = file_name.ReplaceExtension(drop_data.file_extension); + data->SetFileContents(file_name.value(), drop_data.file_contents); } if (!drop_data.text_html.empty()) data->SetHtml(drop_data.text_html, drop_data.html_base_url); diff --git a/chrome/common/render_messages.h b/chrome/common/render_messages.h index 7d1273f..fa459a6 100644 --- a/chrome/common/render_messages.h +++ b/chrome/common/render_messages.h @@ -1666,6 +1666,7 @@ struct ParamTraits<WebDropData> { static void Write(Message* m, const param_type& p) { WriteParam(m, p.url); WriteParam(m, p.url_title); + WriteParam(m, p.file_extension); WriteParam(m, p.filenames); WriteParam(m, p.plain_text); WriteParam(m, p.text_html); @@ -1677,6 +1678,7 @@ struct ParamTraits<WebDropData> { return ReadParam(m, iter, &p->url) && ReadParam(m, iter, &p->url_title) && + ReadParam(m, iter, &p->file_extension) && ReadParam(m, iter, &p->filenames) && ReadParam(m, iter, &p->plain_text) && ReadParam(m, iter, &p->text_html) && diff --git a/webkit/glue/clipboard_conversion.cc b/webkit/glue/clipboard_conversion.cc index 02a14ab..28f191d 100644 --- a/webkit/glue/clipboard_conversion.cc +++ b/webkit/glue/clipboard_conversion.cc @@ -24,6 +24,8 @@ WebDropData ChromiumDataObjectToWebDropData( drop_data.url = KURLToGURL(data_object->url); drop_data.url_title = StringToStdWString(data_object->urlTitle); + drop_data.file_extension = StringToStdWString(data_object->fileExtension); + for (size_t i = 0; i < data_object->filenames.size(); ++i) { drop_data.filenames.push_back(StringToStdWString( data_object->filenames[i])); @@ -51,6 +53,8 @@ PassRefPtr<WebCore::ChromiumDataObject> WebDropDataToChromiumDataObject( data_object->url = GURLToKURL(drop_data.url); data_object->urlTitle = StdWStringToString(drop_data.url_title); + data_object->fileExtension = StdWStringToString(drop_data.file_extension); + for (size_t i = 0; i < drop_data.filenames.size(); ++i) { data_object->filenames.append(StdWStringToString(drop_data.filenames[i])); } diff --git a/webkit/glue/webdropdata.h b/webkit/glue/webdropdata.h index e6d51f4..9afcd04 100644 --- a/webkit/glue/webdropdata.h +++ b/webkit/glue/webdropdata.h @@ -20,6 +20,9 @@ struct WebDropData { GURL url; std::wstring url_title; // The title associated with |url|. + // File extension for dragging images from a webview to the desktop. + std::wstring file_extension; + // User is dropping one or more files on the webview. std::vector<std::wstring> filenames; |