1 // Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights
2 // reserved. Use of this source code is governed by a BSD-style license that
3 // can be found in the LICENSE file.
4
5 #include <string>
6
7 #include "base/files/file_path.h"
8 #include "libcef/browser/stream_impl.h"
9 #include "libcef/common/drag_data_impl.h"
10
11 #define CHECK_READONLY_RETURN_VOID() \
12 if (read_only_) { \
13 NOTREACHED() << "object is read only"; \
14 return; \
15 }
16
CefDragDataImpl(const content::DropData & data)17 CefDragDataImpl::CefDragDataImpl(const content::DropData& data)
18 : data_(data), read_only_(false) {}
19
CefDragDataImpl(const content::DropData & data,CefRefPtr<CefImage> image,const CefPoint & image_hotspot)20 CefDragDataImpl::CefDragDataImpl(const content::DropData& data,
21 CefRefPtr<CefImage> image,
22 const CefPoint& image_hotspot)
23 : data_(data),
24 image_(image),
25 image_hotspot_(image_hotspot),
26 read_only_(false) {}
27
CefDragDataImpl()28 CefDragDataImpl::CefDragDataImpl() : read_only_(false) {}
29
Create()30 CefRefPtr<CefDragData> CefDragData::Create() {
31 return new CefDragDataImpl();
32 }
33
Clone()34 CefRefPtr<CefDragData> CefDragDataImpl::Clone() {
35 CefDragDataImpl* drag_data = nullptr;
36 {
37 base::AutoLock lock_scope(lock_);
38 drag_data = new CefDragDataImpl(data_, image_, image_hotspot_);
39 }
40 return drag_data;
41 }
42
IsReadOnly()43 bool CefDragDataImpl::IsReadOnly() {
44 base::AutoLock lock_scope(lock_);
45 return read_only_;
46 }
47
IsLink()48 bool CefDragDataImpl::IsLink() {
49 base::AutoLock lock_scope(lock_);
50 return (data_.url.is_valid() &&
51 data_.file_contents_content_disposition.empty());
52 }
53
IsFragment()54 bool CefDragDataImpl::IsFragment() {
55 base::AutoLock lock_scope(lock_);
56 return (!data_.url.is_valid() &&
57 data_.file_contents_content_disposition.empty() &&
58 data_.filenames.empty());
59 }
60
IsFile()61 bool CefDragDataImpl::IsFile() {
62 base::AutoLock lock_scope(lock_);
63 return (!data_.file_contents_content_disposition.empty() ||
64 !data_.filenames.empty());
65 }
66
GetLinkURL()67 CefString CefDragDataImpl::GetLinkURL() {
68 base::AutoLock lock_scope(lock_);
69 return data_.url.spec();
70 }
71
GetLinkTitle()72 CefString CefDragDataImpl::GetLinkTitle() {
73 base::AutoLock lock_scope(lock_);
74 return data_.url_title;
75 }
76
GetLinkMetadata()77 CefString CefDragDataImpl::GetLinkMetadata() {
78 base::AutoLock lock_scope(lock_);
79 return data_.download_metadata;
80 }
81
GetFragmentText()82 CefString CefDragDataImpl::GetFragmentText() {
83 base::AutoLock lock_scope(lock_);
84 return data_.text ? CefString(*data_.text) : CefString();
85 }
86
GetFragmentHtml()87 CefString CefDragDataImpl::GetFragmentHtml() {
88 base::AutoLock lock_scope(lock_);
89 return data_.html ? CefString(*data_.html) : CefString();
90 }
91
GetFragmentBaseURL()92 CefString CefDragDataImpl::GetFragmentBaseURL() {
93 base::AutoLock lock_scope(lock_);
94 return data_.html_base_url.spec();
95 }
96
GetFileName()97 CefString CefDragDataImpl::GetFileName() {
98 base::AutoLock lock_scope(lock_);
99 auto filename = data_.GetSafeFilenameForImageFileContents();
100 return filename ? CefString(filename->value()) : CefString();
101 }
102
GetFileContents(CefRefPtr<CefStreamWriter> writer)103 size_t CefDragDataImpl::GetFileContents(CefRefPtr<CefStreamWriter> writer) {
104 base::AutoLock lock_scope(lock_);
105 if (data_.file_contents.empty())
106 return 0;
107
108 char* data = const_cast<char*>(data_.file_contents.c_str());
109 size_t size = data_.file_contents.size();
110
111 if (!writer.get())
112 return size;
113
114 return writer->Write(data, 1, size);
115 }
116
GetFileNames(std::vector<CefString> & names)117 bool CefDragDataImpl::GetFileNames(std::vector<CefString>& names) {
118 base::AutoLock lock_scope(lock_);
119 if (data_.filenames.empty())
120 return false;
121
122 std::vector<ui::FileInfo>::const_iterator it = data_.filenames.begin();
123 for (; it != data_.filenames.end(); ++it) {
124 auto name = it->display_name.value();
125 if (name.empty())
126 name = it->path.value();
127 names.push_back(name);
128 }
129
130 return true;
131 }
132
SetLinkURL(const CefString & url)133 void CefDragDataImpl::SetLinkURL(const CefString& url) {
134 base::AutoLock lock_scope(lock_);
135 CHECK_READONLY_RETURN_VOID();
136 data_.url = GURL(url.ToString());
137 }
138
SetLinkTitle(const CefString & title)139 void CefDragDataImpl::SetLinkTitle(const CefString& title) {
140 base::AutoLock lock_scope(lock_);
141 CHECK_READONLY_RETURN_VOID();
142 data_.url_title = title.ToString16();
143 }
144
SetLinkMetadata(const CefString & data)145 void CefDragDataImpl::SetLinkMetadata(const CefString& data) {
146 base::AutoLock lock_scope(lock_);
147 CHECK_READONLY_RETURN_VOID();
148 data_.download_metadata = data.ToString16();
149 }
150
SetFragmentText(const CefString & text)151 void CefDragDataImpl::SetFragmentText(const CefString& text) {
152 base::AutoLock lock_scope(lock_);
153 CHECK_READONLY_RETURN_VOID();
154 data_.text = text.ToString16();
155 }
156
SetFragmentHtml(const CefString & fragment)157 void CefDragDataImpl::SetFragmentHtml(const CefString& fragment) {
158 base::AutoLock lock_scope(lock_);
159 CHECK_READONLY_RETURN_VOID();
160 data_.html = fragment.ToString16();
161 }
162
SetFragmentBaseURL(const CefString & fragment)163 void CefDragDataImpl::SetFragmentBaseURL(const CefString& fragment) {
164 base::AutoLock lock_scope(lock_);
165 CHECK_READONLY_RETURN_VOID();
166 data_.html_base_url = GURL(fragment.ToString());
167 }
168
ResetFileContents()169 void CefDragDataImpl::ResetFileContents() {
170 base::AutoLock lock_scope(lock_);
171 CHECK_READONLY_RETURN_VOID();
172 data_.file_contents.erase();
173 data_.file_contents_source_url = GURL();
174 data_.file_contents_filename_extension.erase();
175 data_.file_contents_content_disposition.erase();
176 }
177
AddFile(const CefString & path,const CefString & display_name)178 void CefDragDataImpl::AddFile(const CefString& path,
179 const CefString& display_name) {
180 base::AutoLock lock_scope(lock_);
181 CHECK_READONLY_RETURN_VOID();
182 data_.filenames.push_back(
183 ui::FileInfo(base::FilePath(path), base::FilePath(display_name)));
184 }
185
SetReadOnly(bool read_only)186 void CefDragDataImpl::SetReadOnly(bool read_only) {
187 base::AutoLock lock_scope(lock_);
188 if (read_only_ == read_only)
189 return;
190
191 read_only_ = read_only;
192 }
193
GetImage()194 CefRefPtr<CefImage> CefDragDataImpl::GetImage() {
195 base::AutoLock lock_scope(lock_);
196 return image_;
197 }
198
GetImageHotspot()199 CefPoint CefDragDataImpl::GetImageHotspot() {
200 base::AutoLock lock_scope(lock_);
201 return image_hotspot_;
202 }
203
HasImage()204 bool CefDragDataImpl::HasImage() {
205 base::AutoLock lock_scope(lock_);
206 return image_ ? true : false;
207 }
208