| 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/stringprintf.h" | 8 #include "base/stringprintf.h" | 
| 9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" | 
| 10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 56 // Converts std::string to V8 String. | 56 // Converts std::string to V8 String. | 
| 57 v8::Handle<v8::String> UTF8ToV8String(const std::string& s) { | 57 v8::Handle<v8::String> UTF8ToV8String(const std::string& s) { | 
| 58   return v8::String::New(s.data(), s.size()); | 58   return v8::String::New(s.data(), s.size()); | 
| 59 } | 59 } | 
| 60 | 60 | 
| 61 void Dispatch(WebKit::WebFrame* frame, const WebKit::WebString& script) { | 61 void Dispatch(WebKit::WebFrame* frame, const WebKit::WebString& script) { | 
| 62   if (!frame) return; | 62   if (!frame) return; | 
| 63   frame->executeScript(WebKit::WebScriptSource(script)); | 63   frame->executeScript(WebKit::WebScriptSource(script)); | 
| 64 } | 64 } | 
| 65 | 65 | 
|  | 66 v8::Handle<v8::String> GenerateThumbnailURL(uint64 most_visited_item_id) { | 
|  | 67   return UTF8ToV8String( | 
|  | 68       StringPrintf("chrome-search://thumb/%s", | 
|  | 69                    base::Uint64ToString(most_visited_item_id).c_str())); | 
|  | 70 } | 
|  | 71 | 
|  | 72 v8::Handle<v8::String> GenerateFaviconURL(uint64 most_visited_item_id) { | 
|  | 73   return UTF8ToV8String( | 
|  | 74       StringPrintf("chrome-search://favicon/%s", | 
|  | 75                    base::Uint64ToString(most_visited_item_id).c_str())); | 
|  | 76 } | 
|  | 77 | 
|  | 78 const GURL MostVisitedItemIDToURL( | 
|  | 79     const std::vector<InstantMostVisitedItem>& most_visited_items, | 
|  | 80     uint64 most_visited_item_id) { | 
|  | 81   for (size_t i = 0; i < most_visited_items.size(); ++i) { | 
|  | 82     if (most_visited_items[i].most_visited_item_id == most_visited_item_id) | 
|  | 83       return most_visited_items[i].url; | 
|  | 84   } | 
|  | 85   return GURL(); | 
|  | 86 } | 
|  | 87 | 
| 66 }  // namespace | 88 }  // namespace | 
| 67 | 89 | 
| 68 namespace extensions_v8 { | 90 namespace extensions_v8 { | 
| 69 | 91 | 
| 70 static const char kSearchBoxExtensionName[] = "v8/EmbeddedSearch"; | 92 static const char kSearchBoxExtensionName[] = "v8/EmbeddedSearch"; | 
| 71 | 93 | 
| 72 static const char kDispatchChangeEventScript[] = | 94 static const char kDispatchChangeEventScript[] = | 
| 73     "if (window.chrome &&" | 95     "if (window.chrome &&" | 
| 74     "    window.chrome.embeddedSearch &&" | 96     "    window.chrome.embeddedSearch &&" | 
| 75     "    window.chrome.embeddedSearch.searchBox &&" | 97     "    window.chrome.embeddedSearch.searchBox &&" | 
| (...skipping 647 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 723 | 745 | 
| 724 // static | 746 // static | 
| 725 v8::Handle<v8::Value> SearchBoxExtensionWrapper::NavigateNewTabPage( | 747 v8::Handle<v8::Value> SearchBoxExtensionWrapper::NavigateNewTabPage( | 
| 726     const v8::Arguments& args) { | 748     const v8::Arguments& args) { | 
| 727   content::RenderView* render_view = GetRenderView(); | 749   content::RenderView* render_view = GetRenderView(); | 
| 728   if (!render_view || !args.Length()) return v8::Undefined(); | 750   if (!render_view || !args.Length()) return v8::Undefined(); | 
| 729 | 751 | 
| 730   GURL destination_url; | 752   GURL destination_url; | 
| 731   content::PageTransition transition = content::PAGE_TRANSITION_TYPED; | 753   content::PageTransition transition = content::PAGE_TRANSITION_TYPED; | 
| 732   if (args[0]->IsNumber()) { | 754   if (args[0]->IsNumber()) { | 
| 733     destination_url = GURL(SearchBox::Get(render_view)->MostVisitedItemIDToURL( | 755     destination_url = MostVisitedItemIDToURL( | 
| 734         args[0]->Uint32Value())); | 756         SearchBox::Get(render_view)->GetMostVisitedItems(), | 
|  | 757         args[0]->Uint32Value()); | 
| 735   } else { | 758   } else { | 
| 736     destination_url = GURL(V8ValueToUTF16(args[0])); | 759     destination_url = GURL(V8ValueToUTF16(args[0])); | 
| 737   } | 760   } | 
| 738 | 761 | 
| 739   DVLOG(1) << render_view << " NavigateNewTabPage: " << destination_url; | 762   DVLOG(1) << render_view << " NavigateNewTabPage: " << destination_url; | 
| 740 | 763 | 
| 741   // Navigate the main frame. | 764   // Navigate the main frame. | 
| 742   if (destination_url.is_valid()) { | 765   if (destination_url.is_valid()) { | 
| 743     WindowOpenDisposition disposition = CURRENT_TAB; | 766     WindowOpenDisposition disposition = CURRENT_TAB; | 
| 744     if (args[1]->Uint32Value() == 2) | 767     if (args[1]->Uint32Value() == 2) | 
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 924 | 947 | 
| 925   SearchBox::Get(render_view)->ShowInstantOverlay(reason, height, units); | 948   SearchBox::Get(render_view)->ShowInstantOverlay(reason, height, units); | 
| 926 | 949 | 
| 927   return v8::Undefined(); | 950   return v8::Undefined(); | 
| 928 } | 951 } | 
| 929 | 952 | 
| 930 // static | 953 // static | 
| 931 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetMostVisitedItems( | 954 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetMostVisitedItems( | 
| 932     const v8::Arguments& args) { | 955     const v8::Arguments& args) { | 
| 933   content::RenderView* render_view = GetRenderView(); | 956   content::RenderView* render_view = GetRenderView(); | 
| 934   if (!render_view) return v8::Undefined(); | 957   if (!render_view) | 
| 935 | 958     return v8::Undefined(); | 
| 936   DVLOG(1) << render_view << " GetMostVisitedItems"; | 959   DVLOG(1) << render_view << " GetMostVisitedItems"; | 
| 937 | 960 | 
| 938   const std::vector<MostVisitedItem>& items = | 961   const SearchBox* search_box = SearchBox::Get(render_view); | 
| 939       SearchBox::Get(render_view)->GetMostVisitedItems(); |  | 
| 940   v8::Handle<v8::Array> items_array = v8::Array::New(items.size()); |  | 
| 941   for (size_t i = 0; i < items.size(); ++i) { |  | 
| 942 | 962 | 
| 943     const string16 url = UTF8ToUTF16(items[i].url.spec()); | 963   const std::vector<InstantMostVisitedItem>& instant_mv_items = | 
| 944     const string16 host = UTF8ToUTF16(items[i].url.host()); | 964       search_box->GetMostVisitedItems(); | 
| 945     int most_visited_item_id = | 965   v8::Handle<v8::Array> v8_mv_items = v8::Array::New(instant_mv_items.size()); | 
| 946         SearchBox::Get(render_view)->URLToMostVisitedItemID(url); | 966   for (size_t i = 0; i < instant_mv_items.size(); ++i) { | 
| 947 |  | 
| 948     // We set the "dir" attribute of the title, so that in RTL locales, a LTR | 967     // We set the "dir" attribute of the title, so that in RTL locales, a LTR | 
| 949     // title is rendered left-to-right and truncated from the right. For | 968     // title is rendered left-to-right and truncated from the right. For | 
| 950     // example, the title of http://msdn.microsoft.com/en-us/default.aspx is | 969     // example, the title of http://msdn.microsoft.com/en-us/default.aspx is | 
| 951     // "MSDN: Microsoft developer network". In RTL locales, in the New Tab | 970     // "MSDN: Microsoft developer network". In RTL locales, in the New Tab | 
| 952     // page, if the "dir" of this title is not specified, it takes Chrome UI's | 971     // page, if the "dir" of this title is not specified, it takes Chrome UI's | 
| 953     // directionality. So the title will be truncated as "soft developer | 972     // directionality. So the title will be truncated as "soft developer | 
| 954     // network". Setting the "dir" attribute as "ltr" renders the truncated | 973     // network". Setting the "dir" attribute as "ltr" renders the truncated | 
| 955     // title as "MSDN: Microsoft D...". As another example, the title of | 974     // title as "MSDN: Microsoft D...". As another example, the title of | 
| 956     // http://yahoo.com is "Yahoo!". In RTL locales, in the New Tab page, the | 975     // http://yahoo.com is "Yahoo!". In RTL locales, in the New Tab page, the | 
| 957     // title will be rendered as "!Yahoo" if its "dir" attribute is not set to | 976     // title will be rendered as "!Yahoo" if its "dir" attribute is not set to | 
| 958     // "ltr". | 977     // "ltr". | 
| 959     std::string direction; | 978     std::string direction; | 
| 960     if (base::i18n::StringContainsStrongRTLChars(items[i].title)) | 979     if (base::i18n::StringContainsStrongRTLChars(instant_mv_items[i].title)) | 
| 961       direction = kRTLHtmlTextDirection; | 980       direction = kRTLHtmlTextDirection; | 
| 962     else | 981     else | 
| 963       direction = kLTRHtmlTextDirection; | 982       direction = kLTRHtmlTextDirection; | 
| 964 | 983 | 
| 965     string16 title = items[i].title; | 984     string16 title = instant_mv_items[i].title; | 
| 966     if (title.empty()) | 985     if (title.empty()) | 
| 967       title = url; | 986       title = UTF8ToUTF16(instant_mv_items[i].url.spec()); | 
| 968 | 987 | 
| 969     v8::Handle<v8::Object> item = v8::Object::New(); | 988     v8::Handle<v8::Object> item = v8::Object::New(); | 
| 970     item->Set(v8::String::New("rid"), | 989     item->Set(v8::String::New("rid"), | 
| 971               v8::Int32::New(most_visited_item_id)); | 990               v8::Int32::New(instant_mv_items[i].most_visited_item_id)); | 
| 972     item->Set(v8::String::New("thumbnailUrl"), | 991     item->Set(v8::String::New("thumbnailUrl"), | 
| 973               UTF16ToV8String(SearchBox::Get(render_view)-> | 992               GenerateThumbnailURL(instant_mv_items[i].most_visited_item_id)); | 
| 974                               GenerateThumbnailUrl(most_visited_item_id))); |  | 
| 975     item->Set(v8::String::New("faviconUrl"), | 993     item->Set(v8::String::New("faviconUrl"), | 
| 976               UTF16ToV8String(SearchBox::Get(render_view)-> | 994               GenerateFaviconURL(instant_mv_items[i].most_visited_item_id)); | 
| 977                               GenerateFaviconUrl(most_visited_item_id))); |  | 
| 978     item->Set(v8::String::New("title"), | 995     item->Set(v8::String::New("title"), | 
| 979               UTF16ToV8String(title)); | 996               UTF16ToV8String(title)); | 
| 980     item->Set(v8::String::New("domain"), UTF16ToV8String(host)); | 997     item->Set(v8::String::New("domain"), | 
| 981     item->Set(v8::String::New("direction"), | 998               UTF8ToV8String(instant_mv_items[i].url.host())); | 
| 982               UTF8ToV8String(direction)); | 999     item->Set(v8::String::New("direction"), UTF8ToV8String(direction)); | 
| 983 | 1000 | 
| 984     items_array->Set(i, item); | 1001     v8_mv_items->Set(i, item); | 
| 985   } | 1002   } | 
| 986   return items_array; | 1003   return v8_mv_items; | 
| 987 } | 1004 } | 
| 988 | 1005 | 
| 989 // static | 1006 // static | 
| 990 v8::Handle<v8::Value> SearchBoxExtensionWrapper::DeleteMostVisitedItem( | 1007 v8::Handle<v8::Value> SearchBoxExtensionWrapper::DeleteMostVisitedItem( | 
| 991     const v8::Arguments& args) { | 1008     const v8::Arguments& args) { | 
| 992   content::RenderView* render_view = GetRenderView(); | 1009   content::RenderView* render_view = GetRenderView(); | 
| 993   if (!render_view || !args.Length()) return v8::Undefined(); | 1010   if (!render_view || !args.Length()) return v8::Undefined(); | 
| 994 | 1011 | 
| 995   DVLOG(1) << render_view << " DeleteMostVisitedItem"; | 1012   DVLOG(1) << render_view << " DeleteMostVisitedItem"; | 
| 996   SearchBox::Get(render_view)->DeleteMostVisitedItem(args[0]->IntegerValue()); | 1013   SearchBox::Get(render_view)->DeleteMostVisitedItem(args[0]->IntegerValue()); | 
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1126 void SearchBoxExtension::DispatchThemeChange(WebKit::WebFrame* frame) { | 1143 void SearchBoxExtension::DispatchThemeChange(WebKit::WebFrame* frame) { | 
| 1127   Dispatch(frame, kDispatchThemeChangeEventScript); | 1144   Dispatch(frame, kDispatchThemeChangeEventScript); | 
| 1128 } | 1145 } | 
| 1129 | 1146 | 
| 1130 // static | 1147 // static | 
| 1131 void SearchBoxExtension::DispatchMostVisitedChanged( | 1148 void SearchBoxExtension::DispatchMostVisitedChanged( | 
| 1132     WebKit::WebFrame* frame) { | 1149     WebKit::WebFrame* frame) { | 
| 1133   Dispatch(frame, kDispatchMostVisitedChangedScript); | 1150   Dispatch(frame, kDispatchMostVisitedChangedScript); | 
| 1134 } | 1151 } | 
| 1135 }  // namespace extensions_v8 | 1152 }  // namespace extensions_v8 | 
| OLD | NEW | 
|---|