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

Side by Side Diff: chrome/renderer/searchbox/searchbox_extension.cc

Issue 11359198: Implement the Instant extended API startMargin, endMargin, and rtl properties and the onmarginchang… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
OLDNEW
« chrome/common/render_messages.h ('K') | « chrome/renderer/searchbox/searchbox_extension.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698