| OLD | NEW |
| 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/browser/extensions/extension_function_dispatcher.h" | 5 #include "chrome/browser/extensions/extension_function_dispatcher.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/json/json_string_value_serializer.h" | 8 #include "base/json/json_string_value_serializer.h" |
| 9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 base::Bind(&IOThreadResponseCallback, ipc_sender, routing_id, | 251 base::Bind(&IOThreadResponseCallback, ipc_sender, routing_id, |
| 252 params.request_id)); | 252 params.request_id)); |
| 253 | 253 |
| 254 scoped_refptr<ExtensionFunction> function( | 254 scoped_refptr<ExtensionFunction> function( |
| 255 CreateExtensionFunction(params, extension, render_process_id, | 255 CreateExtensionFunction(params, extension, render_process_id, |
| 256 extension_info_map->process_map(), | 256 extension_info_map->process_map(), |
| 257 g_global_io_data.Get().api.get(), | 257 g_global_io_data.Get().api.get(), |
| 258 profile, callback)); | 258 profile, callback)); |
| 259 scoped_ptr<ListValue> args(params.arguments.DeepCopy()); | 259 scoped_ptr<ListValue> args(params.arguments.DeepCopy()); |
| 260 | 260 |
| 261 if (!function) { | 261 if (!function.get()) { |
| 262 LogFailure(extension, | 262 LogFailure(extension, |
| 263 params.name, | 263 params.name, |
| 264 args.Pass(), | 264 args.Pass(), |
| 265 extensions::BlockedAction::ACCESS_DENIED, | 265 extensions::BlockedAction::ACCESS_DENIED, |
| 266 profile_cast); | 266 profile_cast); |
| 267 return; | 267 return; |
| 268 } | 268 } |
| 269 | 269 |
| 270 IOThreadExtensionFunction* function_io = | 270 IOThreadExtensionFunction* function_io = |
| 271 function->AsIOThreadExtensionFunction(); | 271 function->AsIOThreadExtensionFunction(); |
| 272 if (!function_io) { | 272 if (!function_io) { |
| 273 NOTREACHED(); | 273 NOTREACHED(); |
| 274 return; | 274 return; |
| 275 } | 275 } |
| 276 function_io->set_ipc_sender(ipc_sender); | 276 function_io->set_ipc_sender(ipc_sender); |
| 277 function_io->set_extension_info_map(extension_info_map); | 277 function_io->set_extension_info_map(extension_info_map); |
| 278 function->set_include_incognito( | 278 function->set_include_incognito( |
| 279 extension_info_map->IsIncognitoEnabled(extension->id())); | 279 extension_info_map->IsIncognitoEnabled(extension->id())); |
| 280 | 280 |
| 281 if (!CheckPermissions(function, extension, params, callback)) { | 281 if (!CheckPermissions(function.get(), extension, params, callback)) { |
| 282 LogFailure(extension, | 282 LogFailure(extension, |
| 283 params.name, | 283 params.name, |
| 284 args.Pass(), | 284 args.Pass(), |
| 285 extensions::BlockedAction::ACCESS_DENIED, | 285 extensions::BlockedAction::ACCESS_DENIED, |
| 286 profile_cast); | 286 profile_cast); |
| 287 return; | 287 return; |
| 288 } | 288 } |
| 289 | 289 |
| 290 ExtensionsQuotaService* quota = extension_info_map->GetQuotaService(); | 290 ExtensionsQuotaService* quota = extension_info_map->GetQuotaService(); |
| 291 std::string violation_error = quota->Assess(extension->id(), | 291 std::string violation_error = quota->Assess(extension->id(), |
| 292 function, | 292 function.get(), |
| 293 ¶ms.arguments, | 293 ¶ms.arguments, |
| 294 base::TimeTicks::Now()); | 294 base::TimeTicks::Now()); |
| 295 if (violation_error.empty()) { | 295 if (violation_error.empty()) { |
| 296 LogSuccess(extension, | 296 LogSuccess(extension, |
| 297 params.name, | 297 params.name, |
| 298 args.Pass(), | 298 args.Pass(), |
| 299 profile_cast); | 299 profile_cast); |
| 300 function->Run(); | 300 function->Run(); |
| 301 } else { | 301 } else { |
| 302 LogFailure(extension, | 302 LogFailure(extension, |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 params.source_url)); | 356 params.source_url)); |
| 357 | 357 |
| 358 scoped_refptr<ExtensionFunction> function( | 358 scoped_refptr<ExtensionFunction> function( |
| 359 CreateExtensionFunction(params, extension, | 359 CreateExtensionFunction(params, extension, |
| 360 render_view_host->GetProcess()->GetID(), | 360 render_view_host->GetProcess()->GetID(), |
| 361 *(service->process_map()), | 361 *(service->process_map()), |
| 362 extensions::ExtensionAPI::GetSharedInstance(), | 362 extensions::ExtensionAPI::GetSharedInstance(), |
| 363 profile(), callback)); | 363 profile(), callback)); |
| 364 scoped_ptr<ListValue> args(params.arguments.DeepCopy()); | 364 scoped_ptr<ListValue> args(params.arguments.DeepCopy()); |
| 365 | 365 |
| 366 if (!function) { | 366 if (!function.get()) { |
| 367 LogFailure(extension, | 367 LogFailure(extension, |
| 368 params.name, | 368 params.name, |
| 369 args.Pass(), | 369 args.Pass(), |
| 370 extensions::BlockedAction::ACCESS_DENIED, | 370 extensions::BlockedAction::ACCESS_DENIED, |
| 371 profile()); | 371 profile()); |
| 372 return; | 372 return; |
| 373 } | 373 } |
| 374 | 374 |
| 375 UIThreadExtensionFunction* function_ui = | 375 UIThreadExtensionFunction* function_ui = |
| 376 function->AsUIThreadExtensionFunction(); | 376 function->AsUIThreadExtensionFunction(); |
| 377 if (!function_ui) { | 377 if (!function_ui) { |
| 378 NOTREACHED(); | 378 NOTREACHED(); |
| 379 return; | 379 return; |
| 380 } | 380 } |
| 381 function_ui->SetRenderViewHost(render_view_host); | 381 function_ui->SetRenderViewHost(render_view_host); |
| 382 function_ui->set_dispatcher(AsWeakPtr()); | 382 function_ui->set_dispatcher(AsWeakPtr()); |
| 383 function_ui->set_profile(profile_); | 383 function_ui->set_profile(profile_); |
| 384 function->set_include_incognito(service->CanCrossIncognito(extension)); | 384 function->set_include_incognito(service->CanCrossIncognito(extension)); |
| 385 | 385 |
| 386 if (!CheckPermissions(function, extension, params, callback)) { | 386 if (!CheckPermissions(function.get(), extension, params, callback)) { |
| 387 LogFailure(extension, | 387 LogFailure(extension, |
| 388 params.name, | 388 params.name, |
| 389 args.Pass(), | 389 args.Pass(), |
| 390 extensions::BlockedAction::ACCESS_DENIED, | 390 extensions::BlockedAction::ACCESS_DENIED, |
| 391 profile()); | 391 profile()); |
| 392 return; | 392 return; |
| 393 } | 393 } |
| 394 | 394 |
| 395 ExtensionsQuotaService* quota = service->quota_service(); | 395 ExtensionsQuotaService* quota = service->quota_service(); |
| 396 std::string violation_error = quota->Assess(extension->id(), | 396 std::string violation_error = quota->Assess(extension->id(), |
| 397 function, | 397 function.get(), |
| 398 ¶ms.arguments, | 398 ¶ms.arguments, |
| 399 base::TimeTicks::Now()); | 399 base::TimeTicks::Now()); |
| 400 if (violation_error.empty()) { | 400 if (violation_error.empty()) { |
| 401 // See crbug.com/39178. | 401 // See crbug.com/39178. |
| 402 ExternalProtocolHandler::PermitLaunchUrl(); | 402 ExternalProtocolHandler::PermitLaunchUrl(); |
| 403 LogSuccess(extension, params.name, args.Pass(), profile()); | 403 LogSuccess(extension, params.name, args.Pass(), profile()); |
| 404 function->Run(); | 404 function->Run(); |
| 405 } else { | 405 } else { |
| 406 LogFailure(extension, | 406 LogFailure(extension, |
| 407 params.name, | 407 params.name, |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 return function; | 526 return function; |
| 527 } | 527 } |
| 528 | 528 |
| 529 // static | 529 // static |
| 530 void ExtensionFunctionDispatcher::SendAccessDenied( | 530 void ExtensionFunctionDispatcher::SendAccessDenied( |
| 531 const ExtensionFunction::ResponseCallback& callback) { | 531 const ExtensionFunction::ResponseCallback& callback) { |
| 532 ListValue empty_list; | 532 ListValue empty_list; |
| 533 callback.Run(ExtensionFunction::FAILED, empty_list, | 533 callback.Run(ExtensionFunction::FAILED, empty_list, |
| 534 "Access to extension API denied."); | 534 "Access to extension API denied."); |
| 535 } | 535 } |
| OLD | NEW |