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

Side by Side Diff: chrome/browser/autocomplete/autocomplete_edit_view_win.cc

Issue 6462009: Allow dragging and dropping of URLs to any portion of the toolbar view.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 10 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
OLDNEW
1 // Copyright (c) 2011 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/browser/autocomplete/autocomplete_edit_view_win.h" 5 #include "chrome/browser/autocomplete/autocomplete_edit_view_win.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <locale> 8 #include <locale>
9 #include <string> 9 #include <string>
10 10
(...skipping 22 matching lines...) Expand all
33 #include "chrome/browser/search_engines/template_url_model.h" 33 #include "chrome/browser/search_engines/template_url_model.h"
34 #include "chrome/browser/tab_contents/tab_contents.h" 34 #include "chrome/browser/tab_contents/tab_contents.h"
35 #include "chrome/browser/ui/views/location_bar/location_bar_view.h" 35 #include "chrome/browser/ui/views/location_bar/location_bar_view.h"
36 #include "chrome/common/notification_service.h" 36 #include "chrome/common/notification_service.h"
37 #include "googleurl/src/url_util.h" 37 #include "googleurl/src/url_util.h"
38 #include "grit/generated_resources.h" 38 #include "grit/generated_resources.h"
39 #include "net/base/escape.h" 39 #include "net/base/escape.h"
40 #include "skia/ext/skia_utils_win.h" 40 #include "skia/ext/skia_utils_win.h"
41 #include "ui/base/clipboard/clipboard.h" 41 #include "ui/base/clipboard/clipboard.h"
42 #include "ui/base/clipboard/scoped_clipboard_writer.h" 42 #include "ui/base/clipboard/scoped_clipboard_writer.h"
43 #include "ui/base/dragdrop/drag_drop_types.h"
43 #include "ui/base/dragdrop/drag_source.h" 44 #include "ui/base/dragdrop/drag_source.h"
44 #include "ui/base/dragdrop/drop_target.h" 45 #include "ui/base/dragdrop/drop_target.h"
45 #include "ui/base/dragdrop/os_exchange_data.h" 46 #include "ui/base/dragdrop/os_exchange_data.h"
46 #include "ui/base/dragdrop/os_exchange_data_provider_win.h" 47 #include "ui/base/dragdrop/os_exchange_data_provider_win.h"
47 #include "ui/base/keycodes/keyboard_codes.h" 48 #include "ui/base/keycodes/keyboard_codes.h"
48 #include "ui/base/l10n/l10n_util.h" 49 #include "ui/base/l10n/l10n_util.h"
49 #include "ui/base/l10n/l10n_util_win.h" 50 #include "ui/base/l10n/l10n_util_win.h"
50 #include "ui/gfx/canvas.h" 51 #include "ui/gfx/canvas.h"
51 #include "ui/gfx/canvas_skia.h" 52 #include "ui/gfx/canvas_skia.h"
52 #include "views/controls/textfield/native_textfield_win.h" 53 #include "views/controls/textfield/native_textfield_win.h"
53 #include "views/drag_utils.h" 54 #include "views/drag_utils.h"
54 #include "views/events/event_utils_win.h" 55 #include "views/events/event_utils_win.h"
55 #include "views/focus/focus_util_win.h" 56 #include "views/focus/focus_util_win.h"
56 #include "views/widget/widget.h" 57 #include "views/widget/widget.h"
57 58
58 #pragma comment(lib, "oleacc.lib") // Needed for accessibility support. 59 #pragma comment(lib, "oleacc.lib") // Needed for accessibility support.
59 #pragma comment(lib, "riched20.lib") // Needed for the richedit control. 60 #pragma comment(lib, "riched20.lib") // Needed for the richedit control.
60 61
61 /////////////////////////////////////////////////////////////////////////////// 62 ///////////////////////////////////////////////////////////////////////////////
62 // AutocompleteEditModel 63 // AutocompleteEditModel
63 64
64 namespace { 65 namespace {
65 66
67 // A helper method for determining a valid DROPEFFECT given the allowed
68 // DROPEFFECTS. We prefer copy over link.
69 DWORD CopyOrLinkDropEffect(DWORD effect) {
70 if (effect & DROPEFFECT_COPY)
71 return DROPEFFECT_COPY;
72 if (effect & DROPEFFECT_LINK)
73 return DROPEFFECT_LINK;
74 return DROPEFFECT_NONE;
75 }
76
77 // A helper method for determining a valid drag operation given the allowed
78 // operation. We prefer copy over link.
79 int CopyOrLinkDragOperation(int drag_operation) {
80 if (drag_operation & ui::DragDropTypes::DRAG_COPY)
81 return ui::DragDropTypes::DRAG_COPY;
82 if (drag_operation & ui::DragDropTypes::DRAG_LINK)
83 return ui::DragDropTypes::DRAG_LINK;
84 return ui::DragDropTypes::DRAG_NONE;
85 }
86
87 // The AutocompleteEditState struct contains enough information about the
88 // AutocompleteEditModel and AutocompleteEditViewWin to save/restore a user's
89 // typing, caret position, etc. across tab changes. We explicitly don't
90 // preserve things like whether the popup was open as this might be weird.
91 struct AutocompleteEditState {
92 AutocompleteEditState(const AutocompleteEditModel::State model_state,
93 const AutocompleteEditViewWin::State view_state)
94 : model_state(model_state),
95 view_state(view_state) {
96 }
97
98 const AutocompleteEditModel::State model_state;
99 const AutocompleteEditViewWin::State view_state;
100 };
101
102 // Returns true if the current point is far enough from the origin that it
103 // would be considered a drag.
104 bool IsDrag(const POINT& origin, const POINT& current) {
sky 2011/02/15 19:05:50 Use views::View::ExeceededDragThreshold instead
Roger Tawa OOO till Jul 10th 2011/02/15 19:50:07 Done.
105 // The CXDRAG and CYDRAG system metrics describe the width and height of a
106 // rectangle around the origin position, inside of which motion is not
107 // considered a drag.
108 return (abs(current.x - origin.x) > (GetSystemMetrics(SM_CXDRAG) / 2)) ||
109 (abs(current.y - origin.y) > (GetSystemMetrics(SM_CYDRAG) / 2));
110 }
111
112 } // namespace
113
66 // EditDropTarget is the IDropTarget implementation installed on 114 // EditDropTarget is the IDropTarget implementation installed on
67 // AutocompleteEditViewWin. EditDropTarget prefers URL over plain text. A drop 115 // AutocompleteEditViewWin. EditDropTarget prefers URL over plain text. A drop
68 // of a URL replaces all the text of the edit and navigates immediately to the 116 // of a URL replaces all the text of the edit and navigates immediately to the
69 // URL. A drop of plain text from the same edit either copies or moves the 117 // URL. A drop of plain text from the same edit either copies or moves the
70 // selected text, and a drop of plain text from a source other than the edit 118 // selected text, and a drop of plain text from a source other than the edit
71 // does a paste and go. 119 // does a paste and go.
72 class EditDropTarget : public ui::DropTarget { 120 class AutocompleteEditViewWin::EditDropTarget : public ui::DropTarget {
73 public: 121 public:
74 explicit EditDropTarget(AutocompleteEditViewWin* edit); 122 explicit EditDropTarget(AutocompleteEditViewWin* edit);
75 123
76 protected: 124 protected:
77 virtual DWORD OnDragEnter(IDataObject* data_object, 125 virtual DWORD OnDragEnter(IDataObject* data_object,
78 DWORD key_state, 126 DWORD key_state,
79 POINT cursor_position, 127 POINT cursor_position,
80 DWORD effect); 128 DWORD effect);
81 virtual DWORD OnDragOver(IDataObject* data_object, 129 virtual DWORD OnDragOver(IDataObject* data_object,
82 DWORD key_state, 130 DWORD key_state,
(...skipping 19 matching lines...) Expand all
102 // If true, the drag session contains a URL. 150 // If true, the drag session contains a URL.
103 bool drag_has_url_; 151 bool drag_has_url_;
104 152
105 // If true, the drag session contains a string. If drag_has_url_ is true, 153 // If true, the drag session contains a string. If drag_has_url_ is true,
106 // this is false regardless of whether the clipboard has a string. 154 // this is false regardless of whether the clipboard has a string.
107 bool drag_has_string_; 155 bool drag_has_string_;
108 156
109 DISALLOW_COPY_AND_ASSIGN(EditDropTarget); 157 DISALLOW_COPY_AND_ASSIGN(EditDropTarget);
110 }; 158 };
111 159
112 // A helper method for determining a valid DROPEFFECT given the allowed 160 AutocompleteEditViewWin::EditDropTarget::EditDropTarget(
113 // DROPEFFECTS. We prefer copy over link. 161 AutocompleteEditViewWin* edit)
114 DWORD CopyOrLinkDropEffect(DWORD effect) {
115 if (effect & DROPEFFECT_COPY)
116 return DROPEFFECT_COPY;
117 if (effect & DROPEFFECT_LINK)
118 return DROPEFFECT_LINK;
119 return DROPEFFECT_NONE;
120 }
121
122 EditDropTarget::EditDropTarget(AutocompleteEditViewWin* edit)
123 : ui::DropTarget(edit->m_hWnd), 162 : ui::DropTarget(edit->m_hWnd),
124 edit_(edit), 163 edit_(edit),
125 drag_has_url_(false), 164 drag_has_url_(false),
126 drag_has_string_(false) { 165 drag_has_string_(false) {
127 } 166 }
128 167
129 DWORD EditDropTarget::OnDragEnter(IDataObject* data_object, 168 DWORD AutocompleteEditViewWin::EditDropTarget::OnDragEnter(
130 DWORD key_state, 169 IDataObject* data_object,
131 POINT cursor_position, 170 DWORD key_state,
132 DWORD effect) { 171 POINT cursor_position,
172 DWORD effect) {
133 ui::OSExchangeData os_data(new ui::OSExchangeDataProviderWin(data_object)); 173 ui::OSExchangeData os_data(new ui::OSExchangeDataProviderWin(data_object));
134 drag_has_url_ = os_data.HasURL(); 174 drag_has_url_ = os_data.HasURL();
135 drag_has_string_ = !drag_has_url_ && os_data.HasString(); 175 drag_has_string_ = !drag_has_url_ && os_data.HasString();
136 if (drag_has_url_) { 176 if (drag_has_url_) {
137 if (edit_->in_drag()) { 177 if (edit_->in_drag()) {
138 // The edit we're associated with originated the drag. No point in 178 // The edit we're associated with originated the drag. No point in
139 // allowing the user to drop back on us. 179 // allowing the user to drop back on us.
140 drag_has_url_ = false; 180 drag_has_url_ = false;
141 } 181 }
142 // NOTE: it would be nice to visually show all the text is going to 182 // NOTE: it would be nice to visually show all the text is going to
143 // be replaced by selecting all, but this caused painting problems. In 183 // be replaced by selecting all, but this caused painting problems. In
144 // particular the flashing caret would appear outside the edit! For now 184 // particular the flashing caret would appear outside the edit! For now
145 // we stick with no visual indicator other than that shown own the mouse 185 // we stick with no visual indicator other than that shown own the mouse
146 // cursor. 186 // cursor.
147 } 187 }
148 return OnDragOver(data_object, key_state, cursor_position, effect); 188 return OnDragOver(data_object, key_state, cursor_position, effect);
149 } 189 }
150 190
151 DWORD EditDropTarget::OnDragOver(IDataObject* data_object, 191 DWORD AutocompleteEditViewWin::EditDropTarget::OnDragOver(
152 DWORD key_state, 192 IDataObject* data_object,
153 POINT cursor_position, 193 DWORD key_state,
154 DWORD effect) { 194 POINT cursor_position,
195 DWORD effect) {
155 if (drag_has_url_) 196 if (drag_has_url_)
156 return CopyOrLinkDropEffect(effect); 197 return CopyOrLinkDropEffect(effect);
157 198
158 if (drag_has_string_) { 199 if (drag_has_string_) {
159 UpdateDropHighlightPosition(cursor_position); 200 UpdateDropHighlightPosition(cursor_position);
160 if (edit_->drop_highlight_position() == -1 && edit_->in_drag()) 201 if (edit_->drop_highlight_position() == -1 && edit_->in_drag())
161 return DROPEFFECT_NONE; 202 return DROPEFFECT_NONE;
162 if (edit_->in_drag()) { 203 if (edit_->in_drag()) {
163 // The edit we're associated with originated the drag. Do the normal drag 204 // The edit we're associated with originated the drag. Do the normal drag
164 // behavior. 205 // behavior.
165 DCHECK((effect & DROPEFFECT_COPY) && (effect & DROPEFFECT_MOVE)); 206 DCHECK((effect & DROPEFFECT_COPY) && (effect & DROPEFFECT_MOVE));
166 return (key_state & MK_CONTROL) ? DROPEFFECT_COPY : DROPEFFECT_MOVE; 207 return (key_state & MK_CONTROL) ? DROPEFFECT_COPY : DROPEFFECT_MOVE;
167 } 208 }
168 // Our edit didn't originate the drag, only allow link or copy. 209 // Our edit didn't originate the drag, only allow link or copy.
169 return CopyOrLinkDropEffect(effect); 210 return CopyOrLinkDropEffect(effect);
170 } 211 }
171 212
172 return DROPEFFECT_NONE; 213 return DROPEFFECT_NONE;
173 } 214 }
174 215
175 void EditDropTarget::OnDragLeave(IDataObject* data_object) { 216 void AutocompleteEditViewWin::EditDropTarget::OnDragLeave(
217 IDataObject* data_object) {
176 ResetDropHighlights(); 218 ResetDropHighlights();
177 } 219 }
178 220
179 DWORD EditDropTarget::OnDrop(IDataObject* data_object, 221 DWORD AutocompleteEditViewWin::EditDropTarget::OnDrop(
180 DWORD key_state, 222 IDataObject* data_object,
181 POINT cursor_position, 223 DWORD key_state,
182 DWORD effect) { 224 POINT cursor_position,
225 DWORD effect) {
226 effect = OnDragOver(data_object, key_state, cursor_position, effect);
227
228 // OnDragOver() always returns only one effect type. We create the event
sky 2011/02/15 19:05:50 Nuke this comment, it isn't useful.
Roger Tawa OOO till Jul 10th 2011/02/15 19:50:07 Done.
229 // with this effect so that it too only has one drag type.
183 ui::OSExchangeData os_data(new ui::OSExchangeDataProviderWin(data_object)); 230 ui::OSExchangeData os_data(new ui::OSExchangeDataProviderWin(data_object));
231 views::DropTargetEvent event(os_data, cursor_position.x, cursor_position.y,
232 ui::DragDropTypes::DropEffectToDragOperation(effect));
184 233
185 if (drag_has_url_) { 234 int drag_operation = edit_->OnPerformDropImpl(event, edit_->in_drag());
186 GURL url;
187 string16 title;
188 if (os_data.GetURLAndTitle(&url, &title)) {
189 edit_->SetUserText(UTF8ToWide(url.spec()));
190 edit_->model()->AcceptInput(CURRENT_TAB, true);
191 return CopyOrLinkDropEffect(effect);
192 }
193 } else if (drag_has_string_) {
194 int string_drop_position = edit_->drop_highlight_position();
195 string16 text;
196 if ((string_drop_position != -1 || !edit_->in_drag()) &&
197 os_data.GetString(&text)) {
198 DCHECK(string_drop_position == -1 ||
199 ((string_drop_position >= 0) &&
200 (string_drop_position <= edit_->GetTextLength())));
201 const DWORD drop_operation =
202 OnDragOver(data_object, key_state, cursor_position, effect);
203 if (edit_->in_drag()) {
204 if (drop_operation == DROPEFFECT_MOVE)
205 edit_->MoveSelectedText(string_drop_position);
206 else
207 edit_->InsertText(string_drop_position, text);
208 } else {
209 edit_->PasteAndGo(CollapseWhitespace(text, true));
210 }
211 ResetDropHighlights();
212 return drop_operation;
213 }
214 }
215 235
216 ResetDropHighlights(); 236 if (!drag_has_url_)
237 ResetDropHighlights();
217 238
218 return DROPEFFECT_NONE; 239 return ui::DragDropTypes::DragOperationToDropEffect(drag_operation);
219 } 240 }
220 241
221 void EditDropTarget::UpdateDropHighlightPosition( 242 void AutocompleteEditViewWin::EditDropTarget::UpdateDropHighlightPosition(
222 const POINT& cursor_screen_position) { 243 const POINT& cursor_screen_position) {
223 if (drag_has_string_) { 244 if (drag_has_string_) {
224 POINT client_position = cursor_screen_position; 245 POINT client_position = cursor_screen_position;
225 ScreenToClient(edit_->m_hWnd, &client_position); 246 ::ScreenToClient(edit_->m_hWnd, &client_position);
226 int drop_position = edit_->CharFromPos(client_position); 247 int drop_position = edit_->CharFromPos(client_position);
227 if (edit_->in_drag()) { 248 if (edit_->in_drag()) {
228 // Our edit originated the drag, don't allow a drop if over the selected 249 // Our edit originated the drag, don't allow a drop if over the selected
229 // region. 250 // region.
230 LONG sel_start, sel_end; 251 LONG sel_start, sel_end;
231 edit_->GetSel(sel_start, sel_end); 252 edit_->GetSel(sel_start, sel_end);
232 if ((sel_start != sel_end) && (drop_position >= sel_start) && 253 if ((sel_start != sel_end) && (drop_position >= sel_start) &&
233 (drop_position <= sel_end)) 254 (drop_position <= sel_end))
234 drop_position = -1; 255 drop_position = -1;
235 } else { 256 } else {
236 // A drop from a source other than the edit replaces all the text, so 257 // A drop from a source other than the edit replaces all the text, so
237 // we don't show the drop location. See comment in OnDragEnter as to why 258 // we don't show the drop location. See comment in OnDragEnter as to why
238 // we don't try and select all here. 259 // we don't try and select all here.
239 drop_position = -1; 260 drop_position = -1;
240 } 261 }
241 edit_->SetDropHighlightPosition(drop_position); 262 edit_->SetDropHighlightPosition(drop_position);
242 } 263 }
243 } 264 }
244 265
245 void EditDropTarget::ResetDropHighlights() { 266 void AutocompleteEditViewWin::EditDropTarget::ResetDropHighlights() {
246 if (drag_has_string_) 267 if (drag_has_string_)
247 edit_->SetDropHighlightPosition(-1); 268 edit_->SetDropHighlightPosition(-1);
248 } 269 }
249 270
250 // The AutocompleteEditState struct contains enough information about the
251 // AutocompleteEditModel and AutocompleteEditViewWin to save/restore a user's
252 // typing, caret position, etc. across tab changes. We explicitly don't
253 // preserve things like whether the popup was open as this might be weird.
254 struct AutocompleteEditState {
255 AutocompleteEditState(const AutocompleteEditModel::State model_state,
256 const AutocompleteEditViewWin::State view_state)
257 : model_state(model_state),
258 view_state(view_state) {
259 }
260
261 const AutocompleteEditModel::State model_state;
262 const AutocompleteEditViewWin::State view_state;
263 };
264
265 // Returns true if the current point is far enough from the origin that it
266 // would be considered a drag.
267 bool IsDrag(const POINT& origin, const POINT& current) {
268 // The CXDRAG and CYDRAG system metrics describe the width and height of a
269 // rectangle around the origin position, inside of which motion is not
270 // considered a drag.
271 return (abs(current.x - origin.x) > (GetSystemMetrics(SM_CXDRAG) / 2)) ||
272 (abs(current.y - origin.y) > (GetSystemMetrics(SM_CYDRAG) / 2));
273 }
274
275 } // namespace
276 271
277 /////////////////////////////////////////////////////////////////////////////// 272 ///////////////////////////////////////////////////////////////////////////////
278 // Helper classes 273 // Helper classes
279 274
280 AutocompleteEditViewWin::ScopedFreeze::ScopedFreeze( 275 AutocompleteEditViewWin::ScopedFreeze::ScopedFreeze(
281 AutocompleteEditViewWin* edit, 276 AutocompleteEditViewWin* edit,
282 ITextDocument* text_object_model) 277 ITextDocument* text_object_model)
283 : edit_(edit), 278 : edit_(edit),
284 text_object_model_(text_object_model) { 279 text_object_model_(text_object_model) {
285 // Freeze the screen. 280 // Freeze the screen.
(...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after
956 } 951 }
957 952
958 views::View* AutocompleteEditViewWin::AddToView(views::View* parent) { 953 views::View* AutocompleteEditViewWin::AddToView(views::View* parent) {
959 views::NativeViewHost* host = new views::NativeViewHost; 954 views::NativeViewHost* host = new views::NativeViewHost;
960 parent->AddChildView(host); 955 parent->AddChildView(host);
961 host->set_focus_view(parent); 956 host->set_focus_view(parent);
962 host->Attach(GetNativeView()); 957 host->Attach(GetNativeView());
963 return host; 958 return host;
964 } 959 }
965 960
961 int AutocompleteEditViewWin::OnPerformDrop(
962 const views::DropTargetEvent& event) {
963 return OnPerformDropImpl(event, false);
964 }
965
966 int AutocompleteEditViewWin::OnPerformDropImpl(
967 const views::DropTargetEvent& event,
968 bool in_drag) {
969 const ui::OSExchangeData& data = event.data();
970
971 if (data.HasURL()) {
972 GURL url;
973 string16 title;
974 if (data.GetURLAndTitle(&url, &title)) {
975 SetUserText(UTF8ToWide(url.spec()));
976 model()->AcceptInput(CURRENT_TAB, true);
977 return CopyOrLinkDragOperation(event.source_operations());
978 }
979 } else if (data.HasString()) {
980 int string_drop_position = drop_highlight_position();
981 string16 text;
982 if ((string_drop_position != -1 || !in_drag) && data.GetString(&text)) {
983 DCHECK(string_drop_position == -1 ||
984 ((string_drop_position >= 0) &&
985 (string_drop_position <= GetTextLength())));
986 if (in_drag) {
987 if (event.source_operations()== ui::DragDropTypes::DRAG_MOVE)
988 MoveSelectedText(string_drop_position);
989 else
990 InsertText(string_drop_position, text);
991 } else {
992 PasteAndGo(CollapseWhitespace(text, true));
993 }
994 return CopyOrLinkDragOperation(event.source_operations());
995 }
996 }
997
998 return ui::DragDropTypes::DRAG_NONE;
999 }
1000
966 void AutocompleteEditViewWin::PasteAndGo(const string16& text) { 1001 void AutocompleteEditViewWin::PasteAndGo(const string16& text) {
967 if (CanPasteAndGo(text)) 1002 if (CanPasteAndGo(text))
968 model_->PasteAndGo(); 1003 model_->PasteAndGo();
969 } 1004 }
970 1005
971 bool AutocompleteEditViewWin::SkipDefaultKeyEventProcessing( 1006 bool AutocompleteEditViewWin::SkipDefaultKeyEventProcessing(
972 const views::KeyEvent& e) { 1007 const views::KeyEvent& e) {
973 ui::KeyboardCode key = e.key_code(); 1008 ui::KeyboardCode key = e.key_code();
974 // We don't process ALT + numpad digit as accelerators, they are used for 1009 // We don't process ALT + numpad digit as accelerators, they are used for
975 // entering special characters. We do translate alt-home. 1010 // entering special characters. We do translate alt-home.
(...skipping 1607 matching lines...) Expand 10 before | Expand all | Expand 10 after
2583 // PosFromChar(i) might return 0 when i is greater than 1. 2618 // PosFromChar(i) might return 0 when i is greater than 1.
2584 return font_.GetStringWidth(text) + GetHorizontalMargin(); 2619 return font_.GetStringWidth(text) + GetHorizontalMargin();
2585 } 2620 }
2586 2621
2587 bool AutocompleteEditViewWin::IsCaretAtEnd() const { 2622 bool AutocompleteEditViewWin::IsCaretAtEnd() const {
2588 long length = GetTextLength(); 2623 long length = GetTextLength();
2589 CHARRANGE sel; 2624 CHARRANGE sel;
2590 GetSelection(sel); 2625 GetSelection(sel);
2591 return sel.cpMin == sel.cpMax && sel.cpMin == length; 2626 return sel.cpMin == sel.cpMax && sel.cpMin == length;
2592 } 2627 }
OLDNEW
« no previous file with comments | « chrome/browser/autocomplete/autocomplete_edit_view_win.h ('k') | chrome/browser/ui/views/toolbar_view.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698