OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/searchbox/searchbox_extension.h" | 5 #include "chrome/renderer/searchbox/searchbox_extension.h" |
6 | 6 |
7 #include <ctype.h> | 7 #include <ctype.h> |
8 | 8 |
9 #include "base/i18n/rtl.h" | |
9 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
10 #include "base/stringprintf.h" | 11 #include "base/stringprintf.h" |
11 #include "base/utf_string_conversions.h" | 12 #include "base/utf_string_conversions.h" |
12 #include "chrome/renderer/searchbox/searchbox.h" | 13 #include "chrome/renderer/searchbox/searchbox.h" |
13 #include "content/public/renderer/render_view.h" | 14 #include "content/public/renderer/render_view.h" |
14 #include "grit/renderer_resources.h" | 15 #include "grit/renderer_resources.h" |
15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | 16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptSource.h" | 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptSource.h" |
17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" | 18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
18 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLReques t.h" | 19 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLReques t.h" |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
140 | 141 |
141 static const char kDispatchContextChangeEventScript[] = | 142 static const char kDispatchContextChangeEventScript[] = |
142 "if (window.chrome &&" | 143 "if (window.chrome &&" |
143 " window.chrome.searchBox &&" | 144 " window.chrome.searchBox &&" |
144 " window.chrome.searchBox.oncontextchange &&" | 145 " window.chrome.searchBox.oncontextchange &&" |
145 " typeof window.chrome.searchBox.oncontextchange == 'function') {" | 146 " typeof window.chrome.searchBox.oncontextchange == 'function') {" |
146 " window.chrome.searchBox.oncontextchange();" | 147 " window.chrome.searchBox.oncontextchange();" |
147 " true;" | 148 " true;" |
148 "}"; | 149 "}"; |
149 | 150 |
151 static const char kDispatchMarginChangeEventScript[] = | |
152 "if (window.chrome &&" | |
153 " window.chrome.searchBox &&" | |
154 " window.chrome.searchBox.onmarginchange &&" | |
155 " typeof window.chrome.searchBox.onmarginchange == 'function') {" | |
156 " window.chrome.searchBox.onmarginchange();" | |
157 " true;" | |
158 "}"; | |
159 | |
150 // ---------------------------------------------------------------------------- | 160 // ---------------------------------------------------------------------------- |
151 | 161 |
152 class SearchBoxExtensionWrapper : public v8::Extension { | 162 class SearchBoxExtensionWrapper : public v8::Extension { |
153 public: | 163 public: |
154 explicit SearchBoxExtensionWrapper(const base::StringPiece& code); | 164 explicit SearchBoxExtensionWrapper(const base::StringPiece& code); |
155 | 165 |
156 // Allows v8's javascript code to call the native functions defined | 166 // Allows v8's javascript code to call the native functions defined |
157 // in this class for window.chrome. | 167 // in this class for window.chrome. |
158 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction( | 168 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction( |
159 v8::Handle<v8::String> name); | 169 v8::Handle<v8::String> name); |
(...skipping 22 matching lines...) Expand all Loading... | |
182 // Gets the y coordinate (relative to |window|) of the right edge of the | 192 // Gets the y coordinate (relative to |window|) of the right edge of the |
183 // region of the search box that overlaps the window. | 193 // region of the search box that overlaps the window. |
184 static v8::Handle<v8::Value> GetY(const v8::Arguments& args); | 194 static v8::Handle<v8::Value> GetY(const v8::Arguments& args); |
185 | 195 |
186 // Gets the width of the region of the search box that overlaps the window. | 196 // Gets the width of the region of the search box that overlaps the window. |
187 static v8::Handle<v8::Value> GetWidth(const v8::Arguments& args); | 197 static v8::Handle<v8::Value> GetWidth(const v8::Arguments& args); |
188 | 198 |
189 // Gets the height of the region of the search box that overlaps the window. | 199 // Gets the height of the region of the search box that overlaps the window. |
190 static v8::Handle<v8::Value> GetHeight(const v8::Arguments& args); | 200 static v8::Handle<v8::Value> GetHeight(const v8::Arguments& args); |
191 | 201 |
202 // Gets the width of the margin from the start of the page to the start of | |
203 // the suggestions dropdown. | |
204 static v8::Handle<v8::Value> GetStartMargin(const v8::Arguments& args); | |
205 | |
206 // Gets the width of the margin from the start of the page to the end of | |
207 // the suggestions dropdown. | |
208 static v8::Handle<v8::Value> GetEndMargin(const v8::Arguments& args); | |
209 | |
210 // Returns true if the Searchbox itself is oriented right-to-left. | |
211 static v8::Handle<v8::Value> GetRightToLeft(const v8::Arguments& args); | |
212 | |
192 // Gets the autocomplete results from search box. | 213 // Gets the autocomplete results from search box. |
193 static v8::Handle<v8::Value> GetAutocompleteResults( | 214 static v8::Handle<v8::Value> GetAutocompleteResults( |
194 const v8::Arguments& args); | 215 const v8::Arguments& args); |
195 | 216 |
196 // Gets whether the search box is focused. | 217 // Gets whether the search box is focused. |
197 static v8::Handle<v8::Value> GetIsFocused(const v8::Arguments& args); | 218 static v8::Handle<v8::Value> GetIsFocused(const v8::Arguments& args); |
198 | 219 |
199 // Gets the current session context. | 220 // Gets the current session context. |
200 static v8::Handle<v8::Value> GetContext(const v8::Arguments& args); | 221 static v8::Handle<v8::Value> GetContext(const v8::Arguments& args); |
201 | 222 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
248 } else if (name->Equals(v8::String::New("GetSelectionEnd"))) { | 269 } else if (name->Equals(v8::String::New("GetSelectionEnd"))) { |
249 return v8::FunctionTemplate::New(GetSelectionEnd); | 270 return v8::FunctionTemplate::New(GetSelectionEnd); |
250 } else if (name->Equals(v8::String::New("GetX"))) { | 271 } else if (name->Equals(v8::String::New("GetX"))) { |
251 return v8::FunctionTemplate::New(GetX); | 272 return v8::FunctionTemplate::New(GetX); |
252 } else if (name->Equals(v8::String::New("GetY"))) { | 273 } else if (name->Equals(v8::String::New("GetY"))) { |
253 return v8::FunctionTemplate::New(GetY); | 274 return v8::FunctionTemplate::New(GetY); |
254 } else if (name->Equals(v8::String::New("GetWidth"))) { | 275 } else if (name->Equals(v8::String::New("GetWidth"))) { |
255 return v8::FunctionTemplate::New(GetWidth); | 276 return v8::FunctionTemplate::New(GetWidth); |
256 } else if (name->Equals(v8::String::New("GetHeight"))) { | 277 } else if (name->Equals(v8::String::New("GetHeight"))) { |
257 return v8::FunctionTemplate::New(GetHeight); | 278 return v8::FunctionTemplate::New(GetHeight); |
279 } else if (name->Equals(v8::String::New("GetStartMargin"))) { | |
280 return v8::FunctionTemplate::New(GetStartMargin); | |
281 } else if (name->Equals(v8::String::New("GetEndMargin"))) { | |
282 return v8::FunctionTemplate::New(GetEndMargin); | |
283 } else if (name->Equals(v8::String::New("GetRightToLeft"))) { | |
284 return v8::FunctionTemplate::New(GetRightToLeft); | |
258 } else if (name->Equals(v8::String::New("GetAutocompleteResults"))) { | 285 } else if (name->Equals(v8::String::New("GetAutocompleteResults"))) { |
259 return v8::FunctionTemplate::New(GetAutocompleteResults); | 286 return v8::FunctionTemplate::New(GetAutocompleteResults); |
260 } else if (name->Equals(v8::String::New("GetIsFocused"))) { | 287 } else if (name->Equals(v8::String::New("GetIsFocused"))) { |
261 return v8::FunctionTemplate::New(GetIsFocused); | 288 return v8::FunctionTemplate::New(GetIsFocused); |
262 } else if (name->Equals(v8::String::New("GetContext"))) { | 289 } else if (name->Equals(v8::String::New("GetContext"))) { |
263 return v8::FunctionTemplate::New(GetContext); | 290 return v8::FunctionTemplate::New(GetContext); |
264 } else if (name->Equals(v8::String::New("NavigateContentWindow"))) { | 291 } else if (name->Equals(v8::String::New("NavigateContentWindow"))) { |
265 return v8::FunctionTemplate::New(NavigateContentWindow); | 292 return v8::FunctionTemplate::New(NavigateContentWindow); |
266 } else if (name->Equals(v8::String::New("SetSuggestions"))) { | 293 } else if (name->Equals(v8::String::New("SetSuggestions"))) { |
267 return v8::FunctionTemplate::New(SetSuggestions); | 294 return v8::FunctionTemplate::New(SetSuggestions); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
323 content::RenderView* render_view = GetRenderView(); | 350 content::RenderView* render_view = GetRenderView(); |
324 if (!render_view) return v8::Undefined(); | 351 if (!render_view) return v8::Undefined(); |
325 return v8::Uint32::New(SearchBox::Get(render_view)->selection_end()); | 352 return v8::Uint32::New(SearchBox::Get(render_view)->selection_end()); |
326 } | 353 } |
327 | 354 |
328 // static | 355 // static |
329 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetX( | 356 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetX( |
330 const v8::Arguments& args) { | 357 const v8::Arguments& args) { |
331 content::RenderView* render_view = GetRenderView(); | 358 content::RenderView* render_view = GetRenderView(); |
332 if (!render_view) return v8::Undefined(); | 359 if (!render_view) return v8::Undefined(); |
333 return v8::Int32::New(SearchBox::Get(render_view)->GetRect().x()); | 360 return v8::Int32::New(SearchBox::Get(render_view)->GetPopupBounds().x()); |
334 } | 361 } |
335 | 362 |
336 // static | 363 // static |
337 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetY( | 364 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetY( |
338 const v8::Arguments& args) { | 365 const v8::Arguments& args) { |
339 content::RenderView* render_view = GetRenderView(); | 366 content::RenderView* render_view = GetRenderView(); |
340 if (!render_view) return v8::Undefined(); | 367 if (!render_view) return v8::Undefined(); |
341 return v8::Int32::New(SearchBox::Get(render_view)->GetRect().y()); | 368 return v8::Int32::New(SearchBox::Get(render_view)->GetPopupBounds().y()); |
342 } | 369 } |
343 | 370 |
344 // static | 371 // static |
345 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetWidth( | 372 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetWidth( |
346 const v8::Arguments& args) { | 373 const v8::Arguments& args) { |
347 content::RenderView* render_view = GetRenderView(); | 374 content::RenderView* render_view = GetRenderView(); |
348 if (!render_view) return v8::Undefined(); | 375 if (!render_view) return v8::Undefined(); |
349 return v8::Int32::New(SearchBox::Get(render_view)->GetRect().width()); | 376 return v8::Int32::New(SearchBox::Get(render_view)->GetPopupBounds().width()); |
350 } | 377 } |
351 | 378 |
352 // static | 379 // static |
353 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetHeight( | 380 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetHeight( |
354 const v8::Arguments& args) { | 381 const v8::Arguments& args) { |
355 content::RenderView* render_view = GetRenderView(); | 382 content::RenderView* render_view = GetRenderView(); |
356 if (!render_view) return v8::Undefined(); | 383 if (!render_view) return v8::Undefined(); |
357 return v8::Int32::New(SearchBox::Get(render_view)->GetRect().height()); | 384 return v8::Int32::New(SearchBox::Get(render_view)->GetPopupBounds().height()); |
358 } | 385 } |
359 | 386 |
360 // static | 387 // static |
388 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetStartMargin( | |
389 const v8::Arguments& args) { | |
390 content::RenderView* render_view = GetRenderView(); | |
391 if (!render_view) return v8::Undefined(); | |
392 return v8::Int32::New(SearchBox::Get(render_view)->GetStartMargin()); | |
393 } | |
394 | |
395 // static | |
396 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetEndMargin( | |
397 const v8::Arguments& args) { | |
398 content::RenderView* render_view = GetRenderView(); | |
399 if (!render_view) return v8::Undefined(); | |
400 return v8::Int32::New(SearchBox::Get(render_view)->GetEndMargin()); | |
401 } | |
402 | |
403 // static | |
404 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetRightToLeft( | |
405 const v8::Arguments& args) { | |
406 return v8::Boolean::New(base::i18n::IsRTL()); | |
samarth
2012/11/16 22:08:26
Can IsRTL change while Chrome is running?
melevin
2012/11/16 22:34:43
It's not impossible but I think would be extremely
| |
407 } | |
408 | |
409 // static | |
361 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetAutocompleteResults( | 410 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetAutocompleteResults( |
362 const v8::Arguments& args) { | 411 const v8::Arguments& args) { |
363 content::RenderView* render_view = GetRenderView(); | 412 content::RenderView* render_view = GetRenderView(); |
364 if (!render_view) return v8::Undefined(); | 413 if (!render_view) return v8::Undefined(); |
365 const std::vector<InstantAutocompleteResult>& results = | 414 const std::vector<InstantAutocompleteResult>& results = |
366 SearchBox::Get(render_view)->GetAutocompleteResults(); | 415 SearchBox::Get(render_view)->GetAutocompleteResults(); |
367 const size_t results_base = SearchBox::Get(render_view)->results_base(); | 416 const size_t results_base = SearchBox::Get(render_view)->results_base(); |
368 v8::Handle<v8::Array> results_array = v8::Array::New(results.size()); | 417 v8::Handle<v8::Array> results_array = v8::Array::New(results.size()); |
369 for (size_t i = 0; i < results.size(); ++i) { | 418 for (size_t i = 0; i < results.size(); ++i) { |
370 v8::Handle<v8::Object> result = v8::Object::New(); | 419 v8::Handle<v8::Object> result = v8::Object::New(); |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
703 void SearchBoxExtension::DispatchBlur(WebKit::WebFrame* frame) { | 752 void SearchBoxExtension::DispatchBlur(WebKit::WebFrame* frame) { |
704 Dispatch(frame, kDispatchBlurEventScript); | 753 Dispatch(frame, kDispatchBlurEventScript); |
705 } | 754 } |
706 | 755 |
707 // static | 756 // static |
708 void SearchBoxExtension::DispatchContextChange(WebKit::WebFrame* frame) { | 757 void SearchBoxExtension::DispatchContextChange(WebKit::WebFrame* frame) { |
709 Dispatch(frame, kDispatchContextChangeEventScript); | 758 Dispatch(frame, kDispatchContextChangeEventScript); |
710 } | 759 } |
711 | 760 |
712 // static | 761 // static |
762 void SearchBoxExtension::DispatchMarginChange(WebKit::WebFrame* frame) { | |
763 Dispatch(frame, kDispatchMarginChangeEventScript); | |
764 } | |
765 | |
766 // static | |
713 bool SearchBoxExtension::PageSupportsInstant(WebKit::WebFrame* frame) { | 767 bool SearchBoxExtension::PageSupportsInstant(WebKit::WebFrame* frame) { |
714 if (!frame) return false; | 768 if (!frame) return false; |
715 | 769 |
716 v8::Handle<v8::Value> v = frame->executeScriptAndReturnValue( | 770 v8::Handle<v8::Value> v = frame->executeScriptAndReturnValue( |
717 WebKit::WebScriptSource(kSupportsInstantScript)); | 771 WebKit::WebScriptSource(kSupportsInstantScript)); |
718 bool supports_instant = !v.IsEmpty() && v->BooleanValue(); | 772 bool supports_instant = !v.IsEmpty() && v->BooleanValue(); |
719 | 773 |
720 // Send a resize message to tell the page that Chrome is actively using the | 774 // Send a resize message to tell the page that Chrome is actively using the |
721 // searchbox API with it. The page uses the message to transition from | 775 // searchbox API with it. The page uses the message to transition from |
722 // "homepage" mode to "search" mode. | 776 // "homepage" mode to "search" mode. |
723 if (supports_instant) | 777 if (supports_instant) |
724 DispatchResize(frame); | 778 DispatchResize(frame); |
725 | 779 |
726 return supports_instant; | 780 return supports_instant; |
727 } | 781 } |
728 | 782 |
729 // static | 783 // static |
730 v8::Extension* SearchBoxExtension::Get() { | 784 v8::Extension* SearchBoxExtension::Get() { |
731 const base::StringPiece code = | 785 const base::StringPiece code = |
732 ResourceBundle::GetSharedInstance().GetRawDataResource( | 786 ResourceBundle::GetSharedInstance().GetRawDataResource( |
733 IDR_SEARCHBOX_API); | 787 IDR_SEARCHBOX_API); |
734 return new SearchBoxExtensionWrapper(code); | 788 return new SearchBoxExtensionWrapper(code); |
735 } | 789 } |
736 | 790 |
737 } // namespace extensions_v8 | 791 } // namespace extensions_v8 |
OLD | NEW |