| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/dispatcher.h" | 5 #include "extensions/renderer/dispatcher.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/debug/alias.h" | 10 #include "base/debug/alias.h" |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 #include "extensions/renderer/script_context.h" | 73 #include "extensions/renderer/script_context.h" |
| 74 #include "extensions/renderer/script_context_set.h" | 74 #include "extensions/renderer/script_context_set.h" |
| 75 #include "extensions/renderer/script_injection.h" | 75 #include "extensions/renderer/script_injection.h" |
| 76 #include "extensions/renderer/script_injection_manager.h" | 76 #include "extensions/renderer/script_injection_manager.h" |
| 77 #include "extensions/renderer/send_request_natives.h" | 77 #include "extensions/renderer/send_request_natives.h" |
| 78 #include "extensions/renderer/set_icon_natives.h" | 78 #include "extensions/renderer/set_icon_natives.h" |
| 79 #include "extensions/renderer/test_features_native_handler.h" | 79 #include "extensions/renderer/test_features_native_handler.h" |
| 80 #include "extensions/renderer/user_gestures_native_handler.h" | 80 #include "extensions/renderer/user_gestures_native_handler.h" |
| 81 #include "extensions/renderer/utils_native_handler.h" | 81 #include "extensions/renderer/utils_native_handler.h" |
| 82 #include "extensions/renderer/v8_context_native_handler.h" | 82 #include "extensions/renderer/v8_context_native_handler.h" |
| 83 #include "extensions/renderer/v8_maybe_helpers.h" |
| 83 #include "grit/extensions_renderer_resources.h" | 84 #include "grit/extensions_renderer_resources.h" |
| 84 #include "third_party/WebKit/public/platform/WebString.h" | 85 #include "third_party/WebKit/public/platform/WebString.h" |
| 85 #include "third_party/WebKit/public/platform/WebURLRequest.h" | 86 #include "third_party/WebKit/public/platform/WebURLRequest.h" |
| 86 #include "third_party/WebKit/public/web/WebCustomElement.h" | 87 #include "third_party/WebKit/public/web/WebCustomElement.h" |
| 87 #include "third_party/WebKit/public/web/WebDataSource.h" | 88 #include "third_party/WebKit/public/web/WebDataSource.h" |
| 88 #include "third_party/WebKit/public/web/WebDocument.h" | 89 #include "third_party/WebKit/public/web/WebDocument.h" |
| 89 #include "third_party/WebKit/public/web/WebFrame.h" | 90 #include "third_party/WebKit/public/web/WebFrame.h" |
| 90 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 91 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
| 91 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h" | 92 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h" |
| 92 #include "third_party/WebKit/public/web/WebScopedUserGesture.h" | 93 #include "third_party/WebKit/public/web/WebScopedUserGesture.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 117 static const char kEventDispatchFunction[] = "dispatchEvent"; | 118 static const char kEventDispatchFunction[] = "dispatchEvent"; |
| 118 static const char kOnSuspendEvent[] = "runtime.onSuspend"; | 119 static const char kOnSuspendEvent[] = "runtime.onSuspend"; |
| 119 static const char kOnSuspendCanceledEvent[] = "runtime.onSuspendCanceled"; | 120 static const char kOnSuspendCanceledEvent[] = "runtime.onSuspendCanceled"; |
| 120 | 121 |
| 121 // Returns the global value for "chrome" from |context|. If one doesn't exist | 122 // Returns the global value for "chrome" from |context|. If one doesn't exist |
| 122 // creates a new object for it. | 123 // creates a new object for it. |
| 123 // | 124 // |
| 124 // Note that this isn't necessarily an object, since webpages can write, for | 125 // Note that this isn't necessarily an object, since webpages can write, for |
| 125 // example, "window.chrome = true". | 126 // example, "window.chrome = true". |
| 126 v8::Local<v8::Value> GetOrCreateChrome(ScriptContext* context) { | 127 v8::Local<v8::Value> GetOrCreateChrome(ScriptContext* context) { |
| 127 v8::Local<v8::String> chrome_string( | 128 v8::Local<v8::Context> v8_context(context->v8_context()); |
| 128 v8::String::NewFromUtf8(context->isolate(), "chrome")); | 129 v8::Local<v8::String> chrome_string(ToV8String(context->isolate(), "chrome")); |
| 129 v8::Local<v8::Object> global(context->v8_context()->Global()); | 130 v8::Local<v8::Object> global(v8_context->Global()); |
| 130 v8::Local<v8::Value> chrome(global->Get(chrome_string)); | 131 v8::Local<v8::Value> chrome; |
| 131 if (chrome->IsUndefined()) { | 132 if (!global->Get(v8_context, chrome_string).ToLocal(&chrome) || |
| 133 chrome->IsUndefined()) { |
| 132 chrome = v8::Object::New(context->isolate()); | 134 chrome = v8::Object::New(context->isolate()); |
| 133 global->Set(chrome_string, chrome); | 135 SetProperty(v8_context, global, chrome_string, chrome); |
| 134 } | 136 } |
| 135 return chrome; | 137 return chrome; |
| 136 } | 138 } |
| 137 | 139 |
| 138 // Returns |value| cast to an object if possible, else an empty handle. | 140 // Returns |value| cast to an object if possible, else an empty handle. |
| 139 v8::Local<v8::Object> AsObjectOrEmpty(v8::Local<v8::Value> value) { | 141 v8::Local<v8::Object> AsObjectOrEmpty(v8::Local<v8::Value> value) { |
| 140 return value->IsObject() ? value.As<v8::Object>() : v8::Local<v8::Object>(); | 142 return value->IsObject() ? value.As<v8::Object>() : v8::Local<v8::Object>(); |
| 141 } | 143 } |
| 142 | 144 |
| 143 // Calls a method |method_name| in a module |module_name| belonging to the | 145 // Calls a method |method_name| in a module |module_name| belonging to the |
| (...skipping 1043 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1187 ScriptContext* context) { | 1189 ScriptContext* context) { |
| 1188 std::string bind_name; | 1190 std::string bind_name; |
| 1189 v8::Local<v8::Object> bind_object = | 1191 v8::Local<v8::Object> bind_object = |
| 1190 GetOrCreateBindObjectIfAvailable(api_name, &bind_name, context); | 1192 GetOrCreateBindObjectIfAvailable(api_name, &bind_name, context); |
| 1191 | 1193 |
| 1192 // Empty if the bind object failed to be created, probably because the | 1194 // Empty if the bind object failed to be created, probably because the |
| 1193 // extension overrode chrome with a non-object, e.g. window.chrome = true. | 1195 // extension overrode chrome with a non-object, e.g. window.chrome = true. |
| 1194 if (bind_object.IsEmpty()) | 1196 if (bind_object.IsEmpty()) |
| 1195 return; | 1197 return; |
| 1196 | 1198 |
| 1199 v8::Local<v8::Context> v8_context = context->v8_context(); |
| 1197 v8::Local<v8::String> v8_bind_name = | 1200 v8::Local<v8::String> v8_bind_name = |
| 1198 v8::String::NewFromUtf8(context->isolate(), bind_name.c_str()); | 1201 ToV8String(context->isolate(), bind_name.c_str()); |
| 1199 if (bind_object->HasRealNamedProperty(v8_bind_name)) { | 1202 if (CheckV8Call( |
| 1203 bind_object->HasRealNamedProperty(v8_context, v8_bind_name))) { |
| 1200 // The bind object may already have the property if the API has been | 1204 // The bind object may already have the property if the API has been |
| 1201 // registered before (or if the extension has put something there already, | 1205 // registered before (or if the extension has put something there already, |
| 1202 // but, whatevs). | 1206 // but, whatevs). |
| 1203 // | 1207 // |
| 1204 // In the former case, we need to re-register the bindings for the APIs | 1208 // In the former case, we need to re-register the bindings for the APIs |
| 1205 // which the extension now has permissions for (if any), but not touch any | 1209 // which the extension now has permissions for (if any), but not touch any |
| 1206 // others so that we don't destroy state such as event listeners. | 1210 // others so that we don't destroy state such as event listeners. |
| 1207 // | 1211 // |
| 1208 // TODO(kalman): Only register available APIs to make this all moot. | 1212 // TODO(kalman): Only register available APIs to make this all moot. |
| 1209 if (bind_object->HasRealNamedCallbackProperty(v8_bind_name)) | 1213 if (CheckV8Call(bind_object->HasRealNamedCallbackProperty(v8_context, |
| 1214 v8_bind_name))) |
| 1210 return; // lazy binding still there, nothing to do | 1215 return; // lazy binding still there, nothing to do |
| 1211 if (bind_object->Get(v8_bind_name)->IsObject()) | 1216 v8::Local<v8::Value> bind; |
| 1217 if (bind_object->Get(v8_context, v8_bind_name).ToLocal(&bind) && |
| 1218 bind->IsObject()) |
| 1212 return; // binding has already been fully installed | 1219 return; // binding has already been fully installed |
| 1213 } | 1220 } |
| 1214 | 1221 |
| 1215 ModuleSystem* module_system = context->module_system(); | 1222 ModuleSystem* module_system = context->module_system(); |
| 1216 if (!source_map_.Contains(api_name)) { | 1223 if (!source_map_.Contains(api_name)) { |
| 1217 module_system->RegisterNativeHandler( | 1224 module_system->RegisterNativeHandler( |
| 1218 api_name, | 1225 api_name, |
| 1219 scoped_ptr<NativeHandler>(new BindingGeneratingNativeHandler( | 1226 scoped_ptr<NativeHandler>(new BindingGeneratingNativeHandler( |
| 1220 module_system, api_name, "binding"))); | 1227 module_system, api_name, "binding"))); |
| 1221 module_system->SetNativeLazyField( | 1228 module_system->SetNativeLazyField( |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1301 if (extension && extension->is_platform_app()) | 1308 if (extension && extension->is_platform_app()) |
| 1302 return true; | 1309 return true; |
| 1303 } | 1310 } |
| 1304 return false; | 1311 return false; |
| 1305 } | 1312 } |
| 1306 | 1313 |
| 1307 v8::Local<v8::Object> Dispatcher::GetOrCreateObject( | 1314 v8::Local<v8::Object> Dispatcher::GetOrCreateObject( |
| 1308 const v8::Local<v8::Object>& object, | 1315 const v8::Local<v8::Object>& object, |
| 1309 const std::string& field, | 1316 const std::string& field, |
| 1310 v8::Isolate* isolate) { | 1317 v8::Isolate* isolate) { |
| 1311 v8::Local<v8::String> key = v8::String::NewFromUtf8(isolate, field.c_str()); | 1318 DCHECK(field.size() < v8::String::kMaxLength); |
| 1319 v8::Local<v8::String> key = ToV8String(isolate, field.c_str()); |
| 1320 v8::Local<v8::Context> context = isolate->GetCurrentContext(); |
| 1312 // If the object has a callback property, it is assumed it is an unavailable | 1321 // If the object has a callback property, it is assumed it is an unavailable |
| 1313 // API, so it is safe to delete. This is checked before GetOrCreateObject is | 1322 // API, so it is safe to delete. This is checked before GetOrCreateObject is |
| 1314 // called. | 1323 // called. |
| 1315 if (object->HasRealNamedCallbackProperty(key)) { | 1324 if (CheckV8Call(object->HasRealNamedCallbackProperty(context, key))) { |
| 1316 object->Delete(key); | 1325 object->Delete(context, key); |
| 1317 } else if (object->HasRealNamedProperty(key)) { | 1326 } else if (CheckV8Call(object->HasRealNamedProperty(context, key))) { |
| 1318 v8::Local<v8::Value> value = object->Get(key); | 1327 v8::Local<v8::Value> value = object->Get(context, key).ToLocalChecked(); |
| 1319 CHECK(value->IsObject()); | 1328 CHECK(value->IsObject()); |
| 1320 return v8::Local<v8::Object>::Cast(value); | 1329 return v8::Local<v8::Object>::Cast(value); |
| 1321 } | 1330 } |
| 1322 | 1331 |
| 1323 v8::Local<v8::Object> new_object = v8::Object::New(isolate); | 1332 v8::Local<v8::Object> new_object = v8::Object::New(isolate); |
| 1324 object->Set(key, new_object); | 1333 SetProperty(context, object, key, new_object); |
| 1325 return new_object; | 1334 return new_object; |
| 1326 } | 1335 } |
| 1327 | 1336 |
| 1328 v8::Local<v8::Object> Dispatcher::GetOrCreateBindObjectIfAvailable( | 1337 v8::Local<v8::Object> Dispatcher::GetOrCreateBindObjectIfAvailable( |
| 1329 const std::string& api_name, | 1338 const std::string& api_name, |
| 1330 std::string* bind_name, | 1339 std::string* bind_name, |
| 1331 ScriptContext* context) { | 1340 ScriptContext* context) { |
| 1332 std::vector<std::string> split; | 1341 std::vector<std::string> split; |
| 1333 base::SplitString(api_name, '.', &split); | 1342 base::SplitString(api_name, '.', &split); |
| 1334 | 1343 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1414 // The "guestViewDeny" module must always be loaded last. It registers | 1423 // The "guestViewDeny" module must always be loaded last. It registers |
| 1415 // error-providing custom elements for the GuestView types that are not | 1424 // error-providing custom elements for the GuestView types that are not |
| 1416 // available, and thus all of those types must have been checked and loaded | 1425 // available, and thus all of those types must have been checked and loaded |
| 1417 // (or not loaded) beforehand. | 1426 // (or not loaded) beforehand. |
| 1418 if (context_type == Feature::BLESSED_EXTENSION_CONTEXT) { | 1427 if (context_type == Feature::BLESSED_EXTENSION_CONTEXT) { |
| 1419 module_system->Require("guestViewDeny"); | 1428 module_system->Require("guestViewDeny"); |
| 1420 } | 1429 } |
| 1421 } | 1430 } |
| 1422 | 1431 |
| 1423 } // namespace extensions | 1432 } // namespace extensions |
| OLD | NEW |