Index: chrome/browser/tab_contents/tab_contents_view_gtk.cc |
=================================================================== |
--- chrome/browser/tab_contents/tab_contents_view_gtk.cc (revision 20047) |
+++ chrome/browser/tab_contents/tab_contents_view_gtk.cc (working copy) |
@@ -179,14 +179,21 @@ |
if (context_ != context) { |
context_ = context; |
drop_data_.reset(new WebDropData); |
- data_requests_ = 0; |
is_drop_target_ = false; |
- // TODO(estade): support other targets. When we start support URL drags, |
- // we'll have to worry about interstitial pages (see web_drop_target.cc). |
- data_requests_++; |
- gtk_drag_get_data(widget_, context, |
- gdk_atom_intern("text/plain", FALSE), time); |
+ static int supported_targets[] = { |
+ GtkDndUtil::X_CHROME_TEXT_PLAIN, |
+ GtkDndUtil::X_CHROME_TEXT_URI_LIST, |
+ GtkDndUtil::X_CHROME_TEXT_HTML, |
+ // TODO(estade): support image drags? |
+ }; |
+ |
+ data_requests_ = arraysize(supported_targets); |
+ for (size_t i = 0; i < arraysize(supported_targets); ++i) { |
+ gtk_drag_get_data(widget_, context, |
+ GtkDndUtil::GetAtomForTarget(supported_targets[i]), |
+ time); |
+ } |
} else if (data_requests_ == 0) { |
tab_contents_->render_view_host()-> |
DragTargetDragOver(ClientPoint(), ScreenPoint()); |
@@ -212,14 +219,42 @@ |
data_requests_--; |
- // If the source can't provide us with valid data for a requested target, |
- // data->data will be NULL. |
+ // Decode the data. |
if (data->data) { |
- drop_data_->plain_text = UTF8ToUTF16(std::string( |
- reinterpret_cast<char*>(data->data), data->length)); |
+ // If the source can't provide us with valid data for a requested target, |
+ // data->data will be NULL. |
+ if (data->target == |
+ GtkDndUtil::GetAtomForTarget(GtkDndUtil::X_CHROME_TEXT_PLAIN)) { |
+ guchar* text = gtk_selection_data_get_text(data); |
+ if (text) { |
+ drop_data_->plain_text = UTF8ToUTF16(std::string( |
+ reinterpret_cast<char*>(text), data->length)); |
+ g_free(text); |
+ } |
+ } else if (data->target == |
+ GtkDndUtil::GetAtomForTarget(GtkDndUtil::X_CHROME_TEXT_URI_LIST)) { |
+ gchar** uris = gtk_selection_data_get_uris(data); |
+ if (uris) { |
+ for (gchar** uri_iter = uris; *uri_iter; uri_iter++) { |
+ // TODO(estade): Can the filenames have a non-UTF8 encoding? |
+ drop_data_->filenames.push_back(UTF8ToUTF16(*uri_iter)); |
+ } |
+ // Also, write the first URI as the URL. |
+ if (uris[0]) |
+ drop_data_->url = GURL(uris[0]); |
+ g_strfreev(uris); |
+ } |
+ } else if (data->target == |
+ GtkDndUtil::GetAtomForTarget(GtkDndUtil::X_CHROME_TEXT_HTML)) { |
+ // TODO(estade): Can the html have a non-UTF8 encoding? |
+ drop_data_->text_html = UTF8ToUTF16(std::string( |
+ reinterpret_cast<char*>(data->data), data->length)); |
+ // We leave the base URL empty. |
+ } |
} |
if (data_requests_ == 0) { |
+ // Tell the renderer about the drag. |
// |x| and |y| are seemingly arbitrary at this point. |
tab_contents_->render_view_host()-> |
DragTargetDragEnter(*drop_data_.get(), ClientPoint(), ScreenPoint()); |
@@ -437,8 +472,7 @@ |
} |
void TabContentsViewGtk::OnContentsDestroy() { |
- // TODO(estade): Windows uses this function cancel pending drag-n-drop drags. |
- // We don't have drags yet, so do nothing for now. |
+ // TODO(estade): Windows uses this for some sort of plugin-related stuff. |
} |
void TabContentsViewGtk::SetPageTitle(const std::wstring& title) { |