| 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) || |
| 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 |