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 |