• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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