Chromium Code Reviews| Index: chrome/renderer/extensions/renderer_extension_bindings.cc |
| diff --git a/chrome/renderer/extensions/renderer_extension_bindings.cc b/chrome/renderer/extensions/renderer_extension_bindings.cc |
| index de958d1323f97892cf8debe366ae70ca39f1ae47..61ab90dbe5b4e3e9ccad939476cefa70c7e5930c 100644 |
| --- a/chrome/renderer/extensions/renderer_extension_bindings.cc |
| +++ b/chrome/renderer/extensions/renderer_extension_bindings.cc |
| @@ -37,10 +37,18 @@ struct ExtensionData { |
| }; |
| std::map<int, PortData> ports; // port ID -> data |
| }; |
| +bool HasPortData(int port_id) { |
| + return Singleton<ExtensionData>::get()->ports.find(port_id) != |
| + Singleton<ExtensionData>::get()->ports.end(); |
| +} |
| ExtensionData::PortData& GetPortData(int port_id) { |
| return Singleton<ExtensionData>::get()->ports[port_id]; |
| } |
| +void ClearPortData(int port_id) { |
| + Singleton<ExtensionData>::get()->ports.erase(port_id); |
| +} |
| +const char kPortClosedError[] = "Attempting to use a disconnected port object"; |
| const char* kExtensionDeps[] = { EventBindings::kName }; |
| class ExtensionImpl : public ExtensionBase { |
| @@ -99,6 +107,10 @@ class ExtensionImpl : public ExtensionBase { |
| if (args.Length() >= 2 && args[0]->IsInt32() && args[1]->IsString()) { |
| int port_id = args[0]->Int32Value(); |
| + if (!HasPortData(port_id)) { |
| + return v8::ThrowException(v8::Exception::Error( |
| + v8::String::New(kPortClosedError))); |
| + } |
| std::string message = *v8::String::Utf8Value(args[1]->ToString()); |
| renderview->Send(new ViewHostMsg_ExtensionPostMessage( |
| renderview->routing_id(), port_id, message)); |
| @@ -110,10 +122,14 @@ class ExtensionImpl : public ExtensionBase { |
| static v8::Handle<v8::Value> CloseChannel(const v8::Arguments& args) { |
| if (args.Length() >= 1 && args[0]->IsInt32()) { |
| int port_id = args[0]->Int32Value(); |
| + if (!HasPortData(port_id)) { |
|
Aaron Boodman
2009/10/31 19:21:22
Maybe we don't want to throw here? It seems nice t
Matt Perry
2009/11/03 00:39:36
Done.
|
| + return v8::ThrowException(v8::Exception::Error( |
| + v8::String::New(kPortClosedError))); |
| + } |
| // Send via the RenderThread because the RenderView might be closing. |
| EventBindings::GetRenderThread()->Send( |
| new ViewHostMsg_ExtensionCloseChannel(port_id)); |
| - GetPortData(port_id).disconnected = true; |
| + ClearPortData(port_id); |
| } |
| return v8::Undefined(); |
| } |
| @@ -134,11 +150,11 @@ class ExtensionImpl : public ExtensionBase { |
| static v8::Handle<v8::Value> PortRelease(const v8::Arguments& args) { |
| if (args.Length() >= 1 && args[0]->IsInt32()) { |
| int port_id = args[0]->Int32Value(); |
| - if (!GetPortData(port_id).disconnected && |
| - --GetPortData(port_id).ref_count == 0) { |
| + if (HasPortData(port_id) && --GetPortData(port_id).ref_count == 0) { |
| // Send via the RenderThread because the RenderView might be closing. |
| EventBindings::GetRenderThread()->Send( |
| new ViewHostMsg_ExtensionCloseChannel(port_id)); |
| + ClearPortData(port_id); |
| } |
| } |
| return v8::Undefined(); |