| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/external_extension.h" | 5 #include "chrome/renderer/external_extension.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "chrome/common/chrome_switches.h" | 8 #include "chrome/common/chrome_switches.h" |
| 9 #include "chrome/common/render_messages.h" | 9 #include "chrome/common/render_messages.h" |
| 10 #include "chrome/common/search_provider.h" | 10 #include "chrome/common/search_provider.h" |
| 11 #include "content/public/renderer/render_view.h" | 11 #include "content/public/renderer/render_view.h" |
| 12 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" | 12 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" |
| 13 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | 13 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
| 14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" | 14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
| 15 #include "v8/include/v8.h" | 15 #include "v8/include/v8.h" |
| 16 | 16 |
| 17 using WebKit::WebFrame; | 17 using WebKit::WebFrame; |
| 18 using WebKit::WebView; | 18 using WebKit::WebView; |
| 19 using content::RenderView; | 19 using content::RenderView; |
| 20 | 20 |
| 21 namespace extensions_v8 { | 21 namespace extensions_v8 { |
| 22 | 22 |
| 23 static const char* const kSearchProviderApiV1 = | 23 static const char* const kSearchProviderApi = |
| 24 "var external;" | 24 "var external;" |
| 25 "if (!external)" | 25 "if (!external)" |
| 26 " external = {};" | 26 " external = {};" |
| 27 "external.AddSearchProvider = function(name) {" | 27 "external.AddSearchProvider = function(name) {" |
| 28 " native function NativeAddSearchProvider();" | 28 " native function NativeAddSearchProvider();" |
| 29 " NativeAddSearchProvider(name);" | 29 " NativeAddSearchProvider(name);" |
| 30 "};"; | |
| 31 | |
| 32 static const char* const kSearchProviderApiV2 = | |
| 33 "var external;" | |
| 34 "if (!external)" | |
| 35 " external = {};" | |
| 36 "external.AddSearchProvider = function(name, default_provider) {" | |
| 37 " native function NativeAddSearchProvider();" | |
| 38 " NativeAddSearchProvider(name, default_provider);" | |
| 39 "};" | 30 "};" |
| 40 "external.IsSearchProviderInstalled = function(name) {" | 31 "external.IsSearchProviderInstalled = function(name) {" |
| 41 " native function NativeIsSearchProviderInstalled();" | 32 " native function NativeIsSearchProviderInstalled();" |
| 42 " return NativeIsSearchProviderInstalled(name);" | 33 " return NativeIsSearchProviderInstalled(name);" |
| 43 "};"; | 34 "};"; |
| 44 | 35 |
| 45 #undef SEARCH_PROVIDER_API_V1 | |
| 46 | |
| 47 const char* const kExternalExtensionName = "v8/External"; | 36 const char* const kExternalExtensionName = "v8/External"; |
| 48 | 37 |
| 49 // Should the new api's "IsSearchProviderInstalled and InstallSearchProvider | |
| 50 // with an extra parameter to indicate if the provider should be the default" | |
| 51 // be available? | |
| 52 static bool EnableSearchProviderV2() { | |
| 53 #if defined(OS_WIN) | |
| 54 return true; | |
| 55 #else | |
| 56 return CommandLine::ForCurrentProcess()->HasSwitch( | |
| 57 switches::kEnableSearchProviderApiV2); | |
| 58 #endif | |
| 59 } | |
| 60 | |
| 61 class ExternalExtensionWrapper : public v8::Extension { | 38 class ExternalExtensionWrapper : public v8::Extension { |
| 62 public: | 39 public: |
| 63 ExternalExtensionWrapper(); | 40 ExternalExtensionWrapper(); |
| 64 | 41 |
| 65 // Allows v8's javascript code to call the native functions defined | 42 // Allows v8's javascript code to call the native functions defined |
| 66 // in this class for window.external. | 43 // in this class for window.external. |
| 67 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction( | 44 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction( |
| 68 v8::Handle<v8::String> name); | 45 v8::Handle<v8::String> name); |
| 69 | 46 |
| 70 // Helper function to find the RenderView. May return NULL. | 47 // Helper function to find the RenderView. May return NULL. |
| 71 static RenderView* GetRenderView(); | 48 static RenderView* GetRenderView(); |
| 72 | 49 |
| 73 // Implementation of window.external.AddSearchProvider. | 50 // Implementation of window.external.AddSearchProvider. |
| 74 static v8::Handle<v8::Value> AddSearchProvider(const v8::Arguments& args); | 51 static v8::Handle<v8::Value> AddSearchProvider(const v8::Arguments& args); |
| 75 | 52 |
| 76 // Implementation of window.external.IsSearchProviderInstalled. | 53 // Implementation of window.external.IsSearchProviderInstalled. |
| 77 static v8::Handle<v8::Value> IsSearchProviderInstalled( | 54 static v8::Handle<v8::Value> IsSearchProviderInstalled( |
| 78 const v8::Arguments& args); | 55 const v8::Arguments& args); |
| 79 | 56 |
| 80 private: | 57 private: |
| 81 DISALLOW_COPY_AND_ASSIGN(ExternalExtensionWrapper); | 58 DISALLOW_COPY_AND_ASSIGN(ExternalExtensionWrapper); |
| 82 }; | 59 }; |
| 83 | 60 |
| 84 ExternalExtensionWrapper::ExternalExtensionWrapper() | 61 ExternalExtensionWrapper::ExternalExtensionWrapper() |
| 85 : v8::Extension( | 62 : v8::Extension( |
| 86 kExternalExtensionName, | 63 kExternalExtensionName, |
| 87 !EnableSearchProviderV2() ? | 64 kSearchProviderApi) { |
| 88 kSearchProviderApiV1 : kSearchProviderApiV2) { | |
| 89 } | 65 } |
| 90 | 66 |
| 91 v8::Handle<v8::FunctionTemplate> ExternalExtensionWrapper::GetNativeFunction( | 67 v8::Handle<v8::FunctionTemplate> ExternalExtensionWrapper::GetNativeFunction( |
| 92 v8::Handle<v8::String> name) { | 68 v8::Handle<v8::String> name) { |
| 93 if (name->Equals(v8::String::New("NativeAddSearchProvider"))) | 69 if (name->Equals(v8::String::New("NativeAddSearchProvider"))) |
| 94 return v8::FunctionTemplate::New(AddSearchProvider); | 70 return v8::FunctionTemplate::New(AddSearchProvider); |
| 95 | 71 |
| 96 if (name->Equals(v8::String::New("NativeIsSearchProviderInstalled"))) | 72 if (name->Equals(v8::String::New("NativeIsSearchProviderInstalled"))) |
| 97 return v8::FunctionTemplate::New(IsSearchProviderInstalled); | 73 return v8::FunctionTemplate::New(IsSearchProviderInstalled); |
| 98 | 74 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 113 } | 89 } |
| 114 | 90 |
| 115 // static | 91 // static |
| 116 v8::Handle<v8::Value> ExternalExtensionWrapper::AddSearchProvider( | 92 v8::Handle<v8::Value> ExternalExtensionWrapper::AddSearchProvider( |
| 117 const v8::Arguments& args) { | 93 const v8::Arguments& args) { |
| 118 if (!args.Length()) return v8::Undefined(); | 94 if (!args.Length()) return v8::Undefined(); |
| 119 | 95 |
| 120 std::string name = std::string(*v8::String::Utf8Value(args[0])); | 96 std::string name = std::string(*v8::String::Utf8Value(args[0])); |
| 121 if (!name.length()) return v8::Undefined(); | 97 if (!name.length()) return v8::Undefined(); |
| 122 | 98 |
| 123 search_provider::OSDDType provider_type = | |
| 124 ((args.Length() < 2) || !args[1]->BooleanValue()) ? | |
| 125 search_provider::EXPLICIT_PROVIDER : | |
| 126 search_provider::EXPLICIT_DEFAULT_PROVIDER; | |
| 127 | |
| 128 RenderView* render_view = GetRenderView(); | 99 RenderView* render_view = GetRenderView(); |
| 129 if (!render_view) return v8::Undefined(); | 100 if (!render_view) return v8::Undefined(); |
| 130 | 101 |
| 131 if (provider_type != search_provider::EXPLICIT_DEFAULT_PROVIDER || | 102 GURL osd_url(name); |
| 132 render_view->GetWebView()->mainFrame()->isProcessingUserGesture()) { | 103 if (!osd_url.is_empty()) { |
| 133 GURL osd_url(name); | 104 render_view->Send(new ChromeViewHostMsg_PageHasOSDD( |
| 134 if (!osd_url.is_empty()) { | 105 render_view->GetRoutingId(), render_view->GetPageId(), osd_url, |
| 135 render_view->Send(new ChromeViewHostMsg_PageHasOSDD( | 106 search_provider::EXPLICIT_PROVIDER)); |
| 136 render_view->GetRoutingId(), render_view->GetPageId(), osd_url, | |
| 137 provider_type)); | |
| 138 } | |
| 139 } | 107 } |
| 140 | 108 |
| 141 return v8::Undefined(); | 109 return v8::Undefined(); |
| 142 } | 110 } |
| 143 | 111 |
| 144 // static | 112 // static |
| 145 v8::Handle<v8::Value> ExternalExtensionWrapper::IsSearchProviderInstalled( | 113 v8::Handle<v8::Value> ExternalExtensionWrapper::IsSearchProviderInstalled( |
| 146 const v8::Arguments& args) { | 114 const v8::Arguments& args) { |
| 147 if (!args.Length()) return v8::Undefined(); | 115 if (!args.Length()) return v8::Undefined(); |
| 148 v8::String::Utf8Value utf8name(args[0]); | 116 v8::String::Utf8Value utf8name(args[0]); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 170 return v8::ThrowException(v8::Exception::Error(v8::String::Empty())); | 138 return v8::ThrowException(v8::Exception::Error(v8::String::Empty())); |
| 171 } | 139 } |
| 172 return v8::Integer::New(install); | 140 return v8::Integer::New(install); |
| 173 } | 141 } |
| 174 | 142 |
| 175 v8::Extension* ExternalExtension::Get() { | 143 v8::Extension* ExternalExtension::Get() { |
| 176 return new ExternalExtensionWrapper(); | 144 return new ExternalExtensionWrapper(); |
| 177 } | 145 } |
| 178 | 146 |
| 179 } // namespace extensions_v8 | 147 } // namespace extensions_v8 |
| OLD | NEW |