Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Side by Side Diff: chrome/renderer/searchbox_extension.cc

Issue 6677030: Fixes crash if instant is enabled and you block JS. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Adds test Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/instant/instant_loader.cc ('k') | content/common/notification_type.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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"
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
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();
357 if (context.IsEmpty())
358 return false;
357 v8::Context::Scope context_scope(context); 359 v8::Context::Scope context_scope(context);
358 360
359 v8::Local<v8::Value> value = 361 v8::Local<v8::Value> value =
360 context->Global()->Get(v8::String::New("window")); 362 context->Global()->Get(v8::String::New("window"));
361 std::vector<std::string> components; 363 std::vector<std::string> components;
362 base::SplitStringDontTrim(event_name, '.', &components); 364 base::SplitStringDontTrim(event_name, '.', &components);
363 for (size_t i = 0; i < components.size(); ++i) { 365 for (size_t i = 0; i < components.size(); ++i) {
364 if (!value.IsEmpty() && value->IsObject()) 366 if (!value.IsEmpty() && value->IsObject())
365 value = value->ToObject()->Get(v8::String::New(components[i].c_str())); 367 value = value->ToObject()->Get(v8::String::New(components[i].c_str()));
366 } 368 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 if (Dispatch(frame, kResizeEventName)) 403 if (Dispatch(frame, kResizeEventName))
402 return; 404 return;
403 frame->executeScript(WebScriptSource(kSetOmniboxBoundsScript)); 405 frame->executeScript(WebScriptSource(kSetOmniboxBoundsScript));
404 } 406 }
405 407
406 // static 408 // static
407 bool SearchBoxExtension::PageSupportsInstant(WebFrame* frame) { 409 bool SearchBoxExtension::PageSupportsInstant(WebFrame* frame) {
408 DCHECK(frame) << "PageSupportsInstant requires frame"; 410 DCHECK(frame) << "PageSupportsInstant requires frame";
409 if (!frame) return false; 411 if (!frame) return false;
410 412
411 bool supports_deprecated_api = frame->executeScriptAndReturnValue( 413 v8::Handle<v8::Value> v = frame->executeScriptAndReturnValue(
412 WebScriptSource(kSupportsInstantScript))->BooleanValue(); 414 WebScriptSource(kSupportsInstantScript));
415 bool supports_deprecated_api = !v.IsEmpty() && v->BooleanValue();
413 // TODO(tonyg): Add way of detecting instant support to SearchBox API. 416 // TODO(tonyg): Add way of detecting instant support to SearchBox API.
414 bool supports_searchbox_api = supports_deprecated_api; 417 bool supports_searchbox_api = supports_deprecated_api;
415 418
416 // The deprecated API needs to notify the page of events it may have missed. 419 // The deprecated API needs to notify the page of events it may have missed.
417 // This isn't necessary in the SearchBox API, since the page can query the 420 // This isn't necessary in the SearchBox API, since the page can query the
418 // API at any time. 421 // API at any time.
419 static std::string init_script( 422 static std::string init_script(
420 StringPrintf(kInitScript, kSetOmniboxBoundsScript, kUserInputScript)); 423 StringPrintf(kInitScript, kSetOmniboxBoundsScript, kUserInputScript));
421 if (supports_deprecated_api) { 424 if (supports_deprecated_api) {
422 frame->executeScript(WebScriptSource(WebString::fromUTF8(init_script))); 425 frame->executeScript(WebScriptSource(WebString::fromUTF8(init_script)));
423 } 426 }
424 427
425 return supports_searchbox_api || supports_deprecated_api; 428 return supports_searchbox_api || supports_deprecated_api;
426 } 429 }
427 430
428 // static 431 // static
429 v8::Extension* SearchBoxExtension::Get() { 432 v8::Extension* SearchBoxExtension::Get() {
430 return new SearchBoxExtensionWrapper(); 433 return new SearchBoxExtensionWrapper();
431 } 434 }
432 435
433 } // namespace extensions_v8 436 } // namespace extensions_v8
OLDNEW
« no previous file with comments | « chrome/browser/instant/instant_loader.cc ('k') | content/common/notification_type.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698