Index: chrome/browser/ui/gtk/omnibox/omnibox_view_gtk.cc |
=================================================================== |
--- chrome/browser/ui/gtk/omnibox/omnibox_view_gtk.cc (revision 110898) |
+++ chrome/browser/ui/gtk/omnibox/omnibox_view_gtk.cc (working copy) |
@@ -67,6 +67,13 @@ |
const double kStrikethroughStrokeRed = 162.0 / 256.0; |
const double kStrikethroughStrokeWidth = 2.0; |
+// static |
+const char16 kInvalidChars[] = { |
+ '\n', '\r', '\t', |
+ 0x200B, // Zero Width Space |
+ 0 |
+}; |
+ |
size_t GetUTF8Offset(const string16& text, size_t text_offset) { |
return UTF16ToUTF8(text.substr(0, text_offset)).size(); |
} |
@@ -878,9 +885,7 @@ |
if (data.GetURLAndTitle(&url, &title)) |
text = UTF8ToUTF16(url.spec()); |
} else { |
- string16 data_string; |
- if (data.GetString(&data_string)) |
- text = CollapseWhitespace(data_string, true); |
+ data.GetString(&text); |
} |
if (!text.empty() && OnPerformDropImpl(text)) |
@@ -1444,10 +1449,14 @@ |
// back after shutdown, and similar issues. |
GtkClipboard* x_clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); |
gchar* text = gtk_clipboard_wait_for_text(x_clipboard); |
- string16 text_wstr = UTF8ToUTF16(text ? text : ""); |
+ string16 sanitized_text(text ? |
+ StripJavascriptSchemas(CollapseWhitespace(UTF8ToUTF16(text), true)) : |
+ string16()); |
g_free(text); |
- // Paste and Go menu item. |
+ // Paste and Go menu item. Note that CanPasteAndGo() needs to be called |
+ // before is_paste_and_search() in order to set up the paste-and-go state. |
+ bool can_paste_and_go = model_->CanPasteAndGo(sanitized_text); |
GtkWidget* paste_go_menuitem = gtk_menu_item_new_with_mnemonic( |
gfx::ConvertAcceleratorsFromWindowsStyle( |
l10n_util::GetStringUTF8(model_->is_paste_and_search() ? |
@@ -1455,8 +1464,7 @@ |
gtk_menu_shell_append(GTK_MENU_SHELL(menu), paste_go_menuitem); |
g_signal_connect(paste_go_menuitem, "activate", |
G_CALLBACK(HandlePasteAndGoThunk), this); |
- gtk_widget_set_sensitive(paste_go_menuitem, |
- model_->CanPasteAndGo(text_wstr)); |
+ gtk_widget_set_sensitive(paste_go_menuitem, can_paste_and_go); |
gtk_widget_show(paste_go_menuitem); |
g_signal_connect(menu, "deactivate", |
@@ -1632,7 +1640,7 @@ |
GtkTextIter* location, |
const gchar* text, |
gint len) { |
- std::string filtered_text; |
+ string16 filtered_text; |
filtered_text.reserve(len); |
// Filter out new line and tab characters. |
@@ -1646,29 +1654,21 @@ |
if (len == 1 && (text[0] == '\n' || text[0] == '\r')) |
enter_was_inserted_ = true; |
- const gchar* p = text; |
- while (*p && (p - text) < len) { |
- gunichar c = g_utf8_get_char(p); |
- const gchar* next = g_utf8_next_char(p); |
+ filtered_text = UTF8ToUTF16(text); |
+ RemoveChars(filtered_text, kInvalidChars, &filtered_text); |
- // 0x200B is Zero Width Space, which is inserted just before the instant |
- // anchor for working around the GtkTextView's misalignment bug. |
- // This character might be captured and inserted into the content by undo |
- // manager, so we need to filter it out here. |
- if (c != L'\n' && c != L'\r' && c != L'\t' && c != 0x200B) |
- filtered_text.append(p, next); |
+ if (model_->is_pasting()) |
+ filtered_text = StripJavascriptSchemas(filtered_text); |
- p = next; |
- } |
- |
- if (filtered_text.length()) { |
+ if (!filtered_text.empty()) { |
// Avoid inserting the text after the instant anchor. |
ValidateTextBufferIter(location); |
// Call the default handler to insert filtered text. |
GtkTextBufferClass* klass = GTK_TEXT_BUFFER_GET_CLASS(buffer); |
- klass->insert_text(buffer, location, filtered_text.data(), |
- static_cast<gint>(filtered_text.length())); |
+ std::string utf8_text = UTF16ToUTF8(filtered_text); |
+ klass->insert_text(buffer, location, utf8_text.data(), |
+ static_cast<gint>(utf8_text.length())); |
} |
// Stop propagating the signal emission to prevent the default handler from |
@@ -1795,7 +1795,8 @@ |
} |
bool OmniboxViewGtk::OnPerformDropImpl(const string16& text) { |
- if (model_->CanPasteAndGo(CollapseWhitespace(text, true))) { |
+ if (model_->CanPasteAndGo(StripJavascriptSchemas( |
+ CollapseWhitespace(text, true)))) { |
model_->PasteAndGo(); |
return true; |
} |