diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-08 01:02:37 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-08 01:02:37 +0000 |
commit | e90355370c3763d71fb0f6346f08ef1b3246fa58 (patch) | |
tree | 9b715891e2056922771827e931e554d065b8228a | |
parent | 3f873e1cd9bc39d4eb8c40e6ee68e7dd6af68aae (diff) | |
download | chromium_src-e90355370c3763d71fb0f6346f08ef1b3246fa58.zip chromium_src-e90355370c3763d71fb0f6346f08ef1b3246fa58.tar.gz chromium_src-e90355370c3763d71fb0f6346f08ef1b3246fa58.tar.bz2 |
GTK: Support for more drag targets in renderer destination.
BUG=http://crbug.com/15429
TEST=drag a file from konqueror to the web view; observe that it causes the browser to navigate there (assuming you don't drag it into an <input> field or something).
Review URL: http://codereview.chromium.org/155175
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20108 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/tab_contents/tab_contents_view_gtk.cc | 58 |
1 files changed, 46 insertions, 12 deletions
diff --git a/chrome/browser/tab_contents/tab_contents_view_gtk.cc b/chrome/browser/tab_contents/tab_contents_view_gtk.cc index 5fe6e38..4b829fa 100644 --- a/chrome/browser/tab_contents/tab_contents_view_gtk.cc +++ b/chrome/browser/tab_contents/tab_contents_view_gtk.cc @@ -181,14 +181,21 @@ class WebDragDest { 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()); @@ -214,14 +221,42 @@ class WebDragDest { 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()); @@ -441,8 +476,7 @@ void TabContentsViewGtk::GetContainerBounds(gfx::Rect* out) const { } 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) { |