OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <ApplicationServices/ApplicationServices.h> | 5 #import <ApplicationServices/ApplicationServices.h> |
6 #import <Cocoa/Cocoa.h> | 6 #import <Cocoa/Cocoa.h> |
7 | 7 |
8 #include "base/mac/foundation_util.h" | 8 #include "base/mac/foundation_util.h" |
9 #include "base/mac/scoped_nsobject.h" | 9 #include "base/mac/scoped_nsobject.h" |
10 #import "chrome/browser/ui/cocoa/location_bar/autocomplete_text_field.h" | 10 #import "chrome/browser/ui/cocoa/location_bar/autocomplete_text_field.h" |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 NSRect frame = NSMakeRect(0, 0, kWidth, 30); | 78 NSRect frame = NSMakeRect(0, 0, kWidth, 30); |
79 base::scoped_nsobject<AutocompleteTextField> field( | 79 base::scoped_nsobject<AutocompleteTextField> field( |
80 [[AutocompleteTextField alloc] initWithFrame:frame]); | 80 [[AutocompleteTextField alloc] initWithFrame:frame]); |
81 field_ = field.get(); | 81 field_ = field.get(); |
82 [field_ setStringValue:@"Test test"]; | 82 [field_ setStringValue:@"Test test"]; |
83 [[test_window() contentView] addSubview:field_]; | 83 [[test_window() contentView] addSubview:field_]; |
84 | 84 |
85 AutocompleteTextFieldCell* cell = [field_ cell]; | 85 AutocompleteTextFieldCell* cell = [field_ cell]; |
86 [cell clearDecorations]; | 86 [cell clearDecorations]; |
87 | 87 |
88 mock_left_decoration_.SetVisible(false); | 88 mock_leading_decoration_.SetVisible(false); |
89 [cell addLeftDecoration:&mock_left_decoration_]; | 89 [cell addLeadingDecoration:&mock_leading_decoration_]; |
90 | 90 |
91 mock_right_decoration_.SetVisible(false); | 91 mock_trailing_decoration_.SetVisible(false); |
92 [cell addRightDecoration:&mock_right_decoration_]; | 92 [cell addTrailingDecoration:&mock_trailing_decoration_]; |
93 | 93 |
94 window_delegate_.reset( | 94 window_delegate_.reset( |
95 [[AutocompleteTextFieldWindowTestDelegate alloc] init]); | 95 [[AutocompleteTextFieldWindowTestDelegate alloc] init]); |
96 [test_window() setDelegate:window_delegate_.get()]; | 96 [test_window() setDelegate:window_delegate_.get()]; |
97 } | 97 } |
98 | 98 |
99 NSEvent* KeyDownEventWithFlags(NSUInteger flags) { | 99 NSEvent* KeyDownEventWithFlags(NSUInteger flags) { |
100 return [NSEvent keyEventWithType:NSKeyDown | 100 return [NSEvent keyEventWithType:NSKeyDown |
101 location:NSZeroPoint | 101 location:NSZeroPoint |
102 modifierFlags:flags | 102 modifierFlags:flags |
(...skipping 18 matching lines...) Expand all Loading... |
121 return NSZeroRect; | 121 return NSZeroRect; |
122 } | 122 } |
123 } | 123 } |
124 | 124 |
125 AutocompleteTextFieldEditor* FieldEditor() { | 125 AutocompleteTextFieldEditor* FieldEditor() { |
126 return base::mac::ObjCCastStrict<AutocompleteTextFieldEditor>( | 126 return base::mac::ObjCCastStrict<AutocompleteTextFieldEditor>( |
127 [field_ currentEditor]); | 127 [field_ currentEditor]); |
128 } | 128 } |
129 | 129 |
130 AutocompleteTextField* field_; | 130 AutocompleteTextField* field_; |
131 MockDecoration mock_left_decoration_; | 131 MockDecoration mock_leading_decoration_; |
132 MockDecoration mock_right_decoration_; | 132 MockDecoration mock_trailing_decoration_; |
133 base::scoped_nsobject<AutocompleteTextFieldWindowTestDelegate> | 133 base::scoped_nsobject<AutocompleteTextFieldWindowTestDelegate> |
134 window_delegate_; | 134 window_delegate_; |
135 }; | 135 }; |
136 | 136 |
137 TEST_VIEW(AutocompleteTextFieldTest, field_); | 137 TEST_VIEW(AutocompleteTextFieldTest, field_); |
138 | 138 |
139 // Base class for testing AutocompleteTextFieldObserver messages. | 139 // Base class for testing AutocompleteTextFieldObserver messages. |
140 class AutocompleteTextFieldObserverTest : public AutocompleteTextFieldTest { | 140 class AutocompleteTextFieldObserverTest : public AutocompleteTextFieldTest { |
141 public: | 141 public: |
142 virtual void SetUp() { | 142 virtual void SetUp() { |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 // Test that the field editor gets the same bounds when focus is | 289 // Test that the field editor gets the same bounds when focus is |
290 // delivered by the standard focusing machinery, or by | 290 // delivered by the standard focusing machinery, or by |
291 // -resetFieldEditorFrameIfNeeded. | 291 // -resetFieldEditorFrameIfNeeded. |
292 TEST_F(AutocompleteTextFieldTest, ResetFieldEditorBase) { | 292 TEST_F(AutocompleteTextFieldTest, ResetFieldEditorBase) { |
293 // Capture the editor frame resulting from the standard focus | 293 // Capture the editor frame resulting from the standard focus |
294 // machinery. | 294 // machinery. |
295 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; | 295 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; |
296 const NSRect baseEditorFrame = EditorFrame(); | 296 const NSRect baseEditorFrame = EditorFrame(); |
297 | 297 |
298 // A decoration should result in a strictly smaller editor frame. | 298 // A decoration should result in a strictly smaller editor frame. |
299 mock_left_decoration_.SetVisible(true); | 299 mock_leading_decoration_.SetVisible(true); |
300 [field_ resetFieldEditorFrameIfNeeded]; | 300 [field_ resetFieldEditorFrameIfNeeded]; |
301 EXPECT_NSNE(baseEditorFrame, EditorFrame()); | 301 EXPECT_NSNE(baseEditorFrame, EditorFrame()); |
302 EXPECT_TRUE(NSContainsRect(baseEditorFrame, EditorFrame())); | 302 EXPECT_TRUE(NSContainsRect(baseEditorFrame, EditorFrame())); |
303 | 303 |
304 // Removing the decoration and using -resetFieldEditorFrameIfNeeded | 304 // Removing the decoration and using -resetFieldEditorFrameIfNeeded |
305 // should result in the same frame as the standard focus machinery. | 305 // should result in the same frame as the standard focus machinery. |
306 mock_left_decoration_.SetVisible(false); | 306 mock_leading_decoration_.SetVisible(false); |
307 [field_ resetFieldEditorFrameIfNeeded]; | 307 [field_ resetFieldEditorFrameIfNeeded]; |
308 EXPECT_NSEQ(baseEditorFrame, EditorFrame()); | 308 EXPECT_NSEQ(baseEditorFrame, EditorFrame()); |
309 } | 309 } |
310 | 310 |
311 // Test that the field editor gets the same bounds when focus is | 311 // Test that the field editor gets the same bounds when focus is |
312 // delivered by the standard focusing machinery, or by | 312 // delivered by the standard focusing machinery, or by |
313 // -resetFieldEditorFrameIfNeeded, this time with a decoration | 313 // -resetFieldEditorFrameIfNeeded, this time with a decoration |
314 // pre-loaded. | 314 // pre-loaded. |
315 TEST_F(AutocompleteTextFieldTest, ResetFieldEditorWithDecoration) { | 315 TEST_F(AutocompleteTextFieldTest, ResetFieldEditorWithDecoration) { |
316 AutocompleteTextFieldCell* cell = [field_ cell]; | 316 AutocompleteTextFieldCell* cell = [field_ cell]; |
317 | 317 |
318 // Make sure decoration isn't already visible, then make it visible. | 318 // Make sure decoration isn't already visible, then make it visible. |
319 EXPECT_TRUE(NSIsEmptyRect([cell frameForDecoration:&mock_left_decoration_ | 319 EXPECT_TRUE(NSIsEmptyRect([cell frameForDecoration:&mock_leading_decoration_ |
320 inFrame:[field_ bounds]])); | 320 inFrame:[field_ bounds]])); |
321 mock_left_decoration_.SetVisible(true); | 321 mock_leading_decoration_.SetVisible(true); |
322 EXPECT_FALSE(NSIsEmptyRect([cell frameForDecoration:&mock_left_decoration_ | 322 EXPECT_FALSE(NSIsEmptyRect([cell frameForDecoration:&mock_leading_decoration_ |
323 inFrame:[field_ bounds]])); | 323 inFrame:[field_ bounds]])); |
324 | 324 |
325 // Capture the editor frame resulting from the standard focus | 325 // Capture the editor frame resulting from the standard focus |
326 // machinery. | 326 // machinery. |
327 | 327 |
328 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; | 328 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; |
329 const NSRect baseEditorFrame = EditorFrame(); | 329 const NSRect baseEditorFrame = EditorFrame(); |
330 | 330 |
331 // When the decoration is not visible the frame should be strictly larger. | 331 // When the decoration is not visible the frame should be strictly larger. |
332 mock_left_decoration_.SetVisible(false); | 332 mock_leading_decoration_.SetVisible(false); |
333 EXPECT_TRUE(NSIsEmptyRect([cell frameForDecoration:&mock_left_decoration_ | 333 EXPECT_TRUE(NSIsEmptyRect([cell frameForDecoration:&mock_leading_decoration_ |
334 inFrame:[field_ bounds]])); | 334 inFrame:[field_ bounds]])); |
335 [field_ resetFieldEditorFrameIfNeeded]; | 335 [field_ resetFieldEditorFrameIfNeeded]; |
336 EXPECT_NSNE(baseEditorFrame, EditorFrame()); | 336 EXPECT_NSNE(baseEditorFrame, EditorFrame()); |
337 EXPECT_TRUE(NSContainsRect(EditorFrame(), baseEditorFrame)); | 337 EXPECT_TRUE(NSContainsRect(EditorFrame(), baseEditorFrame)); |
338 | 338 |
339 // When the decoration is visible, -resetFieldEditorFrameIfNeeded | 339 // When the decoration is visible, -resetFieldEditorFrameIfNeeded |
340 // should result in the same frame as the standard focus machinery. | 340 // should result in the same frame as the standard focus machinery. |
341 mock_left_decoration_.SetVisible(true); | 341 mock_leading_decoration_.SetVisible(true); |
342 EXPECT_FALSE(NSIsEmptyRect([cell frameForDecoration:&mock_left_decoration_ | 342 EXPECT_FALSE(NSIsEmptyRect([cell frameForDecoration:&mock_leading_decoration_ |
343 inFrame:[field_ bounds]])); | 343 inFrame:[field_ bounds]])); |
344 | 344 |
345 [field_ resetFieldEditorFrameIfNeeded]; | 345 [field_ resetFieldEditorFrameIfNeeded]; |
346 EXPECT_NSEQ(baseEditorFrame, EditorFrame()); | 346 EXPECT_NSEQ(baseEditorFrame, EditorFrame()); |
347 } | 347 } |
348 | 348 |
349 // Test that resetting the field editor bounds does not cause untoward | 349 // Test that resetting the field editor bounds does not cause untoward |
350 // messages to the field's observer. | 350 // messages to the field's observer. |
351 TEST_F(AutocompleteTextFieldObserverTest, ResetFieldEditorContinuesEditing) { | 351 TEST_F(AutocompleteTextFieldObserverTest, ResetFieldEditorContinuesEditing) { |
352 // Many of these methods try to change the selection. | 352 // Many of these methods try to change the selection. |
353 EXPECT_CALL(field_observer_, SelectionRangeForProposedRange(A<NSRange>())) | 353 EXPECT_CALL(field_observer_, SelectionRangeForProposedRange(A<NSRange>())) |
354 .WillRepeatedly(ReturnArg<0>()); | 354 .WillRepeatedly(ReturnArg<0>()); |
355 | 355 |
356 EXPECT_CALL(field_observer_, OnSetFocus(false)); | 356 EXPECT_CALL(field_observer_, OnSetFocus(false)); |
357 // Becoming first responder doesn't begin editing. | 357 // Becoming first responder doesn't begin editing. |
358 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; | 358 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; |
359 const NSRect baseEditorFrame = EditorFrame(); | 359 const NSRect baseEditorFrame = EditorFrame(); |
360 NSTextView* editor = static_cast<NSTextView*>([field_ currentEditor]); | 360 NSTextView* editor = static_cast<NSTextView*>([field_ currentEditor]); |
361 EXPECT_TRUE(nil != editor); | 361 EXPECT_TRUE(nil != editor); |
362 | 362 |
363 // This should begin editing and indicate a change. | 363 // This should begin editing and indicate a change. |
364 EXPECT_CALL(field_observer_, OnDidBeginEditing()); | 364 EXPECT_CALL(field_observer_, OnDidBeginEditing()); |
365 EXPECT_CALL(field_observer_, OnBeforeChange()); | 365 EXPECT_CALL(field_observer_, OnBeforeChange()); |
366 EXPECT_CALL(field_observer_, OnDidChange()); | 366 EXPECT_CALL(field_observer_, OnDidChange()); |
367 [editor shouldChangeTextInRange:NSMakeRange(0, 0) replacementString:@""]; | 367 [editor shouldChangeTextInRange:NSMakeRange(0, 0) replacementString:@""]; |
368 [editor didChangeText]; | 368 [editor didChangeText]; |
369 | 369 |
370 // No messages to |field_observer_| when the frame actually changes. | 370 // No messages to |field_observer_| when the frame actually changes. |
371 mock_left_decoration_.SetVisible(true); | 371 mock_leading_decoration_.SetVisible(true); |
372 [field_ resetFieldEditorFrameIfNeeded]; | 372 [field_ resetFieldEditorFrameIfNeeded]; |
373 EXPECT_NSNE(baseEditorFrame, EditorFrame()); | 373 EXPECT_NSNE(baseEditorFrame, EditorFrame()); |
374 } | 374 } |
375 | 375 |
376 // Clicking in a right-hand decoration which does not handle the mouse | 376 // Clicking in a right-hand decoration which does not handle the mouse |
377 // puts the caret rightmost. | 377 // puts the caret rightmost. |
378 TEST_F(AutocompleteTextFieldTest, ClickRightDecorationPutsCaretRightmost) { | 378 TEST_F(AutocompleteTextFieldTest, ClickRightDecorationPutsCaretRightmost) { |
379 // Decoration does not handle the mouse event, so the cell should | 379 // Decoration does not handle the mouse event, so the cell should |
380 // process it. Called at least once. | 380 // process it. Called at least once. |
381 EXPECT_CALL(mock_right_decoration_, AcceptsMousePress()) | 381 EXPECT_CALL(mock_trailing_decoration_, AcceptsMousePress()) |
382 .WillOnce(Return(false)) | 382 .WillOnce(Return(false)) |
383 .WillRepeatedly(Return(false)); | 383 .WillRepeatedly(Return(false)); |
384 | 384 |
385 // Set the decoration before becoming responder. | 385 // Set the decoration before becoming responder. |
386 EXPECT_FALSE([field_ currentEditor]); | 386 EXPECT_FALSE([field_ currentEditor]); |
387 mock_right_decoration_.SetVisible(true); | 387 mock_trailing_decoration_.SetVisible(true); |
388 | 388 |
389 // Make first responder should select all. | 389 // Make first responder should select all. |
390 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; | 390 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; |
391 EXPECT_TRUE([field_ currentEditor]); | 391 EXPECT_TRUE([field_ currentEditor]); |
392 const NSRange allRange = NSMakeRange(0, [[field_ stringValue] length]); | 392 const NSRange allRange = NSMakeRange(0, [[field_ stringValue] length]); |
393 EXPECT_TRUE(NSEqualRanges(allRange, [[field_ currentEditor] selectedRange])); | 393 EXPECT_TRUE(NSEqualRanges(allRange, [[field_ currentEditor] selectedRange])); |
394 | 394 |
395 // Generate a click on the decoration. | 395 // Generate a click on the decoration. |
396 AutocompleteTextFieldCell* cell = [field_ cell]; | 396 AutocompleteTextFieldCell* cell = [field_ cell]; |
397 const NSRect bounds = [field_ bounds]; | 397 const NSRect bounds = [field_ bounds]; |
398 const NSRect iconFrame = | 398 const NSRect iconFrame = |
399 [cell frameForDecoration:&mock_right_decoration_ inFrame:bounds]; | 399 [cell frameForDecoration:&mock_trailing_decoration_ inFrame:bounds]; |
400 const NSPoint point = NSMakePoint(NSMidX(iconFrame), NSMidY(iconFrame)); | 400 const NSPoint point = NSMakePoint(NSMidX(iconFrame), NSMidY(iconFrame)); |
401 NSEvent* downEvent = Event(field_, point, NSLeftMouseDown); | 401 NSEvent* downEvent = Event(field_, point, NSLeftMouseDown); |
402 NSEvent* upEvent = Event(field_, point, NSLeftMouseUp); | 402 NSEvent* upEvent = Event(field_, point, NSLeftMouseUp); |
403 [NSApp postEvent:upEvent atStart:YES]; | 403 [NSApp postEvent:upEvent atStart:YES]; |
404 [field_ mouseDown:downEvent]; | 404 [field_ mouseDown:downEvent]; |
405 | 405 |
406 // Selection should be a right-hand-side caret. | 406 // Selection should be a right-hand-side caret. |
407 EXPECT_TRUE(NSEqualRanges(NSMakeRange([[field_ stringValue] length], 0), | 407 EXPECT_TRUE(NSEqualRanges(NSMakeRange([[field_ stringValue] length], 0), |
408 [[field_ currentEditor] selectedRange])); | 408 [[field_ currentEditor] selectedRange])); |
409 } | 409 } |
410 | 410 |
411 // Clicking in a left-side decoration which doesn't handle the event | 411 // Clicking in a left-side decoration which doesn't handle the event |
412 // puts the selection in the leftmost position. | 412 // puts the selection in the leftmost position. |
413 TEST_F(AutocompleteTextFieldTest, ClickLeftDecorationPutsCaretLeftmost) { | 413 TEST_F(AutocompleteTextFieldTest, ClickLeftDecorationPutsCaretLeftmost) { |
414 // Decoration does not handle the mouse event, so the cell should | 414 // Decoration does not handle the mouse event, so the cell should |
415 // process it. Called at least once. | 415 // process it. Called at least once. |
416 EXPECT_CALL(mock_left_decoration_, AcceptsMousePress()) | 416 EXPECT_CALL(mock_leading_decoration_, AcceptsMousePress()) |
417 .WillOnce(Return(false)) | 417 .WillOnce(Return(false)) |
418 .WillRepeatedly(Return(false)); | 418 .WillRepeatedly(Return(false)); |
419 | 419 |
420 // Set the decoration before becoming responder. | 420 // Set the decoration before becoming responder. |
421 EXPECT_FALSE([field_ currentEditor]); | 421 EXPECT_FALSE([field_ currentEditor]); |
422 mock_left_decoration_.SetVisible(true); | 422 mock_leading_decoration_.SetVisible(true); |
423 | 423 |
424 // Make first responder should select all. | 424 // Make first responder should select all. |
425 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; | 425 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; |
426 EXPECT_TRUE([field_ currentEditor]); | 426 EXPECT_TRUE([field_ currentEditor]); |
427 const NSRange allRange = NSMakeRange(0, [[field_ stringValue] length]); | 427 const NSRange allRange = NSMakeRange(0, [[field_ stringValue] length]); |
428 EXPECT_TRUE(NSEqualRanges(allRange, [[field_ currentEditor] selectedRange])); | 428 EXPECT_TRUE(NSEqualRanges(allRange, [[field_ currentEditor] selectedRange])); |
429 | 429 |
430 // Generate a click on the decoration. | 430 // Generate a click on the decoration. |
431 AutocompleteTextFieldCell* cell = [field_ cell]; | 431 AutocompleteTextFieldCell* cell = [field_ cell]; |
432 const NSRect bounds = [field_ bounds]; | 432 const NSRect bounds = [field_ bounds]; |
433 const NSRect iconFrame = | 433 const NSRect iconFrame = |
434 [cell frameForDecoration:&mock_left_decoration_ inFrame:bounds]; | 434 [cell frameForDecoration:&mock_leading_decoration_ inFrame:bounds]; |
435 const NSPoint point = NSMakePoint(NSMidX(iconFrame), NSMidY(iconFrame)); | 435 const NSPoint point = NSMakePoint(NSMidX(iconFrame), NSMidY(iconFrame)); |
436 NSEvent* downEvent = Event(field_, point, NSLeftMouseDown); | 436 NSEvent* downEvent = Event(field_, point, NSLeftMouseDown); |
437 NSEvent* upEvent = Event(field_, point, NSLeftMouseUp); | 437 NSEvent* upEvent = Event(field_, point, NSLeftMouseUp); |
438 [NSApp postEvent:upEvent atStart:YES]; | 438 [NSApp postEvent:upEvent atStart:YES]; |
439 [field_ mouseDown:downEvent]; | 439 [field_ mouseDown:downEvent]; |
440 | 440 |
441 // Selection should be a left-hand-side caret. | 441 // Selection should be a left-hand-side caret. |
442 EXPECT_TRUE(NSEqualRanges(NSMakeRange(0, 0), | 442 EXPECT_TRUE(NSEqualRanges(NSMakeRange(0, 0), |
443 [[field_ currentEditor] selectedRange])); | 443 [[field_ currentEditor] selectedRange])); |
444 } | 444 } |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
553 const NSRange selectedRange([[field_ currentEditor] selectedRange]); | 553 const NSRange selectedRange([[field_ currentEditor] selectedRange]); |
554 EXPECT_EQ(selectedRange.location, 0U); | 554 EXPECT_EQ(selectedRange.location, 0U); |
555 EXPECT_EQ(selectedRange.length, [[field_ stringValue] length]); | 555 EXPECT_EQ(selectedRange.length, [[field_ stringValue] length]); |
556 } | 556 } |
557 | 557 |
558 // Clicking a decoration should call decoration's OnMousePressed. | 558 // Clicking a decoration should call decoration's OnMousePressed. |
559 TEST_F(AutocompleteTextFieldTest, LeftDecorationMouseDown) { | 559 TEST_F(AutocompleteTextFieldTest, LeftDecorationMouseDown) { |
560 // At this point, not focussed. | 560 // At this point, not focussed. |
561 EXPECT_FALSE([field_ currentEditor]); | 561 EXPECT_FALSE([field_ currentEditor]); |
562 | 562 |
563 mock_left_decoration_.SetVisible(true); | 563 mock_leading_decoration_.SetVisible(true); |
564 EXPECT_CALL(mock_left_decoration_, AcceptsMousePress()) | 564 EXPECT_CALL(mock_leading_decoration_, AcceptsMousePress()) |
565 .WillRepeatedly(Return(true)); | 565 .WillRepeatedly(Return(true)); |
566 | 566 |
567 AutocompleteTextFieldCell* cell = [field_ cell]; | 567 AutocompleteTextFieldCell* cell = [field_ cell]; |
568 [cell updateMouseTrackingAndToolTipsInRect:[field_ frame] ofView:field_]; | 568 [cell updateMouseTrackingAndToolTipsInRect:[field_ frame] ofView:field_]; |
569 | 569 |
570 const NSRect iconFrame = | 570 const NSRect iconFrame = [cell frameForDecoration:&mock_leading_decoration_ |
571 [cell frameForDecoration:&mock_left_decoration_ inFrame:[field_ bounds]]; | 571 inFrame:[field_ bounds]]; |
572 const NSPoint location = NSMakePoint(NSMidX(iconFrame), NSMidY(iconFrame)); | 572 const NSPoint location = NSMakePoint(NSMidX(iconFrame), NSMidY(iconFrame)); |
573 NSEvent* downEvent = Event(field_, location, NSLeftMouseDown, 1); | 573 NSEvent* downEvent = Event(field_, location, NSLeftMouseDown, 1); |
574 NSEvent* upEvent = Event(field_, location, NSLeftMouseUp, 1); | 574 NSEvent* upEvent = Event(field_, location, NSLeftMouseUp, 1); |
575 | 575 |
576 // Since decorations can be dragged, the mouse-press is sent on | 576 // Since decorations can be dragged, the mouse-press is sent on |
577 // mouse-up. | 577 // mouse-up. |
578 [NSApp postEvent:upEvent atStart:YES]; | 578 [NSApp postEvent:upEvent atStart:YES]; |
579 | 579 |
580 EXPECT_CALL(mock_left_decoration_, OnMousePressed(_, _)) | 580 EXPECT_CALL(mock_leading_decoration_, OnMousePressed(_, _)) |
581 .WillOnce(Return(true)); | 581 .WillOnce(Return(true)); |
582 [field_ mouseDown:downEvent]; | 582 [field_ mouseDown:downEvent]; |
583 | 583 |
584 // Focus the field and test that handled clicks don't affect selection. | 584 // Focus the field and test that handled clicks don't affect selection. |
585 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; | 585 [test_window() makePretendKeyWindowAndSetFirstResponder:field_]; |
586 EXPECT_TRUE([field_ currentEditor]); | 586 EXPECT_TRUE([field_ currentEditor]); |
587 const NSRange allRange = NSMakeRange(0, [[field_ stringValue] length]); | 587 const NSRange allRange = NSMakeRange(0, [[field_ stringValue] length]); |
588 EXPECT_TRUE(NSEqualRanges(allRange, [[field_ currentEditor] selectedRange])); | 588 EXPECT_TRUE(NSEqualRanges(allRange, [[field_ currentEditor] selectedRange])); |
589 | 589 |
590 // Generate another click on the decoration. | 590 // Generate another click on the decoration. |
591 downEvent = Event(field_, location, NSLeftMouseDown, 1); | 591 downEvent = Event(field_, location, NSLeftMouseDown, 1); |
592 upEvent = Event(field_, location, NSLeftMouseUp, 1); | 592 upEvent = Event(field_, location, NSLeftMouseUp, 1); |
593 [NSApp postEvent:upEvent atStart:YES]; | 593 [NSApp postEvent:upEvent atStart:YES]; |
594 EXPECT_CALL(mock_left_decoration_, OnMousePressed(_, _)) | 594 EXPECT_CALL(mock_leading_decoration_, OnMousePressed(_, _)) |
595 .WillOnce(Return(true)); | 595 .WillOnce(Return(true)); |
596 [field_ mouseDown:downEvent]; | 596 [field_ mouseDown:downEvent]; |
597 | 597 |
598 // The selection should not have changed. | 598 // The selection should not have changed. |
599 EXPECT_TRUE(NSEqualRanges(allRange, [[field_ currentEditor] selectedRange])); | 599 EXPECT_TRUE(NSEqualRanges(allRange, [[field_ currentEditor] selectedRange])); |
600 | 600 |
601 // TODO(shess): Test that mouse drags are initiated if the next | 601 // TODO(shess): Test that mouse drags are initiated if the next |
602 // event is a drag, or if the mouse-up takes too long to arrive. | 602 // event is a drag, or if the mouse-up takes too long to arrive. |
603 // IDEA: mock decoration to return a pasteboard which a mock | 603 // IDEA: mock decoration to return a pasteboard which a mock |
604 // AutocompleteTextField notes in -dragImage:*. | 604 // AutocompleteTextField notes in -dragImage:*. |
605 } | 605 } |
606 | 606 |
607 // Clicking a decoration should call decoration's OnMousePressed. | 607 // Clicking a decoration should call decoration's OnMousePressed. |
608 TEST_F(AutocompleteTextFieldTest, RightDecorationMouseDown) { | 608 TEST_F(AutocompleteTextFieldTest, RightDecorationMouseDown) { |
609 // At this point, not focussed. | 609 // At this point, not focussed. |
610 EXPECT_FALSE([field_ currentEditor]); | 610 EXPECT_FALSE([field_ currentEditor]); |
611 | 611 |
612 mock_right_decoration_.SetVisible(true); | 612 mock_trailing_decoration_.SetVisible(true); |
613 EXPECT_CALL(mock_right_decoration_, AcceptsMousePress()) | 613 EXPECT_CALL(mock_trailing_decoration_, AcceptsMousePress()) |
614 .WillRepeatedly(Return(true)); | 614 .WillRepeatedly(Return(true)); |
615 | 615 |
616 AutocompleteTextFieldCell* cell = [field_ cell]; | 616 AutocompleteTextFieldCell* cell = [field_ cell]; |
617 [cell updateMouseTrackingAndToolTipsInRect:[field_ frame] ofView:field_]; | 617 [cell updateMouseTrackingAndToolTipsInRect:[field_ frame] ofView:field_]; |
618 | 618 |
619 const NSRect bounds = [field_ bounds]; | 619 const NSRect bounds = [field_ bounds]; |
620 const NSRect iconFrame = | 620 const NSRect iconFrame = |
621 [cell frameForDecoration:&mock_right_decoration_ inFrame:bounds]; | 621 [cell frameForDecoration:&mock_trailing_decoration_ inFrame:bounds]; |
622 const NSPoint location = NSMakePoint(NSMidX(iconFrame), NSMidY(iconFrame)); | 622 const NSPoint location = NSMakePoint(NSMidX(iconFrame), NSMidY(iconFrame)); |
623 NSEvent* downEvent = Event(field_, location, NSLeftMouseDown, 1); | 623 NSEvent* downEvent = Event(field_, location, NSLeftMouseDown, 1); |
624 NSEvent* upEvent = Event(field_, location, NSLeftMouseUp, 1); | 624 NSEvent* upEvent = Event(field_, location, NSLeftMouseUp, 1); |
625 | 625 |
626 // Since decorations can be dragged, the mouse-press is sent on | 626 // Since decorations can be dragged, the mouse-press is sent on |
627 // mouse-up. | 627 // mouse-up. |
628 [NSApp postEvent:upEvent atStart:YES]; | 628 [NSApp postEvent:upEvent atStart:YES]; |
629 | 629 |
630 EXPECT_CALL(mock_right_decoration_, OnMousePressed(_, _)) | 630 EXPECT_CALL(mock_trailing_decoration_, OnMousePressed(_, _)) |
631 .WillOnce(Return(true)); | 631 .WillOnce(Return(true)); |
632 [field_ mouseDown:downEvent]; | 632 [field_ mouseDown:downEvent]; |
633 } | 633 } |
634 | 634 |
635 // Test that page action menus are properly returned. | 635 // Test that page action menus are properly returned. |
636 // TODO(shess): Really, this should test that things are forwarded to | 636 // TODO(shess): Really, this should test that things are forwarded to |
637 // the cell, and the cell tests should test that the right things are | 637 // the cell, and the cell tests should test that the right things are |
638 // selected. It's easier to mock the event here, though. This code's | 638 // selected. It's easier to mock the event here, though. This code's |
639 // event-mockers might be worth promoting to |cocoa_test_event_utils.h| or | 639 // event-mockers might be worth promoting to |cocoa_test_event_utils.h| or |
640 // |cocoa_test_helper.h|. | 640 // |cocoa_test_helper.h|. |
641 TEST_F(AutocompleteTextFieldTest, DecorationMenu) { | 641 TEST_F(AutocompleteTextFieldTest, DecorationMenu) { |
642 AutocompleteTextFieldCell* cell = [field_ cell]; | 642 AutocompleteTextFieldCell* cell = [field_ cell]; |
643 const NSRect bounds([field_ bounds]); | 643 const NSRect bounds([field_ bounds]); |
644 | 644 |
645 const CGFloat edge = NSHeight(bounds) - 4.0; | 645 const CGFloat edge = NSHeight(bounds) - 4.0; |
646 const NSSize size = NSMakeSize(edge, edge); | 646 const NSSize size = NSMakeSize(edge, edge); |
647 base::scoped_nsobject<NSImage> image([[NSImage alloc] initWithSize:size]); | 647 base::scoped_nsobject<NSImage> image([[NSImage alloc] initWithSize:size]); |
648 | 648 |
649 base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] initWithTitle:@"Menu"]); | 649 base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] initWithTitle:@"Menu"]); |
650 | 650 |
651 mock_left_decoration_.SetVisible(true); | 651 mock_leading_decoration_.SetVisible(true); |
652 mock_right_decoration_.SetVisible(true); | 652 mock_trailing_decoration_.SetVisible(true); |
653 | 653 |
654 // The item with a menu returns it. | 654 // The item with a menu returns it. |
655 NSRect actionFrame = [cell frameForDecoration:&mock_right_decoration_ | 655 NSRect actionFrame = |
656 inFrame:bounds]; | 656 [cell frameForDecoration:&mock_trailing_decoration_ inFrame:bounds]; |
657 NSPoint location = NSMakePoint(NSMidX(actionFrame), NSMidY(actionFrame)); | 657 NSPoint location = NSMakePoint(NSMidX(actionFrame), NSMidY(actionFrame)); |
658 NSEvent* event = Event(field_, location, NSRightMouseDown, 1); | 658 NSEvent* event = Event(field_, location, NSRightMouseDown, 1); |
659 | 659 |
660 // Check that the decoration is called, and the field returns the | 660 // Check that the decoration is called, and the field returns the |
661 // menu. | 661 // menu. |
662 EXPECT_CALL(mock_right_decoration_, GetMenu()) | 662 EXPECT_CALL(mock_trailing_decoration_, GetMenu()) |
663 .WillOnce(Return(menu.get())); | 663 .WillOnce(Return(menu.get())); |
664 NSMenu *decorationMenu = [field_ decorationMenuForEvent:event]; | 664 NSMenu *decorationMenu = [field_ decorationMenuForEvent:event]; |
665 EXPECT_EQ(decorationMenu, menu); | 665 EXPECT_EQ(decorationMenu, menu); |
666 | 666 |
667 // The item without a menu returns nil. | 667 // The item without a menu returns nil. |
668 EXPECT_CALL(mock_left_decoration_, GetMenu()) | 668 EXPECT_CALL(mock_leading_decoration_, GetMenu()) |
669 .WillOnce(Return(static_cast<NSMenu*>(nil))); | 669 .WillOnce(Return(static_cast<NSMenu*>(nil))); |
670 actionFrame = [cell frameForDecoration:&mock_left_decoration_ | 670 actionFrame = |
671 inFrame:bounds]; | 671 [cell frameForDecoration:&mock_leading_decoration_ inFrame:bounds]; |
672 location = NSMakePoint(NSMidX(actionFrame), NSMidY(actionFrame)); | 672 location = NSMakePoint(NSMidX(actionFrame), NSMidY(actionFrame)); |
673 event = Event(field_, location, NSRightMouseDown, 1); | 673 event = Event(field_, location, NSRightMouseDown, 1); |
674 EXPECT_FALSE([field_ decorationMenuForEvent:event]); | 674 EXPECT_FALSE([field_ decorationMenuForEvent:event]); |
675 | 675 |
676 // Something not in an action returns nil. | 676 // Something not in an action returns nil. |
677 location = NSMakePoint(NSMidX(bounds), NSMidY(bounds)); | 677 location = NSMakePoint(NSMidX(bounds), NSMidY(bounds)); |
678 event = Event(field_, location, NSRightMouseDown, 1); | 678 event = Event(field_, location, NSRightMouseDown, 1); |
679 EXPECT_FALSE([field_ decorationMenuForEvent:event]); | 679 EXPECT_FALSE([field_ decorationMenuForEvent:event]); |
680 } | 680 } |
681 | 681 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
789 [[field_ cell] setHideFocusState:NO | 789 [[field_ cell] setHideFocusState:NO |
790 ofView:field_]; | 790 ofView:field_]; |
791 EXPECT_TRUE([[field_ cell] showsFirstResponder]); | 791 EXPECT_TRUE([[field_ cell] showsFirstResponder]); |
792 EXPECT_TRUE([FieldEditor() shouldDrawInsertionPoint]); | 792 EXPECT_TRUE([FieldEditor() shouldDrawInsertionPoint]); |
793 } | 793 } |
794 | 794 |
795 // Verify that the tracking areas are added properly. | 795 // Verify that the tracking areas are added properly. |
796 TEST_F(AutocompleteTextFieldTest, UpdateTrackingAreas) { | 796 TEST_F(AutocompleteTextFieldTest, UpdateTrackingAreas) { |
797 AutocompleteTextFieldCell* cell = [field_ cell]; | 797 AutocompleteTextFieldCell* cell = [field_ cell]; |
798 | 798 |
799 mock_left_decoration_.SetVisible(true); | 799 mock_leading_decoration_.SetVisible(true); |
800 mock_right_decoration_.SetVisible(true); | 800 mock_trailing_decoration_.SetVisible(true); |
801 | 801 |
802 EXPECT_CALL(mock_left_decoration_, AcceptsMousePress()) | 802 EXPECT_CALL(mock_leading_decoration_, AcceptsMousePress()) |
803 .WillOnce(Return(true)) | 803 .WillOnce(Return(true)) |
804 .WillRepeatedly(Return(true)); | 804 .WillRepeatedly(Return(true)); |
805 EXPECT_CALL(mock_right_decoration_, AcceptsMousePress()) | 805 EXPECT_CALL(mock_trailing_decoration_, AcceptsMousePress()) |
806 .WillOnce(Return(false)) | 806 .WillOnce(Return(false)) |
807 .WillRepeatedly(Return(false)); | 807 .WillRepeatedly(Return(false)); |
808 [cell updateMouseTrackingAndToolTipsInRect:[field_ bounds] ofView:field_]; | 808 [cell updateMouseTrackingAndToolTipsInRect:[field_ bounds] ofView:field_]; |
809 | 809 |
810 EXPECT_EQ([cell mouseTrackingDecorations].size(), 1.0); | 810 EXPECT_EQ([cell mouseTrackingDecorations].size(), 1.0); |
811 | 811 |
812 [cell clearTrackingArea]; | 812 [cell clearTrackingArea]; |
813 EXPECT_TRUE([cell mouseTrackingDecorations].empty()); | 813 EXPECT_TRUE([cell mouseTrackingDecorations].empty()); |
814 | 814 |
815 EXPECT_CALL(mock_right_decoration_, AcceptsMousePress()) | 815 EXPECT_CALL(mock_trailing_decoration_, AcceptsMousePress()) |
816 .WillOnce(Return(true)) | 816 .WillOnce(Return(true)) |
817 .WillRepeatedly(Return(true)); | 817 .WillRepeatedly(Return(true)); |
818 | 818 |
819 [cell updateMouseTrackingAndToolTipsInRect:[field_ bounds] ofView:field_]; | 819 [cell updateMouseTrackingAndToolTipsInRect:[field_ bounds] ofView:field_]; |
820 EXPECT_EQ([cell mouseTrackingDecorations].size(), 2.0); | 820 EXPECT_EQ([cell mouseTrackingDecorations].size(), 2.0); |
821 } | 821 } |
822 | 822 |
823 // Verify that clicking a decoration that accepts mouse clicks does not focus | 823 // Verify that clicking a decoration that accepts mouse clicks does not focus |
824 // the Omnibox. | 824 // the Omnibox. |
825 TEST_F(AutocompleteTextFieldObserverTest, | 825 TEST_F(AutocompleteTextFieldObserverTest, |
826 ClickingDecorationDoesNotFocusOmnibox) { | 826 ClickingDecorationDoesNotFocusOmnibox) { |
827 AutocompleteTextFieldCell* cell = [field_ cell]; | 827 AutocompleteTextFieldCell* cell = [field_ cell]; |
828 | 828 |
829 // Set up a non-interactive decoration. | 829 // Set up a non-interactive decoration. |
830 MockDecoration noninteractive_decoration; | 830 MockDecoration noninteractive_decoration; |
831 noninteractive_decoration.SetVisible(true); | 831 noninteractive_decoration.SetVisible(true); |
832 EXPECT_CALL(noninteractive_decoration, AcceptsMousePress()) | 832 EXPECT_CALL(noninteractive_decoration, AcceptsMousePress()) |
833 .WillRepeatedly(testing::Return(false)); | 833 .WillRepeatedly(testing::Return(false)); |
834 [cell addLeftDecoration:&noninteractive_decoration]; | 834 [cell addLeadingDecoration:&noninteractive_decoration]; |
835 | 835 |
836 // Set up an interactive decoration. | 836 // Set up an interactive decoration. |
837 MockDecoration interactive_decoration; | 837 MockDecoration interactive_decoration; |
838 EXPECT_CALL(interactive_decoration, AcceptsMousePress()) | 838 EXPECT_CALL(interactive_decoration, AcceptsMousePress()) |
839 .WillRepeatedly(testing::Return(true)); | 839 .WillRepeatedly(testing::Return(true)); |
840 interactive_decoration.SetVisible(true); | 840 interactive_decoration.SetVisible(true); |
841 [cell addLeftDecoration:&interactive_decoration]; | 841 [cell addLeadingDecoration:&interactive_decoration]; |
842 [cell updateMouseTrackingAndToolTipsInRect:[field_ frame] ofView:field_]; | 842 [cell updateMouseTrackingAndToolTipsInRect:[field_ frame] ofView:field_]; |
843 EXPECT_CALL(interactive_decoration, OnMousePressed(_, _)) | 843 EXPECT_CALL(interactive_decoration, OnMousePressed(_, _)) |
844 .WillRepeatedly(testing::Return(true)); | 844 .WillRepeatedly(testing::Return(true)); |
845 | 845 |
846 // Ignore incidental calls. The exact frequency of these calls doesn't matter | 846 // Ignore incidental calls. The exact frequency of these calls doesn't matter |
847 // as they are auxiliary. | 847 // as they are auxiliary. |
848 EXPECT_CALL(field_observer_, SelectionRangeForProposedRange(_)) | 848 EXPECT_CALL(field_observer_, SelectionRangeForProposedRange(_)) |
849 .WillRepeatedly(testing::Return(NSMakeRange(0, 0))); | 849 .WillRepeatedly(testing::Return(NSMakeRange(0, 0))); |
850 EXPECT_CALL(field_observer_, OnMouseDown(_)).Times(testing::AnyNumber()); | 850 EXPECT_CALL(field_observer_, OnMouseDown(_)).Times(testing::AnyNumber()); |
851 EXPECT_CALL(field_observer_, OnSetFocus(false)).Times(testing::AnyNumber()); | 851 EXPECT_CALL(field_observer_, OnSetFocus(false)).Times(testing::AnyNumber()); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
924 base::scoped_nsobject<AutocompleteTextField> pin([field_ retain]); | 924 base::scoped_nsobject<AutocompleteTextField> pin([field_ retain]); |
925 [field_ removeFromSuperview]; | 925 [field_ removeFromSuperview]; |
926 [test_window() resignKeyWindow]; | 926 [test_window() resignKeyWindow]; |
927 | 927 |
928 [[test_window() contentView] addSubview:field_]; | 928 [[test_window() contentView] addSubview:field_]; |
929 EXPECT_CALL(field_observer_, ClosePopup()); | 929 EXPECT_CALL(field_observer_, ClosePopup()); |
930 [test_window() resignKeyWindow]; | 930 [test_window() resignKeyWindow]; |
931 } | 931 } |
932 | 932 |
933 } // namespace | 933 } // namespace |
OLD | NEW |