mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
Replace ReadOnlySharedMemoryRegion with WritableSharedMemoryRegion (see #3502)
Write access to the shared memory region is required because JavaScript lacks the capability to create read-only ArrayBuffers. When a user attempts to modify an ArrayBuffer that utilizes a ReadOnlySharedMemoryRegion as its BackingStore it triggers an access violation. Note that this pull request may be reverted in the future if JavaScript adds read-only ArrayBuffer support.
This commit is contained in:
committed by
Marshall Greenblatt
parent
f3e92b45fc
commit
8d7001adc3
@@ -7,6 +7,7 @@
|
||||
#include "tests/gtest/include/gtest/gtest.h"
|
||||
|
||||
#include <array>
|
||||
#include <type_traits>
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -29,6 +30,9 @@ CefRefPtr<CefSharedProcessMessageBuilder> CreateTestBuilder() {
|
||||
EXPECT_NE(builder, nullptr);
|
||||
EXPECT_TRUE(builder->IsValid());
|
||||
|
||||
static_assert(
|
||||
std::is_trivially_copyable_v<TestData>,
|
||||
"Do not copy non-trivially-copyable object across memory spaces");
|
||||
auto data = static_cast<TestData*>(builder->Memory());
|
||||
EXPECT_NE(data, nullptr);
|
||||
|
||||
@@ -92,3 +96,33 @@ TEST(SharedProcessMessageTest,
|
||||
EXPECT_EQ(read_data->buffer[i], i);
|
||||
}
|
||||
}
|
||||
|
||||
TEST(SharedProcessMessageTest, WrittenValuesVisibleInOtherRegion) {
|
||||
CefRefPtr<CefSharedMemoryRegion> read_region;
|
||||
CefRefPtr<CefSharedMemoryRegion> write_region;
|
||||
{
|
||||
auto builder = CreateTestBuilder();
|
||||
auto message = builder->Build();
|
||||
read_region = message->GetSharedMemoryRegion();
|
||||
write_region = message->GetSharedMemoryRegion();
|
||||
}
|
||||
|
||||
EXPECT_TRUE(write_region->IsValid());
|
||||
auto write_data = static_cast<TestData*>(write_region->Memory());
|
||||
write_data->flag = !kTestFlag;
|
||||
write_data->value = kTestValue * 2;
|
||||
auto new_double_value = kTestDoubleValue * 3;
|
||||
write_data->doubleValue = new_double_value;
|
||||
for (size_t i = 0; i < write_data->buffer.size(); ++i) {
|
||||
write_data->buffer[i] = i + 1;
|
||||
}
|
||||
|
||||
EXPECT_TRUE(read_region->IsValid());
|
||||
auto read_data = static_cast<const TestData*>(read_region->Memory());
|
||||
EXPECT_EQ(read_data->flag, !kTestFlag);
|
||||
EXPECT_EQ(read_data->value, kTestValue * 2);
|
||||
EXPECT_EQ(read_data->doubleValue, new_double_value);
|
||||
for (size_t i = 0; i < read_data->buffer.size(); ++i) {
|
||||
EXPECT_EQ(read_data->buffer[i], i + 1);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user