OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/ui/views/tab_contents/web_drag_bookmark_handler_win.h" | |
6 | |
7 #include "chrome/browser/bookmarks/bookmark_node_data.h" | |
8 #include "chrome/browser/ui/browser.h" | |
9 #include "chrome/browser/ui/browser_finder.h" | |
10 #include "chrome/browser/ui/browser_window.h" | |
11 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" | |
12 #include "chrome/browser/profiles/profile.h" | |
13 #include "content/public/browser/web_contents.h" | |
14 #include "content/public/common/drop_data.h" | |
15 #include "content/public/common/url_constants.h" | |
16 #include "ui/base/dragdrop/os_exchange_data.h" | |
17 #include "ui/base/dragdrop/os_exchange_data_provider_win.h" | |
18 | |
19 using content::WebContents; | |
20 | |
21 WebDragBookmarkHandlerWin::WebDragBookmarkHandlerWin() | |
22 : bookmark_tab_helper_(NULL), | |
23 web_contents_(NULL) { | |
24 } | |
25 | |
26 WebDragBookmarkHandlerWin::~WebDragBookmarkHandlerWin() { | |
27 } | |
28 | |
29 void WebDragBookmarkHandlerWin::DragInitialize(WebContents* contents) { | |
30 // Ideally we would want to initialize the the BookmarkTabHelper member in | |
31 // the constructor. We cannot do that as the WebDragTargetWin object is | |
32 // created during the construction of the WebContents object. The | |
33 // BookmarkTabHelper is created much later. | |
34 web_contents_ = contents; | |
35 if (!bookmark_tab_helper_) | |
36 bookmark_tab_helper_ = BookmarkTabHelper::FromWebContents(contents); | |
37 } | |
38 | |
39 void WebDragBookmarkHandlerWin::OnDragOver(IDataObject* data_object) { | |
40 if (bookmark_tab_helper_ && bookmark_tab_helper_->bookmark_drag_delegate()) { | |
41 ui::OSExchangeData os_exchange_data( | |
42 new ui::OSExchangeDataProviderWin(data_object)); | |
43 BookmarkNodeData bookmark_drag_data; | |
44 if (bookmark_drag_data.Read(os_exchange_data)) | |
45 bookmark_tab_helper_->bookmark_drag_delegate()->OnDragOver( | |
46 bookmark_drag_data); | |
47 } | |
48 } | |
49 | |
50 void WebDragBookmarkHandlerWin::OnDragEnter(IDataObject* data_object) { | |
51 // This is non-null if the web_contents_ is showing an ExtensionWebUI with | |
52 // support for (at the moment experimental) drag and drop extensions. | |
53 if (bookmark_tab_helper_ && bookmark_tab_helper_->bookmark_drag_delegate()) { | |
54 ui::OSExchangeData os_exchange_data( | |
55 new ui::OSExchangeDataProviderWin(data_object)); | |
56 BookmarkNodeData bookmark_drag_data; | |
57 if (bookmark_drag_data.Read(os_exchange_data)) | |
58 bookmark_tab_helper_->bookmark_drag_delegate()->OnDragEnter( | |
59 bookmark_drag_data); | |
60 } | |
61 } | |
62 | |
63 void WebDragBookmarkHandlerWin::OnDrop(IDataObject* data_object) { | |
64 // This is non-null if the web_contents_ is showing an ExtensionWebUI with | |
65 // support for (at the moment experimental) drag and drop extensions. | |
66 if (bookmark_tab_helper_) { | |
67 if (bookmark_tab_helper_->bookmark_drag_delegate()) { | |
68 ui::OSExchangeData os_exchange_data( | |
69 new ui::OSExchangeDataProviderWin(data_object)); | |
70 BookmarkNodeData bookmark_drag_data; | |
71 if (bookmark_drag_data.Read(os_exchange_data)) { | |
72 bookmark_tab_helper_->bookmark_drag_delegate()->OnDrop( | |
73 bookmark_drag_data); | |
74 } | |
75 } | |
76 | |
77 // Focus the target browser. | |
78 Browser* browser = chrome::FindBrowserWithWebContents(web_contents_); | |
79 if (browser) | |
80 browser->window()->Show(); | |
81 } | |
82 } | |
83 | |
84 void WebDragBookmarkHandlerWin::OnDragLeave(IDataObject* data_object) { | |
85 if (bookmark_tab_helper_ && bookmark_tab_helper_->bookmark_drag_delegate()) { | |
86 ui::OSExchangeData os_exchange_data( | |
87 new ui::OSExchangeDataProviderWin(data_object)); | |
88 BookmarkNodeData bookmark_drag_data; | |
89 if (bookmark_drag_data.Read(os_exchange_data)) | |
90 bookmark_tab_helper_->bookmark_drag_delegate()->OnDragLeave( | |
91 bookmark_drag_data); | |
92 } | |
93 } | |
94 | |
95 bool WebDragBookmarkHandlerWin::AddDragData(const content::DropData& drop_data, | |
96 ui::OSExchangeData* data) { | |
97 if (!drop_data.url.SchemeIs(content::kJavaScriptScheme)) | |
98 return false; | |
99 | |
100 // We don't want to allow javascript URLs to be dragged to the desktop, | |
101 // but we do want to allow them to be added to the bookmarks bar | |
102 // (bookmarklets). So we create a fake bookmark entry (BookmarkNodeData | |
103 // object) which explorer.exe cannot handle, and write the entry to data. | |
104 BookmarkNodeData::Element bm_elt; | |
105 bm_elt.is_url = true; | |
106 bm_elt.url = drop_data.url; | |
107 bm_elt.title = drop_data.url_title; | |
108 | |
109 BookmarkNodeData bm_drag_data; | |
110 bm_drag_data.elements.push_back(bm_elt); | |
111 | |
112 // Pass in NULL as the profile so that the bookmark always adds the url | |
113 // rather than trying to move an existing url. | |
114 bm_drag_data.Write(NULL, data); | |
115 | |
116 return true; | |
117 } | |
OLD | NEW |