| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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_extension.h" | 5 #include "chrome/renderer/searchbox_extension.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 11 #include "base/string_split.h" | 11 #include "base/string_split.h" |
| 12 #include "base/stringprintf.h" | 12 #include "base/stringprintf.h" |
| 13 #include "chrome/common/render_messages_params.h" | 13 #include "chrome/common/render_messages_params.h" |
| 14 #include "chrome/renderer/render_view_wrapper.h" |
| 14 #include "chrome/renderer/searchbox.h" | 15 #include "chrome/renderer/searchbox.h" |
| 15 #include "content/renderer/render_view.h" | |
| 16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | 16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
| 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptSource.h" | 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptSource.h" |
| 18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" | 18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" |
| 19 #include "v8/include/v8.h" | 19 #include "v8/include/v8.h" |
| 20 | 20 |
| 21 using WebKit::WebFrame; | 21 using WebKit::WebFrame; |
| 22 using WebKit::WebScriptSource; | 22 using WebKit::WebScriptSource; |
| 23 using WebKit::WebString; | 23 using WebKit::WebString; |
| 24 using WebKit::WebView; | 24 using WebKit::WebView; |
| 25 | 25 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 class SearchBoxExtensionWrapper : public v8::Extension { | 126 class SearchBoxExtensionWrapper : public v8::Extension { |
| 127 public: | 127 public: |
| 128 SearchBoxExtensionWrapper(); | 128 SearchBoxExtensionWrapper(); |
| 129 | 129 |
| 130 // Allows v8's javascript code to call the native functions defined | 130 // Allows v8's javascript code to call the native functions defined |
| 131 // in this class for window.chrome. | 131 // in this class for window.chrome. |
| 132 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction( | 132 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction( |
| 133 v8::Handle<v8::String> name); | 133 v8::Handle<v8::String> name); |
| 134 | 134 |
| 135 // Helper function to find the RenderView. May return NULL. | 135 // Helper function to find the RenderView. May return NULL. |
| 136 static RenderView* GetRenderView(); | 136 static RenderViewWrapper* GetRenderViewWrapper(); |
| 137 | 137 |
| 138 // Gets the value of the user's search query. | 138 // Gets the value of the user's search query. |
| 139 static v8::Handle<v8::Value> GetValue(const v8::Arguments& args); | 139 static v8::Handle<v8::Value> GetValue(const v8::Arguments& args); |
| 140 | 140 |
| 141 // Gets whether the |value| should be considered final -- as opposed to a | 141 // Gets whether the |value| should be considered final -- as opposed to a |
| 142 // partial match. This may be set if the user clicks a suggestion, presses | 142 // partial match. This may be set if the user clicks a suggestion, presses |
| 143 // forward delete, or in other cases where Chrome overrides. | 143 // forward delete, or in other cases where Chrome overrides. |
| 144 static v8::Handle<v8::Value> GetVerbatim(const v8::Arguments& args); | 144 static v8::Handle<v8::Value> GetVerbatim(const v8::Arguments& args); |
| 145 | 145 |
| 146 // Gets the start of the selection in the search box. | 146 // Gets the start of the selection in the search box. |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 return v8::FunctionTemplate::New(GetWidth); | 191 return v8::FunctionTemplate::New(GetWidth); |
| 192 } else if (name->Equals(v8::String::New("GetHeight"))) { | 192 } else if (name->Equals(v8::String::New("GetHeight"))) { |
| 193 return v8::FunctionTemplate::New(GetHeight); | 193 return v8::FunctionTemplate::New(GetHeight); |
| 194 } else if (name->Equals(v8::String::New("SetSuggestions"))) { | 194 } else if (name->Equals(v8::String::New("SetSuggestions"))) { |
| 195 return v8::FunctionTemplate::New(SetSuggestions); | 195 return v8::FunctionTemplate::New(SetSuggestions); |
| 196 } | 196 } |
| 197 return v8::Handle<v8::FunctionTemplate>(); | 197 return v8::Handle<v8::FunctionTemplate>(); |
| 198 } | 198 } |
| 199 | 199 |
| 200 // static | 200 // static |
| 201 RenderView* SearchBoxExtensionWrapper::GetRenderView() { | 201 RenderViewWrapper* SearchBoxExtensionWrapper::GetRenderViewWrapper() { |
| 202 WebFrame* webframe = WebFrame::frameForEnteredContext(); | 202 WebFrame* webframe = WebFrame::frameForEnteredContext(); |
| 203 DCHECK(webframe) << "There should be an active frame since we just got " | 203 DCHECK(webframe) << "There should be an active frame since we just got " |
| 204 "a native function called."; | 204 "a native function called."; |
| 205 if (!webframe) return NULL; | 205 if (!webframe) return NULL; |
| 206 | 206 |
| 207 WebView* webview = webframe->view(); | 207 WebView* webview = webframe->view(); |
| 208 if (!webview) return NULL; // can happen during closing | 208 if (!webview) return NULL; // can happen during closing |
| 209 | 209 |
| 210 return RenderView::FromWebView(webview); | 210 return RenderViewWrapper::FromWebView(webview); |
| 211 } | 211 } |
| 212 | 212 |
| 213 // static | 213 // static |
| 214 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetValue( | 214 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetValue( |
| 215 const v8::Arguments& args) { | 215 const v8::Arguments& args) { |
| 216 RenderView* render_view = GetRenderView(); | 216 RenderViewWrapper* render_view_wrapper = GetRenderViewWrapper(); |
| 217 if (!render_view) return v8::Undefined(); | 217 if (!render_view_wrapper) return v8::Undefined(); |
| 218 return v8::String::New( | 218 return v8::String::New( |
| 219 reinterpret_cast<const uint16_t*>( | 219 reinterpret_cast<const uint16_t*>( |
| 220 render_view->searchbox()->value().c_str()), | 220 render_view_wrapper->searchbox()->value().c_str()), |
| 221 render_view->searchbox()->value().length()); | 221 render_view_wrapper->searchbox()->value().length()); |
| 222 } | 222 } |
| 223 | 223 |
| 224 // static | 224 // static |
| 225 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetVerbatim( | 225 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetVerbatim( |
| 226 const v8::Arguments& args) { | 226 const v8::Arguments& args) { |
| 227 RenderView* render_view = GetRenderView(); | 227 RenderViewWrapper* render_view_wrapper = GetRenderViewWrapper(); |
| 228 if (!render_view) return v8::Undefined(); | 228 if (!render_view_wrapper) return v8::Undefined(); |
| 229 return v8::Boolean::New(render_view->searchbox()->verbatim()); | 229 return v8::Boolean::New(render_view_wrapper->searchbox()->verbatim()); |
| 230 } | 230 } |
| 231 | 231 |
| 232 // static | 232 // static |
| 233 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetSelectionStart( | 233 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetSelectionStart( |
| 234 const v8::Arguments& args) { | 234 const v8::Arguments& args) { |
| 235 RenderView* render_view = GetRenderView(); | 235 RenderViewWrapper* render_view_wrapper = GetRenderViewWrapper(); |
| 236 if (!render_view) return v8::Undefined(); | 236 if (!render_view_wrapper) return v8::Undefined(); |
| 237 return v8::Int32::New(render_view->searchbox()->selection_start()); | 237 return v8::Int32::New(render_view_wrapper->searchbox()->selection_start()); |
| 238 } | 238 } |
| 239 | 239 |
| 240 // static | 240 // static |
| 241 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetSelectionEnd( | 241 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetSelectionEnd( |
| 242 const v8::Arguments& args) { | 242 const v8::Arguments& args) { |
| 243 RenderView* render_view = GetRenderView(); | 243 RenderViewWrapper* render_view_wrapper = GetRenderViewWrapper(); |
| 244 if (!render_view) return v8::Undefined(); | 244 if (!render_view_wrapper) return v8::Undefined(); |
| 245 return v8::Int32::New(render_view->searchbox()->selection_end()); | 245 return v8::Int32::New(render_view_wrapper->searchbox()->selection_end()); |
| 246 } | 246 } |
| 247 | 247 |
| 248 // static | 248 // static |
| 249 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetX( | 249 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetX( |
| 250 const v8::Arguments& args) { | 250 const v8::Arguments& args) { |
| 251 RenderView* render_view = GetRenderView(); | 251 RenderViewWrapper* render_view_wrapper = GetRenderViewWrapper(); |
| 252 if (!render_view) return v8::Undefined(); | 252 if (!render_view_wrapper) return v8::Undefined(); |
| 253 return v8::Int32::New(render_view->searchbox()->rect().x()); | 253 return v8::Int32::New(render_view_wrapper->searchbox()->rect().x()); |
| 254 } | 254 } |
| 255 | 255 |
| 256 // static | 256 // static |
| 257 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetY( | 257 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetY( |
| 258 const v8::Arguments& args) { | 258 const v8::Arguments& args) { |
| 259 RenderView* render_view = GetRenderView(); | 259 RenderViewWrapper* render_view_wrapper = GetRenderViewWrapper(); |
| 260 if (!render_view) return v8::Undefined(); | 260 if (!render_view_wrapper) return v8::Undefined(); |
| 261 return v8::Int32::New(render_view->searchbox()->rect().y()); | 261 return v8::Int32::New(render_view_wrapper->searchbox()->rect().y()); |
| 262 } | 262 } |
| 263 | 263 |
| 264 // static | 264 // static |
| 265 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetWidth( | 265 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetWidth( |
| 266 const v8::Arguments& args) { | 266 const v8::Arguments& args) { |
| 267 RenderView* render_view = GetRenderView(); | 267 RenderViewWrapper* render_view_wrapper = GetRenderViewWrapper(); |
| 268 if (!render_view) return v8::Undefined(); | 268 if (!render_view_wrapper) return v8::Undefined(); |
| 269 return v8::Int32::New(render_view->searchbox()->rect().width()); | 269 return v8::Int32::New(render_view_wrapper->searchbox()->rect().width()); |
| 270 } | 270 } |
| 271 | 271 |
| 272 // static | 272 // static |
| 273 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetHeight( | 273 v8::Handle<v8::Value> SearchBoxExtensionWrapper::GetHeight( |
| 274 const v8::Arguments& args) { | 274 const v8::Arguments& args) { |
| 275 RenderView* render_view = GetRenderView(); | 275 RenderViewWrapper* render_view_wrapper = GetRenderViewWrapper(); |
| 276 if (!render_view) return v8::Undefined(); | 276 if (!render_view_wrapper) return v8::Undefined(); |
| 277 return v8::Int32::New(render_view->searchbox()->rect().height()); | 277 return v8::Int32::New(render_view_wrapper->searchbox()->rect().height()); |
| 278 } | 278 } |
| 279 | 279 |
| 280 // Accepts a single argument in form: | 280 // Accepts a single argument in form: |
| 281 // { | 281 // { |
| 282 // suggestions: [ | 282 // suggestions: [ |
| 283 // { | 283 // { |
| 284 // value: "..." | 284 // value: "..." |
| 285 // } | 285 // } |
| 286 // ] | 286 // ] |
| 287 // } | 287 // } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 suggestion_json->Get(v8::String::New("complete_behavior")); | 335 suggestion_json->Get(v8::String::New("complete_behavior")); |
| 336 if (complete_value->IsString()) { | 336 if (complete_value->IsString()) { |
| 337 if (complete_value->Equals(v8::String::New("never"))) | 337 if (complete_value->Equals(v8::String::New("never"))) |
| 338 behavior = INSTANT_COMPLETE_NEVER; | 338 behavior = INSTANT_COMPLETE_NEVER; |
| 339 else if (complete_value->Equals(v8::String::New("delayed"))) | 339 else if (complete_value->Equals(v8::String::New("delayed"))) |
| 340 behavior = INSTANT_COMPLETE_DELAYED; | 340 behavior = INSTANT_COMPLETE_DELAYED; |
| 341 } | 341 } |
| 342 } | 342 } |
| 343 } | 343 } |
| 344 | 344 |
| 345 if (RenderView* render_view = GetRenderView()) | 345 if (RenderViewWrapper* render_view_wrapper = GetRenderViewWrapper()) |
| 346 render_view->searchbox()->SetSuggestions(suggestions, behavior); | 346 render_view_wrapper->searchbox()->SetSuggestions(suggestions, behavior); |
| 347 return v8::Undefined(); | 347 return v8::Undefined(); |
| 348 } | 348 } |
| 349 | 349 |
| 350 // static | 350 // static |
| 351 bool Dispatch(WebFrame* frame, const std::string& event_name) { | 351 bool Dispatch(WebFrame* frame, const std::string& event_name) { |
| 352 DCHECK(frame) << "Dispatch requires frame"; | 352 DCHECK(frame) << "Dispatch requires frame"; |
| 353 if (!frame) return false; | 353 if (!frame) return false; |
| 354 | 354 |
| 355 v8::HandleScope handle_scope; | 355 v8::HandleScope handle_scope; |
| 356 v8::Local<v8::Context> context = frame->mainWorldScriptContext(); | 356 v8::Local<v8::Context> context = frame->mainWorldScriptContext(); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 | 427 |
| 428 return supports_searchbox_api || supports_deprecated_api; | 428 return supports_searchbox_api || supports_deprecated_api; |
| 429 } | 429 } |
| 430 | 430 |
| 431 // static | 431 // static |
| 432 v8::Extension* SearchBoxExtension::Get() { | 432 v8::Extension* SearchBoxExtension::Get() { |
| 433 return new SearchBoxExtensionWrapper(); | 433 return new SearchBoxExtensionWrapper(); |
| 434 } | 434 } |
| 435 | 435 |
| 436 } // namespace extensions_v8 | 436 } // namespace extensions_v8 |
| OLD | NEW |