Chromium Code Reviews| Index: chrome/renderer/searchbox/searchbox_extension.cc |
| diff --git a/chrome/renderer/searchbox/searchbox_extension.cc b/chrome/renderer/searchbox/searchbox_extension.cc |
| index 62b8397536d177b9dbba5cf96dc8cbf9c50aec6a..200b3a0ef632fa0c8f43bf3d38cb1ad30f8d9f3d 100644 |
| --- a/chrome/renderer/searchbox/searchbox_extension.cc |
| +++ b/chrome/renderer/searchbox/searchbox_extension.cc |
| @@ -4,995 +4,263 @@ |
| #include "chrome/renderer/searchbox/searchbox_extension.h" |
| -#include "base/i18n/rtl.h" |
| -#include "base/stringprintf.h" |
| -#include "base/strings/string_number_conversions.h" |
| #include "base/utf_string_conversions.h" |
| -#include "chrome/common/extensions/extension.h" |
| +#include "chrome/common/instant_types.h" |
| #include "chrome/renderer/searchbox/searchbox.h" |
| #include "content/public/renderer/render_view.h" |
| #include "grit/renderer_resources.h" |
| -#include "third_party/WebKit/Source/Platform/chromium/public/WebURLRequest.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptSource.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
| -#include "ui/base/keycodes/keyboard_codes.h" |
| #include "ui/base/resource/resource_bundle.h" |
| -#include "ui/base/window_open_disposition.h" |
| #include "v8/include/v8.h" |
| namespace { |
| -const char kCSSBackgroundImageFormat[] = "-webkit-image-set(" |
| - "url(chrome-search://theme/IDR_THEME_NTP_BACKGROUND?%s) 1x)"; |
| +const char kSearchBoxExtensionName[] = "v8/SearchBox"; |
| + |
| +const char kDetermineInstantSupportScript[] = |
| + "chrome &&" |
|
Jered
2013/03/26 16:36:42
Is it safe to omit window (could this have functio
|
| + "chrome.searchBox &&" |
| + "chrome.searchBox.onsubmit &&" |
| + "typeof chrome.searchBox.onsubmit == 'function';"; |
| + |
| +const char kOnChangeScript[] = |
| + "if (chrome &&" |
| + " chrome.searchBox &&" |
| + " chrome.searchBox.onchange &&" |
| + " typeof chrome.searchBox.onchange == 'function')" |
| + " chrome.searchBox.onchange();"; |
| + |
| +const char kOnSubmitScript[] = |
| + "if (chrome &&" |
| + " chrome.searchBox &&" |
| + " chrome.searchBox.onsubmit &&" |
| + " typeof chrome.searchBox.onsubmit == 'function')" |
| + " chrome.searchBox.onsubmit();"; |
| + |
| +const char kOnBlurScript[] = |
| + "if (chrome &&" |
| + " chrome.searchBox &&" |
| + " chrome.searchBox.oncancel &&" |
| + " typeof chrome.searchBox.oncancel == 'function')" |
| + " chrome.searchBox.oncancel();"; |
| + |
| +const char kOnPopupBoundsScript[] = |
| + "if (chrome &&" |
| + " chrome.searchBox &&" |
| + " chrome.searchBox.onresize &&" |
| + " typeof chrome.searchBox.onresize == 'function')" |
| + " chrome.searchBox.onresize();"; |
| -const char kCSSBackgroundColorFormat[] = "rgba(%d,%d,%d,%s)"; |
| - |
| -const char kCSSBackgroundPositionCenter[] = "center"; |
| -const char kCSSBackgroundPositionLeft[] = "left"; |
| -const char kCSSBackgroundPositionTop[] = "top"; |
| -const char kCSSBackgroundPositionRight[] = "right"; |
| -const char kCSSBackgroundPositionBottom[] = "bottom"; |
| - |
| -const char kCSSBackgroundRepeatNo[] = "no-repeat"; |
| -const char kCSSBackgroundRepeatX[] = "repeat-x"; |
| -const char kCSSBackgroundRepeatY[] = "repeat-y"; |
| -const char kCSSBackgroundRepeat[] = "repeat"; |
| - |
| -const char kLTRHtmlTextDirection[] = "ltr"; |
| -const char kRTLHtmlTextDirection[] = "rtl"; |
| - |
| -// Converts a V8 value to a string16. |
| string16 V8ValueToUTF16(v8::Handle<v8::Value> v) { |
| v8::String::Value s(v); |
| return string16(reinterpret_cast<const char16*>(*s), s.length()); |
| } |
| -// Converts string16 to V8 String. |
| v8::Handle<v8::String> UTF16ToV8String(const string16& s) { |
| return v8::String::New(reinterpret_cast<const uint16_t*>(s.data()), s.size()); |
| } |
| -// Converts std::string to V8 String. |
| -v8::Handle<v8::String> UTF8ToV8String(const std::string& s) { |
| - return v8::String::New(s.data(), s.size()); |
| +SearchBox* GetSearchBox() { |
| + WebKit::WebFrame* frame = WebKit::WebFrame::frameForCurrentContext(); |
| + // The WebView may be NULL during closing. |
| + if (!frame || !frame->view()) |
| + return NULL; |
| + |
| + content::RenderView* render_view = |
| + content::RenderView::FromWebView(frame->view()); |
| + if (!render_view) |
| + return NULL; |
| + |
| + return SearchBox::Get(render_view); |
| } |
| -void Dispatch(WebKit::WebFrame* frame, const WebKit::WebString& script) { |
| - if (!frame) return; |
| - frame->executeScript(WebKit::WebScriptSource(script)); |
| +WebKit::WebFrame* GetFrame(content::RenderView* render_view) { |
| + return render_view->GetWebView() ? render_view->GetWebView()->mainFrame() : |
| + NULL; |
| +} |
| + |
| +void Dispatch(content::RenderView* render_view, |
| + const WebKit::WebString& script) { |
| + WebKit::WebFrame* frame = GetFrame(render_view); |
| + if (frame) |
| + frame->executeScript(WebKit::WebScriptSource(script)); |
| } |
| } // namespace |
| namespace extensions_v8 { |
| -static const char kSearchBoxExtensionName[] = "v8/EmbeddedSearch"; |
|
Jered
2013/03/26 16:36:42
Where did all this stuff go? :-)
|
| - |
| -static const char kDispatchChangeEventScript[] = |
| - "if (window.chrome &&" |
| - " window.chrome.embeddedSearch &&" |
| - " window.chrome.embeddedSearch.searchBox &&" |
| - " window.chrome.embeddedSearch.searchBox.onchange &&" |
| - " typeof window.chrome.embeddedSearch.searchBox.onchange ==" |
| - " 'function') {" |
| - " window.chrome.embeddedSearch.searchBox.onchange();" |
| - " true;" |
| - "}"; |
| - |
| -static const char kDispatchSubmitEventScript[] = |
| - "if (window.chrome &&" |
| - " window.chrome.embeddedSearch &&" |
| - " window.chrome.embeddedSearch.searchBox &&" |
| - " window.chrome.embeddedSearch.searchBox.onsubmit &&" |
| - " typeof window.chrome.embeddedSearch.searchBox.onsubmit ==" |
| - " 'function') {" |
| - " window.chrome.embeddedSearch.searchBox.onsubmit();" |
| - " true;" |
| - "}"; |
| - |
| -static const char kDispatchCancelEventScript[] = |
| - "if (window.chrome &&" |
| - " window.chrome.embeddedSearch &&" |
| - " window.chrome.embeddedSearch.searchBox &&" |
| - " window.chrome.embeddedSearch.searchBox.oncancel &&" |
| - " typeof window.chrome.embeddedSearch.searchBox.oncancel ==" |
| - " 'function') {" |
| - " window.chrome.embeddedSearch.searchBox.oncancel();" |
| - " true;" |
| - "}"; |
| - |
| -static const char kDispatchResizeEventScript[] = |
| - "if (window.chrome &&" |
| - " window.chrome.embeddedSearch &&" |
| - " window.chrome.embeddedSearch.searchBox &&" |
| - " window.chrome.embeddedSearch.searchBox.onresize &&" |
| - " typeof window.chrome.embeddedSearch.searchBox.onresize ==" |
| - " 'function') {" |
| - " window.chrome.embeddedSearch.searchBox.onresize();" |
| - " true;" |
| - "}"; |
| - |
| -// We first send this script down to determine if the page supports instant. |
| -static const char kSupportsInstantScript[] = |
| - "if (window.chrome &&" |
| - " window.chrome.embeddedSearch &&" |
| - " window.chrome.embeddedSearch.searchBox &&" |
| - " window.chrome.embeddedSearch.searchBox.onsubmit &&" |
| - " typeof window.chrome.embeddedSearch.searchBox.onsubmit ==" |
| - " 'function') {" |
| - " true;" |
| - "} else {" |
| - " false;" |
| - "}"; |
| - |
| -// Extended API. |
| - |
| -// Per-context initialization. |
| -static const char kDispatchOnWindowReady[] = |
| - "if (window.chrome &&" |
| - " window.chrome.embeddedSearchOnWindowReady &&" |
| - " typeof window.chrome.embeddedSearchOnWindowReady == 'function') {" |
| - " window.chrome.embeddedSearchOnWindowReady();" |
| - "}"; |
| - |
| -static const char kDispatchAutocompleteResultsEventScript[] = |
| - "if (window.chrome &&" |
| - " window.chrome.embeddedSearch &&" |
| - " window.chrome.embeddedSearch.searchBox &&" |
| - " window.chrome.embeddedSearch.searchBox.onnativesuggestions &&" |
| - " typeof window.chrome.embeddedSearch.searchBox.onnativesuggestions ==" |
| - " 'function') {" |
| - " window.chrome.embeddedSearch.searchBox.onnativesuggestions();" |
| - " true;" |
| - "}"; |
| - |
| -// Takes two printf-style replaceable values: count, key_code. |
| -static const char kDispatchUpOrDownKeyPressEventScript[] = |
| - "if (window.chrome &&" |
| - " window.chrome.embeddedSearch &&" |
| - " window.chrome.embeddedSearch.searchBox &&" |
| - " window.chrome.embeddedSearch.searchBox.onkeypress &&" |
| - " typeof window.chrome.embeddedSearch.searchBox.onkeypress ==" |
| - " 'function') {" |
| - " for (var i = 0; i < %d; ++i)" |
| - " window.chrome.embeddedSearch.searchBox.onkeypress({keyCode: %d});" |
| - " true;" |
| - "}"; |
| - |
| -// Takes one printf-style replaceable value: key_code. |
| -static const char kDispatchEscKeyPressEventScript[] = |
| - "if (window.chrome &&" |
| - " window.chrome.embeddedSearch &&" |
| - " window.chrome.embeddedSearch.searchBox &&" |
| - " window.chrome.embeddedSearch.searchBox.onkeypress &&" |
| - " typeof window.chrome.embeddedSearch.searchBox.onkeypress ==" |
| - " 'function') {" |
| - " window.chrome.embeddedSearch.searchBox.onkeypress({keyCode: %d});" |
| - " true;" |
| - "}"; |
| - |
| -static const char kDispatchKeyCaptureChangeScript[] = |
| - "if (window.chrome &&" |
| - " window.chrome.embeddedSearch &&" |
| - " window.chrome.embeddedSearch.searchBox &&" |
| - " window.chrome.embeddedSearch.searchBox.onkeycapturechange &&" |
| - " typeof window.chrome.embeddedSearch.searchBox.onkeycapturechange ==" |
| - " 'function') {" |
| - " window.chrome.embeddedSearch.searchBox.onkeycapturechange();" |
| - " true;" |
| - "}"; |
| - |
| -static const char kDispatchThemeChangeEventScript[] = |
| - "if (window.chrome &&" |
| - " window.chrome.embeddedSearch &&" |
| - " window.chrome.embeddedSearch.newTabPage &&" |
| - " window.chrome.embeddedSearch.newTabPage.onthemechange &&" |
| - " typeof window.chrome.embeddedSearch.newTabPage.onthemechange ==" |
| - " 'function') {" |
| - " window.chrome.embeddedSearch.newTabPage.onthemechange();" |
| - " true;" |
| - "}"; |
| - |
| -static const char kDispatchMarginChangeEventScript[] = |
| - "if (window.chrome &&" |
| - " window.chrome.embeddedSearch &&" |
| - " window.chrome.embeddedSearch.searchBox &&" |
| - " window.chrome.embeddedSearch.searchBox.onmarginchange &&" |
| - " typeof window.chrome.embeddedSearch.searchBox.onmarginchange ==" |
| - " 'function') {" |
| - " window.chrome.embeddedSearch.searchBox.onmarginchange();" |
| - " true;" |
| - "}"; |
| - |
| -static const char kDispatchMostVisitedChangedScript[] = |
| - "if (window.chrome &&" |
| - " window.chrome.embeddedSearch &&" |
| - " window.chrome.embeddedSearch.newTabPage &&" |
| - " window.chrome.embeddedSearch.newTabPage.onmostvisitedchange &&" |
| - " typeof window.chrome.embeddedSearch.newTabPage.onmostvisitedchange ==" |
| - " 'function') {" |
| - " window.chrome.embeddedSearch.newTabPage.onmostvisitedchange();" |
| - " true;" |
| - "}"; |
| - |
| -// ---------------------------------------------------------------------------- |
| +// SearchBoxExtensionWrapper -------------------------------------------------- |
| class SearchBoxExtensionWrapper : public v8::Extension { |
| public: |
| explicit SearchBoxExtensionWrapper(const base::StringPiece& code); |
| - // Allows v8's javascript code to call the native functions defined |
| - // in this class for window.chrome. |
| + // Allows v8's JavaScript code to call the native functions defined in this |
| + // class for window.chrome.searchBox. |
| virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction( |
| v8::Handle<v8::String> name) OVERRIDE; |
| - // Helper function to find the RenderView. May return NULL. |
| - static content::RenderView* GetRenderView(); |
| - |
| - // Deletes a Most Visited item. |
| - static v8::Handle<v8::Value> DeleteMostVisitedItem(const v8::Arguments& args); |
| - |
| - // Gets the value of the user's search query. |
| + // Gets the user's search query. |
| static v8::Handle<v8::Value> GetQuery(const v8::Arguments& args); |
| - // Gets whether the |value| should be considered final -- as opposed to a |
| - // partial match. This may be set if the user clicks a suggestion, presses |
| + // Gets whether the search query should be considered final -- as opposed to |
| + // a partial match. This may be set if the user clicks a suggestion, presses |
| // forward delete, or in other cases where Chrome overrides. |
| static v8::Handle<v8::Value> GetVerbatim(const v8::Arguments& args); |
| - // Gets the start of the selection in the search box. |
| + // Gets the start of the selection in the searchbox. |
| static v8::Handle<v8::Value> GetSelectionStart(const v8::Arguments& args); |
| - // Gets the end of the selection in the search box. |
| + // Gets the end of the selection in the searchbox. |
| static v8::Handle<v8::Value> GetSelectionEnd(const v8::Arguments& args); |
| - // Gets the x coordinate (relative to |window|) of the left edge of the |
| - // region of the search box that overlaps the window. |
| + // Gets the x coordinate (relative to the window) of the left edge of the |
| + // region of the searchbox popup that overlaps the window. |
| static v8::Handle<v8::Value> GetX(const v8::Arguments& args); |
| - // Gets the y coordinate (relative to |window|) of the right edge of the |
| - // region of the search box that overlaps the window. |
| + // Gets the y coordinate (relative to the window) of the right edge of the |
| + // region of the searchbox popup that overlaps the window. |
| static v8::Handle<v8::Value> GetY(const v8::Arguments& args); |
| - // Gets the width of the region of the search box that overlaps the window, |
| - // i.e., the width of the omnibox. |
| + // Gets the width of the searchbox popup region that overlaps the window. |
| static v8::Handle<v8::Value> GetWidth(const v8::Arguments& args); |
| - // Gets the height of the region of the search box that overlaps the window. |
| + // Gets the height of the searchbox popup region that overlaps the window. |
| static v8::Handle<v8::Value> GetHeight(const v8::Arguments& args); |
| - // Gets Most Visited Items. |
| - static v8::Handle<v8::Value> GetMostVisitedItems(const v8::Arguments& args); |
| - |
| - // Gets the start-edge margin to use with extended Instant. |
| - static v8::Handle<v8::Value> GetStartMargin(const v8::Arguments& args); |
| - |
| - // Returns true if the Searchbox itself is oriented right-to-left. |
| - static v8::Handle<v8::Value> GetRightToLeft(const v8::Arguments& args); |
| - |
| - // Gets the autocomplete results from search box. |
| - static v8::Handle<v8::Value> GetAutocompleteResults( |
| - const v8::Arguments& args); |
| - |
| - // Gets whether to display Instant results. |
| - static v8::Handle<v8::Value> GetDisplayInstantResults( |
| - const v8::Arguments& args); |
| - |
| - // Gets the background info of the theme currently adopted by browser. |
| - // Call only when overlay is showing NTP page. |
| - static v8::Handle<v8::Value> GetThemeBackgroundInfo( |
| - const v8::Arguments& args); |
| - |
| - // Gets whether the browser is capturing key strokes. |
| - static v8::Handle<v8::Value> IsKeyCaptureEnabled(const v8::Arguments& args); |
| - |
| - // Gets the font family of the text in the omnibox. |
| - static v8::Handle<v8::Value> GetFont(const v8::Arguments& args); |
| - |
| - // Gets the font size of the text in the omnibox. |
| - static v8::Handle<v8::Value> GetFontSize(const v8::Arguments& args); |
| - |
| - // Navigates the window to a URL represented by either a URL string or a |
| - // restricted ID. |
| - static v8::Handle<v8::Value> NavigateContentWindow(const v8::Arguments& args); |
| - |
| - // Sets ordered suggestions. Valid for current |value|. |
| - static v8::Handle<v8::Value> SetSuggestions(const v8::Arguments& args); |
| - |
| - // Sets the text to be autocompleted into the search box. |
| - static v8::Handle<v8::Value> SetQuerySuggestion(const v8::Arguments& args); |
| - |
| - // Like |SetQuerySuggestion| but uses a restricted ID to identify the text. |
| - static v8::Handle<v8::Value> SetQuerySuggestionFromAutocompleteResult( |
| - const v8::Arguments& args); |
| - |
| - // Sets the search box text, completely replacing what the user typed. |
| - static v8::Handle<v8::Value> SetQuery(const v8::Arguments& args); |
| - |
| - // Like |SetQuery| but uses a restricted ID to identify the text. |
| - static v8::Handle<v8::Value> SetQueryFromAutocompleteResult( |
| - const v8::Arguments& args); |
| - |
| - // Requests the overlay be shown with the specified contents and height. |
| - static v8::Handle<v8::Value> ShowOverlay(const v8::Arguments& args); |
| - |
| - // Sets the focus to the omnibox. |
| - static v8::Handle<v8::Value> FocusOmnibox(const v8::Arguments& args); |
| - |
| - // Start capturing user key strokes. |
| - static v8::Handle<v8::Value> StartCapturingKeyStrokes( |
| - const v8::Arguments& args); |
| - |
| - // Stop capturing user key strokes. |
| - static v8::Handle<v8::Value> StopCapturingKeyStrokes( |
| - const v8::Arguments& args); |
| - |
| - // Undoes the deletion of all Most Visited itens. |
| - static v8::Handle<v8::Value> UndoAllMostVisitedDeletions( |
| - const v8::Arguments& args); |
| - |
| - // Undoes the deletion of a Most Visited item. |
| - static v8::Handle<v8::Value> UndoMostVisitedDeletion( |
| - const v8::Arguments& args); |
| + // Suggests an autocompletion for the current query. |
| + static v8::Handle<v8::Value> SetSuggestion(const v8::Arguments& args); |
| private: |
| + std::map<string16, v8::InvocationCallback> functions_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(SearchBoxExtensionWrapper); |
| }; |
| SearchBoxExtensionWrapper::SearchBoxExtensionWrapper( |
| const base::StringPiece& code) |
| : v8::Extension(kSearchBoxExtensionName, code.data(), 0, 0, code.size()) { |
| + functions_[ASCIIToUTF16("GetQuery")] = GetQuery; |
| + functions_[ASCIIToUTF16("GetVerbatim")] = GetVerbatim; |
| + functions_[ASCIIToUTF16("GetSelectionStart")] = GetSelectionStart; |
| + functions_[ASCIIToUTF16("GetSelectionEnd")] = GetSelectionEnd; |
| + functions_[ASCIIToUTF16("GetX")] = GetX; |
| + functions_[ASCIIToUTF16("GetY")] = GetY; |
| + functions_[ASCIIToUTF16("GetWidth")] = GetWidth; |
| + functions_[ASCIIToUTF16("GetHeight")] = GetHeight; |
| + functions_[ASCIIToUTF16("SetSuggestion")] = SetSuggestion; |
| } |
| v8::Handle<v8::FunctionTemplate> SearchBoxExtensionWrapper::GetNativeFunction( |
| v8::Handle<v8::String> name) { |
| - if (name->Equals(v8::String::New("DeleteMostVisitedItem"))) |
| - return v8::FunctionTemplate::New(DeleteMostVisitedItem); |
| - if (name->Equals(v8::String::New("GetQuery"))) |
| - return v8::FunctionTemplate::New(GetQuery); |
| - if (name->Equals(v8::String::New("GetVerbatim"))) |
| - return v8::FunctionTemplate::New(GetVerbatim); |
| - if (name->Equals(v8::String::New("GetSelectionStart"))) |
| - return v8::FunctionTemplate::New(GetSelectionStart); |
| - if (name->Equals(v8::String::New("GetSelectionEnd"))) |
| - return v8::FunctionTemplate::New(GetSelectionEnd); |
| - if (name->Equals(v8::String::New("GetX"))) |
| - return v8::FunctionTemplate::New(GetX); |
| - if (name->Equals(v8::String::New("GetY"))) |
| - return v8::FunctionTemplate::New(GetY); |
| - if (name->Equals(v8::String::New("GetWidth"))) |
| - return v8::FunctionTemplate::New(GetWidth); |
| - if (name->Equals(v8::String::New("GetHeight"))) |
| - return v8::FunctionTemplate::New(GetHeight); |
| - if (name->Equals(v8::String::New("GetMostVisitedItems"))) |
| - return v8::FunctionTemplate::New(GetMostVisitedItems); |
| - if (name->Equals(v8::String::New("GetStartMargin"))) |
| - return v8::FunctionTemplate::New(GetStartMargin); |
| - if (name->Equals(v8::String::New("GetRightToLeft"))) |
| - return v8::FunctionTemplate::New(GetRightToLeft); |
| - if (name->Equals(v8::String::New("GetAutocompleteResults"))) |
| - return v8::FunctionTemplate::New(GetAutocompleteResults); |
| - if (name->Equals(v8::String::New("GetDisplayInstantResults"))) |
| - return v8::FunctionTemplate::New(GetDisplayInstantResults); |
| - if (name->Equals(v8::String::New("GetThemeBackgroundInfo"))) |
| - return v8::FunctionTemplate::New(GetThemeBackgroundInfo); |
| - if (name->Equals(v8::String::New("IsKeyCaptureEnabled"))) |
| - return v8::FunctionTemplate::New(IsKeyCaptureEnabled); |
| - if (name->Equals(v8::String::New("GetFont"))) |
| - return v8::FunctionTemplate::New(GetFont); |
| - if (name->Equals(v8::String::New("GetFontSize"))) |
| - return v8::FunctionTemplate::New(GetFontSize); |
| - if (name->Equals(v8::String::New("NavigateContentWindow"))) |
| - return v8::FunctionTemplate::New(NavigateContentWindow); |
| - if (name->Equals(v8::String::New("SetSuggestions"))) |
| - return v8::FunctionTemplate::New(SetSuggestions); |
| - if (name->Equals(v8::String::New("SetQuerySuggestion"))) |
| - return v8::FunctionTemplate::New(SetQuerySuggestion); |
| - if (name->Equals(v8::String::New("SetQuerySuggestionFromAutocompleteResult"))) |
| - return v8::FunctionTemplate::New(SetQuerySuggestionFromAutocompleteResult); |
| - if (name->Equals(v8::String::New("SetQuery"))) |
| - return v8::FunctionTemplate::New(SetQuery); |
| - if (name->Equals(v8::String::New("SetQueryFromAutocompleteResult"))) |
| - return v8::FunctionTemplate::New(SetQueryFromAutocompleteResult); |
| - if (name->Equals(v8::String::New("ShowOverlay"))) |
| - return v8::FunctionTemplate::New(ShowOverlay); |
| - if (name->Equals(v8::String::New("FocusOmnibox"))) |
| - return v8::FunctionTemplate::New(FocusOmnibox); |
| - if (name->Equals(v8::String::New("StartCapturingKeyStrokes"))) |
| - return v8::FunctionTemplate::New(StartCapturingKeyStrokes); |
| - if (name->Equals(v8::String::New("StopCapturingKeyStrokes"))) |
| - return v8::FunctionTemplate::New(StopCapturingKeyStrokes); |
| - if (name->Equals(v8::String::New("UndoAllMostVisitedDeletions"))) |
| - return v8::FunctionTemplate::New(UndoAllMostVisitedDeletions); |
| - if (name->Equals(v8::String::New("UndoMostVisitedDeletion"))) |
| - return v8::FunctionTemplate::New(UndoMostVisitedDeletion); |
| + std::map<string16, v8::InvocationCallback>::const_iterator iter = |
| + functions_.find(V8ValueToUTF16(name)); |
| + if (iter != functions_.end()) |
| + return v8::FunctionTemplate::New(iter->second); |
| return v8::Handle<v8::FunctionTemplate>(); |
| } |
| // static |
| -content::RenderView* SearchBoxExtensionWrapper::GetRenderView() { |
| - WebKit::WebFrame* webframe = WebKit::WebFrame::frameForCurrentContext(); |
| - if (!webframe) return NULL; |
| - |
| - WebKit::WebView* webview = webframe->view(); |
| - if (!webview) return NULL; // can happen during closing |
| - |
| - return content::RenderView::FromWebView(webview); |
| -} |
| - |
| -// static |
| v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetQuery( |
| const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| + SearchBox* searchbox = GetSearchBox(); |
| + if (!searchbox) return v8::Undefined(); |
| - DVLOG(1) << render_view << " GetQuery: '" |
| - << SearchBox::Get(render_view)->query() << "'"; |
| - return UTF16ToV8String(SearchBox::Get(render_view)->query()); |
| + return UTF16ToV8String(searchbox->query()); |
| } |
| // static |
| v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetVerbatim( |
| const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| + SearchBox* searchbox = GetSearchBox(); |
| + if (!searchbox) return v8::Undefined(); |
| - DVLOG(1) << render_view << " GetVerbatim: " |
| - << SearchBox::Get(render_view)->verbatim(); |
| - return v8::Boolean::New(SearchBox::Get(render_view)->verbatim()); |
| + return v8::Boolean::New(searchbox->verbatim()); |
| } |
| // static |
| v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetSelectionStart( |
| const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| + SearchBox* searchbox = GetSearchBox(); |
| + if (!searchbox) return v8::Undefined(); |
| - return v8::Uint32::New(SearchBox::Get(render_view)->selection_start()); |
| + return v8::Uint32::New(searchbox->selection_start()); |
| } |
| // static |
| v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetSelectionEnd( |
| const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| + SearchBox* searchbox = GetSearchBox(); |
| + if (!searchbox) return v8::Undefined(); |
| - return v8::Uint32::New(SearchBox::Get(render_view)->selection_end()); |
| + return v8::Uint32::New(searchbox->selection_end()); |
| } |
| // static |
| v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetX( |
| const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| + SearchBox* searchbox = GetSearchBox(); |
| + if (!searchbox) return v8::Undefined(); |
| - return v8::Int32::New(SearchBox::Get(render_view)->GetPopupBounds().x()); |
| + return v8::Int32::New(searchbox->GetPopupBounds().x()); |
| } |
| // static |
| v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetY( |
| const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| + SearchBox* searchbox = GetSearchBox(); |
| + if (!searchbox) return v8::Undefined(); |
| - return v8::Int32::New(SearchBox::Get(render_view)->GetPopupBounds().y()); |
| + return v8::Int32::New(searchbox->GetPopupBounds().y()); |
| } |
| // static |
| v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetWidth( |
| const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| - return v8::Int32::New(SearchBox::Get(render_view)->GetPopupBounds().width()); |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetHeight( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| - |
| - return v8::Int32::New(SearchBox::Get(render_view)->GetPopupBounds().height()); |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetStartMargin( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| - return v8::Int32::New(SearchBox::Get(render_view)->GetStartMargin()); |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetRightToLeft( |
| - const v8::Arguments& args) { |
| - return v8::Boolean::New(base::i18n::IsRTL()); |
| -} |
| + SearchBox* searchbox = GetSearchBox(); |
| + if (!searchbox) return v8::Undefined(); |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetAutocompleteResults( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| - |
| - DVLOG(1) << render_view << " GetAutocompleteResults"; |
| - const std::vector<InstantAutocompleteResult>& results = |
| - SearchBox::Get(render_view)->GetAutocompleteResults(); |
| - size_t results_base = SearchBox::Get(render_view)->results_base(); |
| - |
| - v8::Handle<v8::Array> results_array = v8::Array::New(results.size()); |
| - for (size_t i = 0; i < results.size(); ++i) { |
| - v8::Handle<v8::Object> result = v8::Object::New(); |
| - result->Set(v8::String::New("provider"), |
| - UTF16ToV8String(results[i].provider)); |
| - result->Set(v8::String::New("type"), UTF16ToV8String(results[i].type)); |
| - result->Set(v8::String::New("contents"), |
| - UTF16ToV8String(results[i].description)); |
| - result->Set(v8::String::New("destination_url"), |
| - UTF16ToV8String(results[i].destination_url)); |
| - result->Set(v8::String::New("rid"), v8::Uint32::New(results_base + i)); |
| - |
| - v8::Handle<v8::Object> ranking_data = v8::Object::New(); |
| - ranking_data->Set(v8::String::New("relevance"), |
| - v8::Int32::New(results[i].relevance)); |
| - result->Set(v8::String::New("rankingData"), ranking_data); |
| - |
| - results_array->Set(i, result); |
| - } |
| - return results_array; |
| + return v8::Int32::New(searchbox->GetPopupBounds().width()); |
| } |
| // static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::IsKeyCaptureEnabled( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| - |
| - return v8::Boolean::New(SearchBox::Get(render_view)-> |
| - is_key_capture_enabled()); |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetDisplayInstantResults( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| - |
| - bool display_instant_results = |
| - SearchBox::Get(render_view)->display_instant_results(); |
| - DVLOG(1) << render_view << " " |
| - << "GetDisplayInstantResults: " << display_instant_results; |
| - return v8::Boolean::New(display_instant_results); |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetThemeBackgroundInfo( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| - |
| - DVLOG(1) << render_view << " GetThemeBackgroundInfo"; |
| - const ThemeBackgroundInfo& theme_info = |
| - SearchBox::Get(render_view)->GetThemeBackgroundInfo(); |
| - v8::Handle<v8::Object> info = v8::Object::New(); |
| - |
| - // The theme background color is in RGBA format "rgba(R,G,B,A)" where R, G and |
| - // B are between 0 and 255 inclusive, and A is a double between 0 and 1 |
| - // inclusive. |
| - // This is the CSS "background-color" format. |
| - // Value is always valid. |
| - info->Set(v8::String::New("colorRgba"), UTF8ToV8String( |
| - // Convert the alpha using DoubleToString because StringPrintf will use |
| - // locale specific formatters (e.g., use , instead of . in German). |
| - base::StringPrintf( |
| - kCSSBackgroundColorFormat, |
| - theme_info.color_r, |
| - theme_info.color_g, |
| - theme_info.color_b, |
| - base::DoubleToString(theme_info.color_a / 255.0).c_str()))); |
| - |
| - // The theme background image url is of format |
| - // "-webkit-image-set(url(chrome://theme/IDR_THEME_BACKGROUND?<theme_id>) 1x)" |
| - // where <theme_id> is the id that identifies the theme. |
| - // This is the CSS "background-image" format. |
| - // Value is only valid if there's a custom theme background image. |
| - if (extensions::Extension::IdIsValid(theme_info.theme_id)) { |
| - info->Set(v8::String::New("imageUrl"), UTF8ToV8String( |
| - base::StringPrintf(kCSSBackgroundImageFormat, |
| - theme_info.theme_id.c_str()))); |
| - |
| - // The theme background image horizontal alignment is one of "left", |
| - // "right", "center". |
| - // This is the horizontal component of the CSS "background-position" format. |
| - // Value is only valid if |imageUrl| is not empty. |
| - std::string alignment = kCSSBackgroundPositionCenter; |
| - if (theme_info.image_horizontal_alignment == |
| - THEME_BKGRND_IMAGE_ALIGN_LEFT) { |
| - alignment = kCSSBackgroundPositionLeft; |
| - } else if (theme_info.image_horizontal_alignment == |
| - THEME_BKGRND_IMAGE_ALIGN_RIGHT) { |
| - alignment = kCSSBackgroundPositionRight; |
| - } |
| - info->Set(v8::String::New("imageHorizontalAlignment"), |
| - UTF8ToV8String(alignment)); |
| - |
| - // The theme background image vertical alignment is one of "top", "bottom", |
| - // "center". |
| - // This is the vertical component of the CSS "background-position" format. |
| - // Value is only valid if |image_url| is not empty. |
| - if (theme_info.image_vertical_alignment == THEME_BKGRND_IMAGE_ALIGN_TOP) { |
| - alignment = kCSSBackgroundPositionTop; |
| - } else if (theme_info.image_vertical_alignment == |
| - THEME_BKGRND_IMAGE_ALIGN_BOTTOM) { |
| - alignment = kCSSBackgroundPositionBottom; |
| - } else { |
| - alignment = kCSSBackgroundPositionCenter; |
| - } |
| - info->Set(v8::String::New("imageVerticalAlignment"), |
| - UTF8ToV8String(alignment)); |
| - |
| - // The tiling of the theme background image is one of "no-repeat", |
| - // "repeat-x", "repeat-y", "repeat". |
| - // This is the CSS "background-repeat" format. |
| - // Value is only valid if |image_url| is not empty. |
| - std::string tiling = kCSSBackgroundRepeatNo; |
| - switch (theme_info.image_tiling) { |
| - case THEME_BKGRND_IMAGE_NO_REPEAT: |
| - tiling = kCSSBackgroundRepeatNo; |
| - break; |
| - case THEME_BKGRND_IMAGE_REPEAT_X: |
| - tiling = kCSSBackgroundRepeatX; |
| - break; |
| - case THEME_BKGRND_IMAGE_REPEAT_Y: |
| - tiling = kCSSBackgroundRepeatY; |
| - break; |
| - case THEME_BKGRND_IMAGE_REPEAT: |
| - tiling = kCSSBackgroundRepeat; |
| - break; |
| - } |
| - info->Set(v8::String::New("imageTiling"), UTF8ToV8String(tiling)); |
| - |
| - // The theme background image height is only valid if |imageUrl| is valid. |
| - info->Set(v8::String::New("imageHeight"), |
| - v8::Int32::New(theme_info.image_height)); |
| - } |
| - |
| - return info; |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetFont( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| - |
| - return UTF16ToV8String(SearchBox::Get(render_view)->omnibox_font()); |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetFontSize( |
| +v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetHeight( |
| const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| + SearchBox* searchbox = GetSearchBox(); |
| + if (!searchbox) return v8::Undefined(); |
| - return v8::Uint32::New(SearchBox::Get(render_view)->omnibox_font_size()); |
| + return v8::Int32::New(searchbox->GetPopupBounds().height()); |
| } |
| // static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::NavigateContentWindow( |
| +v8::Handle<v8::Value> SearchBoxExtensionWrapper::SetSuggestion( |
| const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view || !args.Length()) return v8::Undefined(); |
| - |
| - GURL destination_url; |
| - content::PageTransition transition = content::PAGE_TRANSITION_TYPED; |
| - if (args[0]->IsNumber()) { |
| - const InstantAutocompleteResult* result = SearchBox::Get(render_view)-> |
| - GetAutocompleteResultWithId(args[0]->Uint32Value()); |
| - if (result) { |
| - destination_url = GURL(result->destination_url); |
| - transition = result->transition; |
| - } |
| - } else { |
| - destination_url = GURL(V8ValueToUTF16(args[0])); |
| - } |
| - |
| - // Navigate the main frame. |
| - if (destination_url.is_valid()) { |
| - WindowOpenDisposition disposition = CURRENT_TAB; |
| - if (args[1]->Uint32Value() == 2) |
| - disposition = NEW_BACKGROUND_TAB; |
| - SearchBox::Get(render_view)->NavigateToURL( |
| - destination_url, transition, disposition); |
| - } |
| - return v8::Undefined(); |
| -} |
| + SearchBox* searchbox = GetSearchBox(); |
| + if (!searchbox || !args.Length()) return v8::Undefined(); |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::SetSuggestions( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view || !args.Length()) return v8::Undefined(); |
| + InstantSuggestion suggestion; |
| - DVLOG(1) << render_view << " SetSuggestions"; |
| v8::Handle<v8::Object> suggestion_json = args[0]->ToObject(); |
| - InstantCompleteBehavior behavior = INSTANT_COMPLETE_NOW; |
| - InstantSuggestionType type = INSTANT_SUGGESTION_SEARCH; |
| - v8::Handle<v8::Value> complete_value = |
| - suggestion_json->Get(v8::String::New("complete_behavior")); |
| - if (complete_value->Equals(v8::String::New("now"))) { |
| - behavior = INSTANT_COMPLETE_NOW; |
| - } else if (complete_value->Equals(v8::String::New("never"))) { |
| - behavior = INSTANT_COMPLETE_NEVER; |
| - } else if (complete_value->Equals(v8::String::New("replace"))) { |
| - behavior = INSTANT_COMPLETE_REPLACE; |
| - } |
| - |
| - std::vector<InstantSuggestion> suggestions; |
| - |
| v8::Handle<v8::Value> suggestions_field = |
| suggestion_json->Get(v8::String::New("suggestions")); |
| if (suggestions_field->IsArray()) { |
| v8::Handle<v8::Array> suggestions_array = suggestions_field.As<v8::Array>(); |
| - for (size_t i = 0; i < suggestions_array->Length(); i++) { |
| - string16 text = V8ValueToUTF16( |
| - suggestions_array->Get(i)->ToObject()->Get(v8::String::New("value"))); |
| - suggestions.push_back(InstantSuggestion(text, behavior, type)); |
| + if (suggestions_array->Length() > 0) { |
| + suggestion.text = V8ValueToUTF16( |
| + suggestions_array->Get(0)->ToObject()->Get(v8::String::New("value"))); |
| } |
| } |
| - SearchBox::Get(render_view)->SetSuggestions(suggestions); |
| - |
| - return v8::Undefined(); |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::SetQuerySuggestion( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view || args.Length() < 2) return v8::Undefined(); |
| - |
| - DVLOG(1) << render_view << " SetQuerySuggestion"; |
| - string16 text = V8ValueToUTF16(args[0]); |
| - InstantCompleteBehavior behavior = INSTANT_COMPLETE_NOW; |
| - InstantSuggestionType type = INSTANT_SUGGESTION_URL; |
| - |
| - if (args[1]->Uint32Value() == 2) { |
| - behavior = INSTANT_COMPLETE_NEVER; |
| - type = INSTANT_SUGGESTION_SEARCH; |
| - } |
| - |
| - std::vector<InstantSuggestion> suggestions; |
| - suggestions.push_back(InstantSuggestion(text, behavior, type)); |
| - SearchBox::Get(render_view)->SetSuggestions(suggestions); |
| - |
| - return v8::Undefined(); |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> |
| - SearchBoxExtensionWrapper::SetQuerySuggestionFromAutocompleteResult( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view || !args.Length()) return v8::Undefined(); |
| - |
| - DVLOG(1) << render_view << " SetQuerySuggestionFromAutocompleteResult"; |
| - const InstantAutocompleteResult* result = SearchBox::Get(render_view)-> |
| - GetAutocompleteResultWithId(args[0]->Uint32Value()); |
| - if (!result) return v8::Undefined(); |
| - |
| - // We only support selecting autocomplete results that are URLs. |
| - string16 text = result->destination_url; |
| - InstantCompleteBehavior behavior = INSTANT_COMPLETE_NOW; |
| - InstantSuggestionType type = INSTANT_SUGGESTION_URL; |
| - |
| - std::vector<InstantSuggestion> suggestions; |
| - suggestions.push_back(InstantSuggestion(text, behavior, type)); |
| - SearchBox::Get(render_view)->SetSuggestions(suggestions); |
| - |
| - return v8::Undefined(); |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::SetQuery( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view || args.Length() < 2) return v8::Undefined(); |
| - |
| - DVLOG(1) << render_view << " SetQuery"; |
| - string16 text = V8ValueToUTF16(args[0]); |
| - InstantCompleteBehavior behavior = INSTANT_COMPLETE_REPLACE; |
| - InstantSuggestionType type = INSTANT_SUGGESTION_SEARCH; |
| - |
| - if (args[1]->Uint32Value() == 1) |
| - type = INSTANT_SUGGESTION_URL; |
| - |
| - std::vector<InstantSuggestion> suggestions; |
| - suggestions.push_back(InstantSuggestion(text, behavior, type)); |
| - SearchBox::Get(render_view)->SetSuggestions(suggestions); |
| - |
| - return v8::Undefined(); |
| -} |
| - |
| -v8::Handle<v8::Value> |
| - SearchBoxExtensionWrapper::SetQueryFromAutocompleteResult( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view || !args.Length()) return v8::Undefined(); |
| - |
| - DVLOG(1) << render_view << " SetQueryFromAutocompleteResult"; |
| - const InstantAutocompleteResult* result = SearchBox::Get(render_view)-> |
| - GetAutocompleteResultWithId(args[0]->Uint32Value()); |
| - if (!result) return v8::Undefined(); |
| - |
| - // We only support selecting autocomplete results that are URLs. |
| - string16 text = result->destination_url; |
| - InstantCompleteBehavior behavior = INSTANT_COMPLETE_REPLACE; |
| - // TODO(jered): Distinguish between history URLs and search provider |
| - // navsuggest URLs so that we can do proper accounting on history URLs. |
| - InstantSuggestionType type = INSTANT_SUGGESTION_URL; |
| - |
| - std::vector<InstantSuggestion> suggestions; |
| - suggestions.push_back(InstantSuggestion(text, behavior, type)); |
| - SearchBox::Get(render_view)->SetSuggestions(suggestions); |
| - |
| - return v8::Undefined(); |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::ShowOverlay( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view || args.Length() < 2) return v8::Undefined(); |
| - |
| - DVLOG(1) << render_view << " ShowOverlay"; |
| - InstantShownReason reason = INSTANT_SHOWN_NOT_SPECIFIED; |
| - switch (args[0]->Uint32Value()) { |
| - case 1: reason = INSTANT_SHOWN_CUSTOM_NTP_CONTENT; break; |
| - case 2: reason = INSTANT_SHOWN_QUERY_SUGGESTIONS; break; |
| - case 3: reason = INSTANT_SHOWN_ZERO_SUGGESTIONS; break; |
| - case 4: reason = INSTANT_SHOWN_CLICKED_QUERY_SUGGESTION; break; |
| - } |
| - |
| - int height = 100; |
| - InstantSizeUnits units = INSTANT_SIZE_PERCENT; |
| - if (args[1]->IsInt32()) { |
| - height = args[1]->Int32Value(); |
| - units = INSTANT_SIZE_PIXELS; |
| - } |
| - |
| - SearchBox::Get(render_view)->ShowInstantOverlay(reason, height, units); |
| - |
| - return v8::Undefined(); |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetMostVisitedItems( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| - |
| - DVLOG(1) << render_view << " GetMostVisitedItems"; |
| - |
| - const std::vector<MostVisitedItem>& items = |
| - SearchBox::Get(render_view)->GetMostVisitedItems(); |
| - v8::Handle<v8::Array> items_array = v8::Array::New(items.size()); |
| - for (size_t i = 0; i < items.size(); ++i) { |
| - |
| - const string16 url = UTF8ToUTF16(items[i].url.spec()); |
| - const string16 host = UTF8ToUTF16(items[i].url.host()); |
| - int restrict_id = |
| - SearchBox::Get(render_view)->UrlToRestrictedId(url); |
| - |
| - // We set the "dir" attribute of the title, so that in RTL locales, a LTR |
| - // title is rendered left-to-right and truncated from the right. For |
| - // example, the title of http://msdn.microsoft.com/en-us/default.aspx is |
| - // "MSDN: Microsoft developer network". In RTL locales, in the New Tab |
| - // page, if the "dir" of this title is not specified, it takes Chrome UI's |
| - // directionality. So the title will be truncated as "soft developer |
| - // network". Setting the "dir" attribute as "ltr" renders the truncated |
| - // title as "MSDN: Microsoft D...". As another example, the title of |
| - // http://yahoo.com is "Yahoo!". In RTL locales, in the New Tab page, the |
| - // title will be rendered as "!Yahoo" if its "dir" attribute is not set to |
| - // "ltr". |
| - std::string direction; |
| - if (base::i18n::StringContainsStrongRTLChars(items[i].title)) |
| - direction = kRTLHtmlTextDirection; |
| - else |
| - direction = kLTRHtmlTextDirection; |
| - |
| - string16 title = items[i].title; |
| - if (title.empty()) |
| - title = url; |
| - |
| - v8::Handle<v8::Object> item = v8::Object::New(); |
| - item->Set(v8::String::New("rid"), |
| - v8::Int32::New(restrict_id)); |
| - item->Set(v8::String::New("thumbnailUrl"), |
| - UTF16ToV8String(SearchBox::Get(render_view)-> |
| - GenerateThumbnailUrl(restrict_id))); |
| - item->Set(v8::String::New("faviconUrl"), |
| - UTF16ToV8String(SearchBox::Get(render_view)-> |
| - GenerateFaviconUrl(restrict_id))); |
| - item->Set(v8::String::New("title"), |
| - UTF16ToV8String(title)); |
| - item->Set(v8::String::New("domain"), UTF16ToV8String(host)); |
| - item->Set(v8::String::New("direction"), |
| - UTF8ToV8String(direction)); |
| - |
| - items_array->Set(i, item); |
| - } |
| - return items_array; |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::DeleteMostVisitedItem( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view || !args.Length()) return v8::Undefined(); |
| - |
| - DVLOG(1) << render_view << " DeleteMostVisitedItem"; |
| - SearchBox::Get(render_view)->DeleteMostVisitedItem(args[0]->IntegerValue()); |
| - return v8::Undefined(); |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::UndoMostVisitedDeletion( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view || !args.Length()) return v8::Undefined(); |
| - |
| - DVLOG(1) << render_view << " UndoMostVisitedDeletion"; |
| - SearchBox::Get(render_view)->UndoMostVisitedDeletion(args[0]->IntegerValue()); |
| - return v8::Undefined(); |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::UndoAllMostVisitedDeletions( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| + searchbox->SetSuggestion(suggestion); |
| - DVLOG(1) << render_view << " UndoAllMostVisitedDeletions"; |
| - SearchBox::Get(render_view)->UndoAllMostVisitedDeletions(); |
| return v8::Undefined(); |
| } |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::FocusOmnibox( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| - |
| - DVLOG(1) << render_view << " FocusOmnibox"; |
| - SearchBox::Get(render_view)->FocusOmnibox(); |
| - |
| - return v8::Undefined(); |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::StartCapturingKeyStrokes( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| - |
| - DVLOG(1) << render_view << " StartCapturingKeyStrokes"; |
| - SearchBox::Get(render_view)->StartCapturingKeyStrokes(); |
| - return v8::Undefined(); |
| -} |
| - |
| -// static |
| -v8::Handle<v8::Value> SearchBoxExtensionWrapper::StopCapturingKeyStrokes( |
| - const v8::Arguments& args) { |
| - content::RenderView* render_view = GetRenderView(); |
| - if (!render_view) return v8::Undefined(); |
| - |
| - DVLOG(1) << render_view << " StopCapturingKeyStrokes"; |
| - SearchBox::Get(render_view)->StopCapturingKeyStrokes(); |
| - return v8::Undefined(); |
| -} |
| +// SearchBoxExtension --------------------------------------------------------- |
| // static |
| v8::Extension* SearchBoxExtension::Get() { |
| @@ -1001,76 +269,36 @@ v8::Extension* SearchBoxExtension::Get() { |
| } |
| // static |
| -bool SearchBoxExtension::PageSupportsInstant(WebKit::WebFrame* frame) { |
| - if (!frame) return false; |
| +bool SearchBoxExtension::DetermineInstantSupport( |
| + content::RenderView* render_view) { |
| + WebKit::WebFrame* frame = GetFrame(render_view); |
| + if (!frame) |
| + return false; |
| + |
| v8::HandleScope handle_scope; |
| v8::Handle<v8::Value> v = frame->executeScriptAndReturnValue( |
| - WebKit::WebScriptSource(kSupportsInstantScript)); |
| + WebKit::WebScriptSource(kDetermineInstantSupportScript)); |
| return !v.IsEmpty() && v->BooleanValue(); |
| } |
| // static |
| -void SearchBoxExtension::DispatchChange(WebKit::WebFrame* frame) { |
| - Dispatch(frame, kDispatchChangeEventScript); |
| -} |
| - |
| -// static |
| -void SearchBoxExtension::DispatchSubmit(WebKit::WebFrame* frame) { |
| - Dispatch(frame, kDispatchSubmitEventScript); |
| -} |
| - |
| -// static |
| -void SearchBoxExtension::DispatchCancel(WebKit::WebFrame* frame) { |
| - Dispatch(frame, kDispatchCancelEventScript); |
| -} |
| - |
| -// static |
| -void SearchBoxExtension::DispatchResize(WebKit::WebFrame* frame) { |
| - Dispatch(frame, kDispatchResizeEventScript); |
| -} |
| - |
| -// static |
| -void SearchBoxExtension::DispatchOnWindowReady(WebKit::WebFrame* frame) { |
| - Dispatch(frame, kDispatchOnWindowReady); |
| -} |
| - |
| -// static |
| -void SearchBoxExtension::DispatchAutocompleteResults(WebKit::WebFrame* frame) { |
| - Dispatch(frame, kDispatchAutocompleteResultsEventScript); |
| -} |
| - |
| -// static |
| -void SearchBoxExtension::DispatchUpOrDownKeyPress(WebKit::WebFrame* frame, |
| - int count) { |
| - Dispatch(frame, WebKit::WebString::fromUTF8( |
| - base::StringPrintf(kDispatchUpOrDownKeyPressEventScript, abs(count), |
| - count < 0 ? ui::VKEY_UP : ui::VKEY_DOWN))); |
| -} |
| - |
| -// static |
| -void SearchBoxExtension::DispatchEscKeyPress(WebKit::WebFrame* frame) { |
| - Dispatch(frame, WebKit::WebString::fromUTF8( |
| - base::StringPrintf(kDispatchEscKeyPressEventScript, ui::VKEY_ESCAPE))); |
| +void SearchBoxExtension::Change(content::RenderView* render_view) { |
| + Dispatch(render_view, kOnChangeScript); |
| } |
| // static |
| -void SearchBoxExtension::DispatchKeyCaptureChange(WebKit::WebFrame* frame) { |
| - Dispatch(frame, kDispatchKeyCaptureChangeScript); |
| +void SearchBoxExtension::Submit(content::RenderView* render_view) { |
| + Dispatch(render_view, kOnSubmitScript); |
| } |
| // static |
| -void SearchBoxExtension::DispatchMarginChange(WebKit::WebFrame* frame) { |
| - Dispatch(frame, kDispatchMarginChangeEventScript); |
| +void SearchBoxExtension::Blur(content::RenderView* render_view) { |
| + Dispatch(render_view, kOnBlurScript); |
| } |
| // static |
| -void SearchBoxExtension::DispatchThemeChange(WebKit::WebFrame* frame) { |
| - Dispatch(frame, kDispatchThemeChangeEventScript); |
| +void SearchBoxExtension::PopupBounds(content::RenderView* render_view) { |
| + Dispatch(render_view, kOnPopupBoundsScript); |
| } |
| -// static |
| -void SearchBoxExtension::DispatchMostVisitedChanged( |
| - WebKit::WebFrame* frame) { |
| - Dispatch(frame, kDispatchMostVisitedChangedScript); |
| -} |
| } // namespace extensions_v8 |