OLD | NEW |
---|---|
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "base/i18n/rtl.h" | 7 #include "base/i18n/rtl.h" |
8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
9 #include "base/stringprintf.h" | 9 #include "base/stringprintf.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
87 base::StringPrintf("chrome-search://thumb/%s", | 87 base::StringPrintf("chrome-search://thumb/%s", |
88 base::Uint64ToString(most_visited_item_id).c_str())); | 88 base::Uint64ToString(most_visited_item_id).c_str())); |
89 } | 89 } |
90 | 90 |
91 v8::Handle<v8::String> GenerateFaviconURL(uint64 most_visited_item_id) { | 91 v8::Handle<v8::String> GenerateFaviconURL(uint64 most_visited_item_id) { |
92 return UTF8ToV8String( | 92 return UTF8ToV8String( |
93 base::StringPrintf("chrome-search://favicon/%s", | 93 base::StringPrintf("chrome-search://favicon/%s", |
94 base::Uint64ToString(most_visited_item_id).c_str())); | 94 base::Uint64ToString(most_visited_item_id).c_str())); |
95 } | 95 } |
96 | 96 |
97 // If |url| starts with |prefix|, removes |prefix|. | |
98 void StripPrefix(string16* url, const string16& prefix) { | |
99 if (StartsWith(*url, prefix, true)) | |
100 url->erase(0, prefix.length()); | |
101 } | |
102 | |
103 // Removes leading "http://" or "http://www." from |url| unless |user_input| | |
104 // starts with those prefixes. | |
105 void StripURLPrefixes(string16* url, const string16& user_input) { | |
106 string16 trimmed_user_input; | |
107 TrimWhitespace(user_input, TRIM_TRAILING, &trimmed_user_input); | |
108 if (StartsWith(*url, trimmed_user_input, true)) | |
109 return; | |
110 | |
111 StripPrefix(url, ASCIIToUTF16(chrome::kHttpScheme) + ASCIIToUTF16("://")); | |
112 if (StartsWith(*url, trimmed_user_input, true)) | |
113 return; | |
114 | |
115 StripPrefix(url, ASCIIToUTF16("www.")); | |
116 } | |
117 | |
118 // Formats a URL for display to the user. Strips out prefixes like whitespace, | |
119 // "http://" and "www." unless the user input (|query|) matches the prefix. | |
120 // Also removes trailing whitespaces and "/" unless the user input matches the | |
121 // trailing "/". | |
122 void FormatURLForDisplay(string16* url, const string16& query) { | |
123 StripURLPrefixes(url, query); | |
124 | |
125 string16 trimmed_user_input; | |
126 TrimWhitespace(query, TRIM_LEADING, &trimmed_user_input); | |
127 if (EndsWith(*url, trimmed_user_input, true)) | |
128 return; | |
129 | |
130 // Strip a lone trailing slash. | |
131 if (EndsWith(*url, ASCIIToUTF16("/"), true)) | |
132 url->erase(url->length() - 1, 1); | |
133 } | |
134 | |
135 // Populates a Javascript NativeSuggestions object from |result|. | |
136 // NOTE: Includes properties like "contents" which should be erased before the | |
137 // suggestion is returned to the Instant page. | |
138 v8::Handle<v8::Object> GenerateNativeSuggestion( | |
139 const string16& query, | |
140 InstantRestrictedID restricted_id, | |
141 const InstantAutocompleteResult& result) { | |
142 v8::Handle<v8::Object> obj = v8::Object::New(); | |
143 obj->Set(v8::String::New("provider"), UTF16ToV8String(result.provider)); | |
144 obj->Set(v8::String::New("type"), UTF16ToV8String(result.type)); | |
145 obj->Set(v8::String::New("description"), UTF16ToV8String(result.description)); | |
146 obj->Set(v8::String::New("destination_url"), | |
147 UTF16ToV8String(result.destination_url)); | |
148 if (result.search_query.empty()) { | |
149 string16 url = result.destination_url; | |
150 FormatURLForDisplay(&url, query); | |
151 obj->Set(v8::String::New("contents"), UTF16ToV8String(url)); | |
152 } else { | |
153 obj->Set(v8::String::New("contents"), UTF16ToV8String(result.search_query)); | |
154 obj->Set(v8::String::New("is_search"), v8::Boolean::New(true)); | |
155 } | |
156 obj->Set(v8::String::New("rid"), v8::Uint32::New(restricted_id)); | |
157 | |
158 v8::Handle<v8::Object> ranking_data = v8::Object::New(); | |
159 ranking_data->Set(v8::String::New("relevance"), | |
160 v8::Int32::New(result.relevance)); | |
161 obj->Set(v8::String::New("rankingData"), ranking_data); | |
162 return obj; | |
163 } | |
164 | |
97 } // namespace | 165 } // namespace |
98 | 166 |
99 namespace extensions_v8 { | 167 namespace extensions_v8 { |
100 | 168 |
101 static const char kSearchBoxExtensionName[] = "v8/EmbeddedSearch"; | 169 static const char kSearchBoxExtensionName[] = "v8/EmbeddedSearch"; |
102 | 170 |
103 static const char kDispatchChangeEventScript[] = | 171 static const char kDispatchChangeEventScript[] = |
104 "if (window.chrome &&" | 172 "if (window.chrome &&" |
105 " window.chrome.embeddedSearch &&" | 173 " window.chrome.embeddedSearch &&" |
106 " window.chrome.embeddedSearch.searchBox &&" | 174 " window.chrome.embeddedSearch.searchBox &&" |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
326 | 394 |
327 // Gets whether the browser is capturing key strokes. | 395 // Gets whether the browser is capturing key strokes. |
328 static v8::Handle<v8::Value> IsKeyCaptureEnabled(const v8::Arguments& args); | 396 static v8::Handle<v8::Value> IsKeyCaptureEnabled(const v8::Arguments& args); |
329 | 397 |
330 // Gets the font family of the text in the omnibox. | 398 // Gets the font family of the text in the omnibox. |
331 static v8::Handle<v8::Value> GetFont(const v8::Arguments& args); | 399 static v8::Handle<v8::Value> GetFont(const v8::Arguments& args); |
332 | 400 |
333 // Gets the font size of the text in the omnibox. | 401 // Gets the font size of the text in the omnibox. |
334 static v8::Handle<v8::Value> GetFontSize(const v8::Arguments& args); | 402 static v8::Handle<v8::Value> GetFontSize(const v8::Arguments& args); |
335 | 403 |
336 // Gets the URL prefix for the iframe used to display suggestions. | |
337 static v8::Handle<v8::Value> GetSuggestionIframeURLPrefix( | |
338 const v8::Arguments& args); | |
339 | |
340 // Navigates the window to a URL represented by either a URL string or a | 404 // Navigates the window to a URL represented by either a URL string or a |
341 // restricted ID. The two variants handle restricted IDs in their | 405 // restricted ID. The two variants handle restricted IDs in their |
342 // respective namespaces. | 406 // respective namespaces. |
343 static v8::Handle<v8::Value> NavigateSearchBox(const v8::Arguments& args); | 407 static v8::Handle<v8::Value> NavigateSearchBox(const v8::Arguments& args); |
344 static v8::Handle<v8::Value> NavigateNewTabPage(const v8::Arguments& args); | 408 static v8::Handle<v8::Value> NavigateNewTabPage(const v8::Arguments& args); |
345 // DEPRECATED: TODO(sreeram): Remove when google.com no longer uses this. | 409 // DEPRECATED: TODO(sreeram): Remove when google.com no longer uses this. |
346 static v8::Handle<v8::Value> NavigateContentWindow(const v8::Arguments& args); | 410 static v8::Handle<v8::Value> NavigateContentWindow(const v8::Arguments& args); |
347 | 411 |
348 // Sets ordered suggestions. Valid for current |value|. | 412 // Sets ordered suggestions. Valid for current |value|. |
349 static v8::Handle<v8::Value> SetSuggestions(const v8::Arguments& args); | 413 static v8::Handle<v8::Value> SetSuggestions(const v8::Arguments& args); |
(...skipping 21 matching lines...) Expand all Loading... | |
371 static v8::Handle<v8::Value> FocusOmnibox(const v8::Arguments& args); | 435 static v8::Handle<v8::Value> FocusOmnibox(const v8::Arguments& args); |
372 | 436 |
373 // Start capturing user key strokes. | 437 // Start capturing user key strokes. |
374 static v8::Handle<v8::Value> StartCapturingKeyStrokes( | 438 static v8::Handle<v8::Value> StartCapturingKeyStrokes( |
375 const v8::Arguments& args); | 439 const v8::Arguments& args); |
376 | 440 |
377 // Stop capturing user key strokes. | 441 // Stop capturing user key strokes. |
378 static v8::Handle<v8::Value> StopCapturingKeyStrokes( | 442 static v8::Handle<v8::Value> StopCapturingKeyStrokes( |
379 const v8::Arguments& args); | 443 const v8::Arguments& args); |
380 | 444 |
381 // Set the CSS values for the dropdown. | |
382 static v8::Handle<v8::Value> SetSuggestionStyle(const v8::Arguments& args); | |
383 | |
384 // Undoes the deletion of all Most Visited itens. | 445 // Undoes the deletion of all Most Visited itens. |
385 static v8::Handle<v8::Value> UndoAllMostVisitedDeletions( | 446 static v8::Handle<v8::Value> UndoAllMostVisitedDeletions( |
386 const v8::Arguments& args); | 447 const v8::Arguments& args); |
387 | 448 |
388 // Undoes the deletion of a Most Visited item. | 449 // Undoes the deletion of a Most Visited item. |
389 static v8::Handle<v8::Value> UndoMostVisitedDeletion( | 450 static v8::Handle<v8::Value> UndoMostVisitedDeletion( |
390 const v8::Arguments& args); | 451 const v8::Arguments& args); |
391 | 452 |
392 // Shows any attached bars. | 453 // Shows any attached bars. |
393 static v8::Handle<v8::Value> ShowBars(const v8::Arguments& args); | 454 static v8::Handle<v8::Value> ShowBars(const v8::Arguments& args); |
394 | 455 |
395 // Hides any attached bars. When the bars are hidden, the "onbarshidden" | 456 // Hides any attached bars. When the bars are hidden, the "onbarshidden" |
396 // event is fired to notify the page. | 457 // event is fired to notify the page. |
397 static v8::Handle<v8::Value> HideBars(const v8::Arguments& args); | 458 static v8::Handle<v8::Value> HideBars(const v8::Arguments& args); |
398 | 459 |
399 // Returns true if the Instant page should use iframes to display suggestions. | 460 // Gets the raw data for a suggestion including its content. Only callable |
400 static v8::Handle<v8::Value> ShouldUseIframes(const v8::Arguments& args); | 461 // by chrome-search://suggestion pages. |
462 static v8::Handle<v8::Value> GetSuggestionData(const v8::Arguments& args); | |
401 | 463 |
402 private: | 464 private: |
403 DISALLOW_COPY_AND_ASSIGN(SearchBoxExtensionWrapper); | 465 DISALLOW_COPY_AND_ASSIGN(SearchBoxExtensionWrapper); |
404 }; | 466 }; |
405 | 467 |
406 SearchBoxExtensionWrapper::SearchBoxExtensionWrapper( | 468 SearchBoxExtensionWrapper::SearchBoxExtensionWrapper( |
407 const base::StringPiece& code) | 469 const base::StringPiece& code) |
408 : v8::Extension(kSearchBoxExtensionName, code.data(), 0, 0, code.size()) { | 470 : v8::Extension(kSearchBoxExtensionName, code.data(), 0, 0, code.size()) { |
409 } | 471 } |
410 | 472 |
(...skipping 28 matching lines...) Expand all Loading... | |
439 if (name->Equals(v8::String::New("GetDisplayInstantResults"))) | 501 if (name->Equals(v8::String::New("GetDisplayInstantResults"))) |
440 return v8::FunctionTemplate::New(GetDisplayInstantResults); | 502 return v8::FunctionTemplate::New(GetDisplayInstantResults); |
441 if (name->Equals(v8::String::New("GetThemeBackgroundInfo"))) | 503 if (name->Equals(v8::String::New("GetThemeBackgroundInfo"))) |
442 return v8::FunctionTemplate::New(GetThemeBackgroundInfo); | 504 return v8::FunctionTemplate::New(GetThemeBackgroundInfo); |
443 if (name->Equals(v8::String::New("IsKeyCaptureEnabled"))) | 505 if (name->Equals(v8::String::New("IsKeyCaptureEnabled"))) |
444 return v8::FunctionTemplate::New(IsKeyCaptureEnabled); | 506 return v8::FunctionTemplate::New(IsKeyCaptureEnabled); |
445 if (name->Equals(v8::String::New("GetFont"))) | 507 if (name->Equals(v8::String::New("GetFont"))) |
446 return v8::FunctionTemplate::New(GetFont); | 508 return v8::FunctionTemplate::New(GetFont); |
447 if (name->Equals(v8::String::New("GetFontSize"))) | 509 if (name->Equals(v8::String::New("GetFontSize"))) |
448 return v8::FunctionTemplate::New(GetFontSize); | 510 return v8::FunctionTemplate::New(GetFontSize); |
449 if (name->Equals(v8::String::New("GetSuggestionIframeURLPrefix"))) | |
450 return v8::FunctionTemplate::New(GetSuggestionIframeURLPrefix); | |
451 if (name->Equals(v8::String::New("NavigateSearchBox"))) | 511 if (name->Equals(v8::String::New("NavigateSearchBox"))) |
452 return v8::FunctionTemplate::New(NavigateSearchBox); | 512 return v8::FunctionTemplate::New(NavigateSearchBox); |
453 if (name->Equals(v8::String::New("NavigateNewTabPage"))) | 513 if (name->Equals(v8::String::New("NavigateNewTabPage"))) |
454 return v8::FunctionTemplate::New(NavigateNewTabPage); | 514 return v8::FunctionTemplate::New(NavigateNewTabPage); |
455 if (name->Equals(v8::String::New("NavigateContentWindow"))) | 515 if (name->Equals(v8::String::New("NavigateContentWindow"))) |
456 return v8::FunctionTemplate::New(NavigateContentWindow); | 516 return v8::FunctionTemplate::New(NavigateContentWindow); |
457 if (name->Equals(v8::String::New("SetSuggestions"))) | 517 if (name->Equals(v8::String::New("SetSuggestions"))) |
458 return v8::FunctionTemplate::New(SetSuggestions); | 518 return v8::FunctionTemplate::New(SetSuggestions); |
459 if (name->Equals(v8::String::New("SetSuggestion"))) | 519 if (name->Equals(v8::String::New("SetSuggestion"))) |
460 return v8::FunctionTemplate::New(SetSuggestion); | 520 return v8::FunctionTemplate::New(SetSuggestion); |
461 if (name->Equals(v8::String::New("SetSuggestionFromAutocompleteResult"))) | 521 if (name->Equals(v8::String::New("SetSuggestionFromAutocompleteResult"))) |
462 return v8::FunctionTemplate::New(SetSuggestionFromAutocompleteResult); | 522 return v8::FunctionTemplate::New(SetSuggestionFromAutocompleteResult); |
463 if (name->Equals(v8::String::New("SetQuery"))) | 523 if (name->Equals(v8::String::New("SetQuery"))) |
464 return v8::FunctionTemplate::New(SetQuery); | 524 return v8::FunctionTemplate::New(SetQuery); |
465 if (name->Equals(v8::String::New("SetQueryFromAutocompleteResult"))) | 525 if (name->Equals(v8::String::New("SetQueryFromAutocompleteResult"))) |
466 return v8::FunctionTemplate::New(SetQueryFromAutocompleteResult); | 526 return v8::FunctionTemplate::New(SetQueryFromAutocompleteResult); |
467 if (name->Equals(v8::String::New("ShowOverlay"))) | 527 if (name->Equals(v8::String::New("ShowOverlay"))) |
468 return v8::FunctionTemplate::New(ShowOverlay); | 528 return v8::FunctionTemplate::New(ShowOverlay); |
469 if (name->Equals(v8::String::New("FocusOmnibox"))) | 529 if (name->Equals(v8::String::New("FocusOmnibox"))) |
470 return v8::FunctionTemplate::New(FocusOmnibox); | 530 return v8::FunctionTemplate::New(FocusOmnibox); |
471 if (name->Equals(v8::String::New("StartCapturingKeyStrokes"))) | 531 if (name->Equals(v8::String::New("StartCapturingKeyStrokes"))) |
472 return v8::FunctionTemplate::New(StartCapturingKeyStrokes); | 532 return v8::FunctionTemplate::New(StartCapturingKeyStrokes); |
473 if (name->Equals(v8::String::New("StopCapturingKeyStrokes"))) | 533 if (name->Equals(v8::String::New("StopCapturingKeyStrokes"))) |
474 return v8::FunctionTemplate::New(StopCapturingKeyStrokes); | 534 return v8::FunctionTemplate::New(StopCapturingKeyStrokes); |
475 if (name->Equals(v8::String::New("SetSuggestionStyle"))) | |
476 return v8::FunctionTemplate::New(SetSuggestionStyle); | |
477 if (name->Equals(v8::String::New("UndoAllMostVisitedDeletions"))) | 535 if (name->Equals(v8::String::New("UndoAllMostVisitedDeletions"))) |
478 return v8::FunctionTemplate::New(UndoAllMostVisitedDeletions); | 536 return v8::FunctionTemplate::New(UndoAllMostVisitedDeletions); |
479 if (name->Equals(v8::String::New("UndoMostVisitedDeletion"))) | 537 if (name->Equals(v8::String::New("UndoMostVisitedDeletion"))) |
480 return v8::FunctionTemplate::New(UndoMostVisitedDeletion); | 538 return v8::FunctionTemplate::New(UndoMostVisitedDeletion); |
481 if (name->Equals(v8::String::New("ShowBars"))) | 539 if (name->Equals(v8::String::New("ShowBars"))) |
482 return v8::FunctionTemplate::New(ShowBars); | 540 return v8::FunctionTemplate::New(ShowBars); |
483 if (name->Equals(v8::String::New("HideBars"))) | 541 if (name->Equals(v8::String::New("HideBars"))) |
484 return v8::FunctionTemplate::New(HideBars); | 542 return v8::FunctionTemplate::New(HideBars); |
485 if (name->Equals(v8::String::New("ShouldUseIframes"))) | 543 if (name->Equals(v8::String::New("GetSuggestionData"))) |
486 return v8::FunctionTemplate::New(ShouldUseIframes); | 544 return v8::FunctionTemplate::New(GetSuggestionData); |
487 return v8::Handle<v8::FunctionTemplate>(); | 545 return v8::Handle<v8::FunctionTemplate>(); |
488 } | 546 } |
489 | 547 |
490 // static | 548 // static |
491 content::RenderView* SearchBoxExtensionWrapper::GetRenderView() { | 549 content::RenderView* SearchBoxExtensionWrapper::GetRenderView() { |
492 WebKit::WebFrame* webframe = WebKit::WebFrame::frameForCurrentContext(); | 550 WebKit::WebFrame* webframe = WebKit::WebFrame::frameForCurrentContext(); |
493 if (!webframe) return NULL; | 551 if (!webframe) return NULL; |
494 | 552 |
495 WebKit::WebView* webview = webframe->view(); | 553 WebKit::WebView* webview = webframe->view(); |
496 if (!webview) return NULL; // can happen during closing | 554 if (!webview) return NULL; // can happen during closing |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
592 const v8::Arguments& args) { | 650 const v8::Arguments& args) { |
593 content::RenderView* render_view = GetRenderView(); | 651 content::RenderView* render_view = GetRenderView(); |
594 if (!render_view) return v8::Undefined(); | 652 if (!render_view) return v8::Undefined(); |
595 | 653 |
596 std::vector<InstantAutocompleteResultIDPair> results; | 654 std::vector<InstantAutocompleteResultIDPair> results; |
597 SearchBox::Get(render_view)->GetAutocompleteResults(&results); | 655 SearchBox::Get(render_view)->GetAutocompleteResults(&results); |
598 | 656 |
599 DVLOG(1) << render_view << " GetAutocompleteResults: " << results.size(); | 657 DVLOG(1) << render_view << " GetAutocompleteResults: " << results.size(); |
600 | 658 |
601 v8::Handle<v8::Array> results_array = v8::Array::New(results.size()); | 659 v8::Handle<v8::Array> results_array = v8::Array::New(results.size()); |
660 const string16& query = SearchBox::Get(render_view)->query(); | |
602 for (size_t i = 0; i < results.size(); ++i) { | 661 for (size_t i = 0; i < results.size(); ++i) { |
603 v8::Handle<v8::Object> result = v8::Object::New(); | 662 results_array->Set(i, GenerateNativeSuggestion(query, |
604 result->Set(v8::String::New("provider"), | 663 results[i].first, |
605 UTF16ToV8String(results[i].second.provider)); | 664 results[i].second)); |
606 result->Set(v8::String::New("type"), | |
607 UTF16ToV8String(results[i].second.type)); | |
608 result->Set(v8::String::New("description"), | |
609 UTF16ToV8String(results[i].second.description)); | |
610 result->Set(v8::String::New("destination_url"), | |
611 UTF16ToV8String(results[i].second.destination_url)); | |
612 if (results[i].second.search_query.empty()) { | |
613 string16 url = results[i].second.destination_url; | |
614 SearchBox::Get(render_view)->FormatURLForDisplay(&url); | |
615 result->Set(v8::String::New("contents"), UTF16ToV8String(url)); | |
616 } else { | |
617 result->Set(v8::String::New("contents"), | |
618 UTF16ToV8String(results[i].second.search_query)); | |
619 result->Set(v8::String::New("is_search"), v8::Boolean::New(true)); | |
620 } | |
621 result->Set(v8::String::New("rid"), v8::Uint32::New(results[i].first)); | |
622 | |
623 v8::Handle<v8::Object> ranking_data = v8::Object::New(); | |
624 ranking_data->Set(v8::String::New("relevance"), | |
625 v8::Int32::New(results[i].second.relevance)); | |
626 result->Set(v8::String::New("rankingData"), ranking_data); | |
627 | |
628 results_array->Set(i, result); | |
629 } | 665 } |
630 return results_array; | 666 return results_array; |
631 } | 667 } |
632 | 668 |
633 // static | 669 // static |
634 v8::Handle<v8::Value> SearchBoxExtensionWrapper::IsKeyCaptureEnabled( | 670 v8::Handle<v8::Value> SearchBoxExtensionWrapper::IsKeyCaptureEnabled( |
635 const v8::Arguments& args) { | 671 const v8::Arguments& args) { |
636 content::RenderView* render_view = GetRenderView(); | 672 content::RenderView* render_view = GetRenderView(); |
637 if (!render_view) return v8::Undefined(); | 673 if (!render_view) return v8::Undefined(); |
638 | 674 |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
767 // static | 803 // static |
768 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetFontSize( | 804 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetFontSize( |
769 const v8::Arguments& args) { | 805 const v8::Arguments& args) { |
770 content::RenderView* render_view = GetRenderView(); | 806 content::RenderView* render_view = GetRenderView(); |
771 if (!render_view) return v8::Undefined(); | 807 if (!render_view) return v8::Undefined(); |
772 | 808 |
773 return v8::Uint32::New(SearchBox::Get(render_view)->omnibox_font_size()); | 809 return v8::Uint32::New(SearchBox::Get(render_view)->omnibox_font_size()); |
774 } | 810 } |
775 | 811 |
776 // static | 812 // static |
777 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetSuggestionIframeURLPrefix( | |
778 const v8::Arguments& args) { | |
779 content::RenderView* render_view = GetRenderView(); | |
780 if (!render_view) return v8::Undefined(); | |
781 | |
782 return UTF8ToV8String(base::StringPrintf( | |
783 "%s://%s/", | |
784 chrome::kChromeSearchScheme, | |
785 chrome::kChromeSearchSuggestionHost)); | |
786 } | |
787 | |
788 // static | |
789 v8::Handle<v8::Value> SearchBoxExtensionWrapper::NavigateSearchBox( | 813 v8::Handle<v8::Value> SearchBoxExtensionWrapper::NavigateSearchBox( |
790 const v8::Arguments& args) { | 814 const v8::Arguments& args) { |
791 content::RenderView* render_view = GetRenderView(); | 815 content::RenderView* render_view = GetRenderView(); |
792 if (!render_view || !args.Length()) return v8::Undefined(); | 816 if (!render_view || !args.Length()) return v8::Undefined(); |
793 | 817 |
794 GURL destination_url; | 818 GURL destination_url; |
795 content::PageTransition transition = content::PAGE_TRANSITION_TYPED; | 819 content::PageTransition transition = content::PAGE_TRANSITION_TYPED; |
796 if (args[0]->IsNumber()) { | 820 if (args[0]->IsNumber()) { |
797 InstantAutocompleteResult result; | 821 InstantAutocompleteResult result; |
798 if (SearchBox::Get(render_view)->GetAutocompleteResultWithID( | 822 if (SearchBox::Get(render_view)->GetAutocompleteResultWithID( |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1169 return v8::Undefined(); | 1193 return v8::Undefined(); |
1170 } | 1194 } |
1171 | 1195 |
1172 // static | 1196 // static |
1173 v8::Extension* SearchBoxExtension::Get() { | 1197 v8::Extension* SearchBoxExtension::Get() { |
1174 return new SearchBoxExtensionWrapper(ResourceBundle::GetSharedInstance(). | 1198 return new SearchBoxExtensionWrapper(ResourceBundle::GetSharedInstance(). |
1175 GetRawDataResource(IDR_SEARCHBOX_API)); | 1199 GetRawDataResource(IDR_SEARCHBOX_API)); |
1176 } | 1200 } |
1177 | 1201 |
1178 // static | 1202 // static |
1179 v8::Handle<v8::Value> SearchBoxExtensionWrapper::SetSuggestionStyle( | |
1180 const v8::Arguments& args) { | |
1181 content::RenderView* render_view = GetRenderView(); | |
1182 if (!render_view || args.Length() < 2 || !args[0]->IsNumber() || | |
1183 !args[1]->IsNumber()) { | |
1184 return v8::Undefined(); | |
1185 } | |
1186 | |
1187 DVLOG(1) << render_view << " SetSuggestionStyle"; | |
1188 | |
1189 InstantAutocompleteResultStyle style; | |
1190 style.url_color = args[0]->IntegerValue(); | |
1191 style.title_color = args[1]->IntegerValue(); | |
1192 SearchBox::Get(render_view)->SetInstantAutocompleteResultStyle(style); | |
1193 | |
1194 return v8::Undefined(); | |
1195 } | |
1196 | |
1197 // static | |
1198 bool SearchBoxExtension::PageSupportsInstant(WebKit::WebFrame* frame) { | 1203 bool SearchBoxExtension::PageSupportsInstant(WebKit::WebFrame* frame) { |
1199 if (!frame) return false; | 1204 if (!frame) return false; |
1200 v8::HandleScope handle_scope; | 1205 v8::HandleScope handle_scope; |
1201 v8::Handle<v8::Value> v = frame->executeScriptAndReturnValue( | 1206 v8::Handle<v8::Value> v = frame->executeScriptAndReturnValue( |
1202 WebKit::WebScriptSource(kSupportsInstantScript)); | 1207 WebKit::WebScriptSource(kSupportsInstantScript)); |
1203 return !v.IsEmpty() && v->BooleanValue(); | 1208 return !v.IsEmpty() && v->BooleanValue(); |
1204 } | 1209 } |
1205 | 1210 |
1206 v8::Handle<v8::Value> SearchBoxExtensionWrapper::ShowBars( | 1211 v8::Handle<v8::Value> SearchBoxExtensionWrapper::ShowBars( |
1207 const v8::Arguments& args) { | 1212 const v8::Arguments& args) { |
(...skipping 10 matching lines...) Expand all Loading... | |
1218 const v8::Arguments& args) { | 1223 const v8::Arguments& args) { |
1219 content::RenderView* render_view = GetRenderView(); | 1224 content::RenderView* render_view = GetRenderView(); |
1220 if (!render_view) return v8::Undefined(); | 1225 if (!render_view) return v8::Undefined(); |
1221 | 1226 |
1222 DVLOG(1) << render_view << " HideBars"; | 1227 DVLOG(1) << render_view << " HideBars"; |
1223 SearchBox::Get(render_view)->HideBars(); | 1228 SearchBox::Get(render_view)->HideBars(); |
1224 return v8::Undefined(); | 1229 return v8::Undefined(); |
1225 } | 1230 } |
1226 | 1231 |
1227 // static | 1232 // static |
1228 v8::Handle<v8::Value> SearchBoxExtensionWrapper::ShouldUseIframes( | 1233 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetSuggestionData( |
1229 const v8::Arguments& args) { | 1234 const v8::Arguments& args) { |
1230 DVLOG(1) << "ShouldUseIframes"; | 1235 WebKit::WebFrame* webframe = WebKit::WebFrame::frameForCurrentContext(); |
1231 return v8::Boolean::New(SearchBox::ShouldUseIframes()); | 1236 if (!webframe) return v8::Undefined(); |
1237 WebKit::WebView* webview = webframe->view(); | |
1238 if (!webview) return v8::Undefined(); // Can happen during closing. | |
1239 content::RenderView* render_view = content::RenderView::FromWebView(webview); | |
1240 if (!render_view) return v8::Undefined(); | |
1241 | |
1242 // If origin does not match, return undefined. | |
1243 GURL url(webframe->document().url()); | |
1244 if (!(url.SchemeIs(chrome::kChromeSearchScheme) && | |
palmer
2013/04/22 19:38:37
Ahh, I guess this is the early, C++-level check I
Jered
2013/04/22 23:02:58
Not quite. This check asserts that callers to the
| |
1245 url.host() == chrome::kChromeSearchSuggestionHost)) { | |
1246 return v8::Undefined(); | |
1247 } | |
1248 | |
1249 // Need an rid argument. | |
1250 if (args.Length() < 1 || !args[0]->IsNumber()) | |
1251 return v8::Undefined(); | |
1252 | |
1253 DVLOG(1) << render_view << " GetSuggestionData"; | |
1254 InstantRestrictedID restricted_id = args[0]->IntegerValue(); | |
1255 InstantAutocompleteResult result; | |
1256 if (!SearchBox::Get(render_view)->GetAutocompleteResultWithID( | |
1257 restricted_id, &result)) { | |
1258 return v8::Undefined(); | |
1259 } | |
1260 const string16& query = SearchBox::Get(render_view)->query(); | |
1261 return GenerateNativeSuggestion(query, restricted_id, result); | |
1232 } | 1262 } |
1233 | 1263 |
1234 // static | 1264 // static |
1235 void SearchBoxExtension::DispatchChange(WebKit::WebFrame* frame) { | 1265 void SearchBoxExtension::DispatchChange(WebKit::WebFrame* frame) { |
1236 Dispatch(frame, kDispatchChangeEventScript); | 1266 Dispatch(frame, kDispatchChangeEventScript); |
1237 } | 1267 } |
1238 | 1268 |
1239 // static | 1269 // static |
1240 void SearchBoxExtension::DispatchSubmit(WebKit::WebFrame* frame) { | 1270 void SearchBoxExtension::DispatchSubmit(WebKit::WebFrame* frame) { |
1241 Dispatch(frame, kDispatchSubmitEventScript); | 1271 Dispatch(frame, kDispatchSubmitEventScript); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1294 void SearchBoxExtension::DispatchMostVisitedChanged( | 1324 void SearchBoxExtension::DispatchMostVisitedChanged( |
1295 WebKit::WebFrame* frame) { | 1325 WebKit::WebFrame* frame) { |
1296 Dispatch(frame, kDispatchMostVisitedChangedScript); | 1326 Dispatch(frame, kDispatchMostVisitedChangedScript); |
1297 } | 1327 } |
1298 | 1328 |
1299 void SearchBoxExtension::DispatchBarsHidden(WebKit::WebFrame* frame) { | 1329 void SearchBoxExtension::DispatchBarsHidden(WebKit::WebFrame* frame) { |
1300 Dispatch(frame, kDispatchBarsHiddenEventScript); | 1330 Dispatch(frame, kDispatchBarsHiddenEventScript); |
1301 } | 1331 } |
1302 | 1332 |
1303 } // namespace extensions_v8 | 1333 } // namespace extensions_v8 |
OLD | NEW |