Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Side by Side Diff: chrome/renderer/extensions/dispatcher.cc

Issue 11571014: Lazy load chrome.* APIs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: android compilation Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/renderer/extensions/dispatcher.h ('k') | chrome/renderer/extensions/event_bindings.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/renderer/extensions/dispatcher.h" 5 #include "chrome/renderer/extensions/dispatcher.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/string_piece.h" 10 #include "base/string_piece.h"
11 #include "base/strings/string_split.h"
11 #include "chrome/common/child_process_logging.h" 12 #include "chrome/common/child_process_logging.h"
12 #include "chrome/common/chrome_switches.h" 13 #include "chrome/common/chrome_switches.h"
13 #include "chrome/common/chrome_version_info.h" 14 #include "chrome/common/chrome_version_info.h"
14 #include "chrome/common/extensions/api/extension_api.h" 15 #include "chrome/common/extensions/api/extension_api.h"
15 #include "chrome/common/extensions/background_info.h" 16 #include "chrome/common/extensions/background_info.h"
16 #include "chrome/common/extensions/extension.h" 17 #include "chrome/common/extensions/extension.h"
17 #include "chrome/common/extensions/extension_messages.h" 18 #include "chrome/common/extensions/extension_messages.h"
19 #include "chrome/common/extensions/features/feature.h"
18 #include "chrome/common/extensions/manifest.h" 20 #include "chrome/common/extensions/manifest.h"
19 #include "chrome/common/extensions/permissions/permission_set.h" 21 #include "chrome/common/extensions/permissions/permission_set.h"
20 #include "chrome/common/url_constants.h" 22 #include "chrome/common/url_constants.h"
21 #include "chrome/common/view_type.h" 23 #include "chrome/common/view_type.h"
22 #include "chrome/renderer/chrome_render_process_observer.h" 24 #include "chrome/renderer/chrome_render_process_observer.h"
23 #include "chrome/renderer/extensions/api_definitions_natives.h" 25 #include "chrome/renderer/extensions/api_definitions_natives.h"
24 #include "chrome/renderer/extensions/app_bindings.h" 26 #include "chrome/renderer/extensions/app_bindings.h"
25 #include "chrome/renderer/extensions/app_runtime_custom_bindings.h" 27 #include "chrome/renderer/extensions/app_runtime_custom_bindings.h"
26 #include "chrome/renderer/extensions/app_window_custom_bindings.h" 28 #include "chrome/renderer/extensions/app_window_custom_bindings.h"
29 #include "chrome/renderer/extensions/binding_generating_native_handler.h"
27 #include "chrome/renderer/extensions/chrome_v8_context.h" 30 #include "chrome/renderer/extensions/chrome_v8_context.h"
28 #include "chrome/renderer/extensions/chrome_v8_extension.h" 31 #include "chrome/renderer/extensions/chrome_v8_extension.h"
29 #include "chrome/renderer/extensions/content_watcher.h" 32 #include "chrome/renderer/extensions/content_watcher.h"
30 #include "chrome/renderer/extensions/context_menus_custom_bindings.h" 33 #include "chrome/renderer/extensions/context_menus_custom_bindings.h"
31 #include "chrome/renderer/extensions/dom_activity_logger.h" 34 #include "chrome/renderer/extensions/dom_activity_logger.h"
32 #include "chrome/renderer/extensions/event_bindings.h" 35 #include "chrome/renderer/extensions/event_bindings.h"
33 #include "chrome/renderer/extensions/extension_custom_bindings.h" 36 #include "chrome/renderer/extensions/extension_custom_bindings.h"
34 #include "chrome/renderer/extensions/extension_groups.h" 37 #include "chrome/renderer/extensions/extension_groups.h"
35 #include "chrome/renderer/extensions/extension_helper.h" 38 #include "chrome/renderer/extensions/extension_helper.h"
36 #include "chrome/renderer/extensions/file_browser_handler_custom_bindings.h" 39 #include "chrome/renderer/extensions/file_browser_handler_custom_bindings.h"
37 #include "chrome/renderer/extensions/file_browser_private_custom_bindings.h" 40 #include "chrome/renderer/extensions/file_browser_private_custom_bindings.h"
38 #include "chrome/renderer/extensions/file_system_natives.h" 41 #include "chrome/renderer/extensions/file_system_natives.h"
39 #include "chrome/renderer/extensions/i18n_custom_bindings.h" 42 #include "chrome/renderer/extensions/i18n_custom_bindings.h"
40 #include "chrome/renderer/extensions/media_galleries_custom_bindings.h" 43 #include "chrome/renderer/extensions/media_galleries_custom_bindings.h"
41 #include "chrome/renderer/extensions/miscellaneous_bindings.h" 44 #include "chrome/renderer/extensions/miscellaneous_bindings.h"
42 #include "chrome/renderer/extensions/module_system.h" 45 #include "chrome/renderer/extensions/module_system.h"
43 #include "chrome/renderer/extensions/native_handler.h" 46 #include "chrome/renderer/extensions/object_backed_native_handler.h"
44 #include "chrome/renderer/extensions/page_actions_custom_bindings.h" 47 #include "chrome/renderer/extensions/page_actions_custom_bindings.h"
45 #include "chrome/renderer/extensions/page_capture_custom_bindings.h" 48 #include "chrome/renderer/extensions/page_capture_custom_bindings.h"
46 #include "chrome/renderer/extensions/request_sender.h" 49 #include "chrome/renderer/extensions/request_sender.h"
47 #include "chrome/renderer/extensions/runtime_custom_bindings.h" 50 #include "chrome/renderer/extensions/runtime_custom_bindings.h"
48 #include "chrome/renderer/extensions/send_request_natives.h" 51 #include "chrome/renderer/extensions/send_request_natives.h"
49 #include "chrome/renderer/extensions/set_icon_natives.h" 52 #include "chrome/renderer/extensions/set_icon_natives.h"
50 #include "chrome/renderer/extensions/sync_file_system_custom_bindings.h" 53 #include "chrome/renderer/extensions/sync_file_system_custom_bindings.h"
51 #include "chrome/renderer/extensions/tab_finder.h" 54 #include "chrome/renderer/extensions/tab_finder.h"
52 #include "chrome/renderer/extensions/tabs_custom_bindings.h" 55 #include "chrome/renderer/extensions/tabs_custom_bindings.h"
53 #include "chrome/renderer/extensions/tts_custom_bindings.h" 56 #include "chrome/renderer/extensions/tts_custom_bindings.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 namespace extensions { 88 namespace extensions {
86 89
87 namespace { 90 namespace {
88 91
89 static const int64 kInitialExtensionIdleHandlerDelayMs = 5*1000; 92 static const int64 kInitialExtensionIdleHandlerDelayMs = 5*1000;
90 static const int64 kMaxExtensionIdleHandlerDelayMs = 5*60*1000; 93 static const int64 kMaxExtensionIdleHandlerDelayMs = 5*60*1000;
91 static const char kEventDispatchFunction[] = "Event.dispatchEvent"; 94 static const char kEventDispatchFunction[] = "Event.dispatchEvent";
92 static const char kOnSuspendEvent[] = "runtime.onSuspend"; 95 static const char kOnSuspendEvent[] = "runtime.onSuspend";
93 static const char kOnSuspendCanceledEvent[] = "runtime.onSuspendCanceled"; 96 static const char kOnSuspendCanceledEvent[] = "runtime.onSuspendCanceled";
94 97
95 class ChromeHiddenNativeHandler : public NativeHandler { 98 static v8::Handle<v8::Object> GetOrCreateChrome(
99 v8::Handle<v8::Context> context) {
100 v8::Handle<v8::String> chrome_string(v8::String::New("chrome"));
101 v8::Handle<v8::Object> global(context->Global());
102 v8::Handle<v8::Value> chrome(global->Get(chrome_string));
103 if (chrome.IsEmpty() || chrome->IsUndefined()) {
104 v8::Handle<v8::Object> chrome_object(v8::Object::New());
105 global->Set(chrome_string, chrome_object);
106 return chrome_object;
107 }
108 CHECK(chrome->IsObject());
109 return chrome->ToObject();
110 }
111
112 class SchemaRegistryNativeHandler : public ObjectBackedNativeHandler {
96 public: 113 public:
97 explicit ChromeHiddenNativeHandler(v8::Isolate* isolate) 114 SchemaRegistryNativeHandler(V8SchemaRegistry* registry,
98 : NativeHandler(isolate) { 115 v8::Handle<v8::Context> context)
116 : ObjectBackedNativeHandler(context),
117 registry_(registry) {
118 RouteFunction("GetSchema",
119 base::Bind(&SchemaRegistryNativeHandler::GetSchema,
120 base::Unretained(this)));
121 }
122
123 private:
124 v8::Handle<v8::Value> GetSchema(const v8::Arguments& args) {
125 return registry_->GetSchema(*v8::String::AsciiValue(args[0]));
126 }
127
128 V8SchemaRegistry* registry_;
129 };
130
131 class V8ContextNativeHandler : public ObjectBackedNativeHandler {
132 public:
133 explicit V8ContextNativeHandler(ChromeV8Context* context)
134 : ObjectBackedNativeHandler(context->v8_context()),
135 context_(context) {
136 RouteFunction("GetAvailability",
137 base::Bind(&V8ContextNativeHandler::GetAvailability,
138 base::Unretained(this)));
139 }
140
141 private:
142 v8::Handle<v8::Value> GetAvailability(const v8::Arguments& args) {
143 CHECK_EQ(args.Length(), 1);
144 std::string api_name = *v8::String::AsciiValue(args[0]->ToString());
145 Feature::Availability availability = context_->GetAvailability(api_name);
146
147 v8::Handle<v8::Object> ret = v8::Object::New();
148 ret->Set(v8::String::New("is_available"),
149 v8::Boolean::New(availability.is_available()));
150 ret->Set(v8::String::New("message"),
151 v8::String::New(availability.message().c_str()));
152 return ret;
153 }
154
155 ChromeV8Context* context_;
156 };
157
158 class ChromeHiddenNativeHandler : public ObjectBackedNativeHandler {
159 public:
160 explicit ChromeHiddenNativeHandler(v8::Handle<v8::Context> context)
161 : ObjectBackedNativeHandler(context) {
99 RouteFunction("GetChromeHidden", 162 RouteFunction("GetChromeHidden",
100 base::Bind(&ChromeHiddenNativeHandler::GetChromeHidden, 163 base::Bind(&ChromeHiddenNativeHandler::GetChromeHidden,
101 base::Unretained(this))); 164 base::Unretained(this)));
102 } 165 }
103 166
104 v8::Handle<v8::Value> GetChromeHidden(const v8::Arguments& args) { 167 v8::Handle<v8::Value> GetChromeHidden(const v8::Arguments& args) {
105 return ChromeV8Context::GetOrCreateChromeHidden(v8::Context::GetCurrent()); 168 return ChromeV8Context::GetOrCreateChromeHidden(v8_context());
106 } 169 }
107 }; 170 };
108 171
109 class PrintNativeHandler : public NativeHandler { 172 class ChromeNativeHandler : public ObjectBackedNativeHandler {
110 public: 173 public:
111 explicit PrintNativeHandler(v8::Isolate* isolate) 174 explicit ChromeNativeHandler(v8::Handle<v8::Context> context)
112 : NativeHandler(isolate) { 175 : ObjectBackedNativeHandler(context) {
176 RouteFunction("GetChrome",
177 base::Bind(&ChromeNativeHandler::GetChrome, base::Unretained(this)));
178 }
179
180 v8::Handle<v8::Value> GetChrome(const v8::Arguments& args) {
181 return GetOrCreateChrome(v8_context());
182 }
183 };
184
185 class PrintNativeHandler : public ObjectBackedNativeHandler {
186 public:
187 explicit PrintNativeHandler(v8::Handle<v8::Context> context)
188 : ObjectBackedNativeHandler(context) {
113 RouteFunction("Print", 189 RouteFunction("Print",
114 base::Bind(&PrintNativeHandler::Print, 190 base::Bind(&PrintNativeHandler::Print,
115 base::Unretained(this))); 191 base::Unretained(this)));
116 } 192 }
117 193
118 v8::Handle<v8::Value> Print(const v8::Arguments& args) { 194 v8::Handle<v8::Value> Print(const v8::Arguments& args) {
119 if (args.Length() < 1) 195 if (args.Length() < 1)
120 return v8::Undefined(); 196 return v8::Undefined();
121 197
122 std::vector<std::string> components; 198 std::vector<std::string> components;
123 for (int i = 0; i < args.Length(); ++i) 199 for (int i = 0; i < args.Length(); ++i)
124 components.push_back(*v8::String::Utf8Value(args[i]->ToString())); 200 components.push_back(*v8::String::Utf8Value(args[i]->ToString()));
125 201
126 LOG(ERROR) << JoinString(components, ','); 202 LOG(ERROR) << JoinString(components, ',');
127 return v8::Undefined(); 203 return v8::Undefined();
128 } 204 }
129 }; 205 };
130 206
131 class LazyBackgroundPageNativeHandler : public ChromeV8Extension { 207 class LazyBackgroundPageNativeHandler : public ChromeV8Extension {
132 public: 208 public:
133 explicit LazyBackgroundPageNativeHandler(Dispatcher* dispatcher) 209 LazyBackgroundPageNativeHandler(Dispatcher* dispatcher,
134 : ChromeV8Extension(dispatcher) { 210 v8::Handle<v8::Context> context)
211 : ChromeV8Extension(dispatcher, context) {
135 RouteFunction("IncrementKeepaliveCount", 212 RouteFunction("IncrementKeepaliveCount",
136 base::Bind(&LazyBackgroundPageNativeHandler::IncrementKeepaliveCount, 213 base::Bind(&LazyBackgroundPageNativeHandler::IncrementKeepaliveCount,
137 base::Unretained(this))); 214 base::Unretained(this)));
138 RouteFunction("DecrementKeepaliveCount", 215 RouteFunction("DecrementKeepaliveCount",
139 base::Bind(&LazyBackgroundPageNativeHandler::DecrementKeepaliveCount, 216 base::Bind(&LazyBackgroundPageNativeHandler::DecrementKeepaliveCount,
140 base::Unretained(this))); 217 base::Unretained(this)));
141 } 218 }
142 219
143 v8::Handle<v8::Value> IncrementKeepaliveCount(const v8::Arguments& args) { 220 v8::Handle<v8::Value> IncrementKeepaliveCount(const v8::Arguments& args) {
144 ChromeV8Context* context = dispatcher()->v8_context_set().GetCurrent(); 221 ChromeV8Context* context =
222 dispatcher()->v8_context_set().GetByV8Context(v8_context());
145 if (!context) 223 if (!context)
146 return v8::Undefined(); 224 return v8::Undefined();
147 RenderView* render_view = context->GetRenderView(); 225 RenderView* render_view = context->GetRenderView();
148 if (IsContextLazyBackgroundPage(render_view, context->extension())) { 226 if (IsContextLazyBackgroundPage(render_view, context->extension())) {
149 render_view->Send(new ExtensionHostMsg_IncrementLazyKeepaliveCount( 227 render_view->Send(new ExtensionHostMsg_IncrementLazyKeepaliveCount(
150 render_view->GetRoutingID())); 228 render_view->GetRoutingID()));
151 } 229 }
152 return v8::Undefined(); 230 return v8::Undefined();
153 } 231 }
154 232
155 v8::Handle<v8::Value> DecrementKeepaliveCount(const v8::Arguments& args) { 233 v8::Handle<v8::Value> DecrementKeepaliveCount(const v8::Arguments& args) {
156 ChromeV8Context* context = dispatcher()->v8_context_set().GetCurrent(); 234 ChromeV8Context* context =
235 dispatcher()->v8_context_set().GetByV8Context(v8_context());
157 if (!context) 236 if (!context)
158 return v8::Undefined(); 237 return v8::Undefined();
159 RenderView* render_view = context->GetRenderView(); 238 RenderView* render_view = context->GetRenderView();
160 if (IsContextLazyBackgroundPage(render_view, context->extension())) { 239 if (IsContextLazyBackgroundPage(render_view, context->extension())) {
161 render_view->Send(new ExtensionHostMsg_DecrementLazyKeepaliveCount( 240 render_view->Send(new ExtensionHostMsg_DecrementLazyKeepaliveCount(
162 render_view->GetRoutingID())); 241 render_view->GetRoutingID()));
163 } 242 }
164 return v8::Undefined(); 243 return v8::Undefined();
165 } 244 }
166 245
167 private: 246 private:
168 bool IsContextLazyBackgroundPage(RenderView* render_view, 247 bool IsContextLazyBackgroundPage(RenderView* render_view,
169 const Extension* extension) { 248 const Extension* extension) {
170 if (!render_view) 249 if (!render_view)
171 return false; 250 return false;
172 251
173 ExtensionHelper* helper = ExtensionHelper::Get(render_view); 252 ExtensionHelper* helper = ExtensionHelper::Get(render_view);
174 return (extension && BackgroundInfo::HasLazyBackgroundPage(extension) && 253 return (extension && BackgroundInfo::HasLazyBackgroundPage(extension) &&
175 helper->view_type() == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE); 254 helper->view_type() == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE);
176 } 255 }
177 }; 256 };
178 257
179 class ProcessInfoNativeHandler : public ChromeV8Extension { 258 class ProcessInfoNativeHandler : public ChromeV8Extension {
180 public: 259 public:
181 explicit ProcessInfoNativeHandler( 260 ProcessInfoNativeHandler(Dispatcher* dispatcher,
182 Dispatcher* dispatcher, 261 v8::Handle<v8::Context> context,
183 const std::string& extension_id, 262 const std::string& extension_id,
184 const std::string& context_type, 263 const std::string& context_type,
185 bool is_incognito_context, 264 bool is_incognito_context,
186 int manifest_version, 265 int manifest_version,
187 bool send_request_disabled) 266 bool send_request_disabled)
188 : ChromeV8Extension(dispatcher), 267 : ChromeV8Extension(dispatcher, context),
189 extension_id_(extension_id), 268 extension_id_(extension_id),
190 context_type_(context_type), 269 context_type_(context_type),
191 is_incognito_context_(is_incognito_context), 270 is_incognito_context_(is_incognito_context),
192 manifest_version_(manifest_version), 271 manifest_version_(manifest_version),
193 send_request_disabled_(send_request_disabled) { 272 send_request_disabled_(send_request_disabled) {
194 RouteFunction("GetExtensionId", 273 RouteFunction("GetExtensionId",
195 base::Bind(&ProcessInfoNativeHandler::GetExtensionId, 274 base::Bind(&ProcessInfoNativeHandler::GetExtensionId,
196 base::Unretained(this))); 275 base::Unretained(this)));
197 RouteFunction("GetContextType", 276 RouteFunction("GetContextType",
198 base::Bind(&ProcessInfoNativeHandler::GetContextType, 277 base::Bind(&ProcessInfoNativeHandler::GetContextType,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 } 313 }
235 314
236 private: 315 private:
237 std::string extension_id_; 316 std::string extension_id_;
238 std::string context_type_; 317 std::string context_type_;
239 bool is_incognito_context_; 318 bool is_incognito_context_;
240 int manifest_version_; 319 int manifest_version_;
241 bool send_request_disabled_; 320 bool send_request_disabled_;
242 }; 321 };
243 322
244 class LoggingNativeHandler : public NativeHandler { 323 class LoggingNativeHandler : public ObjectBackedNativeHandler {
245 public: 324 public:
246 explicit LoggingNativeHandler(v8::Isolate* isolate) 325 explicit LoggingNativeHandler(v8::Handle<v8::Context> context)
247 : NativeHandler(isolate) { 326 : ObjectBackedNativeHandler(context) {
248 RouteFunction("DCHECK", 327 RouteFunction("DCHECK",
249 base::Bind(&LoggingNativeHandler::Dcheck, 328 base::Bind(&LoggingNativeHandler::Dcheck, base::Unretained(this)));
250 base::Unretained(this)));
251 } 329 }
252 330
253 v8::Handle<v8::Value> Dcheck(const v8::Arguments& args) { 331 v8::Handle<v8::Value> Dcheck(const v8::Arguments& args) {
254 CHECK_LE(args.Length(), 2); 332 CHECK_LE(args.Length(), 2);
255 bool check_value = args[0]->BooleanValue(); 333 bool check_value = args[0]->BooleanValue();
256 std::string error_message; 334 std::string error_message;
257 if (args.Length() == 2) 335 if (args.Length() == 2)
258 error_message = "Error: " + std::string(*v8::String::AsciiValue(args[1])); 336 error_message = "Error: " + std::string(*v8::String::AsciiValue(args[1]));
259 337
260 v8::Handle<v8::StackTrace> stack_trace = 338 v8::Handle<v8::StackTrace> stack_trace =
261 v8::StackTrace::CurrentStackTrace(10); 339 v8::StackTrace::CurrentStackTrace(10);
262 if (stack_trace.IsEmpty() || stack_trace->GetFrameCount() <= 0) { 340 if (stack_trace.IsEmpty() || stack_trace->GetFrameCount() <= 0) {
263 error_message += "\n <no stack trace>"; 341 error_message += "\n <no stack trace>";
264 } else { 342 } else {
265 for (size_t i = 0; i < (size_t) stack_trace->GetFrameCount(); ++i) { 343 for (size_t i = 0; i < (size_t) stack_trace->GetFrameCount(); ++i) {
266 v8::Handle<v8::StackFrame> frame = stack_trace->GetFrame(i); 344 v8::Handle<v8::StackFrame> frame = stack_trace->GetFrame(i);
267 CHECK(!frame.IsEmpty()); 345 CHECK(!frame.IsEmpty());
268 error_message += base::StringPrintf("\n at %s (%s:%d:%d)", 346 error_message += base::StringPrintf("\n at %s (%s:%d:%d)",
269 ToStringOrDefault(frame->GetFunctionName(), "<anonymous>").c_str(), 347 ToStringOrDefault(frame->GetFunctionName(), "<anonymous>").c_str(),
270 ToStringOrDefault(frame->GetScriptName(), "<anonymous>").c_str(), 348 ToStringOrDefault(frame->GetScriptName(), "<anonymous>").c_str(),
271 frame->GetLineNumber(), 349 frame->GetLineNumber(),
272 frame->GetColumn()); 350 frame->GetColumn());
273 } 351 }
274 } 352 }
275 DCHECK(check_value) << error_message; 353 DCHECK(check_value) << error_message;
276 LOG(WARNING) << error_message;
277 return v8::Undefined(); 354 return v8::Undefined();
278 } 355 }
279 356
280 private: 357 private:
281 std::string ToStringOrDefault(const v8::Handle<v8::String>& v8_string, 358 std::string ToStringOrDefault(const v8::Handle<v8::String>& v8_string,
282 const std::string& dflt) { 359 const std::string& dflt) {
283 if (v8_string.IsEmpty()) 360 if (v8_string.IsEmpty())
284 return dflt; 361 return dflt;
285 std::string ascii_value = *v8::String::AsciiValue(v8_string); 362 std::string ascii_value = *v8::String::AsciiValue(v8_string);
286 return ascii_value.empty() ? dflt : ascii_value; 363 return ascii_value.empty() ? dflt : ascii_value;
(...skipping 11 matching lines...) Expand all
298 } 375 }
299 376
300 void InstallWebstoreBindings(ModuleSystem* module_system, 377 void InstallWebstoreBindings(ModuleSystem* module_system,
301 v8::Handle<v8::Object> chrome, 378 v8::Handle<v8::Object> chrome,
302 v8::Handle<v8::Object> chrome_hidden) { 379 v8::Handle<v8::Object> chrome_hidden) {
303 module_system->SetLazyField(chrome, "webstore", "webstore", "chromeWebstore"); 380 module_system->SetLazyField(chrome, "webstore", "webstore", "chromeWebstore");
304 module_system->SetLazyField(chrome_hidden, "webstore", "webstore", 381 module_system->SetLazyField(chrome_hidden, "webstore", "webstore",
305 "chromeHiddenWebstore"); 382 "chromeHiddenWebstore");
306 } 383 }
307 384
308 static v8::Handle<v8::Object> GetOrCreateChrome(
309 v8::Handle<v8::Context> context) {
310 v8::Handle<v8::String> chrome_string(v8::String::New("chrome"));
311 v8::Handle<v8::Object> global(context->Global());
312 v8::Handle<v8::Value> chrome(global->Get(chrome_string));
313 if (chrome.IsEmpty() || chrome->IsUndefined()) {
314 v8::Handle<v8::Object> chrome_object(v8::Object::New());
315 global->Set(chrome_string, chrome_object);
316 return chrome_object;
317 }
318 CHECK(chrome->IsObject());
319 return chrome->ToObject();
320 }
321
322 } // namespace 385 } // namespace
323 386
324 Dispatcher::Dispatcher() 387 Dispatcher::Dispatcher()
325 : content_watcher_(new ContentWatcher(this)), 388 : content_watcher_(new ContentWatcher(this)),
326 is_webkit_initialized_(false), 389 is_webkit_initialized_(false),
327 webrequest_adblock_(false), 390 webrequest_adblock_(false),
328 webrequest_adblock_plus_(false), 391 webrequest_adblock_plus_(false),
329 webrequest_other_(false), 392 webrequest_other_(false),
330 source_map_(&ResourceBundle::GetSharedInstance()) { 393 source_map_(&ResourceBundle::GetSharedInstance()) {
331 const CommandLine& command_line = *(CommandLine::ForCurrentProcess()); 394 const CommandLine& command_line = *(CommandLine::ForCurrentProcess());
332 is_extension_process_ = 395 is_extension_process_ =
333 command_line.HasSwitch(switches::kExtensionProcess) || 396 command_line.HasSwitch(switches::kExtensionProcess) ||
334 command_line.HasSwitch(switches::kSingleProcess); 397 command_line.HasSwitch(switches::kSingleProcess);
335 398
336 if (is_extension_process_) { 399 if (is_extension_process_) {
337 RenderThread::Get()->SetIdleNotificationDelayInMs( 400 RenderThread::Get()->SetIdleNotificationDelayInMs(
338 kInitialExtensionIdleHandlerDelayMs); 401 kInitialExtensionIdleHandlerDelayMs);
339 } 402 }
340 403
341 user_script_slave_.reset(new UserScriptSlave(&extensions_)); 404 user_script_slave_.reset(new UserScriptSlave(&extensions_));
342 request_sender_.reset(new RequestSender(this, &v8_context_set_)); 405 request_sender_.reset(new RequestSender(this));
343 PopulateSourceMap(); 406 PopulateSourceMap();
344 PopulateLazyBindingsMap(); 407 PopulateLazyBindingsMap();
345 } 408 }
346 409
347 Dispatcher::~Dispatcher() { 410 Dispatcher::~Dispatcher() {
348 } 411 }
349 412
350 bool Dispatcher::OnControlMessageReceived(const IPC::Message& message) { 413 bool Dispatcher::OnControlMessageReceived(const IPC::Message& message) {
351 bool handled = true; 414 bool handled = true;
352 IPC_BEGIN_MESSAGE_MAP(Dispatcher, message) 415 IPC_BEGIN_MESSAGE_MAP(Dispatcher, message)
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 } // namespace 620 } // namespace
558 621
559 bool Dispatcher::AllowScriptExtension(WebFrame* frame, 622 bool Dispatcher::AllowScriptExtension(WebFrame* frame,
560 const std::string& v8_extension_name, 623 const std::string& v8_extension_name,
561 int extension_group, 624 int extension_group,
562 int world_id) { 625 int world_id) {
563 g_hack_extension_group = extension_group; 626 g_hack_extension_group = extension_group;
564 return true; 627 return true;
565 } 628 }
566 629
630 v8::Handle<v8::Object> Dispatcher::GetOrCreateObject(
631 v8::Handle<v8::Object> object,
632 const std::string& field) {
633 v8::HandleScope handle_scope;
634 v8::Handle<v8::String> key = v8::String::New(field.c_str());
635 // This little dance is for APIs that may be unavailable but have available
636 // children. For example, chrome.app can be unavailable, while
637 // chrome.app.runtime is available. The lazy getter for chrome.app must be
638 // deleted, so that there isn't an error when accessing chrome.app.runtime.
639 if (object->Has(key)) {
640 v8::Handle<v8::Value> value = object->Get(key);
641 if (value->IsObject())
642 return handle_scope.Close(v8::Handle<v8::Object>::Cast(value));
643 else
644 object->Delete(key);
645 }
646
647 v8::Handle<v8::Object> new_object = v8::Object::New();
648 object->Set(key, new_object);
649 return handle_scope.Close(new_object);
650 }
651
652 void Dispatcher::RegisterSchemaGeneratedBindings(
653 ModuleSystem* module_system,
654 ChromeV8Context* context,
655 v8::Handle<v8::Context> v8_context) {
656 std::set<std::string> apis =
657 ExtensionAPI::GetSharedInstance()->GetAllAPINames();
658 for (std::set<std::string>::iterator it = apis.begin();
659 it != apis.end(); ++it) {
660 const std::string& api_name = *it;
661
662 std::vector<std::string> split;
663 base::SplitString(api_name, '.', &split);
664
665 v8::Handle<v8::Object> bind_object = GetOrCreateChrome(v8_context);
666 for (size_t i = 0; i < split.size() - 1; ++i)
667 bind_object = GetOrCreateObject(bind_object, split[i]);
668
669 if (lazy_bindings_map_.find(api_name) != lazy_bindings_map_.end()) {
670 InstallBindings(module_system, v8_context, api_name);
671 } else if (!source_map_.Contains(api_name)) {
672 module_system->RegisterNativeHandler(
673 api_name,
674 scoped_ptr<NativeHandler>(new BindingGeneratingNativeHandler(
675 module_system,
676 api_name,
677 "binding")));
678 module_system->SetNativeLazyField(bind_object,
679 split.back(),
680 api_name,
681 "binding");
682 } else {
683 module_system->SetLazyField(bind_object,
684 split.back(),
685 api_name,
686 "binding");
687 }
688 }
689 }
690
567 void Dispatcher::RegisterNativeHandlers(ModuleSystem* module_system, 691 void Dispatcher::RegisterNativeHandlers(ModuleSystem* module_system,
568 ChromeV8Context* context) { 692 ChromeV8Context* context) {
693 v8::Handle<v8::Context> v8_context = context->v8_context();
694
569 module_system->RegisterNativeHandler("event_bindings", 695 module_system->RegisterNativeHandler("event_bindings",
570 scoped_ptr<NativeHandler>(EventBindings::Get(this))); 696 scoped_ptr<NativeHandler>(EventBindings::Create(this, v8_context)));
571 module_system->RegisterNativeHandler("miscellaneous_bindings", 697 module_system->RegisterNativeHandler("miscellaneous_bindings",
572 scoped_ptr<NativeHandler>(MiscellaneousBindings::Get(this))); 698 scoped_ptr<NativeHandler>(MiscellaneousBindings::Get(this, v8_context)));
573 module_system->RegisterNativeHandler("apiDefinitions", 699 module_system->RegisterNativeHandler("apiDefinitions",
574 scoped_ptr<NativeHandler>(new ApiDefinitionsNatives(this))); 700 scoped_ptr<NativeHandler>(new ApiDefinitionsNatives(this, context)));
575 module_system->RegisterNativeHandler("sendRequest", 701 module_system->RegisterNativeHandler("sendRequest",
576 scoped_ptr<NativeHandler>( 702 scoped_ptr<NativeHandler>(
577 new SendRequestNatives(this, request_sender_.get()))); 703 new SendRequestNatives(this, request_sender_.get(), context)));
578 module_system->RegisterNativeHandler("setIcon", 704 module_system->RegisterNativeHandler("setIcon",
579 scoped_ptr<NativeHandler>( 705 scoped_ptr<NativeHandler>(
580 new SetIconNatives(this, request_sender_.get()))); 706 new SetIconNatives(this, request_sender_.get(), context)));
581 module_system->RegisterNativeHandler("contentWatcherNative", 707 module_system->RegisterNativeHandler(
582 content_watcher_->MakeNatives()); 708 "contentWatcherNative",
709 content_watcher_->MakeNatives(v8_context));
583 710
584 // Natives used by multiple APIs. 711 // Natives used by multiple APIs.
585 module_system->RegisterNativeHandler("file_system_natives", 712 module_system->RegisterNativeHandler("file_system_natives",
586 scoped_ptr<NativeHandler>(new FileSystemNatives())); 713 scoped_ptr<NativeHandler>(new FileSystemNatives(v8_context)));
587 714
588 // Custom bindings. 715 // Custom bindings.
589 module_system->RegisterNativeHandler("app", 716 module_system->RegisterNativeHandler("app",
590 scoped_ptr<NativeHandler>(new AppBindings(this, context))); 717 scoped_ptr<NativeHandler>(new AppBindings(this, context)));
591 module_system->RegisterNativeHandler("app_runtime", 718 module_system->RegisterNativeHandler("app_runtime",
592 scoped_ptr<NativeHandler>(new AppRuntimeCustomBindings())); 719 scoped_ptr<NativeHandler>(
720 new AppRuntimeCustomBindings(this, v8_context)));
593 module_system->RegisterNativeHandler("app_window", 721 module_system->RegisterNativeHandler("app_window",
594 scoped_ptr<NativeHandler>(new AppWindowCustomBindings(this))); 722 scoped_ptr<NativeHandler>(
723 new AppWindowCustomBindings(this, v8_context)));
595 module_system->RegisterNativeHandler("context_menus", 724 module_system->RegisterNativeHandler("context_menus",
596 scoped_ptr<NativeHandler>(new ContextMenusCustomBindings())); 725 scoped_ptr<NativeHandler>(
726 new ContextMenusCustomBindings(this, v8_context)));
597 module_system->RegisterNativeHandler("extension", 727 module_system->RegisterNativeHandler("extension",
598 scoped_ptr<NativeHandler>( 728 scoped_ptr<NativeHandler>(
599 new ExtensionCustomBindings(this))); 729 new ExtensionCustomBindings(this, v8_context)));
600 module_system->RegisterNativeHandler("sync_file_system", 730 module_system->RegisterNativeHandler("sync_file_system",
601 scoped_ptr<NativeHandler>(new SyncFileSystemCustomBindings())); 731 scoped_ptr<NativeHandler>(
732 new SyncFileSystemCustomBindings(this, v8_context)));
602 module_system->RegisterNativeHandler("file_browser_handler", 733 module_system->RegisterNativeHandler("file_browser_handler",
603 scoped_ptr<NativeHandler>(new FileBrowserHandlerCustomBindings())); 734 scoped_ptr<NativeHandler>(new FileBrowserHandlerCustomBindings(
735 this, v8_context)));
604 module_system->RegisterNativeHandler("file_browser_private", 736 module_system->RegisterNativeHandler("file_browser_private",
605 scoped_ptr<NativeHandler>(new FileBrowserPrivateCustomBindings())); 737 scoped_ptr<NativeHandler>(new FileBrowserPrivateCustomBindings(
738 this, v8_context)));
606 module_system->RegisterNativeHandler("i18n", 739 module_system->RegisterNativeHandler("i18n",
607 scoped_ptr<NativeHandler>(new I18NCustomBindings())); 740 scoped_ptr<NativeHandler>(
741 new I18NCustomBindings(this, v8_context)));
608 module_system->RegisterNativeHandler("mediaGalleries", 742 module_system->RegisterNativeHandler("mediaGalleries",
609 scoped_ptr<NativeHandler>(new MediaGalleriesCustomBindings())); 743 scoped_ptr<NativeHandler>(
744 new MediaGalleriesCustomBindings(this, v8_context)));
610 module_system->RegisterNativeHandler("page_actions", 745 module_system->RegisterNativeHandler("page_actions",
611 scoped_ptr<NativeHandler>( 746 scoped_ptr<NativeHandler>(
612 new PageActionsCustomBindings(this))); 747 new PageActionsCustomBindings(this, v8_context)));
613 module_system->RegisterNativeHandler("page_capture", 748 module_system->RegisterNativeHandler("page_capture",
614 scoped_ptr<NativeHandler>(new PageCaptureCustomBindings())); 749 scoped_ptr<NativeHandler>(
750 new PageCaptureCustomBindings(this, v8_context)));
615 module_system->RegisterNativeHandler("runtime", 751 module_system->RegisterNativeHandler("runtime",
616 scoped_ptr<NativeHandler>(new RuntimeCustomBindings(this, context))); 752 scoped_ptr<NativeHandler>(new RuntimeCustomBindings(this, context)));
617 module_system->RegisterNativeHandler("tabs", 753 module_system->RegisterNativeHandler("tabs",
618 scoped_ptr<NativeHandler>(new TabsCustomBindings())); 754 scoped_ptr<NativeHandler>(new TabsCustomBindings(this, v8_context)));
619 module_system->RegisterNativeHandler("tts", 755 module_system->RegisterNativeHandler("tts",
620 scoped_ptr<NativeHandler>(new TTSCustomBindings())); 756 scoped_ptr<NativeHandler>(new TTSCustomBindings(this, v8_context)));
621 module_system->RegisterNativeHandler("web_request", 757 module_system->RegisterNativeHandler("web_request",
622 scoped_ptr<NativeHandler>(new WebRequestCustomBindings())); 758 scoped_ptr<NativeHandler>(
759 new WebRequestCustomBindings(this, v8_context)));
623 module_system->RegisterNativeHandler("webstore", 760 module_system->RegisterNativeHandler("webstore",
624 scoped_ptr<NativeHandler>(new WebstoreBindings(this, context))); 761 scoped_ptr<NativeHandler>(new WebstoreBindings(this, context)));
625 } 762 }
626 763
627 void Dispatcher::PopulateSourceMap() { 764 void Dispatcher::PopulateSourceMap() {
628 source_map_.RegisterSource("event_bindings", IDR_EVENT_BINDINGS_JS); 765 source_map_.RegisterSource("event_bindings", IDR_EVENT_BINDINGS_JS);
629 source_map_.RegisterSource("miscellaneous_bindings", 766 source_map_.RegisterSource("miscellaneous_bindings",
630 IDR_MISCELLANEOUS_BINDINGS_JS); 767 IDR_MISCELLANEOUS_BINDINGS_JS);
631 source_map_.RegisterSource("schema_generated_bindings",
632 IDR_SCHEMA_GENERATED_BINDINGS_JS);
633 source_map_.RegisterSource("json", IDR_JSON_JS); 768 source_map_.RegisterSource("json", IDR_JSON_JS);
634 source_map_.RegisterSource("json_schema", IDR_JSON_SCHEMA_JS); 769 source_map_.RegisterSource("json_schema", IDR_JSON_SCHEMA_JS);
635 source_map_.RegisterSource("apitest", IDR_EXTENSION_APITEST_JS); 770 source_map_.RegisterSource("test", IDR_TEST_CUSTOM_BINDINGS_JS);
636 771
637 // Libraries. 772 // Libraries.
638 source_map_.RegisterSource("contentWatcher", IDR_CONTENT_WATCHER_JS); 773 source_map_.RegisterSource("contentWatcher", IDR_CONTENT_WATCHER_JS);
639 source_map_.RegisterSource("imageUtil", IDR_IMAGE_UTIL_JS); 774 source_map_.RegisterSource("imageUtil", IDR_IMAGE_UTIL_JS);
640 source_map_.RegisterSource("lastError", IDR_LAST_ERROR_JS); 775 source_map_.RegisterSource("lastError", IDR_LAST_ERROR_JS);
641 source_map_.RegisterSource("schemaUtils", IDR_SCHEMA_UTILS_JS); 776 source_map_.RegisterSource("schemaUtils", IDR_SCHEMA_UTILS_JS);
642 source_map_.RegisterSource("sendRequest", IDR_SEND_REQUEST_JS); 777 source_map_.RegisterSource("sendRequest", IDR_SEND_REQUEST_JS);
643 source_map_.RegisterSource("setIcon", IDR_SET_ICON_JS); 778 source_map_.RegisterSource("setIcon", IDR_SET_ICON_JS);
644 source_map_.RegisterSource("utils", IDR_UTILS_JS); 779 source_map_.RegisterSource("utils", IDR_UTILS_JS);
645 source_map_.RegisterSource("entryIdManager", IDR_ENTRY_ID_MANAGER); 780 source_map_.RegisterSource("entryIdManager", IDR_ENTRY_ID_MANAGER);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
694 IDR_SYSTEM_INDICATOR_CUSTOM_BINDINGS_JS); 829 IDR_SYSTEM_INDICATOR_CUSTOM_BINDINGS_JS);
695 source_map_.RegisterSource("tabCapture", IDR_TAB_CAPTURE_CUSTOM_BINDINGS_JS); 830 source_map_.RegisterSource("tabCapture", IDR_TAB_CAPTURE_CUSTOM_BINDINGS_JS);
696 source_map_.RegisterSource("tabs", IDR_TABS_CUSTOM_BINDINGS_JS); 831 source_map_.RegisterSource("tabs", IDR_TABS_CUSTOM_BINDINGS_JS);
697 source_map_.RegisterSource("tts", IDR_TTS_CUSTOM_BINDINGS_JS); 832 source_map_.RegisterSource("tts", IDR_TTS_CUSTOM_BINDINGS_JS);
698 source_map_.RegisterSource("ttsEngine", IDR_TTS_ENGINE_CUSTOM_BINDINGS_JS); 833 source_map_.RegisterSource("ttsEngine", IDR_TTS_ENGINE_CUSTOM_BINDINGS_JS);
699 source_map_.RegisterSource("types", IDR_TYPES_CUSTOM_BINDINGS_JS); 834 source_map_.RegisterSource("types", IDR_TYPES_CUSTOM_BINDINGS_JS);
700 source_map_.RegisterSource("webRequest", IDR_WEB_REQUEST_CUSTOM_BINDINGS_JS); 835 source_map_.RegisterSource("webRequest", IDR_WEB_REQUEST_CUSTOM_BINDINGS_JS);
701 source_map_.RegisterSource("webRequestInternal", 836 source_map_.RegisterSource("webRequestInternal",
702 IDR_WEB_REQUEST_INTERNAL_CUSTOM_BINDINGS_JS); 837 IDR_WEB_REQUEST_INTERNAL_CUSTOM_BINDINGS_JS);
703 source_map_.RegisterSource("webstore", IDR_WEBSTORE_CUSTOM_BINDINGS_JS); 838 source_map_.RegisterSource("webstore", IDR_WEBSTORE_CUSTOM_BINDINGS_JS);
839 source_map_.RegisterSource("binding", IDR_BINDING_JS);
704 840
705 // Platform app sources that are not API-specific.. 841 // Platform app sources that are not API-specific..
706 source_map_.RegisterSource("tagWatcher", IDR_TAG_WATCHER_JS); 842 source_map_.RegisterSource("tagWatcher", IDR_TAG_WATCHER_JS);
707 source_map_.RegisterSource("webview", IDR_WEB_VIEW_JS); 843 // Note: webView not webview so that this doesn't interfere with the
708 source_map_.RegisterSource("webview.experimental", 844 // chrome.webview API bindings.
845 source_map_.RegisterSource("webView", IDR_WEB_VIEW_JS);
846 source_map_.RegisterSource("webViewExperimental",
709 IDR_WEB_VIEW_EXPERIMENTAL_JS); 847 IDR_WEB_VIEW_EXPERIMENTAL_JS);
710 source_map_.RegisterSource("denyWebview", IDR_WEB_VIEW_DENY_JS); 848 source_map_.RegisterSource("denyWebView", IDR_WEB_VIEW_DENY_JS);
711 source_map_.RegisterSource("platformApp", IDR_PLATFORM_APP_JS); 849 source_map_.RegisterSource("platformApp", IDR_PLATFORM_APP_JS);
712 source_map_.RegisterSource("injectAppTitlebar", IDR_INJECT_APP_TITLEBAR_JS); 850 source_map_.RegisterSource("injectAppTitlebar", IDR_INJECT_APP_TITLEBAR_JS);
713 } 851 }
714 852
715 void Dispatcher::PopulateLazyBindingsMap() { 853 void Dispatcher::PopulateLazyBindingsMap() {
716 lazy_bindings_map_["app"] = InstallAppBindings; 854 lazy_bindings_map_["app"] = InstallAppBindings;
717 lazy_bindings_map_["webstore"] = InstallWebstoreBindings; 855 lazy_bindings_map_["webstore"] = InstallWebstoreBindings;
718 } 856 }
719 857
720 void Dispatcher::InstallBindings(ModuleSystem* module_system, 858 void Dispatcher::InstallBindings(ModuleSystem* module_system,
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
772 new ChromeV8Context(v8_context, frame, extension, context_type); 910 new ChromeV8Context(v8_context, frame, extension, context_type);
773 v8_context_set_.Add(context); 911 v8_context_set_.Add(context);
774 912
775 scoped_ptr<ModuleSystem> module_system(new ModuleSystem(v8_context, 913 scoped_ptr<ModuleSystem> module_system(new ModuleSystem(v8_context,
776 &source_map_)); 914 &source_map_));
777 // Enable natives in startup. 915 // Enable natives in startup.
778 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system.get()); 916 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system.get());
779 917
780 RegisterNativeHandlers(module_system.get(), context); 918 RegisterNativeHandlers(module_system.get(), context);
781 919
782 v8::Isolate* isolate = v8_context->GetIsolate(); 920 module_system->RegisterNativeHandler("chrome",
921 scoped_ptr<NativeHandler>(new ChromeNativeHandler(v8_context)));
783 module_system->RegisterNativeHandler("chrome_hidden", 922 module_system->RegisterNativeHandler("chrome_hidden",
784 scoped_ptr<NativeHandler>(new ChromeHiddenNativeHandler(isolate))); 923 scoped_ptr<NativeHandler>(new ChromeHiddenNativeHandler(v8_context)));
785 module_system->RegisterNativeHandler("print", 924 module_system->RegisterNativeHandler("print",
786 scoped_ptr<NativeHandler>(new PrintNativeHandler(isolate))); 925 scoped_ptr<NativeHandler>(new PrintNativeHandler(v8_context)));
787 module_system->RegisterNativeHandler("lazy_background_page", 926 module_system->RegisterNativeHandler("lazy_background_page",
788 scoped_ptr<NativeHandler>(new LazyBackgroundPageNativeHandler(this))); 927 scoped_ptr<NativeHandler>(
928 new LazyBackgroundPageNativeHandler(this, v8_context)));
789 module_system->RegisterNativeHandler("logging", 929 module_system->RegisterNativeHandler("logging",
790 scoped_ptr<NativeHandler>(new LoggingNativeHandler(isolate))); 930 scoped_ptr<NativeHandler>(new LoggingNativeHandler(v8_context)));
931 module_system->RegisterNativeHandler("schema_registry",
932 scoped_ptr<NativeHandler>(
933 new SchemaRegistryNativeHandler(v8_schema_registry(), v8_context)));
934 module_system->RegisterNativeHandler("v8_context",
935 scoped_ptr<NativeHandler>(new V8ContextNativeHandler(context)));
791 936
792 int manifest_version = extension ? extension->manifest_version() : 1; 937 int manifest_version = extension ? extension->manifest_version() : 1;
793 bool send_request_disabled = 938 bool send_request_disabled =
794 (extension && Manifest::IsUnpackedLocation(extension->location()) && 939 (extension && Manifest::IsUnpackedLocation(extension->location()) &&
795 BackgroundInfo::HasLazyBackgroundPage(extension)); 940 BackgroundInfo::HasLazyBackgroundPage(extension));
796 module_system->RegisterNativeHandler("process", 941 module_system->RegisterNativeHandler("process",
797 scoped_ptr<NativeHandler>(new ProcessInfoNativeHandler( 942 scoped_ptr<NativeHandler>(new ProcessInfoNativeHandler(
798 this, context->GetExtensionID(), 943 this, v8_context, context->GetExtensionID(),
799 context->GetContextTypeDescription(), 944 context->GetContextTypeDescription(),
800 ChromeRenderProcessObserver::is_incognito_process(), 945 ChromeRenderProcessObserver::is_incognito_process(),
801 manifest_version, send_request_disabled))); 946 manifest_version, send_request_disabled)));
802 947
803 GetOrCreateChrome(v8_context); 948 GetOrCreateChrome(v8_context);
804 949
805 // Loading JavaScript is expensive, so only run the full API bindings 950 // Loading JavaScript is expensive, so only run the full API bindings
806 // generation mechanisms in extension pages (NOT all web pages). 951 // generation mechanisms in extension pages (NOT all web pages).
807 switch (context_type) { 952 switch (context_type) {
808 case Feature::UNSPECIFIED_CONTEXT: 953 case Feature::UNSPECIFIED_CONTEXT:
809 case Feature::WEB_PAGE_CONTEXT: 954 case Feature::WEB_PAGE_CONTEXT:
810 // TODO(kalman): see comment below about ExtensionAPI. 955 // TODO(kalman): see comment below about ExtensionAPI.
811 InstallBindings(module_system.get(), v8_context, "app"); 956 InstallBindings(module_system.get(), v8_context, "app");
812 InstallBindings(module_system.get(), v8_context, "webstore"); 957 InstallBindings(module_system.get(), v8_context, "webstore");
813 break; 958 break;
814
815 case Feature::BLESSED_EXTENSION_CONTEXT: 959 case Feature::BLESSED_EXTENSION_CONTEXT:
816 case Feature::UNBLESSED_EXTENSION_CONTEXT: 960 case Feature::UNBLESSED_EXTENSION_CONTEXT:
817 case Feature::CONTENT_SCRIPT_CONTEXT: { 961 case Feature::CONTENT_SCRIPT_CONTEXT: {
962 if (extension && !extension->is_platform_app())
963 module_system->Require("miscellaneous_bindings");
818 module_system->Require("json"); // see paranoid comment in json.js 964 module_system->Require("json"); // see paranoid comment in json.js
819 module_system->Require("miscellaneous_bindings");
820 module_system->Require("schema_generated_bindings");
821 module_system->Require("apitest");
822 965
823 // TODO(kalman): move this code back out of the switch and execute it 966 // TODO(kalman): move this code back out of the switch and execute it
824 // regardless of |context_type|. ExtensionAPI knows how to return the 967 // regardless of |context_type|. ExtensionAPI knows how to return the
825 // correct APIs, however, until it doesn't have a 2MB overhead we can't 968 // correct APIs, however, until it doesn't have a 2MB overhead we can't
826 // load it in every process. 969 // load it in every process.
827 const std::set<std::string>& apis = context->GetAvailableExtensionAPIs(); 970 RegisterSchemaGeneratedBindings(module_system.get(),
828 for (std::set<std::string>::const_iterator i = apis.begin(); 971 context,
829 i != apis.end(); ++i) { 972 v8_context);
830 InstallBindings(module_system.get(), v8_context, *i);
831 }
832
833 break; 973 break;
834 } 974 }
835 } 975 }
836 976
837 // Inject custom JS into the platform app context. 977 // Inject custom JS into the platform app context.
838 if (IsWithinPlatformApp(frame)) 978 if (IsWithinPlatformApp(frame))
839 module_system->Require("platformApp"); 979 module_system->Require("platformApp");
840 980
841 if (context_type == Feature::BLESSED_EXTENSION_CONTEXT) { 981 if (context_type == Feature::BLESSED_EXTENSION_CONTEXT) {
842 bool has_permission = extension->HasAPIPermission(APIPermission::kWebView); 982 // Note: setting up the WebView class here, not the chrome.webview API.
843 module_system->Require(has_permission ? "webview" : "denyWebview"); 983 // The API will be automatically set up when first used.
844 if (has_permission && 984 if (extension->HasAPIPermission(APIPermission::kWebView)) {
845 Feature::GetCurrentChannel() <= chrome::VersionInfo::CHANNEL_DEV) { 985 module_system->Require("webView");
846 module_system->Require("webview.experimental"); 986 if (Feature::GetCurrentChannel() <= chrome::VersionInfo::CHANNEL_DEV)
987 module_system->Require("webViewExperimental");
988 } else {
989 module_system->Require("denyWebView");
847 } 990 }
848 } 991 }
849 992
850 context->set_module_system(module_system.Pass()); 993 context->set_module_system(module_system.Pass());
851 994
852 context->DispatchOnLoadEvent( 995 context->DispatchOnLoadEvent(
853 ChromeRenderProcessObserver::is_incognito_process(), 996 ChromeRenderProcessObserver::is_incognito_process(),
854 manifest_version); 997 manifest_version);
855 998
856 VLOG(1) << "Num tracked contexts: " << v8_context_set_.size(); 999 VLOG(1) << "Num tracked contexts: " << v8_context_set_.size();
(...skipping 21 matching lines...) Expand all
878 return extension && extension->is_platform_app(); 1021 return extension && extension->is_platform_app();
879 } 1022 }
880 1023
881 void Dispatcher::WillReleaseScriptContext( 1024 void Dispatcher::WillReleaseScriptContext(
882 WebFrame* frame, v8::Handle<v8::Context> v8_context, int world_id) { 1025 WebFrame* frame, v8::Handle<v8::Context> v8_context, int world_id) {
883 ChromeV8Context* context = v8_context_set_.GetByV8Context(v8_context); 1026 ChromeV8Context* context = v8_context_set_.GetByV8Context(v8_context);
884 if (!context) 1027 if (!context)
885 return; 1028 return;
886 1029
887 context->DispatchOnUnloadEvent(); 1030 context->DispatchOnUnloadEvent();
1031 // TODO(kalman): add an invalidation observer interface to ChromeV8Context.
1032 request_sender_->InvalidateContext(context);
888 1033
889 v8_context_set_.Remove(context); 1034 v8_context_set_.Remove(context);
890 VLOG(1) << "Num tracked contexts: " << v8_context_set_.size(); 1035 VLOG(1) << "Num tracked contexts: " << v8_context_set_.size();
891 } 1036 }
892 1037
893 void Dispatcher::DidCreateDocumentElement(WebKit::WebFrame* frame) { 1038 void Dispatcher::DidCreateDocumentElement(WebKit::WebFrame* frame) {
894 if (IsWithinPlatformApp(frame)) { 1039 if (IsWithinPlatformApp(frame)) {
895 // WebKit doesn't let us define an additional user agent stylesheet, so we 1040 // WebKit doesn't let us define an additional user agent stylesheet, so we
896 // insert the default platform app stylesheet into all documents that are 1041 // insert the default platform app stylesheet into all documents that are
897 // loaded in each app. 1042 // loaded in each app.
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
1122 return Feature::UNSPECIFIED_CONTEXT; 1267 return Feature::UNSPECIFIED_CONTEXT;
1123 } 1268 }
1124 1269
1125 void Dispatcher::OnExtensionResponse(int request_id, 1270 void Dispatcher::OnExtensionResponse(int request_id,
1126 bool success, 1271 bool success,
1127 const base::ListValue& response, 1272 const base::ListValue& response,
1128 const std::string& error) { 1273 const std::string& error) {
1129 request_sender_->HandleResponse(request_id, success, response, error); 1274 request_sender_->HandleResponse(request_id, success, response, error);
1130 } 1275 }
1131 1276
1132 bool Dispatcher::CheckCurrentContextAccessToExtensionAPI( 1277 bool Dispatcher::CheckContextAccessToExtensionAPI(
1133 const std::string& function_name) const { 1278 const std::string& function_name, ChromeV8Context* context) const {
1134 ChromeV8Context* context = v8_context_set().GetCurrent();
1135 if (!context) { 1279 if (!context) {
1136 DLOG(ERROR) << "Not in a v8::Context"; 1280 DLOG(ERROR) << "Not in a v8::Context";
1137 return false; 1281 return false;
1138 } 1282 }
1139 1283
1140 if (!context->extension()) { 1284 if (!context->extension()) {
1141 v8::ThrowException( 1285 v8::ThrowException(
1142 v8::Exception::Error(v8::String::New("Not in an extension."))); 1286 v8::Exception::Error(v8::String::New("Not in an extension.")));
1143 return false; 1287 return false;
1144 } 1288 }
(...skipping 29 matching lines...) Expand all
1174 std::string error_msg = base::StringPrintf(kMessage, function_name.c_str()); 1318 std::string error_msg = base::StringPrintf(kMessage, function_name.c_str());
1175 v8::ThrowException( 1319 v8::ThrowException(
1176 v8::Exception::Error(v8::String::New(error_msg.c_str()))); 1320 v8::Exception::Error(v8::String::New(error_msg.c_str())));
1177 return false; 1321 return false;
1178 } 1322 }
1179 1323
1180 return true; 1324 return true;
1181 } 1325 }
1182 1326
1183 } // namespace extensions 1327 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/renderer/extensions/dispatcher.h ('k') | chrome/renderer/extensions/event_bindings.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698