Index: extensions/renderer/v8_schema_registry.cc |
diff --git a/extensions/renderer/v8_schema_registry.cc b/extensions/renderer/v8_schema_registry.cc |
index 851b01171413853e7bbac99df035d2884ab325dd..ac865aaf2ce7e26feae94446e9ec852b9a69e28b 100644 |
--- a/extensions/renderer/v8_schema_registry.cc |
+++ b/extensions/renderer/v8_schema_registry.cc |
@@ -21,6 +21,18 @@ namespace extensions { |
namespace { |
+// Recursively freezes every v8 object on |object|. |
+void DeepFreeze(const v8::Local<v8::Object>& object, |
+ const v8::Local<v8::Context>& context) { |
robwu
2016/04/21 14:07:50
As explained at https://crbug.com/604901#c8, add s
Devlin
2016/04/21 22:07:36
Done.
This also has the happy side-effect of maki
|
+ v8::Local<v8::Array> property_names = object->GetOwnPropertyNames(); |
+ for (uint32_t i = 0; i < property_names->Length(); ++i) { |
+ v8::Local<v8::Value> child = object->Get(property_names->Get(i)); |
+ if (child->IsObject()) |
+ DeepFreeze(v8::Local<v8::Object>::Cast(child), context); |
+ } |
+ object->SetIntegrityLevel(context, v8::IntegrityLevel::kFrozen); |
+} |
+ |
class SchemaRegistryNativeHandler : public ObjectBackedNativeHandler { |
public: |
SchemaRegistryNativeHandler(V8SchemaRegistry* registry, |
@@ -104,7 +116,7 @@ v8::Local<v8::Object> V8SchemaRegistry::GetSchema(const std::string& api) { |
CHECK(!value.IsEmpty()); |
v8::Local<v8::Object> v8_schema(v8::Local<v8::Object>::Cast(value)); |
- v8_schema->SetIntegrityLevel(context, v8::IntegrityLevel::kFrozen); |
+ DeepFreeze(v8_schema, context); |
schema_cache_->Set(api, v8_schema); |
return handle_scope.Escape(v8_schema); |