OLD | NEW |
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 #import <Cocoa/Cocoa.h> | 5 #import <Cocoa/Cocoa.h> |
6 | 6 |
7 #include "app/resource_bundle.h" | 7 #include "app/resource_bundle.h" |
8 #import "base/cocoa_protocols_mac.h" | 8 #import "base/cocoa_protocols_mac.h" |
9 #include "base/scoped_nsobject.h" | 9 #include "base/scoped_nsobject.h" |
10 #import "chrome/browser/cocoa/location_bar/autocomplete_text_field.h" | 10 #import "chrome/browser/cocoa/location_bar/autocomplete_text_field.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 using ::testing::InSequence; | 21 using ::testing::InSequence; |
22 using ::testing::Return; | 22 using ::testing::Return; |
23 using ::testing::StrictMock; | 23 using ::testing::StrictMock; |
24 using ::testing::_; | 24 using ::testing::_; |
25 | 25 |
26 namespace { | 26 namespace { |
27 | 27 |
28 class MockDecoration : public LocationBarDecoration { | 28 class MockDecoration : public LocationBarDecoration { |
29 public: | 29 public: |
30 virtual CGFloat GetWidthForSpace(CGFloat width) { return 20.0; } | 30 virtual CGFloat GetWidthForSpace(CGFloat width) { return 20.0; } |
31 virtual bool IsVisible() const { return visible_; } | |
32 void SetVisible(bool visible) { visible_ = visible; } | |
33 | 31 |
34 virtual void DrawInFrame(NSRect frame, NSView* control_view) { ; } | 32 virtual void DrawInFrame(NSRect frame, NSView* control_view) { ; } |
35 virtual bool AcceptsMousePress() { return true; } | 33 MOCK_METHOD0(AcceptsMousePress, bool()); |
36 MOCK_METHOD1(OnMousePressed, bool(NSRect frame)); | 34 MOCK_METHOD1(OnMousePressed, bool(NSRect frame)); |
37 MOCK_METHOD0(GetMenu, NSMenu*()); | 35 MOCK_METHOD0(GetMenu, NSMenu*()); |
38 | |
39 bool visible_; | |
40 }; | 36 }; |
41 | 37 |
42 // Mock up an incrementing event number. | 38 // Mock up an incrementing event number. |
43 NSUInteger eventNumber = 0; | 39 NSUInteger eventNumber = 0; |
44 | 40 |
45 // Create an event of the indicated |type| at |point| within |view|. | 41 // Create an event of the indicated |type| at |point| within |view|. |
46 // TODO(shess): Would be nice to have a MockApplication which provided | 42 // TODO(shess): Would be nice to have a MockApplication which provided |
47 // nifty accessors to create these things and inject them. It could | 43 // nifty accessors to create these things and inject them. It could |
48 // even provide functions for "Click and drag mouse from point A to | 44 // even provide functions for "Click and drag mouse from point A to |
49 // point B". | 45 // point B". |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 } | 200 } |
205 | 201 |
206 // Test drawing, mostly to ensure nothing leaks or crashes. | 202 // Test drawing, mostly to ensure nothing leaks or crashes. |
207 TEST_F(AutocompleteTextFieldTest, Display) { | 203 TEST_F(AutocompleteTextFieldTest, Display) { |
208 [field_ display]; | 204 [field_ display]; |
209 | 205 |
210 // Test focussed drawing. | 206 // Test focussed drawing. |
211 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; | 207 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; |
212 [field_ display]; | 208 [field_ display]; |
213 [test_window() clearPretendKeyWindowAndFirstResponder]; | 209 [test_window() clearPretendKeyWindowAndFirstResponder]; |
214 | |
215 // Test display of various cell configurations. | |
216 AutocompleteTextFieldCell* cell = [field_ cell]; | |
217 | |
218 [cell setSearchHintString:@"Type to search" availableWidth:kWidth]; | |
219 [field_ display]; | |
220 | |
221 NSImage* image = [NSImage imageNamed:@"NSApplicationIcon"]; | |
222 [cell setKeywordHintPrefix:@"prefix" image:image suffix:@"suffix" | |
223 availableWidth:kWidth]; | |
224 [field_ display]; | |
225 | |
226 [cell clearHint]; | |
227 | |
228 [field_ display]; | |
229 } | 210 } |
230 | 211 |
231 TEST_F(AutocompleteTextFieldObserverTest, FlagsChanged) { | 212 TEST_F(AutocompleteTextFieldObserverTest, FlagsChanged) { |
232 InSequence dummy; // Call mock in exactly the order specified. | 213 InSequence dummy; // Call mock in exactly the order specified. |
233 | 214 |
234 // Test without Control key down, but some other modifier down. | 215 // Test without Control key down, but some other modifier down. |
235 EXPECT_CALL(field_observer_, OnControlKeyChanged(false)); | 216 EXPECT_CALL(field_observer_, OnControlKeyChanged(false)); |
236 [field_ flagsChanged:KeyDownEventWithFlags(NSShiftKeyMask)]; | 217 [field_ flagsChanged:KeyDownEventWithFlags(NSShiftKeyMask)]; |
237 | 218 |
238 // Test with Control key down. | 219 // Test with Control key down. |
(...skipping 25 matching lines...) Expand all Loading... |
264 EXPECT_CALL(field_observer_, OnFrameChanged()); | 245 EXPECT_CALL(field_observer_, OnFrameChanged()); |
265 NSRect frame = [field_ frame]; | 246 NSRect frame = [field_ frame]; |
266 frame.size.width += 10.0; | 247 frame.size.width += 10.0; |
267 [field_ setFrame:frame]; | 248 [field_ setFrame:frame]; |
268 } | 249 } |
269 | 250 |
270 // Test that the field editor gets the same bounds when focus is | 251 // Test that the field editor gets the same bounds when focus is |
271 // delivered by the standard focusing machinery, or by | 252 // delivered by the standard focusing machinery, or by |
272 // -resetFieldEditorFrameIfNeeded. | 253 // -resetFieldEditorFrameIfNeeded. |
273 TEST_F(AutocompleteTextFieldTest, ResetFieldEditorBase) { | 254 TEST_F(AutocompleteTextFieldTest, ResetFieldEditorBase) { |
274 AutocompleteTextFieldCell* cell = [field_ cell]; | |
275 | |
276 // Capture the editor frame resulting from the standard focus | 255 // Capture the editor frame resulting from the standard focus |
277 // machinery. | 256 // machinery. |
278 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; | 257 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; |
279 const NSRect baseEditorFrame(EditorFrame()); | 258 const NSRect baseEditorFrame = EditorFrame(); |
280 | 259 |
281 // Setting a hint should result in a strictly smaller editor frame. | 260 // A decoration should result in a strictly smaller editor frame. |
282 EXPECT_FALSE([cell hintString]); | 261 mock_left_decoration_.SetVisible(true); |
283 [cell setSearchHintString:@"search hint" availableWidth:kWidth]; | |
284 EXPECT_TRUE([cell hintString]); | |
285 [field_ resetFieldEditorFrameIfNeeded]; | 262 [field_ resetFieldEditorFrameIfNeeded]; |
286 EXPECT_FALSE(NSEqualRects(baseEditorFrame, EditorFrame())); | 263 EXPECT_FALSE(NSEqualRects(baseEditorFrame, EditorFrame())); |
287 EXPECT_TRUE(NSContainsRect(baseEditorFrame, EditorFrame())); | 264 EXPECT_TRUE(NSContainsRect(baseEditorFrame, EditorFrame())); |
288 | 265 |
289 // Clearing hint string and using -resetFieldEditorFrameIfNeeded | 266 // Removing the decoration and using -resetFieldEditorFrameIfNeeded |
290 // should result in the same frame as the standard focus machinery. | 267 // should result in the same frame as the standard focus machinery. |
291 [cell clearHint]; | 268 mock_left_decoration_.SetVisible(false); |
292 EXPECT_FALSE([cell hintString]); | |
293 [field_ resetFieldEditorFrameIfNeeded]; | 269 [field_ resetFieldEditorFrameIfNeeded]; |
294 EXPECT_TRUE(NSEqualRects(baseEditorFrame, EditorFrame())); | 270 EXPECT_TRUE(NSEqualRects(baseEditorFrame, EditorFrame())); |
295 } | 271 } |
296 | 272 |
297 // Test that the field editor gets the same bounds when focus is | 273 // Test that the field editor gets the same bounds when focus is |
298 // delivered by the standard focusing machinery, or by | 274 // delivered by the standard focusing machinery, or by |
299 // -resetFieldEditorFrameIfNeeded. | 275 // -resetFieldEditorFrameIfNeeded, this time with a decoration |
300 TEST_F(AutocompleteTextFieldTest, ResetFieldEditorSearchHint) { | 276 // pre-loaded. |
301 AutocompleteTextFieldCell* cell = [field_ cell]; | 277 TEST_F(AutocompleteTextFieldTest, ResetFieldEditorWithDecoration) { |
302 | |
303 NSString* const kHintString = @"Type to search"; | |
304 | |
305 // Capture the editor frame resulting from the standard focus | |
306 // machinery. | |
307 [cell setSearchHintString:kHintString availableWidth:kWidth]; | |
308 EXPECT_TRUE([cell hintString]); | |
309 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; | |
310 const NSRect baseEditorFrame(EditorFrame()); | |
311 | |
312 // Clearing the hint should result in a strictly larger editor | |
313 // frame. | |
314 [cell clearHint]; | |
315 EXPECT_FALSE([cell hintString]); | |
316 [field_ resetFieldEditorFrameIfNeeded]; | |
317 EXPECT_FALSE(NSEqualRects(baseEditorFrame, EditorFrame())); | |
318 EXPECT_TRUE(NSContainsRect(EditorFrame(), baseEditorFrame)); | |
319 | |
320 // Setting the same hint string and using | |
321 // -resetFieldEditorFrameIfNeeded should result in the same frame as | |
322 // the standard focus machinery. | |
323 [cell setSearchHintString:kHintString availableWidth:kWidth]; | |
324 EXPECT_TRUE([cell hintString]); | |
325 [field_ resetFieldEditorFrameIfNeeded]; | |
326 EXPECT_TRUE(NSEqualRects(baseEditorFrame, EditorFrame())); | |
327 } | |
328 | |
329 // Test that the field editor gets the same bounds when focus is | |
330 // delivered by the standard focusing machinery, or by | |
331 // -resetFieldEditorFrameIfNeeded. | |
332 TEST_F(AutocompleteTextFieldTest, ResetFieldEditorKeywordHint) { | |
333 AutocompleteTextFieldCell* cell = [field_ cell]; | 278 AutocompleteTextFieldCell* cell = [field_ cell]; |
334 | 279 |
335 // Make sure decoration isn't already visible, then make it visible. | 280 // Make sure decoration isn't already visible, then make it visible. |
336 EXPECT_TRUE(NSIsEmptyRect([cell frameForDecoration:&mock_left_decoration_ | 281 EXPECT_TRUE(NSIsEmptyRect([cell frameForDecoration:&mock_left_decoration_ |
337 inFrame:[field_ bounds]])); | 282 inFrame:[field_ bounds]])); |
338 mock_left_decoration_.SetVisible(true); | 283 mock_left_decoration_.SetVisible(true); |
339 EXPECT_FALSE(NSIsEmptyRect([cell frameForDecoration:&mock_left_decoration_ | 284 EXPECT_FALSE(NSIsEmptyRect([cell frameForDecoration:&mock_left_decoration_ |
340 inFrame:[field_ bounds]])); | 285 inFrame:[field_ bounds]])); |
341 | 286 |
342 // Capture the editor frame resulting from the standard focus | 287 // Capture the editor frame resulting from the standard focus |
343 // machinery. | 288 // machinery. |
344 | 289 |
345 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; | 290 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; |
346 const NSRect baseEditorFrame(EditorFrame()); | 291 const NSRect baseEditorFrame = EditorFrame(); |
347 | 292 |
348 // When the decoration is not visible the frame should be strictly larger. | 293 // When the decoration is not visible the frame should be strictly larger. |
349 mock_left_decoration_.SetVisible(false); | 294 mock_left_decoration_.SetVisible(false); |
350 EXPECT_TRUE(NSIsEmptyRect([cell frameForDecoration:&mock_left_decoration_ | 295 EXPECT_TRUE(NSIsEmptyRect([cell frameForDecoration:&mock_left_decoration_ |
351 inFrame:[field_ bounds]])); | 296 inFrame:[field_ bounds]])); |
352 [field_ resetFieldEditorFrameIfNeeded]; | 297 [field_ resetFieldEditorFrameIfNeeded]; |
353 EXPECT_FALSE(NSEqualRects(baseEditorFrame, EditorFrame())); | 298 EXPECT_FALSE(NSEqualRects(baseEditorFrame, EditorFrame())); |
354 EXPECT_TRUE(NSContainsRect(EditorFrame(), baseEditorFrame)); | 299 EXPECT_TRUE(NSContainsRect(EditorFrame(), baseEditorFrame)); |
355 | 300 |
356 // When the decoration is visible, -resetFieldEditorFrameIfNeeded | 301 // When the decoration is visible, -resetFieldEditorFrameIfNeeded |
357 // should result in the same frame as the standard focus machinery. | 302 // should result in the same frame as the standard focus machinery. |
358 mock_left_decoration_.SetVisible(true); | 303 mock_left_decoration_.SetVisible(true); |
359 EXPECT_FALSE(NSIsEmptyRect([cell frameForDecoration:&mock_left_decoration_ | 304 EXPECT_FALSE(NSIsEmptyRect([cell frameForDecoration:&mock_left_decoration_ |
360 inFrame:[field_ bounds]])); | 305 inFrame:[field_ bounds]])); |
361 | 306 |
362 [field_ resetFieldEditorFrameIfNeeded]; | 307 [field_ resetFieldEditorFrameIfNeeded]; |
363 EXPECT_TRUE(NSEqualRects(baseEditorFrame, EditorFrame())); | 308 EXPECT_TRUE(NSEqualRects(baseEditorFrame, EditorFrame())); |
364 } | 309 } |
365 | 310 |
366 // Test that resetting the field editor bounds does not cause untoward | 311 // Test that resetting the field editor bounds does not cause untoward |
367 // messages to the field's observer. | 312 // messages to the field's observer. |
368 TEST_F(AutocompleteTextFieldObserverTest, ResetFieldEditorContinuesEditing) { | 313 TEST_F(AutocompleteTextFieldObserverTest, ResetFieldEditorContinuesEditing) { |
369 EXPECT_CALL(field_observer_, OnSetFocus(false)); | 314 EXPECT_CALL(field_observer_, OnSetFocus(false)); |
370 // Becoming first responder doesn't begin editing. | 315 // Becoming first responder doesn't begin editing. |
371 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; | 316 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; |
| 317 const NSRect baseEditorFrame = EditorFrame(); |
372 NSTextView* editor = static_cast<NSTextView*>([field_ currentEditor]); | 318 NSTextView* editor = static_cast<NSTextView*>([field_ currentEditor]); |
373 EXPECT_TRUE(nil != editor); | 319 EXPECT_TRUE(nil != editor); |
374 | 320 |
375 // This should begin editing and indicate a change. | 321 // This should begin editing and indicate a change. |
376 EXPECT_CALL(field_observer_, OnDidBeginEditing()); | 322 EXPECT_CALL(field_observer_, OnDidBeginEditing()); |
377 EXPECT_CALL(field_observer_, OnDidChange()); | 323 EXPECT_CALL(field_observer_, OnDidChange()); |
378 [editor shouldChangeTextInRange:NSMakeRange(0, 0) replacementString:@""]; | 324 [editor shouldChangeTextInRange:NSMakeRange(0, 0) replacementString:@""]; |
379 [editor didChangeText]; | 325 [editor didChangeText]; |
380 | 326 |
381 // No messages to |field_observer_| when resetting the frame. | 327 // No messages to |field_observer_| when the frame actually changes. |
382 AutocompleteTextFieldCell* cell = [field_ cell]; | 328 mock_left_decoration_.SetVisible(true); |
383 [cell setSearchHintString:@"Type to search" availableWidth:kWidth]; | |
384 [field_ resetFieldEditorFrameIfNeeded]; | 329 [field_ resetFieldEditorFrameIfNeeded]; |
| 330 EXPECT_FALSE(NSEqualRects(baseEditorFrame, EditorFrame())); |
385 } | 331 } |
386 | 332 |
387 // Clicking in the search hint should put the caret in the rightmost | 333 // Clicking in a right-hand decoration which does not handle the mouse |
388 // position. | 334 // puts the caret rightmost. |
389 TEST_F(AutocompleteTextFieldTest, ClickSearchHintPutsCaretRightmost) { | 335 TEST_F(AutocompleteTextFieldTest, ClickRightDecorationPutsCaretRightmost) { |
| 336 // Decoration does not handle the mouse event, so the cell should |
| 337 // process it. Called at least once. |
| 338 EXPECT_CALL(mock_right_decoration_, AcceptsMousePress()) |
| 339 .WillOnce(Return(false)) |
| 340 .WillRepeatedly(Return(false)); |
| 341 |
390 // Set the decoration before becoming responder. | 342 // Set the decoration before becoming responder. |
391 EXPECT_FALSE([field_ currentEditor]); | 343 EXPECT_FALSE([field_ currentEditor]); |
392 AutocompleteTextFieldCell* cell = [field_ cell]; | 344 mock_right_decoration_.SetVisible(true); |
393 [cell setSearchHintString:@"Type to search" availableWidth:kWidth]; | |
394 | 345 |
395 // Can't rely on the window machinery to make us first responder, | 346 // Make first responder should select all. |
396 // here. | |
397 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; | 347 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; |
398 EXPECT_TRUE([field_ currentEditor]); | 348 EXPECT_TRUE([field_ currentEditor]); |
| 349 const NSRange allRange = NSMakeRange(0, [[field_ stringValue] length]); |
| 350 EXPECT_TRUE(NSEqualRanges(allRange, [[field_ currentEditor] selectedRange])); |
399 | 351 |
400 const NSPoint point(NSMakePoint(300.0 - 20.0, 5.0)); | 352 // Generate a click on the decoration. |
401 NSEvent* downEvent(Event(field_, point, NSLeftMouseDown)); | 353 AutocompleteTextFieldCell* cell = [field_ cell]; |
402 NSEvent* upEvent(Event(field_, point, NSLeftMouseUp)); | 354 const NSRect bounds = [field_ bounds]; |
| 355 const NSRect iconFrame = |
| 356 [cell frameForDecoration:&mock_right_decoration_ inFrame:bounds]; |
| 357 const NSPoint point = NSMakePoint(NSMidX(iconFrame), NSMidY(iconFrame)); |
| 358 NSEvent* downEvent = Event(field_, point, NSLeftMouseDown); |
| 359 NSEvent* upEvent = Event(field_, point, NSLeftMouseUp); |
403 [NSApp postEvent:upEvent atStart:YES]; | 360 [NSApp postEvent:upEvent atStart:YES]; |
404 [field_ mouseDown:downEvent]; | 361 [field_ mouseDown:downEvent]; |
405 const NSRange selectedRange([[field_ currentEditor] selectedRange]); | 362 |
406 EXPECT_EQ(selectedRange.location, [[field_ stringValue] length]); | 363 // Selection should be a right-hand-side caret. |
407 EXPECT_EQ(selectedRange.length, 0U); | 364 EXPECT_TRUE(NSEqualRanges(NSMakeRange([[field_ stringValue] length], 0), |
| 365 [[field_ currentEditor] selectedRange])); |
408 } | 366 } |
409 | 367 |
410 // Clicking in a left-side decoration which doesn't handle the event | 368 // Clicking in a left-side decoration which doesn't handle the event |
411 // puts the selection in the leftmost position. | 369 // puts the selection in the leftmost position. |
412 TEST_F(AutocompleteTextFieldTest, ClickLeftDecorationPutsCaretLeftmost) { | 370 TEST_F(AutocompleteTextFieldTest, ClickLeftDecorationPutsCaretLeftmost) { |
413 // Decoration does not handle the mouse event, so the cell should | 371 // Decoration does not handle the mouse event, so the cell should |
414 // process it. | 372 // process it. Called at least once. |
415 EXPECT_CALL(mock_left_decoration_, OnMousePressed(_)) | 373 EXPECT_CALL(mock_left_decoration_, AcceptsMousePress()) |
| 374 .WillOnce(Return(false)) |
416 .WillRepeatedly(Return(false)); | 375 .WillRepeatedly(Return(false)); |
417 | 376 |
418 // Set the decoration before becoming responder. | 377 // Set the decoration before becoming responder. |
419 EXPECT_FALSE([field_ currentEditor]); | 378 EXPECT_FALSE([field_ currentEditor]); |
420 mock_left_decoration_.SetVisible(true); | 379 mock_left_decoration_.SetVisible(true); |
421 | 380 |
422 // Make first responder should select all. | 381 // Make first responder should select all. |
423 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; | 382 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; |
424 EXPECT_TRUE([field_ currentEditor]); | 383 EXPECT_TRUE([field_ currentEditor]); |
425 const NSRange allRange = NSMakeRange(0, [[field_ stringValue] length]); | 384 const NSRange allRange = NSMakeRange(0, [[field_ stringValue] length]); |
426 EXPECT_TRUE(NSEqualRanges(allRange, [[field_ currentEditor] selectedRange])); | 385 EXPECT_TRUE(NSEqualRanges(allRange, [[field_ currentEditor] selectedRange])); |
427 | 386 |
428 // Generate a click on the decoration. | 387 // Generate a click on the decoration. |
429 AutocompleteTextFieldCell* cell = [field_ cell]; | 388 AutocompleteTextFieldCell* cell = [field_ cell]; |
| 389 const NSRect bounds = [field_ bounds]; |
430 const NSRect iconFrame = | 390 const NSRect iconFrame = |
431 [cell frameForDecoration:&mock_left_decoration_ inFrame:[field_ bounds]]; | 391 [cell frameForDecoration:&mock_left_decoration_ inFrame:bounds]; |
432 const NSPoint point = NSMakePoint(NSMidX(iconFrame), NSMidY(iconFrame)); | 392 const NSPoint point = NSMakePoint(NSMidX(iconFrame), NSMidY(iconFrame)); |
433 NSEvent* downEvent(Event(field_, point, NSLeftMouseDown)); | 393 NSEvent* downEvent = Event(field_, point, NSLeftMouseDown); |
434 NSEvent* upEvent(Event(field_, point, NSLeftMouseUp)); | 394 NSEvent* upEvent = Event(field_, point, NSLeftMouseUp); |
435 [NSApp postEvent:upEvent atStart:YES]; | 395 [NSApp postEvent:upEvent atStart:YES]; |
436 [field_ mouseDown:downEvent]; | 396 [field_ mouseDown:downEvent]; |
437 | 397 |
438 // Selection should be a left-hand-side caret. | 398 // Selection should be a left-hand-side caret. |
439 EXPECT_TRUE(NSEqualRanges(NSMakeRange(0, 0), | 399 EXPECT_TRUE(NSEqualRanges(NSMakeRange(0, 0), |
440 [[field_ currentEditor] selectedRange])); | 400 [[field_ currentEditor] selectedRange])); |
441 } | 401 } |
442 | 402 |
443 // Clicks not in the text area or the cell's decorations fall through | 403 // Clicks not in the text area or the cell's decorations fall through |
444 // to the editor. | 404 // to the editor. |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
551 EXPECT_EQ(selectedRange.location, 0U); | 511 EXPECT_EQ(selectedRange.location, 0U); |
552 EXPECT_EQ(selectedRange.length, [[field_ stringValue] length]); | 512 EXPECT_EQ(selectedRange.length, [[field_ stringValue] length]); |
553 } | 513 } |
554 | 514 |
555 // Clicking a decoration should call decoration's OnMousePressed. | 515 // Clicking a decoration should call decoration's OnMousePressed. |
556 TEST_F(AutocompleteTextFieldTest, LeftDecorationMouseDown) { | 516 TEST_F(AutocompleteTextFieldTest, LeftDecorationMouseDown) { |
557 // At this point, not focussed. | 517 // At this point, not focussed. |
558 EXPECT_FALSE([field_ currentEditor]); | 518 EXPECT_FALSE([field_ currentEditor]); |
559 | 519 |
560 mock_left_decoration_.SetVisible(true); | 520 mock_left_decoration_.SetVisible(true); |
| 521 EXPECT_CALL(mock_left_decoration_, AcceptsMousePress()) |
| 522 .WillRepeatedly(Return(true)); |
561 | 523 |
562 AutocompleteTextFieldCell* cell = [field_ cell]; | 524 AutocompleteTextFieldCell* cell = [field_ cell]; |
563 const NSRect iconFrame = | 525 const NSRect iconFrame = |
564 [cell frameForDecoration:&mock_left_decoration_ inFrame:[field_ bounds]]; | 526 [cell frameForDecoration:&mock_left_decoration_ inFrame:[field_ bounds]]; |
565 const NSPoint location = NSMakePoint(NSMidX(iconFrame), NSMidY(iconFrame)); | 527 const NSPoint location = NSMakePoint(NSMidX(iconFrame), NSMidY(iconFrame)); |
566 NSEvent* downEvent = Event(field_, location, NSLeftMouseDown, 1); | 528 NSEvent* downEvent = Event(field_, location, NSLeftMouseDown, 1); |
567 NSEvent* upEvent = Event(field_, location, NSLeftMouseUp, 1); | 529 NSEvent* upEvent = Event(field_, location, NSLeftMouseUp, 1); |
568 | 530 |
569 // Since decorations can be dragged, the mouse-press is sent on | 531 // Since decorations can be dragged, the mouse-press is sent on |
570 // mouse-up. | 532 // mouse-up. |
(...skipping 25 matching lines...) Expand all Loading... |
596 // IDEA: mock decoration to return a pasteboard which a mock | 558 // IDEA: mock decoration to return a pasteboard which a mock |
597 // AutocompleteTextField notes in -dragImage:*. | 559 // AutocompleteTextField notes in -dragImage:*. |
598 } | 560 } |
599 | 561 |
600 // Clicking a decoration should call decoration's OnMousePressed. | 562 // Clicking a decoration should call decoration's OnMousePressed. |
601 TEST_F(AutocompleteTextFieldTest, RightDecorationMouseDown) { | 563 TEST_F(AutocompleteTextFieldTest, RightDecorationMouseDown) { |
602 // At this point, not focussed. | 564 // At this point, not focussed. |
603 EXPECT_FALSE([field_ currentEditor]); | 565 EXPECT_FALSE([field_ currentEditor]); |
604 | 566 |
605 mock_right_decoration_.SetVisible(true); | 567 mock_right_decoration_.SetVisible(true); |
| 568 EXPECT_CALL(mock_right_decoration_, AcceptsMousePress()) |
| 569 .WillRepeatedly(Return(true)); |
606 | 570 |
607 AutocompleteTextFieldCell* cell = [field_ cell]; | 571 AutocompleteTextFieldCell* cell = [field_ cell]; |
| 572 const NSRect bounds = [field_ bounds]; |
608 const NSRect iconFrame = | 573 const NSRect iconFrame = |
609 [cell frameForDecoration:&mock_right_decoration_ inFrame:[field_ bounds]]; | 574 [cell frameForDecoration:&mock_right_decoration_ inFrame:bounds]; |
610 const NSPoint location = NSMakePoint(NSMidX(iconFrame), NSMidY(iconFrame)); | 575 const NSPoint location = NSMakePoint(NSMidX(iconFrame), NSMidY(iconFrame)); |
611 NSEvent* downEvent = Event(field_, location, NSLeftMouseDown, 1); | 576 NSEvent* downEvent = Event(field_, location, NSLeftMouseDown, 1); |
612 NSEvent* upEvent = Event(field_, location, NSLeftMouseUp, 1); | 577 NSEvent* upEvent = Event(field_, location, NSLeftMouseUp, 1); |
613 | 578 |
614 // Since decorations can be dragged, the mouse-press is sent on | 579 // Since decorations can be dragged, the mouse-press is sent on |
615 // mouse-up. | 580 // mouse-up. |
616 [NSApp postEvent:upEvent atStart:YES]; | 581 [NSApp postEvent:upEvent atStart:YES]; |
617 | 582 |
618 EXPECT_CALL(mock_right_decoration_, OnMousePressed(_)) | 583 EXPECT_CALL(mock_right_decoration_, OnMousePressed(_)) |
619 .WillOnce(Return(true)); | 584 .WillOnce(Return(true)); |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 scoped_nsobject<AutocompleteTextField> pin([field_ retain]); | 768 scoped_nsobject<AutocompleteTextField> pin([field_ retain]); |
804 [field_ removeFromSuperview]; | 769 [field_ removeFromSuperview]; |
805 [test_window() resignKeyWindow]; | 770 [test_window() resignKeyWindow]; |
806 | 771 |
807 [[test_window() contentView] addSubview:field_]; | 772 [[test_window() contentView] addSubview:field_]; |
808 EXPECT_CALL(field_observer_, ClosePopup()); | 773 EXPECT_CALL(field_observer_, ClosePopup()); |
809 [test_window() resignKeyWindow]; | 774 [test_window() resignKeyWindow]; |
810 } | 775 } |
811 | 776 |
812 } // namespace | 777 } // namespace |
OLD | NEW |