| Index: chrome/renderer/external_extension.cc
|
| ===================================================================
|
| --- chrome/renderer/external_extension.cc (revision 0)
|
| +++ chrome/renderer/external_extension.cc (revision 0)
|
| @@ -0,0 +1,61 @@
|
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/renderer/external_extension.h"
|
| +#include "chrome/renderer/render_view.h"
|
| +#include "webkit/glue/webframe.h"
|
| +
|
| +namespace extensions_v8 {
|
| +
|
| +const char* kExternalExtensionName = "v8/External";
|
| +
|
| +class ExternalExtensionWrapper : public v8::Extension {
|
| + public:
|
| + ExternalExtensionWrapper()
|
| + : v8::Extension(
|
| + kExternalExtensionName,
|
| + "var external;"
|
| + "if (!external)"
|
| + " external = {};"
|
| + "external.AddSearchProvider = function(name) {"
|
| + " native function NativeAddSearchProvider();"
|
| + " NativeAddSearchProvider(name);"
|
| + "}") {}
|
| +
|
| + virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction(
|
| + v8::Handle<v8::String> name) {
|
| + if (name->Equals(v8::String::New("NativeAddSearchProvider"))) {
|
| + return v8::FunctionTemplate::New(AddSearchProvider);
|
| + }
|
| + return v8::Handle<v8::FunctionTemplate>();
|
| + }
|
| +
|
| + static v8::Handle<v8::Value> AddSearchProvider(const v8::Arguments& args) {
|
| + if (!args.Length())
|
| + return v8::Undefined();
|
| +
|
| + WebFrame* webframe = WebFrame::RetrieveActiveFrame();
|
| + DCHECK(webframe) << "There should be an active frame since we just got "
|
| + "a native function called.";
|
| + if (!webframe) return v8::Undefined();
|
| +
|
| + WebView* webview = webframe->GetView();
|
| + if (!webview) return v8::Undefined(); // can happen during closing
|
| +
|
| + RenderView* renderview = static_cast<RenderView*>(webview->GetDelegate());
|
| + if (!renderview) return v8::Undefined();
|
| +
|
| + std::string name = std::string(*v8::String::Utf8Value(args[0]));
|
| + if (!name.length()) return v8::Undefined();;
|
| +
|
| + renderview->AddSearchProvider(name);
|
| + return v8::Undefined();
|
| + }
|
| +};
|
| +
|
| +v8::Extension* ExternalExtension::Get() {
|
| + return new ExternalExtensionWrapper();
|
| +}
|
| +
|
| +} // namespace extensions_v8
|
|
|