summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpaulg@google.com <paulg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-01-29 01:53:05 +0000
committerpaulg@google.com <paulg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-01-29 01:53:05 +0000
commita6c712d9b9f2459273ad7616e03ee5f823d539ca (patch)
tree23e12a6a9613eb38ce7ccf4461084edef6b5e588
parent5a6e27ee83d4cc43959f10145b66a1115cfe6e96 (diff)
downloadchromium_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.cc14
-rw-r--r--chrome/common/render_messages.h2
-rw-r--r--webkit/glue/clipboard_conversion.cc4
-rw-r--r--webkit/glue/webdropdata.h3
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;