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 f56ce48c84f1e8922f47ef0b17ac13d31baac1fa..2470d5e2d833ac3872926df41f80e88e59d27c65 100644 |
| --- a/chrome/renderer/searchbox/searchbox_extension.cc |
| +++ b/chrome/renderer/searchbox/searchbox_extension.cc |
| @@ -15,6 +15,7 @@ |
| #include "chrome/common/ntp_logging_events.h" |
| #include "chrome/common/url_constants.h" |
| #include "chrome/renderer/searchbox/searchbox.h" |
| +#include "content/public/common/url_constants.h" |
| #include "content/public/renderer/render_view.h" |
| #include "extensions/common/extension.h" |
| #include "grit/renderer_resources.h" |
| @@ -362,6 +363,10 @@ class SearchBoxExtensionWrapper : public v8::Extension { |
| static void GetAppLauncherEnabled( |
| const v8::FunctionCallbackInfo<v8::Value>& args); |
| + // Gets the desired navigation behavior from a click event. |
| + static void GetDispositionFromClick( |
| + const v8::FunctionCallbackInfo<v8::Value>& args); |
| + |
| // Gets Most Visited Items. |
| static void GetMostVisitedItems( |
| const v8::FunctionCallbackInfo<v8::Value>& args); |
| @@ -407,6 +412,9 @@ class SearchBoxExtensionWrapper : public v8::Extension { |
| // Logs an impression on one of the Most Visited tile on the NTP. |
| static void LogImpression(const v8::FunctionCallbackInfo<v8::Value>& args); |
| + // Logs a navigation on one of the Most Visited tile on the NTP. |
| + static void LogNavigation(const v8::FunctionCallbackInfo<v8::Value>& args); |
| + |
| // Navigates the window to a URL represented by either a URL string or a |
| // restricted ID. |
| static void NavigateContentWindow( |
| @@ -541,6 +549,8 @@ SearchBoxExtensionWrapper::GetNativeFunctionTemplate( |
| return v8::FunctionTemplate::New(isolate, Focus); |
| if (name->Equals(v8::String::NewFromUtf8(isolate, "GetAppLauncherEnabled"))) |
| return v8::FunctionTemplate::New(isolate, GetAppLauncherEnabled); |
| + if (name->Equals(v8::String::NewFromUtf8(isolate, "GetDispositionFromClick"))) |
| + return v8::FunctionTemplate::New(isolate, GetDispositionFromClick); |
| if (name->Equals(v8::String::NewFromUtf8(isolate, "GetMostVisitedItems"))) |
| return v8::FunctionTemplate::New(isolate, GetMostVisitedItems); |
| if (name->Equals(v8::String::NewFromUtf8(isolate, "GetMostVisitedItemData"))) |
| @@ -565,6 +575,8 @@ SearchBoxExtensionWrapper::GetNativeFunctionTemplate( |
| return v8::FunctionTemplate::New(isolate, LogEvent); |
| if (name->Equals(v8::String::NewFromUtf8(isolate, "LogImpression"))) |
| return v8::FunctionTemplate::New(isolate, LogImpression); |
| + if (name->Equals(v8::String::NewFromUtf8(isolate, "LogNavigation"))) |
| + return v8::FunctionTemplate::New(isolate, LogNavigation); |
| if (name->Equals(v8::String::NewFromUtf8(isolate, "NavigateContentWindow"))) |
| return v8::FunctionTemplate::New(isolate, NavigateContentWindow); |
| if (name->Equals(v8::String::NewFromUtf8(isolate, "Paste"))) |
| @@ -641,6 +653,27 @@ void SearchBoxExtensionWrapper::GetAppLauncherEnabled( |
| } |
| // static |
| +void SearchBoxExtensionWrapper::GetDispositionFromClick( |
| + const v8::FunctionCallbackInfo<v8::Value>& args) { |
| + content::RenderView* render_view = GetRenderView(); |
| + if (!render_view || args.Length() != 5) return; |
| + |
| + bool middle_button = args[0]->BooleanValue(); |
| + bool alt_key = args[1]->BooleanValue(); |
| + bool ctrl_key = args[2]->BooleanValue(); |
| + bool meta_key = args[3]->BooleanValue(); |
| + bool shift_key = args[4]->BooleanValue(); |
| + |
| + WindowOpenDisposition disposition = ui::DispositionFromClick(middle_button, |
| + alt_key, |
| + ctrl_key, |
| + meta_key, |
| + shift_key); |
| + v8::Isolate* isolate = args.GetIsolate(); |
| + args.GetReturnValue().Set(v8::Int32::New(isolate, disposition)); |
| +} |
| + |
| +// static |
| void SearchBoxExtensionWrapper::GetMostVisitedItems( |
| const v8::FunctionCallbackInfo<v8::Value>& args) { |
| content::RenderView* render_view = GetRenderView(); |
| @@ -955,6 +988,22 @@ void SearchBoxExtensionWrapper::LogImpression( |
| } |
| // static |
| +void SearchBoxExtensionWrapper::LogNavigation( |
| + const v8::FunctionCallbackInfo<v8::Value>& args) { |
| + content::RenderView* render_view = GetRenderViewWithCheckedOrigin( |
| + GURL(chrome::kChromeSearchMostVisitedUrl)); |
| + if (!render_view) return; |
| + |
| + if (args.Length() < 2 || !args[0]->IsNumber() || args[1]->IsUndefined()) |
| + return; |
| + |
| + DVLOG(1) << render_view << " LogNavigation"; |
| + |
| + SearchBox::Get(render_view)->LogNavigation(args[0]->IntegerValue(), |
| + V8ValueToUTF16(args[1])); |
| +} |
| + |
| +// static |
| void SearchBoxExtensionWrapper::NavigateContentWindow( |
| const v8::FunctionCallbackInfo<v8::Value>& args) { |
| content::RenderView* render_view = GetRenderView(); |
| @@ -973,17 +1022,19 @@ void SearchBoxExtensionWrapper::NavigateContentWindow( |
| } else { |
| // Resolve the URL |
| const base::string16& possibly_relative_url = V8ValueToUTF16(args[0]); |
| - GURL current_url = GetCurrentURL(render_view); |
| + GURL current_url = GetCurrentURL(render_view); |
| destination_url = internal::ResolveURL(current_url, possibly_relative_url); |
| } |
| DVLOG(1) << render_view << " NavigateContentWindow: " << destination_url; |
| // Navigate the main frame. |
| - if (destination_url.is_valid()) { |
| + if (destination_url.is_valid() && |
| + !destination_url.SchemeIs(content::kJavaScriptScheme)) { |
|
beaudoin
2014/03/04 21:33:15
Any other scheme we should prevent against? I'd de
|
| WindowOpenDisposition disposition = CURRENT_TAB; |
| - if (args[1]->Uint32Value() == 2) |
| - disposition = NEW_BACKGROUND_TAB; |
| + if (args[1]->IsNumber()) { |
| + disposition = (WindowOpenDisposition) args[1]->Uint32Value(); |
| + } |
| SearchBox::Get(render_view)->NavigateToURL(destination_url, disposition, |
| is_most_visited_item_url); |
| } |