Index: chrome/renderer/external_extension.cc |
diff --git a/chrome/renderer/external_extension.cc b/chrome/renderer/external_extension.cc |
index e31c42234d4410cffb41b6f6c796a96b414635e9..7b344371e505e85e9ba8d74c7e20d19fb3191d82 100644 |
--- a/chrome/renderer/external_extension.cc |
+++ b/chrome/renderer/external_extension.cc |
@@ -3,6 +3,9 @@ |
// found in the LICENSE file. |
#include "chrome/renderer/external_extension.h" |
+ |
+#include "base/command_line.h" |
+#include "chrome/common/chrome_switches.h" |
#include "chrome/renderer/render_view.h" |
#include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" |
@@ -11,54 +14,126 @@ using WebKit::WebView; |
namespace extensions_v8 { |
+#define SEARCH_PROVIDER_API_V1 \ |
+ "var external;" \ |
+ "if (!external)" \ |
+ " external = {};" \ |
+ "external.AddSearchProvider = function(name) {" \ |
+ " native function NativeAddSearchProvider();" \ |
+ " NativeAddSearchProvider(name);" \ |
+ "};" |
+ |
+static const char* const kSearchProviderApiV1 = SEARCH_PROVIDER_API_V1; |
+static const char* const kSearchProviderApiV2 = |
+ SEARCH_PROVIDER_API_V1 |
+ "external.IsSearchProviderInstalled = function(name) {" |
+ " native function NativeIsSearchProviderInstalled();" |
+ " return NativeIsSearchProviderInstalled(name);" |
+ "};"; |
+ |
+#undef SEARCH_PROVIDER_API_V1 |
+ |
const char* const kExternalExtensionName = "v8/External"; |
+// Should the new api's "IsSearchProviderInstalled and InstallSearchProvider |
+// with an extra parameter to indicate if the provider should be the default" |
+// be available? |
+static bool EnableSearchProviderV2() { |
+ return CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kEnableSearchProviderApiV2); |
+} |
+ |
class ExternalExtensionWrapper : public v8::Extension { |
public: |
- ExternalExtensionWrapper() |
- : v8::Extension( |
- kExternalExtensionName, |
- "var external;" |
- "if (!external)" |
- " external = {};" |
- "external.AddSearchProvider = function(name) {" |
- " native function NativeAddSearchProvider();" |
- " NativeAddSearchProvider(name);" |
- "}") { |
- } |
+ ExternalExtensionWrapper(); |
+ // Allows v8's javascript code to call the native functions defined |
+ // in this class for window.external. |
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>(); |
- } |
+ v8::Handle<v8::String> name); |
+ |
+ // Helper function to find the RenderView. May return NULL. |
+ static RenderView* GetRenderView(); |
+ |
+ // Implementation of window.external.AddSearchProvider. |
+ static v8::Handle<v8::Value> AddSearchProvider(const v8::Arguments& args); |
+ |
+ // Implementation of window.external.IsSearchProviderInstalled. |
+ static v8::Handle<v8::Value> IsSearchProviderInstalled( |
+ const v8::Arguments& args); |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(ExternalExtensionWrapper); |
+}; |
+ |
+ExternalExtensionWrapper::ExternalExtensionWrapper() |
+ : v8::Extension( |
+ kExternalExtensionName, |
+ !EnableSearchProviderV2() ? |
+ kSearchProviderApiV1 : kSearchProviderApiV2) { |
+} |
+ |
+v8::Handle<v8::FunctionTemplate> ExternalExtensionWrapper::GetNativeFunction( |
+ v8::Handle<v8::String> name) { |
+ if (name->Equals(v8::String::New("NativeAddSearchProvider"))) |
+ return v8::FunctionTemplate::New(AddSearchProvider); |
+ |
+ if (name->Equals(v8::String::New("NativeIsSearchProviderInstalled"))) |
+ return v8::FunctionTemplate::New(IsSearchProviderInstalled); |
+ |
+ return v8::Handle<v8::FunctionTemplate>(); |
+} |
+ |
+// static |
+RenderView* ExternalExtensionWrapper::GetRenderView() { |
+ WebFrame* webframe = WebFrame::frameForEnteredContext(); |
+ DCHECK(webframe) << "There should be an active frame since we just got " |
+ "a native function called."; |
+ if (!webframe) return NULL; |
+ |
+ WebView* webview = webframe->view(); |
+ if (!webview) return NULL; // can happen during closing |
- static v8::Handle<v8::Value> AddSearchProvider(const v8::Arguments& args) { |
- if (!args.Length()) |
- return v8::Undefined(); |
+ return RenderView::FromWebView(webview); |
+} |
+ |
+// static |
+v8::Handle<v8::Value> ExternalExtensionWrapper::AddSearchProvider( |
+ const v8::Arguments& args) { |
+ if (!args.Length()) return v8::Undefined(); |
- WebFrame* webframe = WebFrame::frameForEnteredContext(); |
- DCHECK(webframe) << "There should be an active frame since we just got " |
- "a native function called."; |
- if (!webframe) return v8::Undefined(); |
+ std::string name = std::string(*v8::String::Utf8Value(args[0])); |
+ if (!name.length()) return v8::Undefined(); |
- WebView* webview = webframe->view(); |
- if (!webview) return v8::Undefined(); // can happen during closing |
+ RenderView* render_view = GetRenderView(); |
+ if (!render_view) return v8::Undefined(); |
+ |
+ render_view->AddSearchProvider(name); |
+ return v8::Undefined(); |
+} |
- RenderView* renderview = RenderView::FromWebView(webview); |
- if (!renderview) return v8::Undefined(); |
+// static |
+v8::Handle<v8::Value> ExternalExtensionWrapper::IsSearchProviderInstalled( |
+ const v8::Arguments& args) { |
+ if (!args.Length()) return v8::Undefined(); |
- std::string name = std::string(*v8::String::Utf8Value(args[0])); |
- if (!name.length()) 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(); |
+ RenderView* render_view = GetRenderView(); |
+ if (!render_view) return v8::Undefined(); |
+ |
+ ViewHostMsg_GetSearchProviderInstallState_Params install |
+ = render_view->GetSearchProviderInstallState(name); |
+ if (install.state == |
+ ViewHostMsg_GetSearchProviderInstallState_Params::DENIED) { |
+ // FIXME: throw access denied exception. |
+ return v8::ThrowException(v8::Exception::Error(v8::String::Empty())); |
} |
-}; |
+ return v8::Integer::New(install.state); |
+} |
-v8::Extension* ExternalExtension::Get() { |
+v8::Extension* ExternalExtension::Get() { |
return new ExternalExtensionWrapper(); |
} |