| 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/renderer/extensions/miscellaneous_bindings.h" | 5 #include "chrome/renderer/extensions/miscellaneous_bindings.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction( | 77 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction( |
| 78 v8::Handle<v8::String> name) { | 78 v8::Handle<v8::String> name) { |
| 79 if (name->Equals(v8::String::New("PostMessage"))) { | 79 if (name->Equals(v8::String::New("PostMessage"))) { |
| 80 return v8::FunctionTemplate::New(PostMessage); | 80 return v8::FunctionTemplate::New(PostMessage); |
| 81 } else if (name->Equals(v8::String::New("CloseChannel"))) { | 81 } else if (name->Equals(v8::String::New("CloseChannel"))) { |
| 82 return v8::FunctionTemplate::New(CloseChannel); | 82 return v8::FunctionTemplate::New(CloseChannel); |
| 83 } else if (name->Equals(v8::String::New("PortAddRef"))) { | 83 } else if (name->Equals(v8::String::New("PortAddRef"))) { |
| 84 return v8::FunctionTemplate::New(PortAddRef); | 84 return v8::FunctionTemplate::New(PortAddRef); |
| 85 } else if (name->Equals(v8::String::New("PortRelease"))) { | 85 } else if (name->Equals(v8::String::New("PortRelease"))) { |
| 86 return v8::FunctionTemplate::New(PortRelease); | 86 return v8::FunctionTemplate::New(PortRelease); |
| 87 } else if (name->Equals(v8::String::New("BindToGC"))) { |
| 88 return v8::FunctionTemplate::New(BindToGC); |
| 87 } | 89 } |
| 88 return ChromeV8Extension::GetNativeFunction(name); | 90 return ChromeV8Extension::GetNativeFunction(name); |
| 89 } | 91 } |
| 90 | 92 |
| 91 // Sends a message along the given channel. | 93 // Sends a message along the given channel. |
| 92 static v8::Handle<v8::Value> PostMessage(const v8::Arguments& args) { | 94 static v8::Handle<v8::Value> PostMessage(const v8::Arguments& args) { |
| 93 content::RenderView* renderview = GetCurrentRenderView(); | 95 content::RenderView* renderview = GetCurrentRenderView(); |
| 94 if (!renderview) | 96 if (!renderview) |
| 95 return v8::Undefined(); | 97 return v8::Undefined(); |
| 96 | 98 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 int port_id = args[0]->Int32Value(); | 144 int port_id = args[0]->Int32Value(); |
| 143 if (HasPortData(port_id) && --GetPortData(port_id).ref_count == 0) { | 145 if (HasPortData(port_id) && --GetPortData(port_id).ref_count == 0) { |
| 144 // Send via the RenderThread because the RenderView might be closing. | 146 // Send via the RenderThread because the RenderView might be closing. |
| 145 content::RenderThread::Get()->Send( | 147 content::RenderThread::Get()->Send( |
| 146 new ExtensionHostMsg_CloseChannel(port_id)); | 148 new ExtensionHostMsg_CloseChannel(port_id)); |
| 147 ClearPortData(port_id); | 149 ClearPortData(port_id); |
| 148 } | 150 } |
| 149 } | 151 } |
| 150 return v8::Undefined(); | 152 return v8::Undefined(); |
| 151 } | 153 } |
| 154 |
| 155 struct GCCallbackArgs { |
| 156 v8::Persistent<v8::Object> object; |
| 157 v8::Persistent<v8::Function> callback; |
| 158 }; |
| 159 |
| 160 static void GCCallback(v8::Persistent<v8::Value> object, void* parameter) { |
| 161 v8::HandleScope handle_scope; |
| 162 GCCallbackArgs* args = reinterpret_cast<GCCallbackArgs*>(parameter); |
| 163 args->callback->Call(args->callback->CreationContext()->Global(), 0, NULL); |
| 164 args->callback.Dispose(); |
| 165 args->object.Dispose(); |
| 166 delete args; |
| 167 } |
| 168 |
| 169 // Binds a callback to be invoked when the given object is garbage collected. |
| 170 static v8::Handle<v8::Value> BindToGC(const v8::Arguments& args) { |
| 171 if (args.Length() == 2 && args[0]->IsObject() && args[1]->IsFunction()) { |
| 172 GCCallbackArgs* context = new GCCallbackArgs; |
| 173 context->callback = v8::Persistent<v8::Function>::New( |
| 174 v8::Handle<v8::Function>::Cast(args[1])); |
| 175 context->object = v8::Persistent<v8::Object>::New( |
| 176 v8::Handle<v8::Object>::Cast(args[0])); |
| 177 context->object.MakeWeak(context, GCCallback); |
| 178 } else { |
| 179 NOTREACHED(); |
| 180 } |
| 181 return v8::Undefined(); |
| 182 } |
| 152 }; | 183 }; |
| 153 | 184 |
| 154 } // namespace | 185 } // namespace |
| 155 | 186 |
| 156 namespace extensions { | 187 namespace extensions { |
| 157 | 188 |
| 158 v8::Extension* MiscellaneousBindings::Get(ExtensionDispatcher* dispatcher) { | 189 v8::Extension* MiscellaneousBindings::Get(ExtensionDispatcher* dispatcher) { |
| 159 static v8::Extension* extension = new ExtensionImpl(dispatcher); | 190 static v8::Extension* extension = new ExtensionImpl(dispatcher); |
| 160 return extension; | 191 return extension; |
| 161 } | 192 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 192 arguments.push_back(v8::String::New(message.c_str(), message.size())); | 223 arguments.push_back(v8::String::New(message.c_str(), message.size())); |
| 193 arguments.push_back(port_id_handle); | 224 arguments.push_back(port_id_handle); |
| 194 CHECK((*it)->CallChromeHiddenMethod("Port.dispatchOnMessage", | 225 CHECK((*it)->CallChromeHiddenMethod("Port.dispatchOnMessage", |
| 195 arguments.size(), | 226 arguments.size(), |
| 196 &arguments[0], | 227 &arguments[0], |
| 197 NULL)); | 228 NULL)); |
| 198 } | 229 } |
| 199 } | 230 } |
| 200 | 231 |
| 201 } // namespace extension | 232 } // namespace extension |
| OLD | NEW |