| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
| 10 #include "base/memory/singleton.h" | 10 #include "base/memory/singleton.h" |
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 function->set_has_callback(params.has_callback); | 479 function->set_has_callback(params.has_callback); |
| 480 function->set_user_gesture(params.user_gesture); | 480 function->set_user_gesture(params.user_gesture); |
| 481 ExtensionService* service = profile()->GetExtensionService(); | 481 ExtensionService* service = profile()->GetExtensionService(); |
| 482 DCHECK(service); | 482 DCHECK(service); |
| 483 const Extension* extension = service->GetExtensionById(extension_id(), false); | 483 const Extension* extension = service->GetExtensionById(extension_id(), false); |
| 484 DCHECK(extension); | 484 DCHECK(extension); |
| 485 function->set_include_incognito(service->CanCrossIncognito(extension)); | 485 function->set_include_incognito(service->CanCrossIncognito(extension)); |
| 486 | 486 |
| 487 if (!service->ExtensionBindingsAllowed(function->source_url()) || | 487 if (!service->ExtensionBindingsAllowed(function->source_url()) || |
| 488 !extension->HasApiPermission(function->name())) { | 488 !extension->HasApiPermission(function->name())) { |
| 489 render_view_host_->BlockExtensionRequest(function->request_id()); | 489 render_view_host_->Send(new ExtensionMsg_Response( |
| 490 render_view_host_->routing_id(), function->request_id(), false, |
| 491 std::string(), "Access to extension API denied.")); |
| 490 return; | 492 return; |
| 491 } | 493 } |
| 492 | 494 |
| 493 ExtensionsQuotaService* quota = service->quota_service(); | 495 ExtensionsQuotaService* quota = service->quota_service(); |
| 494 if (quota->Assess(extension_id(), function, ¶ms.arguments, | 496 if (quota->Assess(extension_id(), function, ¶ms.arguments, |
| 495 base::TimeTicks::Now())) { | 497 base::TimeTicks::Now())) { |
| 496 // See crbug.com/39178. | 498 // See crbug.com/39178. |
| 497 ExternalProtocolHandler::PermitLaunchUrl(); | 499 ExternalProtocolHandler::PermitLaunchUrl(); |
| 498 | 500 |
| 499 function->Run(); | 501 function->Run(); |
| 500 } else { | 502 } else { |
| 501 render_view_host_->SendExtensionResponse(function->request_id(), false, | 503 render_view_host_->Send(new ExtensionMsg_Response( |
| 502 std::string(), QuotaLimitHeuristic::kGenericOverQuotaError); | 504 render_view_host_->routing_id(), function->request_id(), false, |
| 505 std::string(), QuotaLimitHeuristic::kGenericOverQuotaError)); |
| 503 } | 506 } |
| 504 } | 507 } |
| 505 | 508 |
| 506 void ExtensionFunctionDispatcher::SendResponse(ExtensionFunction* function, | 509 void ExtensionFunctionDispatcher::SendResponse(ExtensionFunction* function, |
| 507 bool success) { | 510 bool success) { |
| 508 render_view_host_->SendExtensionResponse(function->request_id(), success, | 511 render_view_host_->Send(new ExtensionMsg_Response( |
| 509 function->GetResult(), function->GetError()); | 512 render_view_host_->routing_id(), function->request_id(), success, |
| 513 function->GetResult(), function->GetError())); |
| 510 } | 514 } |
| 511 | 515 |
| 512 void ExtensionFunctionDispatcher::HandleBadMessage(ExtensionFunction* api) { | 516 void ExtensionFunctionDispatcher::HandleBadMessage(ExtensionFunction* api) { |
| 513 LOG(ERROR) << "bad extension message " << | 517 LOG(ERROR) << "bad extension message " << |
| 514 api->name() << | 518 api->name() << |
| 515 " : terminating renderer."; | 519 " : terminating renderer."; |
| 516 if (RenderProcessHost::run_renderer_in_process()) { | 520 if (RenderProcessHost::run_renderer_in_process()) { |
| 517 // In single process mode it is better if we don't suicide but just crash. | 521 // In single process mode it is better if we don't suicide but just crash. |
| 518 CHECK(false); | 522 CHECK(false); |
| 519 } else { | 523 } else { |
| 520 NOTREACHED(); | 524 NOTREACHED(); |
| 521 UserMetrics::RecordAction(UserMetricsAction("BadMessageTerminate_EFD")); | 525 UserMetrics::RecordAction(UserMetricsAction("BadMessageTerminate_EFD")); |
| 522 base::KillProcess(render_view_host_->process()->GetHandle(), | 526 base::KillProcess(render_view_host_->process()->GetHandle(), |
| 523 ResultCodes::KILLED_BAD_MESSAGE, false); | 527 ResultCodes::KILLED_BAD_MESSAGE, false); |
| 524 } | 528 } |
| 525 } | 529 } |
| 526 | 530 |
| 527 Profile* ExtensionFunctionDispatcher::profile() { | 531 Profile* ExtensionFunctionDispatcher::profile() { |
| 528 return profile_; | 532 return profile_; |
| 529 } | 533 } |
| OLD | NEW |