| 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/script_context.h" | 5 #include "extensions/renderer/script_context.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/strings/string_split.h" | 10 #include "base/strings/string_split.h" |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 gin::ContextHolder* GetContextHolder() override; | 89 gin::ContextHolder* GetContextHolder() override; |
| 90 | 90 |
| 91 private: | 91 private: |
| 92 ScriptContext* context_; | 92 ScriptContext* context_; |
| 93 }; | 93 }; |
| 94 | 94 |
| 95 ScriptContext::ScriptContext(const v8::Local<v8::Context>& v8_context, | 95 ScriptContext::ScriptContext(const v8::Local<v8::Context>& v8_context, |
| 96 blink::WebLocalFrame* web_frame, | 96 blink::WebLocalFrame* web_frame, |
| 97 const Extension* extension, | 97 const Extension* extension, |
| 98 Feature::Context context_type, | 98 Feature::Context context_type, |
| 99 Feature::SessionType session_type, |
| 99 const Extension* effective_extension, | 100 const Extension* effective_extension, |
| 100 Feature::Context effective_context_type) | 101 Feature::Context effective_context_type) |
| 101 : is_valid_(true), | 102 : is_valid_(true), |
| 102 v8_context_(v8_context->GetIsolate(), v8_context), | 103 v8_context_(v8_context->GetIsolate(), v8_context), |
| 103 web_frame_(web_frame), | 104 web_frame_(web_frame), |
| 104 extension_(extension), | 105 extension_(extension), |
| 105 context_type_(context_type), | 106 context_type_(context_type), |
| 107 session_type_(session_type), |
| 106 effective_extension_(effective_extension), | 108 effective_extension_(effective_extension), |
| 107 effective_context_type_(effective_context_type), | 109 effective_context_type_(effective_context_type), |
| 108 safe_builtins_(this), | 110 safe_builtins_(this), |
| 109 isolate_(v8_context->GetIsolate()), | 111 isolate_(v8_context->GetIsolate()), |
| 110 runner_(new Runner(this)) { | 112 runner_(new Runner(this)) { |
| 111 VLOG(1) << "Created context:\n" << GetDebugString(); | 113 VLOG(1) << "Created context:\n" << GetDebugString(); |
| 112 gin::PerContextData* gin_data = gin::PerContextData::From(v8_context); | 114 gin::PerContextData* gin_data = gin::PerContextData::From(v8_context); |
| 113 CHECK(gin_data); | 115 CHECK(gin_data); |
| 114 gin_data->set_runner(runner_.get()); | 116 gin_data->set_runner(runner_.get()); |
| 115 if (web_frame_) | 117 if (web_frame_) |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 } | 223 } |
| 222 // Hack: Hosted apps should have the availability of messaging APIs based on | 224 // Hack: Hosted apps should have the availability of messaging APIs based on |
| 223 // the URL of the page (which might have access depending on some extension | 225 // the URL of the page (which might have access depending on some extension |
| 224 // with externally_connectable), not whether the app has access to messaging | 226 // with externally_connectable), not whether the app has access to messaging |
| 225 // (which it won't). | 227 // (which it won't). |
| 226 const Extension* extension = extension_.get(); | 228 const Extension* extension = extension_.get(); |
| 227 if (extension && extension->is_hosted_app() && | 229 if (extension && extension->is_hosted_app() && |
| 228 (api_name == "runtime.connect" || api_name == "runtime.sendMessage")) { | 230 (api_name == "runtime.connect" || api_name == "runtime.sendMessage")) { |
| 229 extension = NULL; | 231 extension = NULL; |
| 230 } | 232 } |
| 231 return ExtensionAPI::GetSharedInstance()->IsAvailable(api_name, extension, | 233 return ExtensionAPI::GetSharedInstance()->IsAvailable( |
| 232 context_type_, url()); | 234 api_name, extension, context_type_, session_type_, url()); |
| 233 } | 235 } |
| 234 | 236 |
| 235 void ScriptContext::DispatchEvent(const char* event_name, | 237 void ScriptContext::DispatchEvent(const char* event_name, |
| 236 v8::Local<v8::Array> args) const { | 238 v8::Local<v8::Array> args) const { |
| 237 DCHECK(thread_checker_.CalledOnValidThread()); | 239 DCHECK(thread_checker_.CalledOnValidThread()); |
| 238 v8::HandleScope handle_scope(isolate()); | 240 v8::HandleScope handle_scope(isolate()); |
| 239 v8::Context::Scope context_scope(v8_context()); | 241 v8::Context::Scope context_scope(v8_context()); |
| 240 | 242 |
| 241 v8::Local<v8::Value> argv[] = {v8::String::NewFromUtf8(isolate(), event_name), | 243 v8::Local<v8::Value> argv[] = {v8::String::NewFromUtf8(isolate(), event_name), |
| 242 args}; | 244 args}; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 254 return GetContextTypeDescriptionString(effective_context_type_); | 256 return GetContextTypeDescriptionString(effective_context_type_); |
| 255 } | 257 } |
| 256 | 258 |
| 257 bool ScriptContext::IsAnyFeatureAvailableToContext(const Feature& api) { | 259 bool ScriptContext::IsAnyFeatureAvailableToContext(const Feature& api) { |
| 258 DCHECK(thread_checker_.CalledOnValidThread()); | 260 DCHECK(thread_checker_.CalledOnValidThread()); |
| 259 // TODO(lazyboy): Decide what we should do for SERVICE_WORKER_CONTEXT. | 261 // TODO(lazyboy): Decide what we should do for SERVICE_WORKER_CONTEXT. |
| 260 GURL url = context_type() == Feature::SERVICE_WORKER_CONTEXT | 262 GURL url = context_type() == Feature::SERVICE_WORKER_CONTEXT |
| 261 ? url_ | 263 ? url_ |
| 262 : GetDataSourceURLForFrame(web_frame()); | 264 : GetDataSourceURLForFrame(web_frame()); |
| 263 return ExtensionAPI::GetSharedInstance()->IsAnyFeatureAvailableToContext( | 265 return ExtensionAPI::GetSharedInstance()->IsAnyFeatureAvailableToContext( |
| 264 api, extension(), context_type(), url); | 266 api, extension(), context_type(), session_type_, url); |
| 265 } | 267 } |
| 266 | 268 |
| 267 // static | 269 // static |
| 268 GURL ScriptContext::GetDataSourceURLForFrame(const blink::WebFrame* frame) { | 270 GURL ScriptContext::GetDataSourceURLForFrame(const blink::WebFrame* frame) { |
| 269 // Normally we would use frame->document().url() to determine the document's | 271 // Normally we would use frame->document().url() to determine the document's |
| 270 // URL, but to decide whether to inject a content script, we use the URL from | 272 // URL, but to decide whether to inject a content script, we use the URL from |
| 271 // the data source. This "quirk" helps prevents content scripts from | 273 // the data source. This "quirk" helps prevents content scripts from |
| 272 // inadvertently adding DOM elements to the compose iframe in Gmail because | 274 // inadvertently adding DOM elements to the compose iframe in Gmail because |
| 273 // the compose iframe's dataSource URL is about:blank, but the document URL | 275 // the compose iframe's dataSource URL is about:blank, but the document URL |
| 274 // changes to match the parent document after Gmail document.writes into | 276 // changes to match the parent document after Gmail document.writes into |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 v8::Local<v8::Value> argv[]) { | 503 v8::Local<v8::Value> argv[]) { |
| 502 return context_->CallFunction(function, argc, argv); | 504 return context_->CallFunction(function, argc, argv); |
| 503 } | 505 } |
| 504 | 506 |
| 505 gin::ContextHolder* ScriptContext::Runner::GetContextHolder() { | 507 gin::ContextHolder* ScriptContext::Runner::GetContextHolder() { |
| 506 v8::HandleScope handle_scope(context_->isolate()); | 508 v8::HandleScope handle_scope(context_->isolate()); |
| 507 return gin::PerContextData::From(context_->v8_context())->context_holder(); | 509 return gin::PerContextData::From(context_->v8_context())->context_holder(); |
| 508 } | 510 } |
| 509 | 511 |
| 510 } // namespace extensions | 512 } // namespace extensions |
| OLD | NEW |