Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1610)

Unified Diff: chrome/renderer/external_extension.cc

Issue 2823042: Implement IsSearchProviderInstalled and a test for it. (Closed)
Patch Set: Addressed feedback. Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
}

Powered by Google App Engine
This is Rietveld 408576698