mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	This change introduces a few minor CEF API behavior changes: - A CefProcessMessage object cannot be reused after being passed to SendProcessMessage. - The |extra_info| argument to CefRenderProcessHandler::OnBrowserCreated may now be NULL. Where appropriate, we now utilize the default UTF string encoding format and shared memory to reduce copies and conversions for the cross-process transfer of arbitrary-length strings. For example, CefFrame::GetSource/GetText now involves zero UTF conversions and zero copies in the browser process for the CefString delivered to CefStringVisitor::Visit().
		
			
				
	
	
		
			72 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2021 The Chromium Embedded Framework Authors. Portions copyright
 | |
| // 2011 The Chromium 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 "libcef/common/string_util.h"
 | |
| 
 | |
| #include "base/memory/read_only_shared_memory_region.h"
 | |
| #include "base/memory/ref_counted_memory.h"
 | |
| #include "third_party/blink/public/platform/web_string.h"
 | |
| 
 | |
| namespace string_util {
 | |
| 
 | |
| void GetCefString(const blink::WebString& source, CefString& cef_string) {
 | |
| #if defined(CEF_STRING_TYPE_UTF8)
 | |
|   cef_string.FromString(source.Utf8());
 | |
| #else
 | |
|   cef_string.FromString16(source.Utf16());
 | |
| #endif
 | |
| }
 | |
| 
 | |
| void GetCefString(scoped_refptr<base::RefCountedMemory> source,
 | |
|                   CefString& cef_string) {
 | |
|   if (source && source->size() > 0U) {
 | |
| #if defined(CEF_STRING_TYPE_UTF8) || defined(CEF_STRING_TYPE_UTF16)
 | |
|     // Reference existing UTF8 or UTF16 data.
 | |
|     cef_string.FromString(source->front_as<CefString::char_type>(),
 | |
|                           source->size() / sizeof(CefString::char_type),
 | |
|                           /*copy=*/false);
 | |
| #else
 | |
|     // Must convert from UTF16.
 | |
|     cef_string.FromString16(
 | |
|         source->front_as<std::u16string::value_type>(),
 | |
|         source->size() / sizeof(std::u16string::value_type));
 | |
| #endif
 | |
|   } else {
 | |
|     cef_string.clear();
 | |
|   }
 | |
| }
 | |
| 
 | |
| base::ReadOnlySharedMemoryRegion CreateSharedMemoryRegion(
 | |
|     const blink::WebString& source) {
 | |
|   base::ReadOnlySharedMemoryRegion region;
 | |
| 
 | |
|   if (!source.IsEmpty()) {
 | |
| #if defined(CEF_STRING_TYPE_UTF8)
 | |
|     const std::string& string = source.Utf8();
 | |
|     const size_t byte_size = string.length();
 | |
| #else
 | |
|     const std::u16string& string = source.Utf16();
 | |
|     const size_t byte_size =
 | |
|         string.length() * sizeof(std::u16string::value_type);
 | |
| #endif
 | |
|     auto mapped_region = base::ReadOnlySharedMemoryRegion::Create(byte_size);
 | |
|     if (mapped_region.IsValid()) {
 | |
|       memcpy(mapped_region.mapping.memory(), string.data(), byte_size);
 | |
|       region = std::move(mapped_region.region);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return region;
 | |
| }
 | |
| 
 | |
| void ExecuteWithScopedCefString(base::ReadOnlySharedMemoryRegion region,
 | |
|                                 ScopedCefStringCallback callback) {
 | |
|   auto shared_buf =
 | |
|       base::RefCountedSharedMemoryMapping::CreateFromWholeRegion(region);
 | |
|   CefString str;
 | |
|   GetCefString(shared_buf, str);
 | |
|   std::move(callback).Run(str);
 | |
| }
 | |
| 
 | |
| }  // namespace string_util
 |