mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2024-12-08 23:55:27 +01:00
ebee84755e
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
|