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/json/string_escape.h" | 8 #include "base/json/string_escape.h" |
9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
13 #include "chrome/common/autocomplete_match_type.h" | 13 #include "chrome/common/autocomplete_match_type.h" |
14 #include "chrome/common/instant_types.h" | 14 #include "chrome/common/instant_types.h" |
15 #include "chrome/common/ntp_logging_events.h" | 15 #include "chrome/common/ntp_logging_events.h" |
16 #include "chrome/common/url_constants.h" | 16 #include "chrome/common/url_constants.h" |
17 #include "chrome/renderer/searchbox/searchbox.h" | 17 #include "chrome/renderer/searchbox/searchbox.h" |
18 #include "content/public/common/url_constants.h" | |
18 #include "content/public/renderer/render_view.h" | 19 #include "content/public/renderer/render_view.h" |
19 #include "extensions/common/extension.h" | 20 #include "extensions/common/extension.h" |
20 #include "grit/renderer_resources.h" | 21 #include "grit/renderer_resources.h" |
21 #include "third_party/WebKit/public/platform/WebURLRequest.h" | 22 #include "third_party/WebKit/public/platform/WebURLRequest.h" |
22 #include "third_party/WebKit/public/web/WebDocument.h" | 23 #include "third_party/WebKit/public/web/WebDocument.h" |
23 #include "third_party/WebKit/public/web/WebFrame.h" | 24 #include "third_party/WebKit/public/web/WebFrame.h" |
24 #include "third_party/WebKit/public/web/WebScriptSource.h" | 25 #include "third_party/WebKit/public/web/WebScriptSource.h" |
25 #include "third_party/WebKit/public/web/WebView.h" | 26 #include "third_party/WebKit/public/web/WebView.h" |
26 #include "ui/base/resource/resource_bundle.h" | 27 #include "ui/base/resource/resource_bundle.h" |
27 #include "ui/base/window_open_disposition.h" | 28 #include "ui/base/window_open_disposition.h" |
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
355 static void DeleteMostVisitedItem( | 356 static void DeleteMostVisitedItem( |
356 const v8::FunctionCallbackInfo<v8::Value>& args); | 357 const v8::FunctionCallbackInfo<v8::Value>& args); |
357 | 358 |
358 // Focuses the omnibox. | 359 // Focuses the omnibox. |
359 static void Focus(const v8::FunctionCallbackInfo<v8::Value>& args); | 360 static void Focus(const v8::FunctionCallbackInfo<v8::Value>& args); |
360 | 361 |
361 // Gets whether or not the app launcher is enabled. | 362 // Gets whether or not the app launcher is enabled. |
362 static void GetAppLauncherEnabled( | 363 static void GetAppLauncherEnabled( |
363 const v8::FunctionCallbackInfo<v8::Value>& args); | 364 const v8::FunctionCallbackInfo<v8::Value>& args); |
364 | 365 |
366 // Gets the desired navigation behavior from a click event. | |
367 static void GetDispositionFromClick( | |
368 const v8::FunctionCallbackInfo<v8::Value>& args); | |
369 | |
365 // Gets Most Visited Items. | 370 // Gets Most Visited Items. |
366 static void GetMostVisitedItems( | 371 static void GetMostVisitedItems( |
367 const v8::FunctionCallbackInfo<v8::Value>& args); | 372 const v8::FunctionCallbackInfo<v8::Value>& args); |
368 | 373 |
369 // Gets the raw data for a most visited item including its raw URL. | 374 // Gets the raw data for a most visited item including its raw URL. |
370 // GetRenderViewWithCheckedOrigin() enforces that only code in the origin | 375 // GetRenderViewWithCheckedOrigin() enforces that only code in the origin |
371 // chrome-search://most-visited can call this function. | 376 // chrome-search://most-visited can call this function. |
372 static void GetMostVisitedItemData( | 377 static void GetMostVisitedItemData( |
373 const v8::FunctionCallbackInfo<v8::Value>& args); | 378 const v8::FunctionCallbackInfo<v8::Value>& args); |
374 | 379 |
(...skipping 25 matching lines...) Expand all Loading... | |
400 // Gets whether the browser is capturing key strokes. | 405 // Gets whether the browser is capturing key strokes. |
401 static void IsKeyCaptureEnabled( | 406 static void IsKeyCaptureEnabled( |
402 const v8::FunctionCallbackInfo<v8::Value>& args); | 407 const v8::FunctionCallbackInfo<v8::Value>& args); |
403 | 408 |
404 // Logs information from the iframes/titles on the NTP. | 409 // Logs information from the iframes/titles on the NTP. |
405 static void LogEvent(const v8::FunctionCallbackInfo<v8::Value>& args); | 410 static void LogEvent(const v8::FunctionCallbackInfo<v8::Value>& args); |
406 | 411 |
407 // Logs an impression on one of the Most Visited tile on the NTP. | 412 // Logs an impression on one of the Most Visited tile on the NTP. |
408 static void LogImpression(const v8::FunctionCallbackInfo<v8::Value>& args); | 413 static void LogImpression(const v8::FunctionCallbackInfo<v8::Value>& args); |
409 | 414 |
415 // Logs a navigation on one of the Most Visited tile on the NTP. | |
416 static void LogNavigation(const v8::FunctionCallbackInfo<v8::Value>& args); | |
417 | |
410 // Navigates the window to a URL represented by either a URL string or a | 418 // Navigates the window to a URL represented by either a URL string or a |
411 // restricted ID. | 419 // restricted ID. |
412 static void NavigateContentWindow( | 420 static void NavigateContentWindow( |
413 const v8::FunctionCallbackInfo<v8::Value>& args); | 421 const v8::FunctionCallbackInfo<v8::Value>& args); |
414 | 422 |
415 // Pastes provided value or clipboard's content into the omnibox. | 423 // Pastes provided value or clipboard's content into the omnibox. |
416 static void Paste(const v8::FunctionCallbackInfo<v8::Value>& args); | 424 static void Paste(const v8::FunctionCallbackInfo<v8::Value>& args); |
417 | 425 |
418 // Indicates whether the page supports voice search. | 426 // Indicates whether the page supports voice search. |
419 static void SetVoiceSearchSupported( | 427 static void SetVoiceSearchSupported( |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
534 v8::Handle<v8::String> name) { | 542 v8::Handle<v8::String> name) { |
535 if (name->Equals( | 543 if (name->Equals( |
536 v8::String::NewFromUtf8(isolate, "CheckIsUserSignedInToChromeAs"))) | 544 v8::String::NewFromUtf8(isolate, "CheckIsUserSignedInToChromeAs"))) |
537 return v8::FunctionTemplate::New(isolate, CheckIsUserSignedInToChromeAs); | 545 return v8::FunctionTemplate::New(isolate, CheckIsUserSignedInToChromeAs); |
538 if (name->Equals(v8::String::NewFromUtf8(isolate, "DeleteMostVisitedItem"))) | 546 if (name->Equals(v8::String::NewFromUtf8(isolate, "DeleteMostVisitedItem"))) |
539 return v8::FunctionTemplate::New(isolate, DeleteMostVisitedItem); | 547 return v8::FunctionTemplate::New(isolate, DeleteMostVisitedItem); |
540 if (name->Equals(v8::String::NewFromUtf8(isolate, "Focus"))) | 548 if (name->Equals(v8::String::NewFromUtf8(isolate, "Focus"))) |
541 return v8::FunctionTemplate::New(isolate, Focus); | 549 return v8::FunctionTemplate::New(isolate, Focus); |
542 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetAppLauncherEnabled"))) | 550 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetAppLauncherEnabled"))) |
543 return v8::FunctionTemplate::New(isolate, GetAppLauncherEnabled); | 551 return v8::FunctionTemplate::New(isolate, GetAppLauncherEnabled); |
552 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetDispositionFromClick"))) | |
553 return v8::FunctionTemplate::New(isolate, GetDispositionFromClick); | |
544 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetMostVisitedItems"))) | 554 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetMostVisitedItems"))) |
545 return v8::FunctionTemplate::New(isolate, GetMostVisitedItems); | 555 return v8::FunctionTemplate::New(isolate, GetMostVisitedItems); |
546 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetMostVisitedItemData"))) | 556 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetMostVisitedItemData"))) |
547 return v8::FunctionTemplate::New(isolate, GetMostVisitedItemData); | 557 return v8::FunctionTemplate::New(isolate, GetMostVisitedItemData); |
548 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetQuery"))) | 558 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetQuery"))) |
549 return v8::FunctionTemplate::New(isolate, GetQuery); | 559 return v8::FunctionTemplate::New(isolate, GetQuery); |
550 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetRightToLeft"))) | 560 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetRightToLeft"))) |
551 return v8::FunctionTemplate::New(isolate, GetRightToLeft); | 561 return v8::FunctionTemplate::New(isolate, GetRightToLeft); |
552 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetStartMargin"))) | 562 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetStartMargin"))) |
553 return v8::FunctionTemplate::New(isolate, GetStartMargin); | 563 return v8::FunctionTemplate::New(isolate, GetStartMargin); |
554 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetSuggestionToPrefetch"))) | 564 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetSuggestionToPrefetch"))) |
555 return v8::FunctionTemplate::New(isolate, GetSuggestionToPrefetch); | 565 return v8::FunctionTemplate::New(isolate, GetSuggestionToPrefetch); |
556 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetThemeBackgroundInfo"))) | 566 if (name->Equals(v8::String::NewFromUtf8(isolate, "GetThemeBackgroundInfo"))) |
557 return v8::FunctionTemplate::New(isolate, GetThemeBackgroundInfo); | 567 return v8::FunctionTemplate::New(isolate, GetThemeBackgroundInfo); |
558 if (name->Equals(v8::String::NewFromUtf8(isolate, "IsFocused"))) | 568 if (name->Equals(v8::String::NewFromUtf8(isolate, "IsFocused"))) |
559 return v8::FunctionTemplate::New(isolate, IsFocused); | 569 return v8::FunctionTemplate::New(isolate, IsFocused); |
560 if (name->Equals(v8::String::NewFromUtf8(isolate, "IsInputInProgress"))) | 570 if (name->Equals(v8::String::NewFromUtf8(isolate, "IsInputInProgress"))) |
561 return v8::FunctionTemplate::New(isolate, IsInputInProgress); | 571 return v8::FunctionTemplate::New(isolate, IsInputInProgress); |
562 if (name->Equals(v8::String::NewFromUtf8(isolate, "IsKeyCaptureEnabled"))) | 572 if (name->Equals(v8::String::NewFromUtf8(isolate, "IsKeyCaptureEnabled"))) |
563 return v8::FunctionTemplate::New(isolate, IsKeyCaptureEnabled); | 573 return v8::FunctionTemplate::New(isolate, IsKeyCaptureEnabled); |
564 if (name->Equals(v8::String::NewFromUtf8(isolate, "LogEvent"))) | 574 if (name->Equals(v8::String::NewFromUtf8(isolate, "LogEvent"))) |
565 return v8::FunctionTemplate::New(isolate, LogEvent); | 575 return v8::FunctionTemplate::New(isolate, LogEvent); |
566 if (name->Equals(v8::String::NewFromUtf8(isolate, "LogImpression"))) | 576 if (name->Equals(v8::String::NewFromUtf8(isolate, "LogImpression"))) |
567 return v8::FunctionTemplate::New(isolate, LogImpression); | 577 return v8::FunctionTemplate::New(isolate, LogImpression); |
578 if (name->Equals(v8::String::NewFromUtf8(isolate, "LogNavigation"))) | |
579 return v8::FunctionTemplate::New(isolate, LogNavigation); | |
568 if (name->Equals(v8::String::NewFromUtf8(isolate, "NavigateContentWindow"))) | 580 if (name->Equals(v8::String::NewFromUtf8(isolate, "NavigateContentWindow"))) |
569 return v8::FunctionTemplate::New(isolate, NavigateContentWindow); | 581 return v8::FunctionTemplate::New(isolate, NavigateContentWindow); |
570 if (name->Equals(v8::String::NewFromUtf8(isolate, "Paste"))) | 582 if (name->Equals(v8::String::NewFromUtf8(isolate, "Paste"))) |
571 return v8::FunctionTemplate::New(isolate, Paste); | 583 return v8::FunctionTemplate::New(isolate, Paste); |
572 if (name->Equals(v8::String::NewFromUtf8(isolate, "SetVoiceSearchSupported"))) | 584 if (name->Equals(v8::String::NewFromUtf8(isolate, "SetVoiceSearchSupported"))) |
573 return v8::FunctionTemplate::New(isolate, SetVoiceSearchSupported); | 585 return v8::FunctionTemplate::New(isolate, SetVoiceSearchSupported); |
574 if (name->Equals( | 586 if (name->Equals( |
575 v8::String::NewFromUtf8(isolate, "StartCapturingKeyStrokes"))) | 587 v8::String::NewFromUtf8(isolate, "StartCapturingKeyStrokes"))) |
576 return v8::FunctionTemplate::New(isolate, StartCapturingKeyStrokes); | 588 return v8::FunctionTemplate::New(isolate, StartCapturingKeyStrokes); |
577 if (name->Equals(v8::String::NewFromUtf8(isolate, "StopCapturingKeyStrokes"))) | 589 if (name->Equals(v8::String::NewFromUtf8(isolate, "StopCapturingKeyStrokes"))) |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
634 void SearchBoxExtensionWrapper::GetAppLauncherEnabled( | 646 void SearchBoxExtensionWrapper::GetAppLauncherEnabled( |
635 const v8::FunctionCallbackInfo<v8::Value>& args) { | 647 const v8::FunctionCallbackInfo<v8::Value>& args) { |
636 content::RenderView* render_view = GetRenderView(); | 648 content::RenderView* render_view = GetRenderView(); |
637 if (!render_view) return; | 649 if (!render_view) return; |
638 | 650 |
639 args.GetReturnValue().Set( | 651 args.GetReturnValue().Set( |
640 SearchBox::Get(render_view)->app_launcher_enabled()); | 652 SearchBox::Get(render_view)->app_launcher_enabled()); |
641 } | 653 } |
642 | 654 |
643 // static | 655 // static |
656 void SearchBoxExtensionWrapper::GetDispositionFromClick( | |
657 const v8::FunctionCallbackInfo<v8::Value>& args) { | |
658 content::RenderView* render_view = GetRenderView(); | |
659 if (!render_view || args.Length() != 5) return; | |
660 | |
661 bool middle_button = args[0]->BooleanValue(); | |
662 bool alt_key = args[1]->BooleanValue(); | |
663 bool ctrl_key = args[2]->BooleanValue(); | |
664 bool meta_key = args[3]->BooleanValue(); | |
665 bool shift_key = args[4]->BooleanValue(); | |
666 | |
667 WindowOpenDisposition disposition = ui::DispositionFromClick(middle_button, | |
668 alt_key, | |
669 ctrl_key, | |
670 meta_key, | |
671 shift_key); | |
672 v8::Isolate* isolate = args.GetIsolate(); | |
673 args.GetReturnValue().Set(v8::Int32::New(isolate, disposition)); | |
674 } | |
675 | |
676 // static | |
644 void SearchBoxExtensionWrapper::GetMostVisitedItems( | 677 void SearchBoxExtensionWrapper::GetMostVisitedItems( |
645 const v8::FunctionCallbackInfo<v8::Value>& args) { | 678 const v8::FunctionCallbackInfo<v8::Value>& args) { |
646 content::RenderView* render_view = GetRenderView(); | 679 content::RenderView* render_view = GetRenderView(); |
647 if (!render_view) | 680 if (!render_view) |
648 return; | 681 return; |
649 DVLOG(1) << render_view << " GetMostVisitedItems"; | 682 DVLOG(1) << render_view << " GetMostVisitedItems"; |
650 | 683 |
651 const SearchBox* search_box = SearchBox::Get(render_view); | 684 const SearchBox* search_box = SearchBox::Get(render_view); |
652 | 685 |
653 std::vector<InstantMostVisitedItemIDPair> instant_mv_items; | 686 std::vector<InstantMostVisitedItemIDPair> instant_mv_items; |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
948 if (args.Length() < 2 || !args[0]->IsNumber() || args[1]->IsUndefined()) | 981 if (args.Length() < 2 || !args[0]->IsNumber() || args[1]->IsUndefined()) |
949 return; | 982 return; |
950 | 983 |
951 DVLOG(1) << render_view << " LogImpression"; | 984 DVLOG(1) << render_view << " LogImpression"; |
952 | 985 |
953 SearchBox::Get(render_view)->LogImpression(args[0]->IntegerValue(), | 986 SearchBox::Get(render_view)->LogImpression(args[0]->IntegerValue(), |
954 V8ValueToUTF16(args[1])); | 987 V8ValueToUTF16(args[1])); |
955 } | 988 } |
956 | 989 |
957 // static | 990 // static |
991 void SearchBoxExtensionWrapper::LogNavigation( | |
992 const v8::FunctionCallbackInfo<v8::Value>& args) { | |
993 content::RenderView* render_view = GetRenderViewWithCheckedOrigin( | |
994 GURL(chrome::kChromeSearchMostVisitedUrl)); | |
995 if (!render_view) return; | |
996 | |
997 if (args.Length() < 2 || !args[0]->IsNumber() || args[1]->IsUndefined()) | |
998 return; | |
999 | |
1000 DVLOG(1) << render_view << " LogNavigation"; | |
1001 | |
1002 SearchBox::Get(render_view)->LogNavigation(args[0]->IntegerValue(), | |
1003 V8ValueToUTF16(args[1])); | |
1004 } | |
1005 | |
1006 // static | |
958 void SearchBoxExtensionWrapper::NavigateContentWindow( | 1007 void SearchBoxExtensionWrapper::NavigateContentWindow( |
959 const v8::FunctionCallbackInfo<v8::Value>& args) { | 1008 const v8::FunctionCallbackInfo<v8::Value>& args) { |
960 content::RenderView* render_view = GetRenderView(); | 1009 content::RenderView* render_view = GetRenderView(); |
961 if (!render_view || !args.Length()) return; | 1010 if (!render_view || !args.Length()) return; |
962 | 1011 |
963 GURL destination_url; | 1012 GURL destination_url; |
964 bool is_most_visited_item_url = false; | 1013 bool is_most_visited_item_url = false; |
965 // Check if the url is a rid | 1014 // Check if the url is a rid |
966 if (args[0]->IsNumber()) { | 1015 if (args[0]->IsNumber()) { |
967 InstantMostVisitedItem item; | 1016 InstantMostVisitedItem item; |
968 if (SearchBox::Get(render_view)->GetMostVisitedItemWithID( | 1017 if (SearchBox::Get(render_view)->GetMostVisitedItemWithID( |
969 args[0]->IntegerValue(), &item)) { | 1018 args[0]->IntegerValue(), &item)) { |
970 destination_url = item.url; | 1019 destination_url = item.url; |
971 is_most_visited_item_url = true; | 1020 is_most_visited_item_url = true; |
972 } | 1021 } |
973 } else { | 1022 } else { |
974 // Resolve the URL | 1023 // Resolve the URL |
975 const base::string16& possibly_relative_url = V8ValueToUTF16(args[0]); | 1024 const base::string16& possibly_relative_url = V8ValueToUTF16(args[0]); |
976 GURL current_url = GetCurrentURL(render_view); | 1025 GURL current_url = GetCurrentURL(render_view); |
977 destination_url = internal::ResolveURL(current_url, possibly_relative_url); | 1026 destination_url = internal::ResolveURL(current_url, possibly_relative_url); |
978 } | 1027 } |
979 | 1028 |
980 DVLOG(1) << render_view << " NavigateContentWindow: " << destination_url; | 1029 DVLOG(1) << render_view << " NavigateContentWindow: " << destination_url; |
981 | 1030 |
982 // Navigate the main frame. | 1031 // Navigate the main frame. |
983 if (destination_url.is_valid()) { | 1032 if (destination_url.is_valid() && |
1033 !destination_url.SchemeIs(content::kJavaScriptScheme)) { | |
beaudoin
2014/03/04 21:33:15
Any other scheme we should prevent against? I'd de
| |
984 WindowOpenDisposition disposition = CURRENT_TAB; | 1034 WindowOpenDisposition disposition = CURRENT_TAB; |
985 if (args[1]->Uint32Value() == 2) | 1035 if (args[1]->IsNumber()) { |
986 disposition = NEW_BACKGROUND_TAB; | 1036 disposition = (WindowOpenDisposition) args[1]->Uint32Value(); |
1037 } | |
987 SearchBox::Get(render_view)->NavigateToURL(destination_url, disposition, | 1038 SearchBox::Get(render_view)->NavigateToURL(destination_url, disposition, |
988 is_most_visited_item_url); | 1039 is_most_visited_item_url); |
989 } | 1040 } |
990 } | 1041 } |
991 | 1042 |
992 // static | 1043 // static |
993 void SearchBoxExtensionWrapper::Paste( | 1044 void SearchBoxExtensionWrapper::Paste( |
994 const v8::FunctionCallbackInfo<v8::Value>& args) { | 1045 const v8::FunctionCallbackInfo<v8::Value>& args) { |
995 content::RenderView* render_view = GetRenderView(); | 1046 content::RenderView* render_view = GetRenderView(); |
996 if (!render_view) return; | 1047 if (!render_view) return; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1060 if (!render_view) return; | 1111 if (!render_view) return; |
1061 | 1112 |
1062 bool display_instant_results = | 1113 bool display_instant_results = |
1063 SearchBox::Get(render_view)->display_instant_results(); | 1114 SearchBox::Get(render_view)->display_instant_results(); |
1064 DVLOG(1) << render_view << " GetDisplayInstantResults" << | 1115 DVLOG(1) << render_view << " GetDisplayInstantResults" << |
1065 display_instant_results; | 1116 display_instant_results; |
1066 args.GetReturnValue().Set(display_instant_results); | 1117 args.GetReturnValue().Set(display_instant_results); |
1067 } | 1118 } |
1068 | 1119 |
1069 } // namespace extensions_v8 | 1120 } // namespace extensions_v8 |
OLD | NEW |