Index: chrome/browser/views/tab_contents/tab_contents_view_win.cc |
=================================================================== |
--- chrome/browser/views/tab_contents/tab_contents_view_win.cc (revision 35459) |
+++ chrome/browser/views/tab_contents/tab_contents_view_win.cc (working copy) |
@@ -8,12 +8,10 @@ |
#include "app/gfx/canvas_paint.h" |
#include "app/os_exchange_data.h" |
-#include "app/os_exchange_data_provider_win.h" |
#include "base/file_path.h" |
#include "base/keyboard_codes.h" |
#include "base/time.h" |
#include "base/win_util.h" |
-#include "chrome/browser/bookmarks/bookmark_drag_data.h" |
#include "chrome/browser/browser.h" // TODO(beng): this dependency is awful. |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/download/download_request_manager.h" |
@@ -24,16 +22,13 @@ |
#include "chrome/browser/tab_contents/interstitial_page.h" |
#include "chrome/browser/tab_contents/tab_contents.h" |
#include "chrome/browser/tab_contents/tab_contents_delegate.h" |
-#include "chrome/browser/tab_contents/web_drag_source_win.h" |
#include "chrome/browser/tab_contents/web_drop_target_win.h" |
#include "chrome/browser/views/sad_tab_view.h" |
#include "chrome/browser/views/tab_contents/render_view_context_menu_win.h" |
-#include "chrome/common/url_constants.h" |
-#include "net/base/net_util.h" |
+#include "chrome/browser/views/tab_contents/tab_contents_drag_win.h" |
#include "views/focus/view_storage.h" |
#include "views/screen.h" |
#include "views/widget/root_view.h" |
-#include "webkit/glue/webdropdata.h" |
using WebKit::WebDragOperation; |
using WebKit::WebDragOperationNone; |
@@ -62,8 +57,6 @@ |
views::ViewStorage* view_storage = views::ViewStorage::GetSharedInstance(); |
if (view_storage->RetrieveView(last_focused_view_storage_id_) != NULL) |
view_storage->RemoveView(last_focused_view_storage_id_); |
- |
- DCHECK(!drag_source_.get()); |
} |
void TabContentsViewWin::Unparent() { |
@@ -132,70 +125,11 @@ |
void TabContentsViewWin::StartDragging(const WebDropData& drop_data, |
WebDragOperationsMask ops) { |
- OSExchangeData data; |
+ drag_handler_ = new TabContentsDragWin(this); |
+ drag_handler_->StartDragging(drop_data, ops); |
+} |
- // TODO(tc): Generate an appropriate drag image. |
- |
- // We set the file contents before the URL because the URL also sets file |
- // 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()) { |
- // 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 = net::GetSuggestedFilename(drop_data.url, "", "", FilePath()); |
- if (file_name.value().size() + drop_data.file_extension.size() + 1 > |
- MAX_PATH) { |
- file_name = FilePath(file_name.value().substr( |
- 0, MAX_PATH - drop_data.file_extension.size() - 2)); |
- } |
- } |
- 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); |
- if (drop_data.url.is_valid()) { |
- if (drop_data.url.SchemeIs(chrome::kJavaScriptScheme)) { |
- // We don't want to allow javascript URLs to be dragged to the desktop, |
- // but we do want to allow them to be added to the bookmarks bar |
- // (bookmarklets). So we create a fake bookmark entry (BookmarkDragData |
- // object) which explorer.exe cannot handle, and write the entry to data. |
- BookmarkDragData::Element bm_elt; |
- bm_elt.is_url = true; |
- bm_elt.url = drop_data.url; |
- bm_elt.title = drop_data.url_title; |
- |
- BookmarkDragData bm_drag_data; |
- bm_drag_data.elements.push_back(bm_elt); |
- |
- // Pass in NULL as the profile so that the bookmark always adds the url |
- // rather than trying to move an existing url. |
- bm_drag_data.Write(NULL, &data); |
- } else { |
- data.SetURL(drop_data.url, drop_data.url_title); |
- } |
- } |
- if (!drop_data.plain_text.empty()) |
- data.SetString(drop_data.plain_text); |
- |
- drag_source_ = new WebDragSource(GetNativeView(), tab_contents()); |
- |
- DWORD effects; |
- |
- // We need to enable recursive tasks on the message loop so we can get |
- // updates while in the system DoDragDrop loop. |
- bool old_state = MessageLoop::current()->NestableTasksAllowed(); |
- MessageLoop::current()->SetNestableTasksAllowed(true); |
- DoDragDrop(OSExchangeDataProviderWin::GetIDataObject(data), drag_source_, |
- DROPEFFECT_COPY | DROPEFFECT_LINK, &effects); |
- // TODO(snej): Use 'ops' param instead of hardcoding dropeffects |
- MessageLoop::current()->SetNestableTasksAllowed(old_state); |
- |
- drag_source_ = NULL; |
+void TabContentsViewWin::EndDragging() { |
if (close_tab_after_drag_ends_) { |
close_tab_timer_.Start(base::TimeDelta::FromMilliseconds(0), this, |
&TabContentsViewWin::CloseTab); |
@@ -203,6 +137,8 @@ |
if (tab_contents()->render_view_host()) |
tab_contents()->render_view_host()->DragSourceSystemDragEnded(); |
+ |
+ drag_handler_ = NULL; |
} |
void TabContentsViewWin::OnDestroy() { |
@@ -328,15 +264,15 @@ |
} |
bool TabContentsViewWin::IsDoingDrag() const { |
- return drag_source_.get() != NULL; |
+ return drag_handler_.get() != NULL; |
} |
void TabContentsViewWin::CancelDragAndCloseTab() { |
DCHECK(IsDoingDrag()); |
// We can't close the tab while we're in the drag and |
- // |drag_source_->CancelDrag()| is async. Instead, set a flag to cancel |
+ // |drag_handler_->CancelDrag()| is async. Instead, set a flag to cancel |
// the drag and when the drag nested message loop ends, close the tab. |
- drag_source_->CancelDrag(); |
+ drag_handler_->CancelDrag(); |
close_tab_after_drag_ends_ = true; |
} |