mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	- Delete include/cef_runnable.h (issue #1336). - Build the cef_unittests target using all Chromium headers. Add a USING_CHROMIUM_INCLUDES define and libcef_dll_wrapper_unittests target to support this. This change avoids compile errors due to the divergence of CEF and Chromium base/ header implementations. The libcef_dll_wrapper sources must now compile successfully with both CEF and Chromium base/ headers (issue #1632). - The onbeforeunload message specified via JavaScript is no longer passed to the client (see http://crbug.com/587940).
		
			
				
	
	
		
			194 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights
 | |
| // reserved. Use of this source code is governed by a BSD-style license that
 | |
| // can be found in the LICENSE file.
 | |
| 
 | |
| #include <string>
 | |
| 
 | |
| #include "libcef/browser/stream_impl.h"
 | |
| #include "libcef/common/drag_data_impl.h"
 | |
| #include "base/files/file_path.h"
 | |
| #include "net/base/filename_util.h"
 | |
| 
 | |
| #define CHECK_READONLY_RETURN_VOID() \
 | |
|   if (read_only_) { \
 | |
|     NOTREACHED() << "object is read only"; \
 | |
|     return; \
 | |
|   }
 | |
| 
 | |
| CefDragDataImpl::CefDragDataImpl(const content::DropData& data)
 | |
|     : data_(data),
 | |
|       read_only_(false) {
 | |
| }
 | |
| 
 | |
| CefDragDataImpl::CefDragDataImpl()
 | |
|     : read_only_(false) {
 | |
| }
 | |
| 
 | |
| CefRefPtr<CefDragData> CefDragData::Create() {
 | |
|   return new CefDragDataImpl();
 | |
| }
 | |
| 
 | |
| CefRefPtr<CefDragData> CefDragDataImpl::Clone() {
 | |
|   CefDragDataImpl* drag_data = NULL;
 | |
|   {
 | |
|     base::AutoLock lock_scope(lock_);
 | |
|     drag_data = new CefDragDataImpl(data_);
 | |
|   }
 | |
|   return drag_data;
 | |
| }
 | |
| 
 | |
| bool CefDragDataImpl::IsReadOnly() {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   return read_only_;
 | |
| }
 | |
| 
 | |
| bool CefDragDataImpl::IsLink() {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   return (data_.url.is_valid() && data_.file_description_filename.empty());
 | |
| }
 | |
| 
 | |
| bool CefDragDataImpl::IsFragment() {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   return (!data_.url.is_valid() && data_.file_description_filename.empty() &&
 | |
|           data_.filenames.empty());
 | |
| }
 | |
| 
 | |
| bool CefDragDataImpl::IsFile() {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   return (!data_.file_description_filename.empty() || !data_.filenames.empty());
 | |
| }
 | |
| 
 | |
| CefString CefDragDataImpl::GetLinkURL() {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   return data_.url.spec();
 | |
| }
 | |
| 
 | |
| CefString CefDragDataImpl::GetLinkTitle() {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   return data_.url_title;
 | |
| }
 | |
| 
 | |
| CefString CefDragDataImpl::GetLinkMetadata() {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   return data_.download_metadata;
 | |
| }
 | |
| 
 | |
| CefString CefDragDataImpl::GetFragmentText() {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   return data_.text.is_null() ? CefString() : CefString(data_.text.string());
 | |
| }
 | |
| 
 | |
| CefString CefDragDataImpl::GetFragmentHtml() {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   return data_.html.is_null() ? CefString() : CefString(data_.html.string());
 | |
| }
 | |
| 
 | |
| CefString CefDragDataImpl::GetFragmentBaseURL() {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   return data_.html_base_url.spec();
 | |
| }
 | |
| 
 | |
| CefString CefDragDataImpl::GetFileName() {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   if (data_.file_description_filename.empty())
 | |
|     return CefString();
 | |
| 
 | |
|   base::FilePath file_name(CefString(data_.file_description_filename));
 | |
|   // Images without ALT text will only have a file extension so we need to
 | |
|   // synthesize one from the provided extension and URL.
 | |
|   if (file_name.BaseName().RemoveExtension().empty()) {
 | |
|     base::FilePath::StringType extension = file_name.Extension();
 | |
|     // Retrieve the name from the URL.
 | |
|     CefString suggested_file_name =
 | |
|         net::GetSuggestedFilename(data_.url, "", "", "", "", "");
 | |
|     file_name = base::FilePath(suggested_file_name).ReplaceExtension(extension);
 | |
|   }
 | |
|   return file_name.value();
 | |
| }
 | |
| 
 | |
| size_t CefDragDataImpl::GetFileContents(CefRefPtr<CefStreamWriter> writer) {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   if (data_.file_contents.empty())
 | |
|     return 0;
 | |
| 
 | |
|   char* data = const_cast<char*>(data_.file_contents.c_str());
 | |
|   size_t size = data_.file_contents.size();
 | |
| 
 | |
|   if (!writer.get())
 | |
|     return size;
 | |
| 
 | |
|   return writer->Write(data, 1, size);
 | |
| }
 | |
| 
 | |
| bool CefDragDataImpl::GetFileNames(std::vector<CefString>& names) {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   if (data_.filenames.empty())
 | |
|     return false;
 | |
| 
 | |
|   std::vector<ui::FileInfo>::const_iterator it =
 | |
|       data_.filenames.begin();
 | |
|   for (; it != data_.filenames.end(); ++it)
 | |
|     names.push_back(it->path.value());
 | |
| 
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| void CefDragDataImpl::SetLinkURL(const CefString& url) {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   CHECK_READONLY_RETURN_VOID();
 | |
|   data_.url = GURL(url.ToString());
 | |
| }
 | |
| 
 | |
| void CefDragDataImpl::SetLinkTitle(const CefString& title) {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   CHECK_READONLY_RETURN_VOID();
 | |
|   data_.url_title = title.ToString16();
 | |
| }
 | |
| 
 | |
| void CefDragDataImpl::SetLinkMetadata(const CefString& data) {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   CHECK_READONLY_RETURN_VOID();
 | |
|   data_.download_metadata = data.ToString16();
 | |
| }
 | |
| 
 | |
| void CefDragDataImpl::SetFragmentText(const CefString& text) {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   CHECK_READONLY_RETURN_VOID();
 | |
|   data_.text = base::NullableString16(text.ToString16(), false);
 | |
| }
 | |
| 
 | |
| void CefDragDataImpl::SetFragmentHtml(const CefString& fragment) {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   CHECK_READONLY_RETURN_VOID();
 | |
|   data_.html = base::NullableString16(fragment.ToString16(), false);
 | |
| }
 | |
| 
 | |
| void CefDragDataImpl::SetFragmentBaseURL(const CefString& fragment) {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   CHECK_READONLY_RETURN_VOID();
 | |
|   data_.html_base_url = GURL(fragment.ToString());
 | |
| }
 | |
| 
 | |
| void CefDragDataImpl::ResetFileContents() {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   CHECK_READONLY_RETURN_VOID();
 | |
|   data_.file_contents.erase();
 | |
|   data_.file_description_filename.erase();
 | |
| }
 | |
| 
 | |
| void CefDragDataImpl::AddFile(const CefString& path,
 | |
|                               const CefString& display_name) {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   CHECK_READONLY_RETURN_VOID();
 | |
|   data_.filenames.push_back(ui::FileInfo(base::FilePath(path),
 | |
|                                          base::FilePath(display_name)));
 | |
| }
 | |
| 
 | |
| void CefDragDataImpl::SetReadOnly(bool read_only) {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   if (read_only_ == read_only)
 | |
|     return;
 | |
| 
 | |
|   read_only_ = read_only;
 | |
| }
 |