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 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 Dispatcher::Dispatcher(DispatcherDelegate* delegate) | 182 Dispatcher::Dispatcher(DispatcherDelegate* delegate) |
183 : delegate_(delegate), | 183 : delegate_(delegate), |
184 content_watcher_(new ContentWatcher()), | 184 content_watcher_(new ContentWatcher()), |
185 source_map_(&ResourceBundle::GetSharedInstance()), | 185 source_map_(&ResourceBundle::GetSharedInstance()), |
186 v8_schema_registry_(new V8SchemaRegistry), | 186 v8_schema_registry_(new V8SchemaRegistry), |
187 is_webkit_initialized_(false), | 187 is_webkit_initialized_(false), |
188 user_script_set_manager_observer_(this), | 188 user_script_set_manager_observer_(this), |
189 webrequest_used_(false) { | 189 webrequest_used_(false) { |
190 const CommandLine& command_line = *(CommandLine::ForCurrentProcess()); | 190 const CommandLine& command_line = *(CommandLine::ForCurrentProcess()); |
191 is_extension_process_ = | 191 is_extension_process_ = |
192 command_line.HasSwitch(extensions::switches::kExtensionProcess) || | 192 command_line.HasSwitch(switches::kExtensionProcess) || |
193 command_line.HasSwitch(::switches::kSingleProcess); | 193 command_line.HasSwitch(::switches::kSingleProcess); |
194 | 194 |
195 if (is_extension_process_) { | 195 if (is_extension_process_) { |
196 RenderThread::Get()->SetIdleNotificationDelayInMs( | 196 RenderThread::Get()->SetIdleNotificationDelayInMs( |
197 kInitialExtensionIdleHandlerDelayMs); | 197 kInitialExtensionIdleHandlerDelayMs); |
198 } | 198 } |
199 | 199 |
200 RenderThread::Get()->RegisterExtension(SafeBuiltins::CreateV8Extension()); | 200 RenderThread::Get()->RegisterExtension(SafeBuiltins::CreateV8Extension()); |
201 | 201 |
202 user_script_set_manager_.reset(new UserScriptSetManager(&extensions_)); | 202 user_script_set_manager_.reset(new UserScriptSetManager(&extensions_)); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 } | 253 } |
254 } | 254 } |
255 return extension; | 255 return extension; |
256 } | 256 } |
257 | 257 |
258 void Dispatcher::DidCreateScriptContext( | 258 void Dispatcher::DidCreateScriptContext( |
259 WebFrame* frame, | 259 WebFrame* frame, |
260 const v8::Handle<v8::Context>& v8_context, | 260 const v8::Handle<v8::Context>& v8_context, |
261 int extension_group, | 261 int extension_group, |
262 int world_id) { | 262 int world_id) { |
263 #if !defined(ENABLE_EXTENSIONS) | |
264 return; | |
265 #endif | |
266 | |
267 const Extension* extension = | 263 const Extension* extension = |
268 GetExtensionFromFrameAndWorld(frame, world_id, false); | 264 GetExtensionFromFrameAndWorld(frame, world_id, false); |
269 const Extension* effective_extension = | 265 const Extension* effective_extension = |
270 GetExtensionFromFrameAndWorld(frame, world_id, true); | 266 GetExtensionFromFrameAndWorld(frame, world_id, true); |
271 | 267 |
272 GURL frame_url = ScriptContext::GetDataSourceURLForFrame(frame); | 268 GURL frame_url = ScriptContext::GetDataSourceURLForFrame(frame); |
273 Feature::Context context_type = | 269 Feature::Context context_type = |
274 ClassifyJavaScriptContext(extension, | 270 ClassifyJavaScriptContext(extension, |
275 extension_group, | 271 extension_group, |
276 frame_url, | 272 frame_url, |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 UpdateBindingsForContext(context); | 315 UpdateBindingsForContext(context); |
320 | 316 |
321 bool is_within_platform_app = IsWithinPlatformApp(); | 317 bool is_within_platform_app = IsWithinPlatformApp(); |
322 // Inject custom JS into the platform app context. | 318 // Inject custom JS into the platform app context. |
323 if (is_within_platform_app) { | 319 if (is_within_platform_app) { |
324 module_system->Require("platformApp"); | 320 module_system->Require("platformApp"); |
325 } | 321 } |
326 | 322 |
327 if (context->GetAvailability("appViewEmbedderInternal").is_available()) { | 323 if (context->GetAvailability("appViewEmbedderInternal").is_available()) { |
328 module_system->Require("appView"); | 324 module_system->Require("appView"); |
329 } else if (context_type == extensions::Feature::BLESSED_EXTENSION_CONTEXT) { | 325 } else if (context_type == Feature::BLESSED_EXTENSION_CONTEXT) { |
330 module_system->Require("denyAppView"); | 326 module_system->Require("denyAppView"); |
331 } | 327 } |
332 | 328 |
333 // Note: setting up the WebView class here, not the chrome.webview API. | 329 // Note: setting up the WebView class here, not the chrome.webview API. |
334 // The API will be automatically set up when first used. | 330 // The API will be automatically set up when first used. |
335 if (context->GetAvailability("webViewInternal").is_available()) { | 331 if (context->GetAvailability("webViewInternal").is_available()) { |
336 module_system->Require("webView"); | 332 module_system->Require("webView"); |
337 module_system->Require("webViewConstants"); | 333 module_system->Require("webViewConstants"); |
338 module_system->Require("webViewAttributes"); | 334 module_system->Require("webViewAttributes"); |
339 if (context->GetAvailability("webViewExperimentalInternal") | 335 if (context->GetAvailability("webViewExperimentalInternal") |
340 .is_available()) { | 336 .is_available()) { |
341 module_system->Require("webViewExperimental"); | 337 module_system->Require("webViewExperimental"); |
342 } | 338 } |
343 } else if (context_type == extensions::Feature::BLESSED_EXTENSION_CONTEXT) { | 339 } else if (context_type == Feature::BLESSED_EXTENSION_CONTEXT) { |
344 module_system->Require("denyWebView"); | 340 module_system->Require("denyWebView"); |
345 } | 341 } |
346 | 342 |
347 delegate_->RequireAdditionalModules(context, is_within_platform_app); | 343 delegate_->RequireAdditionalModules(context, is_within_platform_app); |
348 | 344 |
349 VLOG(1) << "Num tracked contexts: " << script_context_set_.size(); | 345 VLOG(1) << "Num tracked contexts: " << script_context_set_.size(); |
350 } | 346 } |
351 | 347 |
352 void Dispatcher::WillReleaseScriptContext( | 348 void Dispatcher::WillReleaseScriptContext( |
353 WebFrame* frame, | 349 WebFrame* frame, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 &stylesheet, 0, "$FONTFAMILY", system_font_family_); | 382 &stylesheet, 0, "$FONTFAMILY", system_font_family_); |
387 ReplaceFirstSubstringAfterOffset( | 383 ReplaceFirstSubstringAfterOffset( |
388 &stylesheet, 0, "$FONTSIZE", system_font_size_); | 384 &stylesheet, 0, "$FONTSIZE", system_font_size_); |
389 | 385 |
390 // Blink doesn't let us define an additional user agent stylesheet, so | 386 // Blink doesn't let us define an additional user agent stylesheet, so |
391 // we insert the default platform app or extension stylesheet into all | 387 // we insert the default platform app or extension stylesheet into all |
392 // documents that are loaded in each app or extension. | 388 // documents that are loaded in each app or extension. |
393 frame->document().insertStyleSheet(WebString::fromUTF8(stylesheet)); | 389 frame->document().insertStyleSheet(WebString::fromUTF8(stylesheet)); |
394 } | 390 } |
395 | 391 |
396 // This preprocessor directive is because this file is still built in Android | |
397 // builds, but OptionsPageInfo is not. For Android builds, exclude this block | |
398 // of code to prevent link errors. | |
399 #if defined(ENABLE_EXTENSIONS) | |
400 // If this is an extension options page, and the extension has opted into | 392 // If this is an extension options page, and the extension has opted into |
401 // using Chrome styles, then insert the Chrome extension stylesheet. | 393 // using Chrome styles, then insert the Chrome extension stylesheet. |
402 if (extension && extension->is_extension() && | 394 if (extension && extension->is_extension() && |
403 OptionsPageInfo::ShouldUseChromeStyle(extension) && | 395 OptionsPageInfo::ShouldUseChromeStyle(extension) && |
404 effective_document_url == OptionsPageInfo::GetOptionsPage(extension)) { | 396 effective_document_url == OptionsPageInfo::GetOptionsPage(extension)) { |
405 frame->document().insertStyleSheet( | 397 frame->document().insertStyleSheet( |
406 WebString::fromUTF8(ResourceBundle::GetSharedInstance() | 398 WebString::fromUTF8(ResourceBundle::GetSharedInstance() |
407 .GetRawDataResource(IDR_EXTENSION_CSS) | 399 .GetRawDataResource(IDR_EXTENSION_CSS) |
408 .as_string())); | 400 .as_string())); |
409 } | 401 } |
410 #endif | |
411 | 402 |
412 content_watcher_->DidCreateDocumentElement(frame); | 403 content_watcher_->DidCreateDocumentElement(frame); |
413 } | 404 } |
414 | 405 |
415 void Dispatcher::DidMatchCSS( | 406 void Dispatcher::DidMatchCSS( |
416 blink::WebFrame* frame, | 407 blink::WebFrame* frame, |
417 const blink::WebVector<blink::WebString>& newly_matching_selectors, | 408 const blink::WebVector<blink::WebString>& newly_matching_selectors, |
418 const blink::WebVector<blink::WebString>& stopped_matching_selectors) { | 409 const blink::WebVector<blink::WebString>& stopped_matching_selectors) { |
419 content_watcher_->DidMatchCSS( | 410 content_watcher_->DidMatchCSS( |
420 frame, newly_matching_selectors, stopped_matching_selectors); | 411 frame, newly_matching_selectors, stopped_matching_selectors); |
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
823 CHECK(extension) << extension_id << " was never loaded: " << error; | 814 CHECK(extension) << extension_id << " was never loaded: " << error; |
824 } | 815 } |
825 | 816 |
826 active_extension_ids_.insert(extension_id); | 817 active_extension_ids_.insert(extension_id); |
827 | 818 |
828 // This is called when starting a new extension page, so start the idle | 819 // This is called when starting a new extension page, so start the idle |
829 // handler ticking. | 820 // handler ticking. |
830 RenderThread::Get()->ScheduleIdleHandler(kInitialExtensionIdleHandlerDelayMs); | 821 RenderThread::Get()->ScheduleIdleHandler(kInitialExtensionIdleHandlerDelayMs); |
831 | 822 |
832 if (is_webkit_initialized_) { | 823 if (is_webkit_initialized_) { |
833 extensions::DOMActivityLogger::AttachToWorld( | 824 DOMActivityLogger::AttachToWorld( |
834 extensions::DOMActivityLogger::kMainWorldId, extension_id); | 825 DOMActivityLogger::kMainWorldId, extension_id); |
835 | 826 |
836 InitOriginPermissions(extension); | 827 InitOriginPermissions(extension); |
837 } | 828 } |
838 | 829 |
839 UpdateActiveExtensions(); | 830 UpdateActiveExtensions(); |
840 } | 831 } |
841 | 832 |
842 void Dispatcher::OnCancelSuspend(const std::string& extension_id) { | 833 void Dispatcher::OnCancelSuspend(const std::string& extension_id) { |
843 DispatchEvent(extension_id, kOnSuspendCanceledEvent); | 834 DispatchEvent(extension_id, kOnSuspendCanceledEvent); |
844 } | 835 } |
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1412 return v8::Handle<v8::Object>(); | 1403 return v8::Handle<v8::Object>(); |
1413 | 1404 |
1414 if (bind_name) | 1405 if (bind_name) |
1415 *bind_name = split.back(); | 1406 *bind_name = split.back(); |
1416 | 1407 |
1417 return bind_object.IsEmpty() ? AsObjectOrEmpty(GetOrCreateChrome(context)) | 1408 return bind_object.IsEmpty() ? AsObjectOrEmpty(GetOrCreateChrome(context)) |
1418 : bind_object; | 1409 : bind_object; |
1419 } | 1410 } |
1420 | 1411 |
1421 } // namespace extensions | 1412 } // namespace extensions |
OLD | NEW |