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 |