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 names.push_back(it->path.value());
125
126 return true;
127 }
128
SetLinkURL(const CefString & url)129 void CefDragDataImpl::SetLinkURL(const CefString& url) {
130 base::AutoLock lock_scope(lock_);
131 CHECK_READONLY_RETURN_VOID();
132 data_.url = GURL(url.ToString());
133 }
134
SetLinkTitle(const CefString & title)135 void CefDragDataImpl::SetLinkTitle(const CefString& title) {
136 base::AutoLock lock_scope(lock_);
137 CHECK_READONLY_RETURN_VOID();
138 data_.url_title = title.ToString16();
139 }
140
SetLinkMetadata(const CefString & data)141 void CefDragDataImpl::SetLinkMetadata(const CefString& data) {
142 base::AutoLock lock_scope(lock_);
143 CHECK_READONLY_RETURN_VOID();
144 data_.download_metadata = data.ToString16();
145 }
146
SetFragmentText(const CefString & text)147 void CefDragDataImpl::SetFragmentText(const CefString& text) {
148 base::AutoLock lock_scope(lock_);
149 CHECK_READONLY_RETURN_VOID();
150 data_.text = text.ToString16();
151 }
152
SetFragmentHtml(const CefString & fragment)153 void CefDragDataImpl::SetFragmentHtml(const CefString& fragment) {
154 base::AutoLock lock_scope(lock_);
155 CHECK_READONLY_RETURN_VOID();
156 data_.html = fragment.ToString16();
157 }
158
SetFragmentBaseURL(const CefString & fragment)159 void CefDragDataImpl::SetFragmentBaseURL(const CefString& fragment) {
160 base::AutoLock lock_scope(lock_);
161 CHECK_READONLY_RETURN_VOID();
162 data_.html_base_url = GURL(fragment.ToString());
163 }
164
ResetFileContents()165 void CefDragDataImpl::ResetFileContents() {
166 base::AutoLock lock_scope(lock_);
167 CHECK_READONLY_RETURN_VOID();
168 data_.file_contents.erase();
169 data_.file_contents_source_url = GURL();
170 data_.file_contents_filename_extension.erase();
171 data_.file_contents_content_disposition.erase();
172 }
173
AddFile(const CefString & path,const CefString & display_name)174 void CefDragDataImpl::AddFile(const CefString& path,
175 const CefString& display_name) {
176 base::AutoLock lock_scope(lock_);
177 CHECK_READONLY_RETURN_VOID();
178 data_.filenames.push_back(
179 ui::FileInfo(base::FilePath(path), base::FilePath(display_name)));
180 }
181
SetReadOnly(bool read_only)182 void CefDragDataImpl::SetReadOnly(bool read_only) {
183 base::AutoLock lock_scope(lock_);
184 if (read_only_ == read_only)
185 return;
186
187 read_only_ = read_only;
188 }
189
GetImage()190 CefRefPtr<CefImage> CefDragDataImpl::GetImage() {
191 base::AutoLock lock_scope(lock_);
192 return image_;
193 }
194
GetImageHotspot()195 CefPoint CefDragDataImpl::GetImageHotspot() {
196 base::AutoLock lock_scope(lock_);
197 return image_hotspot_;
198 }
199
HasImage()200 bool CefDragDataImpl::HasImage() {
201 base::AutoLock lock_scope(lock_);
202 return image_ ? true : false;
203 }
204