| Index: chrome/renderer/extensions/extension_process_bindings.cc
|
| diff --git a/chrome/renderer/extensions/extension_process_bindings.cc b/chrome/renderer/extensions/extension_process_bindings.cc
|
| index 5472dce03cb0b510566aa2431b667eecde6865e7..c1aa392ec2ef07f16ce53f9f891f86a7a65ccbbb 100644
|
| --- a/chrome/renderer/extensions/extension_process_bindings.cc
|
| +++ b/chrome/renderer/extensions/extension_process_bindings.cc
|
| @@ -66,11 +66,13 @@ const char* kExtensionDeps[] = {
|
| // Contains info relevant to a pending API request.
|
| struct PendingRequest {
|
| public :
|
| - PendingRequest(v8::Persistent<v8::Context> context, const std::string& name)
|
| - : context(context), name(name) {
|
| + PendingRequest(v8::Persistent<v8::Context> context, const std::string& name,
|
| + const std::string& extension_id)
|
| + : context(context), name(name), extension_id(extension_id) {
|
| }
|
| v8::Persistent<v8::Context> context;
|
| std::string name;
|
| + std::string extension_id;
|
| };
|
| typedef std::map<int, linked_ptr<PendingRequest> > PendingRequestMap;
|
|
|
| @@ -473,7 +475,7 @@ class ExtensionImpl : public ChromeV8Extension {
|
| v8::Persistent<v8::Context>::New(v8::Context::GetCurrent());
|
| DCHECK(!v8_context.IsEmpty());
|
| g_pending_requests.Get()[request_id].reset(new PendingRequest(
|
| - v8_context, name));
|
| + v8_context, name, current_context->extension_id()));
|
|
|
| ExtensionHostMsg_Request_Params params;
|
| params.name = name;
|
| @@ -605,7 +607,8 @@ void ExtensionProcessBindings::HandleResponse(
|
| int request_id,
|
| bool success,
|
| const std::string& response,
|
| - const std::string& error) {
|
| + const std::string& error,
|
| + std::string* extension_id) {
|
| PendingRequestMap::iterator request =
|
| g_pending_requests.Get().find(request_id);
|
| if (request == g_pending_requests.Get().end()) {
|
| @@ -642,7 +645,21 @@ void ExtensionProcessBindings::HandleResponse(
|
| }
|
| #endif
|
|
|
| + // Save the extension id before erasing the request.
|
| + *extension_id = request->second->extension_id;
|
| +
|
| request->second->context.Dispose();
|
| request->second->context.Clear();
|
| g_pending_requests.Get().erase(request);
|
| }
|
| +
|
| +// static
|
| +bool ExtensionProcessBindings::HasPendingRequests(
|
| + const std::string& extension_id) {
|
| + for (PendingRequestMap::const_iterator it = g_pending_requests.Get().begin();
|
| + it != g_pending_requests.Get().end(); ++it) {
|
| + if (it->second->extension_id == extension_id)
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
|
|