| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/renderer/storage_area.h" | 5 #include "extensions/renderer/storage_area.h" |
| 6 | 6 |
| 7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
| 9 #include "extensions/common/api/storage.h" | 9 #include "extensions/common/api/storage.h" |
| 10 #include "extensions/renderer/api_request_handler.h" | 10 #include "extensions/renderer/api_request_handler.h" |
| 11 #include "extensions/renderer/api_signature.h" | 11 #include "extensions/renderer/api_signature.h" |
| 12 #include "extensions/renderer/api_type_reference_map.h" | 12 #include "extensions/renderer/api_type_reference_map.h" |
| 13 #include "extensions/renderer/binding_access_checker.h" |
| 13 #include "gin/arguments.h" | 14 #include "gin/arguments.h" |
| 14 #include "gin/handle.h" | 15 #include "gin/handle.h" |
| 15 #include "gin/object_template_builder.h" | 16 #include "gin/object_template_builder.h" |
| 16 #include "gin/wrappable.h" | 17 #include "gin/wrappable.h" |
| 17 | 18 |
| 18 namespace extensions { | 19 namespace extensions { |
| 19 | 20 |
| 20 namespace { | 21 namespace { |
| 21 | 22 |
| 22 #define DEFINE_STORAGE_AREA_HANDLERS() \ | 23 #define DEFINE_STORAGE_AREA_HANDLERS() \ |
| (...skipping 12 matching lines...) Expand all Loading... |
| 35 void GetBytesInUse(gin::Arguments* arguments) { \ | 36 void GetBytesInUse(gin::Arguments* arguments) { \ |
| 36 storage_area_.HandleFunctionCall("getBytesInUse", arguments); \ | 37 storage_area_.HandleFunctionCall("getBytesInUse", arguments); \ |
| 37 } | 38 } |
| 38 | 39 |
| 39 // gin::Wrappables for each of the storage areas. Since each has slightly | 40 // gin::Wrappables for each of the storage areas. Since each has slightly |
| 40 // different properties, and the object template is shared between all | 41 // different properties, and the object template is shared between all |
| 41 // instances, this is a little verbose. | 42 // instances, this is a little verbose. |
| 42 class LocalStorageArea final : public gin::Wrappable<LocalStorageArea> { | 43 class LocalStorageArea final : public gin::Wrappable<LocalStorageArea> { |
| 43 public: | 44 public: |
| 44 LocalStorageArea(APIRequestHandler* request_handler, | 45 LocalStorageArea(APIRequestHandler* request_handler, |
| 45 const APITypeReferenceMap* type_refs) | 46 const APITypeReferenceMap* type_refs, |
| 46 : storage_area_(request_handler, type_refs, "local") {} | 47 const BindingAccessChecker* access_checker) |
| 48 : storage_area_(request_handler, type_refs, "local", access_checker) {} |
| 47 ~LocalStorageArea() override = default; | 49 ~LocalStorageArea() override = default; |
| 48 | 50 |
| 49 static gin::WrapperInfo kWrapperInfo; | 51 static gin::WrapperInfo kWrapperInfo; |
| 50 | 52 |
| 51 gin::ObjectTemplateBuilder GetObjectTemplateBuilder( | 53 gin::ObjectTemplateBuilder GetObjectTemplateBuilder( |
| 52 v8::Isolate* isolate) override { | 54 v8::Isolate* isolate) override { |
| 53 return Wrappable<LocalStorageArea>::GetObjectTemplateBuilder(isolate) | 55 return Wrappable<LocalStorageArea>::GetObjectTemplateBuilder(isolate) |
| 54 .SetMethod("get", &LocalStorageArea::Get) | 56 .SetMethod("get", &LocalStorageArea::Get) |
| 55 .SetMethod("set", &LocalStorageArea::Set) | 57 .SetMethod("set", &LocalStorageArea::Set) |
| 56 .SetMethod("remove", &LocalStorageArea::Remove) | 58 .SetMethod("remove", &LocalStorageArea::Remove) |
| 57 .SetMethod("clear", &LocalStorageArea::Clear) | 59 .SetMethod("clear", &LocalStorageArea::Clear) |
| 58 .SetMethod("getBytesInUse", &LocalStorageArea::GetBytesInUse) | 60 .SetMethod("getBytesInUse", &LocalStorageArea::GetBytesInUse) |
| 59 .SetValue("QUOTA_BYTES", api::storage::local::QUOTA_BYTES); | 61 .SetValue("QUOTA_BYTES", api::storage::local::QUOTA_BYTES); |
| 60 } | 62 } |
| 61 | 63 |
| 62 private: | 64 private: |
| 63 DEFINE_STORAGE_AREA_HANDLERS() | 65 DEFINE_STORAGE_AREA_HANDLERS() |
| 64 | 66 |
| 65 StorageArea storage_area_; | 67 StorageArea storage_area_; |
| 66 | 68 |
| 67 DISALLOW_COPY_AND_ASSIGN(LocalStorageArea); | 69 DISALLOW_COPY_AND_ASSIGN(LocalStorageArea); |
| 68 }; | 70 }; |
| 69 | 71 |
| 70 gin::WrapperInfo LocalStorageArea::kWrapperInfo = {gin::kEmbedderNativeGin}; | 72 gin::WrapperInfo LocalStorageArea::kWrapperInfo = {gin::kEmbedderNativeGin}; |
| 71 | 73 |
| 72 class SyncStorageArea final : public gin::Wrappable<SyncStorageArea> { | 74 class SyncStorageArea final : public gin::Wrappable<SyncStorageArea> { |
| 73 public: | 75 public: |
| 74 SyncStorageArea(APIRequestHandler* request_handler, | 76 SyncStorageArea(APIRequestHandler* request_handler, |
| 75 const APITypeReferenceMap* type_refs) | 77 const APITypeReferenceMap* type_refs, |
| 76 : storage_area_(request_handler, type_refs, "sync") {} | 78 const BindingAccessChecker* access_checker) |
| 79 : storage_area_(request_handler, type_refs, "sync", access_checker) {} |
| 77 ~SyncStorageArea() override = default; | 80 ~SyncStorageArea() override = default; |
| 78 | 81 |
| 79 static gin::WrapperInfo kWrapperInfo; | 82 static gin::WrapperInfo kWrapperInfo; |
| 80 | 83 |
| 81 gin::ObjectTemplateBuilder GetObjectTemplateBuilder( | 84 gin::ObjectTemplateBuilder GetObjectTemplateBuilder( |
| 82 v8::Isolate* isolate) override { | 85 v8::Isolate* isolate) override { |
| 83 return Wrappable<SyncStorageArea>::GetObjectTemplateBuilder(isolate) | 86 return Wrappable<SyncStorageArea>::GetObjectTemplateBuilder(isolate) |
| 84 .SetMethod("get", &SyncStorageArea::Get) | 87 .SetMethod("get", &SyncStorageArea::Get) |
| 85 .SetMethod("set", &SyncStorageArea::Set) | 88 .SetMethod("set", &SyncStorageArea::Set) |
| 86 .SetMethod("remove", &SyncStorageArea::Remove) | 89 .SetMethod("remove", &SyncStorageArea::Remove) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 105 StorageArea storage_area_; | 108 StorageArea storage_area_; |
| 106 | 109 |
| 107 DISALLOW_COPY_AND_ASSIGN(SyncStorageArea); | 110 DISALLOW_COPY_AND_ASSIGN(SyncStorageArea); |
| 108 }; | 111 }; |
| 109 | 112 |
| 110 gin::WrapperInfo SyncStorageArea::kWrapperInfo = {gin::kEmbedderNativeGin}; | 113 gin::WrapperInfo SyncStorageArea::kWrapperInfo = {gin::kEmbedderNativeGin}; |
| 111 | 114 |
| 112 class ManagedStorageArea final : public gin::Wrappable<ManagedStorageArea> { | 115 class ManagedStorageArea final : public gin::Wrappable<ManagedStorageArea> { |
| 113 public: | 116 public: |
| 114 ManagedStorageArea(APIRequestHandler* request_handler, | 117 ManagedStorageArea(APIRequestHandler* request_handler, |
| 115 const APITypeReferenceMap* type_refs) | 118 const APITypeReferenceMap* type_refs, |
| 116 : storage_area_(request_handler, type_refs, "managed") {} | 119 const BindingAccessChecker* access_checker) |
| 120 : storage_area_(request_handler, type_refs, "managed", access_checker) {} |
| 117 ~ManagedStorageArea() override = default; | 121 ~ManagedStorageArea() override = default; |
| 118 | 122 |
| 119 static gin::WrapperInfo kWrapperInfo; | 123 static gin::WrapperInfo kWrapperInfo; |
| 120 | 124 |
| 121 gin::ObjectTemplateBuilder GetObjectTemplateBuilder( | 125 gin::ObjectTemplateBuilder GetObjectTemplateBuilder( |
| 122 v8::Isolate* isolate) override { | 126 v8::Isolate* isolate) override { |
| 123 return Wrappable<ManagedStorageArea>::GetObjectTemplateBuilder(isolate) | 127 return Wrappable<ManagedStorageArea>::GetObjectTemplateBuilder(isolate) |
| 124 .SetMethod("get", &ManagedStorageArea::Get) | 128 .SetMethod("get", &ManagedStorageArea::Get) |
| 125 .SetMethod("set", &ManagedStorageArea::Set) | 129 .SetMethod("set", &ManagedStorageArea::Set) |
| 126 .SetMethod("remove", &ManagedStorageArea::Remove) | 130 .SetMethod("remove", &ManagedStorageArea::Remove) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 137 }; | 141 }; |
| 138 | 142 |
| 139 gin::WrapperInfo ManagedStorageArea::kWrapperInfo = {gin::kEmbedderNativeGin}; | 143 gin::WrapperInfo ManagedStorageArea::kWrapperInfo = {gin::kEmbedderNativeGin}; |
| 140 | 144 |
| 141 #undef DEFINE_STORAGE_AREA_HANDLERS | 145 #undef DEFINE_STORAGE_AREA_HANDLERS |
| 142 | 146 |
| 143 } // namespace | 147 } // namespace |
| 144 | 148 |
| 145 StorageArea::StorageArea(APIRequestHandler* request_handler, | 149 StorageArea::StorageArea(APIRequestHandler* request_handler, |
| 146 const APITypeReferenceMap* type_refs, | 150 const APITypeReferenceMap* type_refs, |
| 147 const std::string& name) | 151 const std::string& name, |
| 148 : request_handler_(request_handler), type_refs_(type_refs), name_(name) {} | 152 const BindingAccessChecker* access_checker) |
| 153 : request_handler_(request_handler), |
| 154 type_refs_(type_refs), |
| 155 name_(name), |
| 156 access_checker_(access_checker) {} |
| 149 StorageArea::~StorageArea() = default; | 157 StorageArea::~StorageArea() = default; |
| 150 | 158 |
| 151 // static | 159 // static |
| 152 v8::Local<v8::Object> StorageArea::CreateStorageArea( | 160 v8::Local<v8::Object> StorageArea::CreateStorageArea( |
| 153 v8::Isolate* isolate, | 161 v8::Isolate* isolate, |
| 154 const std::string& property_name, | 162 const std::string& property_name, |
| 155 const base::ListValue* property_values, | 163 const base::ListValue* property_values, |
| 156 APIRequestHandler* request_handler, | 164 APIRequestHandler* request_handler, |
| 157 APIEventHandler* event_handler, | 165 APIEventHandler* event_handler, |
| 158 APITypeReferenceMap* type_refs) { | 166 APITypeReferenceMap* type_refs, |
| 167 const BindingAccessChecker* access_checker) { |
| 159 v8::Local<v8::Object> object; | 168 v8::Local<v8::Object> object; |
| 160 if (property_name == "local") { | 169 if (property_name == "local") { |
| 161 gin::Handle<LocalStorageArea> handle = gin::CreateHandle( | 170 gin::Handle<LocalStorageArea> handle = gin::CreateHandle( |
| 162 isolate, new LocalStorageArea(request_handler, type_refs)); | 171 isolate, |
| 172 new LocalStorageArea(request_handler, type_refs, access_checker)); |
| 163 object = handle.ToV8().As<v8::Object>(); | 173 object = handle.ToV8().As<v8::Object>(); |
| 164 } else if (property_name == "sync") { | 174 } else if (property_name == "sync") { |
| 165 gin::Handle<SyncStorageArea> handle = gin::CreateHandle( | 175 gin::Handle<SyncStorageArea> handle = gin::CreateHandle( |
| 166 isolate, new SyncStorageArea(request_handler, type_refs)); | 176 isolate, |
| 177 new SyncStorageArea(request_handler, type_refs, access_checker)); |
| 167 object = handle.ToV8().As<v8::Object>(); | 178 object = handle.ToV8().As<v8::Object>(); |
| 168 } else { | 179 } else { |
| 169 CHECK_EQ("managed", property_name); | 180 CHECK_EQ("managed", property_name); |
| 170 gin::Handle<ManagedStorageArea> handle = gin::CreateHandle( | 181 gin::Handle<ManagedStorageArea> handle = gin::CreateHandle( |
| 171 isolate, new ManagedStorageArea(request_handler, type_refs)); | 182 isolate, |
| 183 new ManagedStorageArea(request_handler, type_refs, access_checker)); |
| 172 object = handle.ToV8().As<v8::Object>(); | 184 object = handle.ToV8().As<v8::Object>(); |
| 173 } | 185 } |
| 174 return object; | 186 return object; |
| 175 } | 187 } |
| 176 | 188 |
| 177 void StorageArea::HandleFunctionCall(const std::string& method_name, | 189 void StorageArea::HandleFunctionCall(const std::string& method_name, |
| 178 gin::Arguments* arguments) { | 190 gin::Arguments* arguments) { |
| 179 v8::Isolate* isolate = arguments->isolate(); | 191 v8::Isolate* isolate = arguments->isolate(); |
| 180 v8::HandleScope handle_scope(isolate); | 192 v8::HandleScope handle_scope(isolate); |
| 181 v8::Local<v8::Context> context = arguments->GetHolderCreationContext(); | 193 v8::Local<v8::Context> context = arguments->GetHolderCreationContext(); |
| 182 | 194 |
| 195 std::string full_method_name = "storage." + method_name; |
| 196 if (!access_checker_->HasAccessOrThrowError(context, full_method_name)) |
| 197 return; |
| 198 |
| 183 std::vector<v8::Local<v8::Value>> argument_list = arguments->GetAll(); | 199 std::vector<v8::Local<v8::Value>> argument_list = arguments->GetAll(); |
| 184 | 200 |
| 185 std::unique_ptr<base::ListValue> converted_arguments; | 201 std::unique_ptr<base::ListValue> converted_arguments; |
| 186 v8::Local<v8::Function> callback; | 202 v8::Local<v8::Function> callback; |
| 187 std::string error; | 203 std::string error; |
| 188 const APISignature* signature = type_refs_->GetTypeMethodSignature( | 204 const APISignature* signature = type_refs_->GetTypeMethodSignature( |
| 189 base::StringPrintf("%s.%s", "storage.StorageArea", method_name.c_str())); | 205 base::StringPrintf("%s.%s", "storage.StorageArea", method_name.c_str())); |
| 190 DCHECK(signature); | 206 DCHECK(signature); |
| 191 if (!signature->ParseArgumentsToJSON(context, argument_list, *type_refs_, | 207 if (!signature->ParseArgumentsToJSON(context, argument_list, *type_refs_, |
| 192 &converted_arguments, &callback, | 208 &converted_arguments, &callback, |
| 193 &error)) { | 209 &error)) { |
| 194 arguments->ThrowTypeError("Invalid invocation"); | 210 arguments->ThrowTypeError("Invalid invocation"); |
| 195 return; | 211 return; |
| 196 } | 212 } |
| 197 | 213 |
| 198 converted_arguments->Insert(0u, base::MakeUnique<base::Value>(name_)); | 214 converted_arguments->Insert(0u, base::MakeUnique<base::Value>(name_)); |
| 199 request_handler_->StartRequest( | 215 request_handler_->StartRequest( |
| 200 context, "storage." + method_name, std::move(converted_arguments), | 216 context, full_method_name, std::move(converted_arguments), callback, |
| 201 callback, v8::Local<v8::Function>(), binding::RequestThread::UI); | 217 v8::Local<v8::Function>(), binding::RequestThread::UI); |
| 202 } | 218 } |
| 203 | 219 |
| 204 } // namespace extensions | 220 } // namespace extensions |
| OLD | NEW |