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

Side by Side Diff: ios/chrome/browser/ui/stack_view/stack_view_controller.mm

Issue 2944443003: [ObjC ARC] Converts ios/chrome/browser/ui/stack_view:stack_view to ARC. (Closed)
Patch Set: Add and use explicit disconnect in CardSet. Created 3 years, 6 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
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 "ios/chrome/browser/ui/stack_view/stack_view_controller.h" 5 #import "ios/chrome/browser/ui/stack_view/stack_view_controller.h"
6 6
7 #import <QuartzCore/QuartzCore.h> 7 #import <QuartzCore/QuartzCore.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <cmath> 10 #include <cmath>
11 #include <limits> 11 #include <limits>
12 12
13 #include "base/format_macros.h" 13 #include "base/format_macros.h"
14 #import "base/ios/block_types.h" 14 #import "base/ios/block_types.h"
15 #import "base/ios/weak_nsobject.h"
16 #include "base/logging.h" 15 #include "base/logging.h"
17 #import "base/mac/bundle_locations.h" 16 #import "base/mac/bundle_locations.h"
18 #import "base/mac/foundation_util.h" 17 #import "base/mac/foundation_util.h"
19 #import "base/mac/objc_property_releaser.h" 18
20 #include "base/mac/scoped_block.h" 19 #include "base/mac/scoped_block.h"
21 #import "base/mac/scoped_nsobject.h"
22 #include "base/metrics/histogram_macros.h" 20 #include "base/metrics/histogram_macros.h"
23 #include "base/metrics/user_metrics.h" 21 #include "base/metrics/user_metrics.h"
24 #include "base/metrics/user_metrics_action.h" 22 #include "base/metrics/user_metrics_action.h"
25 #include "base/strings/sys_string_conversions.h" 23 #include "base/strings/sys_string_conversions.h"
26 #include "ios/chrome/browser/chrome_url_constants.h" 24 #include "ios/chrome/browser/chrome_url_constants.h"
27 #include "ios/chrome/browser/experimental_flags.h" 25 #include "ios/chrome/browser/experimental_flags.h"
28 #import "ios/chrome/browser/tabs/tab.h" 26 #import "ios/chrome/browser/tabs/tab.h"
29 #import "ios/chrome/browser/tabs/tab_model.h" 27 #import "ios/chrome/browser/tabs/tab_model.h"
30 #import "ios/chrome/browser/tabs/tab_model_observer.h" 28 #import "ios/chrome/browser/tabs/tab_model_observer.h"
31 #import "ios/chrome/browser/ui/animation_util.h" 29 #import "ios/chrome/browser/ui/animation_util.h"
(...skipping 19 matching lines...) Expand all
51 #import "ios/chrome/browser/ui/tools_menu/tools_menu_view_item.h" 49 #import "ios/chrome/browser/ui/tools_menu/tools_menu_view_item.h"
52 #import "ios/chrome/browser/ui/ui_util.h" 50 #import "ios/chrome/browser/ui/ui_util.h"
53 #import "ios/chrome/browser/ui/uikit_ui_util.h" 51 #import "ios/chrome/browser/ui/uikit_ui_util.h"
54 #import "ios/chrome/common/material_timing.h" 52 #import "ios/chrome/common/material_timing.h"
55 #include "ios/chrome/grit/ios_strings.h" 53 #include "ios/chrome/grit/ios_strings.h"
56 #import "ios/shared/chrome/browser/ui/tools_menu/tools_menu_configuration.h" 54 #import "ios/shared/chrome/browser/ui/tools_menu/tools_menu_configuration.h"
57 #include "ios/web/public/referrer.h" 55 #include "ios/web/public/referrer.h"
58 #import "net/base/mac/url_conversions.h" 56 #import "net/base/mac/url_conversions.h"
59 #include "ui/base/l10n/l10n_util.h" 57 #include "ui/base/l10n/l10n_util.h"
60 58
59 #if !defined(__has_feature) || !__has_feature(objc_arc)
60 #error "This file requires ARC support."
61 #endif
62
61 using base::UserMetricsAction; 63 using base::UserMetricsAction;
62 64
63 // To obtain scroll behavior, places the card stacks' display views within a 65 // To obtain scroll behavior, places the card stacks' display views within a
64 // UIScrollView container. The container is used only as a driver of scroll 66 // UIScrollView container. The container is used only as a driver of scroll
65 // events. To avoid the finite size of the container from impacting scrolling, 67 // events. To avoid the finite size of the container from impacting scrolling,
66 // (1) the container is made large enough that it cannot be scrolled to a 68 // (1) the container is made large enough that it cannot be scrolled to a
67 // boundary point without the user having first fully scrolled the card stack 69 // boundary point without the user having first fully scrolled the card stack
68 // in that direction, and (2) after scroll events, the container's scroll 70 // in that direction, and (2) after scroll events, the container's scroll
69 // offset is recentered if necessary. 71 // offset is recentered if necessary.
70 72
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 // the end stack as appropriate. If the element is in the middle of a stack, fan 436 // the end stack as appropriate. If the element is in the middle of a stack, fan
435 // outcards from its card's index. 437 // outcards from its card's index.
436 - (void)accessibilityFocusedOnElement:(id)element; 438 - (void)accessibilityFocusedOnElement:(id)element;
437 439
438 // Determine the center of |sender| if it's a view or a toolbar item and store. 440 // Determine the center of |sender| if it's a view or a toolbar item and store.
439 - (void)setLastTapPoint:(id)sender; 441 - (void)setLastTapPoint:(id)sender;
440 442
441 @end 443 @end
442 444
443 @implementation StackViewController { 445 @implementation StackViewController {
444 base::scoped_nsobject<UIScrollView> _scrollView; 446 UIScrollView* _scrollView;
445 // The view containing the stack view's background. 447 // The view containing the stack view's background.
446 base::scoped_nsobject<UIView> _backgroundView; 448 UIView* _backgroundView;
447 // The main card set. 449 // The main card set.
448 base::scoped_nsobject<CardSet> _mainCardSet; 450 CardSet* _mainCardSet;
449 // The off-the-record card set. 451 // The off-the-record card set.
450 base::scoped_nsobject<CardSet> _otrCardSet; 452 CardSet* _otrCardSet;
451 // The currently active card set; one of _mainCardSet or _otrCardSet. 453 // The currently active card set; one of _mainCardSet or _otrCardSet.
452 CardSet* _activeCardSet; // weak 454 __weak CardSet* _activeCardSet;
453 id<TabSwitcherDelegate> _delegate; // weak 455 __weak id<TabSwitcherDelegate> _delegate;
454 id<StackViewControllerTestDelegate> _testDelegate; // weak 456 __weak id<StackViewControllerTestDelegate> _testDelegate;
455 // Controller for the stack view toolbar. 457 // Controller for the stack view toolbar.
456 base::scoped_nsobject<StackViewToolbarController> _toolbarController; 458 StackViewToolbarController* _toolbarController;
457 // The size of a card at the time the stack was first shown. 459 // The size of a card at the time the stack was first shown.
458 CGSize _initialCardSize; 460 CGSize _initialCardSize;
459 // The previous orientation of the interface. 461 // The previous orientation of the interface.
460 UIInterfaceOrientation _lastInterfaceOrientation; 462 UIInterfaceOrientation _lastInterfaceOrientation;
461 // Gesture recognizer to catch taps on the inactive stack. 463 // Gesture recognizer to catch taps on the inactive stack.
462 base::scoped_nsobject<UITapGestureRecognizer> _modeSwitchRecognizer; 464 UITapGestureRecognizer* _modeSwitchRecognizer;
463 // Gesture recognizer to catch pinches in the active scroll view. 465 // Gesture recognizer to catch pinches in the active scroll view.
464 base::scoped_nsobject<UIGestureRecognizer> _pinchRecognizer; 466 UIGestureRecognizer* _pinchRecognizer;
465 // Gesture recognizer to catch swipes to switch decks/dismiss cards. 467 // Gesture recognizer to catch swipes to switch decks/dismiss cards.
466 base::scoped_nsobject<UIGestureRecognizer> _swipeGestureRecognizer; 468 UIGestureRecognizer* _swipeGestureRecognizer;
467 // Gesture recognizer that determines whether an ambiguous swipe action 469 // Gesture recognizer that determines whether an ambiguous swipe action
468 // (i.e., a swipe on an active card in the direction that would cause a deck 470 // (i.e., a swipe on an active card in the direction that would cause a deck
469 // change) should trigger a change of decks or a card dismissal. 471 // change) should trigger a change of decks or a card dismissal.
470 base::scoped_nsobject<UILongPressGestureRecognizer> 472 UILongPressGestureRecognizer* _swipeDismissesCardRecognizer;
471 _swipeDismissesCardRecognizer;
472 // Tracks the parameters of gesture-related events. 473 // Tracks the parameters of gesture-related events.
473 base::scoped_nsobject<GestureStateTracker> _gestureStateTracker; 474 GestureStateTracker* _gestureStateTracker;
474 // If |YES|, callbacks to |scrollViewDidScroll:| do not trigger scrolling. 475 // If |YES|, callbacks to |scrollViewDidScroll:| do not trigger scrolling.
475 // Default is |NO|. 476 // Default is |NO|.
476 BOOL _ignoreScrollCallbacks; 477 BOOL _ignoreScrollCallbacks;
477 // The scroll view's pan gesture recognizer. 478 // The scroll view's pan gesture recognizer.
478 UIPanGestureRecognizer* _scrollGestureRecognizer; // weak 479 __weak UIPanGestureRecognizer* _scrollGestureRecognizer;
479 // Because the removal of the StackCard during a swipe happens in a callback, 480 // Because the removal of the StackCard during a swipe happens in a callback,
480 // track which direction the animation should dismiss with. 481 // track which direction the animation should dismiss with.
481 // |_reverseDismissCard| is only set when the dismissal happens in reverse. 482 // |_reverseDismissCard| is only set when the dismissal happens in reverse.
482 base::scoped_nsobject<StackCard> _reverseDismissCard; 483 StackCard* _reverseDismissCard;
483 // |YES| if the stack view is in the process of being dismissed. 484 // |YES| if the stack view is in the process of being dismissed.
484 BOOL _isBeingDismissed; 485 BOOL _isBeingDismissed;
485 // |YES| if the stack view is currently active. 486 // |YES| if the stack view is currently active.
486 BOOL _isActive; 487 BOOL _isActive;
487 // Records whether a memory warning occurred in the current session. 488 // Records whether a memory warning occurred in the current session.
488 BOOL _receivedMemoryWarningInSession; 489 BOOL _receivedMemoryWarningInSession;
489 // |YES| if there is card set animation being processed. For testing only. 490 // |YES| if there is card set animation being processed. For testing only.
490 // Save last touch point used by new tab animation. 491 // Save last touch point used by new tab animation.
491 CGPoint _lastTapPoint; 492 CGPoint _lastTapPoint;
492
493 base::mac::ObjCPropertyReleaser _propertyReleaserStackViewController;
494 } 493 }
495 494
496 @synthesize activeCardSet = _activeCardSet; 495 @synthesize activeCardSet = _activeCardSet;
497 @synthesize delegate = _delegate; 496 @synthesize delegate = _delegate;
498 @synthesize dummyToolbarBackgroundView = _dummyToolbarBackgroundView; 497 @synthesize dummyToolbarBackgroundView = _dummyToolbarBackgroundView;
499 @synthesize inActiveDeckChangeAnimation = _inActiveDeckChangeAnimation; 498 @synthesize inActiveDeckChangeAnimation = _inActiveDeckChangeAnimation;
500 @synthesize testDelegate = _testDelegate; 499 @synthesize testDelegate = _testDelegate;
501 @synthesize transitionStyle = _transitionStyle; 500 @synthesize transitionStyle = _transitionStyle;
502 @synthesize transitionTappedCard = _transitionTappedCard; 501 @synthesize transitionTappedCard = _transitionTappedCard;
503 @synthesize transitionToolbarController = _transitionToolbarController; 502 @synthesize transitionToolbarController = _transitionToolbarController;
504 @synthesize transitionToolbarFrame = _transitionToolbarFrame; 503 @synthesize transitionToolbarFrame = _transitionToolbarFrame;
505 @synthesize transitionToolbarOwner = _transitionToolbarOwner; 504 @synthesize transitionToolbarOwner = _transitionToolbarOwner;
506 @synthesize transitionWasCancelled = _transitionWasCancelled; 505 @synthesize transitionWasCancelled = _transitionWasCancelled;
507 506
508 - (instancetype)initWithMainCardSet:(CardSet*)mainCardSet 507 - (instancetype)initWithMainCardSet:(CardSet*)mainCardSet
509 otrCardSet:(CardSet*)otrCardSet 508 otrCardSet:(CardSet*)otrCardSet
510 activeCardSet:(CardSet*)activeCardSet { 509 activeCardSet:(CardSet*)activeCardSet {
511 DCHECK(mainCardSet); 510 DCHECK(mainCardSet);
512 DCHECK(otrCardSet); 511 DCHECK(otrCardSet);
513 DCHECK(activeCardSet == otrCardSet || activeCardSet == mainCardSet); 512 DCHECK(activeCardSet == otrCardSet || activeCardSet == mainCardSet);
514 self = [super initWithNibName:nil bundle:nil]; 513 self = [super initWithNibName:nil bundle:nil];
515 if (self) { 514 if (self) {
516 _propertyReleaserStackViewController.Init(self,
517 [StackViewController class]);
518 [self setUpWithMainCardSet:mainCardSet 515 [self setUpWithMainCardSet:mainCardSet
519 otrCardSet:otrCardSet 516 otrCardSet:otrCardSet
520 activeCardSet:activeCardSet]; 517 activeCardSet:activeCardSet];
521 _swipeDismissesCardRecognizer.reset([[UILongPressGestureRecognizer alloc] 518 _swipeDismissesCardRecognizer = [[UILongPressGestureRecognizer alloc]
522 initWithTarget:self 519 initWithTarget:self
523 action:@selector(handleLongPressFrom:)]); 520 action:@selector(handleLongPressFrom:)];
524 [_swipeDismissesCardRecognizer 521 [_swipeDismissesCardRecognizer
525 setMinimumPressDuration: 522 setMinimumPressDuration:
526 kPressDurationForAmbiguousSwipeToTriggerDismissal]; 523 kPressDurationForAmbiguousSwipeToTriggerDismissal];
527 [_swipeDismissesCardRecognizer setDelegate:self]; 524 [_swipeDismissesCardRecognizer setDelegate:self];
528 _pinchRecognizer.reset([[CardStackPinchGestureRecognizer alloc] 525 _pinchRecognizer = [[CardStackPinchGestureRecognizer alloc]
529 initWithTarget:self 526 initWithTarget:self
530 action:@selector(handlePinchFrom:)]); 527 action:@selector(handlePinchFrom:)];
531 [_pinchRecognizer setDelegate:self]; 528 [_pinchRecognizer setDelegate:self];
532 _modeSwitchRecognizer.reset([[UITapGestureRecognizer alloc] 529 _modeSwitchRecognizer = [[UITapGestureRecognizer alloc]
533 initWithTarget:self 530 initWithTarget:self
534 action:@selector(handleTapFrom:)]); 531 action:@selector(handleTapFrom:)];
535 [_modeSwitchRecognizer setDelegate:self]; 532 [_modeSwitchRecognizer setDelegate:self];
536 } 533 }
537 return self; 534 return self;
538 } 535 }
539 536
540 - (instancetype)initWithMainTabModel:(TabModel*)mainModel 537 - (instancetype)initWithMainTabModel:(TabModel*)mainModel
541 otrTabModel:(TabModel*)otrModel 538 otrTabModel:(TabModel*)otrModel
542 activeTabModel:(TabModel*)activeModel { 539 activeTabModel:(TabModel*)activeModel {
543 DCHECK(mainModel); 540 DCHECK(mainModel);
544 DCHECK(otrModel); 541 DCHECK(otrModel);
545 DCHECK(activeModel == otrModel || activeModel == mainModel); 542 DCHECK(activeModel == otrModel || activeModel == mainModel);
546 base::scoped_nsobject<CardSet> mainCardSet( 543 CardSet* mainCardSet = [[CardSet alloc] initWithModel:mainModel];
547 [[CardSet alloc] initWithModel:mainModel]); 544 CardSet* otrCardSet = [[CardSet alloc] initWithModel:otrModel];
548 base::scoped_nsobject<CardSet> otrCardSet(
549 [[CardSet alloc] initWithModel:otrModel]);
550 CardSet* activeCardSet = 545 CardSet* activeCardSet =
551 (activeModel == mainModel) ? mainCardSet.get() : otrCardSet.get(); 546 (activeModel == mainModel) ? mainCardSet : otrCardSet;
552 return [self initWithMainCardSet:mainCardSet 547 return [self initWithMainCardSet:mainCardSet
553 otrCardSet:otrCardSet 548 otrCardSet:otrCardSet
554 activeCardSet:activeCardSet]; 549 activeCardSet:activeCardSet];
555 } 550 }
556 551
557 - (instancetype)initWithNibName:(NSString*)nibNameOrNil 552 - (instancetype)initWithNibName:(NSString*)nibNameOrNil
558 bundle:(NSBundle*)nibBundleOrNil { 553 bundle:(NSBundle*)nibBundleOrNil {
559 NOTREACHED(); 554 NOTREACHED();
560 return nil; 555 return nil;
561 } 556 }
562 557
563 - (instancetype)initWithCoder:(NSCoder*)aDecoder { 558 - (instancetype)initWithCoder:(NSCoder*)aDecoder {
564 NOTREACHED(); 559 NOTREACHED();
565 return nil; 560 return nil;
566 } 561 }
567 562
568 - (void)setUpWithMainCardSet:(CardSet*)mainCardSet 563 - (void)setUpWithMainCardSet:(CardSet*)mainCardSet
569 otrCardSet:(CardSet*)otrCardSet 564 otrCardSet:(CardSet*)otrCardSet
570 activeCardSet:(CardSet*)activeCardSet { 565 activeCardSet:(CardSet*)activeCardSet {
571 _mainCardSet.reset([mainCardSet retain]); 566 _mainCardSet = mainCardSet;
572 _otrCardSet.reset([otrCardSet retain]); 567 _otrCardSet = otrCardSet;
573 if (experimental_flags::IsLRUSnapshotCacheEnabled()) { 568 if (experimental_flags::IsLRUSnapshotCacheEnabled()) {
574 [_mainCardSet setKeepOnlyVisibleCardViewsAlive:YES]; 569 [_mainCardSet setKeepOnlyVisibleCardViewsAlive:YES];
575 [_otrCardSet setKeepOnlyVisibleCardViewsAlive:YES]; 570 [_otrCardSet setKeepOnlyVisibleCardViewsAlive:YES];
576 } 571 }
577 _activeCardSet = (activeCardSet == mainCardSet) ? mainCardSet : otrCardSet; 572 _activeCardSet = (activeCardSet == mainCardSet) ? mainCardSet : otrCardSet;
578 _gestureStateTracker.reset([[GestureStateTracker alloc] init]); 573 _gestureStateTracker = [[GestureStateTracker alloc] init];
579 _pinchRecognizer.reset([[CardStackPinchGestureRecognizer alloc] 574 _pinchRecognizer = [[CardStackPinchGestureRecognizer alloc]
580 initWithTarget:self 575 initWithTarget:self
581 action:@selector(handlePinchFrom:)]); 576 action:@selector(handlePinchFrom:)];
582 [_pinchRecognizer setDelegate:self]; 577 [_pinchRecognizer setDelegate:self];
583 _modeSwitchRecognizer.reset([[UITapGestureRecognizer alloc] 578 _modeSwitchRecognizer =
584 initWithTarget:self 579 [[UITapGestureRecognizer alloc] initWithTarget:self
585 action:@selector(handleTapFrom:)]); 580 action:@selector(handleTapFrom:)];
586 [_modeSwitchRecognizer setDelegate:self]; 581 [_modeSwitchRecognizer setDelegate:self];
587 } 582 }
588 583
589 - (void)restoreInternalStateWithMainTabModel:(TabModel*)mainModel 584 - (void)restoreInternalStateWithMainTabModel:(TabModel*)mainModel
590 otrTabModel:(TabModel*)otrModel 585 otrTabModel:(TabModel*)otrModel
591 activeTabModel:(TabModel*)activeModel { 586 activeTabModel:(TabModel*)activeModel {
592 DCHECK(mainModel); 587 DCHECK(mainModel);
593 DCHECK(otrModel); 588 DCHECK(otrModel);
594 DCHECK(activeModel == otrModel || activeModel == mainModel); 589 DCHECK(activeModel == otrModel || activeModel == mainModel);
595 DCHECK(!_isActive); 590 DCHECK(!_isActive);
596 base::scoped_nsobject<CardSet> mainCardSet( 591 CardSet* mainCardSet = [[CardSet alloc] initWithModel:mainModel];
597 [[CardSet alloc] initWithModel:mainModel]); 592 CardSet* otrCardSet = [[CardSet alloc] initWithModel:otrModel];
598 base::scoped_nsobject<CardSet> otrCardSet(
599 [[CardSet alloc] initWithModel:otrModel]);
600 CardSet* activeCardSet = 593 CardSet* activeCardSet =
601 (activeModel == mainModel) ? mainCardSet.get() : otrCardSet.get(); 594 (activeModel == mainModel) ? mainCardSet : otrCardSet;
602 [self setUpWithMainCardSet:mainCardSet 595 [self setUpWithMainCardSet:mainCardSet
603 otrCardSet:otrCardSet 596 otrCardSet:otrCardSet
604 activeCardSet:activeCardSet]; 597 activeCardSet:activeCardSet];
605 598
606 // If the view is not currently loaded, do not adjust its size or add 599 // If the view is not currently loaded, do not adjust its size or add
607 // gesture recognizers. That work will be done in |viewDidLoad|. 600 // gesture recognizers. That work will be done in |viewDidLoad|.
608 if ([self isViewLoaded]) { 601 if ([self isViewLoaded]) {
609 [self prepareForDisplay]; 602 [self prepareForDisplay];
610 // The delegate is set to nil when the stack view is dismissed. 603 // The delegate is set to nil when the stack view is dismissed.
611 [_scrollView setDelegate:self]; 604 [_scrollView setDelegate:self];
(...skipping 11 matching lines...) Expand all
623 - (void)clearInternalState { 616 - (void)clearInternalState {
624 DCHECK(!_isActive); 617 DCHECK(!_isActive);
625 [[_mainCardSet displayView] removeFromSuperview]; 618 [[_mainCardSet displayView] removeFromSuperview];
626 [[_otrCardSet displayView] removeFromSuperview]; 619 [[_otrCardSet displayView] removeFromSuperview];
627 620
628 // Only deregister from the specific notifications for which this class 621 // Only deregister from the specific notifications for which this class
629 // registered. Do not use the blanket |removeObserver|, otherwise the low 622 // registered. Do not use the blanket |removeObserver|, otherwise the low
630 // memory notification is not received and the view is never unloaded. 623 // memory notification is not received and the view is never unloaded.
631 [self deregisterForNotifications]; 624 [self deregisterForNotifications];
632 625
633 _mainCardSet.reset(); 626 [_mainCardSet disconnect];
634 _otrCardSet.reset(); 627 _mainCardSet = nil;
628
629 [_otrCardSet disconnect];
630 _otrCardSet = nil;
631
635 _activeCardSet = nil; 632 _activeCardSet = nil;
636 633
637 // Remove gesture recognizers and notifications. 634 // Remove gesture recognizers and notifications.
638 [self prepareForDismissal]; 635 [self prepareForDismissal];
639 _gestureStateTracker.reset(); 636 _gestureStateTracker = nil;
640 _pinchRecognizer.reset(); 637 _pinchRecognizer = nil;
641 _modeSwitchRecognizer.reset(); 638 _modeSwitchRecognizer = nil;
642 _swipeGestureRecognizer.reset(); 639 _swipeGestureRecognizer = nil;
643 640
644 // The cards need to recompute their sizes the next time they are shown. 641 // The cards need to recompute their sizes the next time they are shown.
645 _initialCardSize.height = _initialCardSize.width = 0.0f; 642 _initialCardSize.height = _initialCardSize.width = 0.0f;
646 // The scroll view will need to recenter itself relative to its viewport. 643 // The scroll view will need to recenter itself relative to its viewport.
647 [_scrollView setContentOffset:CGPointZero]; 644 [_scrollView setContentOffset:CGPointZero];
648 _isBeingDismissed = NO; 645 _isBeingDismissed = NO;
649 } 646 }
650 647
651 - (void)viewportSizeWasChanged { 648 - (void)viewportSizeWasChanged {
652 [self updateScrollViewContentSize]; 649 [self updateScrollViewContentSize];
(...skipping 16 matching lines...) Expand all
669 _ignoreScrollCallbacks = YES; 666 _ignoreScrollCallbacks = YES;
670 [_scrollView setContentSize:[self sizeForScrollLength:scrollLength 667 [_scrollView setContentSize:[self sizeForScrollLength:scrollLength
671 breadth:scrollBreadth]]; 668 breadth:scrollBreadth]];
672 _ignoreScrollCallbacks = NO; 669 _ignoreScrollCallbacks = NO;
673 [self recenterScrollViewIfNecessary]; 670 [self recenterScrollViewIfNecessary];
674 } 671 }
675 672
676 - (void)setUpDisplayViews { 673 - (void)setUpDisplayViews {
677 CGRect displayViewFrame = CGRectMake(0, 0, [_scrollView frame].size.width, 674 CGRect displayViewFrame = CGRectMake(0, 0, [_scrollView frame].size.width,
678 [_scrollView frame].size.height); 675 [_scrollView frame].size.height);
679 base::scoped_nsobject<UIView> mainDisplayView( 676 UIView* mainDisplayView = [[UIView alloc] initWithFrame:displayViewFrame];
680 [[UIView alloc] initWithFrame:displayViewFrame]);
681 [mainDisplayView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | 677 [mainDisplayView setAutoresizingMask:UIViewAutoresizingFlexibleWidth |
682 UIViewAutoresizingFlexibleHeight]; 678 UIViewAutoresizingFlexibleHeight];
683 base::scoped_nsobject<UIView> otrDisplayView( 679 UIView* otrDisplayView = [[UIView alloc] initWithFrame:displayViewFrame];
684 [[UIView alloc] initWithFrame:displayViewFrame]);
685 [otrDisplayView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | 680 [otrDisplayView setAutoresizingMask:UIViewAutoresizingFlexibleWidth |
686 UIViewAutoresizingFlexibleHeight]; 681 UIViewAutoresizingFlexibleHeight];
687 682
688 [_scrollView addSubview:mainDisplayView]; 683 [_scrollView addSubview:mainDisplayView];
689 [_scrollView addSubview:otrDisplayView]; 684 [_scrollView addSubview:otrDisplayView];
690 [_mainCardSet setDisplayView:mainDisplayView]; 685 [_mainCardSet setDisplayView:mainDisplayView];
691 [_otrCardSet setDisplayView:otrDisplayView]; 686 [_otrCardSet setDisplayView:otrDisplayView];
692 } 687 }
693 688
694 - (void)prepareForDisplay { 689 - (void)prepareForDisplay {
(...skipping 12 matching lines...) Expand all
707 : UIInterfaceOrientationLandscapeRight; 702 : UIInterfaceOrientationLandscapeRight;
708 } 703 }
709 [self registerForNotifications]; 704 [self registerForNotifications];
710 705
711 // TODO(blundell): Why isn't this recognizer initialized with the 706 // TODO(blundell): Why isn't this recognizer initialized with the
712 // pinch and mode switch recognizers? 707 // pinch and mode switch recognizers?
713 UIPanGestureRecognizer* panGestureRecognizer = 708 UIPanGestureRecognizer* panGestureRecognizer =
714 [[UIPanGestureRecognizer alloc] initWithTarget:self 709 [[UIPanGestureRecognizer alloc] initWithTarget:self
715 action:@selector(handlePanFrom:)]; 710 action:@selector(handlePanFrom:)];
716 [panGestureRecognizer setMaximumNumberOfTouches:1]; 711 [panGestureRecognizer setMaximumNumberOfTouches:1];
717 _swipeGestureRecognizer.reset(panGestureRecognizer); 712 _swipeGestureRecognizer = panGestureRecognizer;
718 [[self view] addGestureRecognizer:_swipeGestureRecognizer]; 713 [[self view] addGestureRecognizer:_swipeGestureRecognizer];
719 [_swipeGestureRecognizer setDelegate:self]; 714 [_swipeGestureRecognizer setDelegate:self];
720 } 715 }
721 716
722 - (void)loadView { 717 - (void)loadView {
723 [super loadView]; 718 [super loadView];
724 719
725 _backgroundView.reset([[UIView alloc] initWithFrame:self.view.bounds]); 720 _backgroundView = [[UIView alloc] initWithFrame:self.view.bounds];
726 [_backgroundView setAutoresizingMask:(UIViewAutoresizingFlexibleHeight | 721 [_backgroundView setAutoresizingMask:(UIViewAutoresizingFlexibleHeight |
727 UIViewAutoresizingFlexibleWidth)]; 722 UIViewAutoresizingFlexibleWidth)];
728 [self.view addSubview:_backgroundView]; 723 [self.view addSubview:_backgroundView];
729 724
730 _toolbarController.reset( 725 _toolbarController =
731 [[StackViewToolbarController alloc] initWithStackViewToolbar]); 726 [[StackViewToolbarController alloc] initWithStackViewToolbar];
732 CGRect toolbarFrame = [self.view bounds]; 727 CGRect toolbarFrame = [self.view bounds];
733 toolbarFrame.origin.y = CGRectGetMinY([[_toolbarController view] frame]); 728 toolbarFrame.origin.y = CGRectGetMinY([[_toolbarController view] frame]);
734 toolbarFrame.size.height = CGRectGetHeight([[_toolbarController view] frame]); 729 toolbarFrame.size.height = CGRectGetHeight([[_toolbarController view] frame]);
735 [[_toolbarController view] setFrame:toolbarFrame]; 730 [[_toolbarController view] setFrame:toolbarFrame];
736 [self.view addSubview:[_toolbarController view]]; 731 [self.view addSubview:[_toolbarController view]];
737 [self updateToolbarAppearanceWithAnimation:NO]; 732 [self updateToolbarAppearanceWithAnimation:NO];
738 733
739 InstallBackgroundInView(_backgroundView); 734 InstallBackgroundInView(_backgroundView);
740 735
741 UIEdgeInsets contentInsets = UIEdgeInsetsMake( 736 UIEdgeInsets contentInsets = UIEdgeInsetsMake(
742 toolbarFrame.size.height - kVerticalToolbarOverlap, 0.0, 0.0, 0.0); 737 toolbarFrame.size.height - kVerticalToolbarOverlap, 0.0, 0.0, 0.0);
743 CGRect scrollViewFrame = 738 CGRect scrollViewFrame =
744 UIEdgeInsetsInsetRect(self.view.bounds, contentInsets); 739 UIEdgeInsetsInsetRect(self.view.bounds, contentInsets);
745 _scrollView.reset([[UIScrollView alloc] initWithFrame:scrollViewFrame]); 740 _scrollView = [[UIScrollView alloc] initWithFrame:scrollViewFrame];
746 [self.view addSubview:_scrollView]; 741 [self.view addSubview:_scrollView];
747 [_scrollView setAutoresizingMask:(UIViewAutoresizingFlexibleHeight | 742 [_scrollView setAutoresizingMask:(UIViewAutoresizingFlexibleHeight |
748 UIViewAutoresizingFlexibleWidth)]; 743 UIViewAutoresizingFlexibleWidth)];
749 [_scrollView setBounces:NO]; 744 [_scrollView setBounces:NO];
750 [_scrollView setScrollsToTop:NO]; 745 [_scrollView setScrollsToTop:NO];
751 [_scrollView setClipsToBounds:NO]; 746 [_scrollView setClipsToBounds:NO];
752 [_scrollView setShowsVerticalScrollIndicator:NO]; 747 [_scrollView setShowsVerticalScrollIndicator:NO];
753 [_scrollView setShowsHorizontalScrollIndicator:NO]; 748 [_scrollView setShowsHorizontalScrollIndicator:NO];
754 [_scrollView setDelegate:self]; 749 [_scrollView setDelegate:self];
755 750
(...skipping 20 matching lines...) Expand all
776 [self setInitialCardSizing]; 771 [self setInitialCardSizing];
777 [self viewportSizeWasChanged]; 772 [self viewportSizeWasChanged];
778 } else { 773 } else {
779 [self refreshCardDisplayWithAnimation:NO]; 774 [self refreshCardDisplayWithAnimation:NO];
780 [self updateToolbarAppearanceWithAnimation:NO]; 775 [self updateToolbarAppearanceWithAnimation:NO];
781 } 776 }
782 [self preloadCardViewsAsynchronously]; 777 [self preloadCardViewsAsynchronously];
783 778
784 // Reset the gesture state tracker to clear gesture-related information from 779 // Reset the gesture state tracker to clear gesture-related information from
785 // the last time the stack view was shown. 780 // the last time the stack view was shown.
786 _gestureStateTracker.reset([[GestureStateTracker alloc] init]); 781 _gestureStateTracker = [[GestureStateTracker alloc] init];
787 782
788 [super viewWillAppear:animated]; 783 [super viewWillAppear:animated];
789 } 784 }
790 785
791 - (void)refreshCardDisplayWithAnimation:(BOOL)animates { 786 - (void)refreshCardDisplayWithAnimation:(BOOL)animates {
792 _lastInterfaceOrientation = GetInterfaceOrientation(); 787 _lastInterfaceOrientation = GetInterfaceOrientation();
793 [self updateDeckOrientationWithAnimation:animates]; 788 [self updateDeckOrientationWithAnimation:animates];
794 [self viewportSizeWasChanged]; 789 [self viewportSizeWasChanged];
795 [_mainCardSet updateCardVisibilities]; 790 [_mainCardSet updateCardVisibilities];
796 [_otrCardSet updateCardVisibilities]; 791 [_otrCardSet updateCardVisibilities];
(...skipping 12 matching lines...) Expand all
809 } 804 }
810 805
811 - (void)dealloc { 806 - (void)dealloc {
812 [_mainCardSet clearGestureRecognizerTargetAndDelegateFromCards:self]; 807 [_mainCardSet clearGestureRecognizerTargetAndDelegateFromCards:self];
813 [_otrCardSet clearGestureRecognizerTargetAndDelegateFromCards:self]; 808 [_otrCardSet clearGestureRecognizerTargetAndDelegateFromCards:self];
814 // Card sets shouldn't have any other references, but nil the observer just 809 // Card sets shouldn't have any other references, but nil the observer just
815 // in case one somehow does end up with another ref. 810 // in case one somehow does end up with another ref.
816 [_mainCardSet setObserver:nil]; 811 [_mainCardSet setObserver:nil];
817 [_otrCardSet setObserver:nil]; 812 [_otrCardSet setObserver:nil];
818 [self cleanUpViewsAndNotifications]; 813 [self cleanUpViewsAndNotifications];
819 [super dealloc];
820 } 814 }
821 815
822 // Overridden to always return NO, ensuring that the status bar shows in 816 // Overridden to always return NO, ensuring that the status bar shows in
823 // landscape on iOS8. 817 // landscape on iOS8.
824 - (BOOL)prefersStatusBarHidden { 818 - (BOOL)prefersStatusBarHidden {
825 return NO; 819 return NO;
826 } 820 }
827 821
828 // Called when in the foreground and the OS needs more memory. Release as much 822 // Called when in the foreground and the OS needs more memory. Release as much
829 // as possible. 823 // as possible.
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
953 UMA_HISTOGRAM_BOOLEAN("MemoryWarning.OccurredDuringCardStackSession", 947 UMA_HISTOGRAM_BOOLEAN("MemoryWarning.OccurredDuringCardStackSession",
954 _receivedMemoryWarningInSession); 948 _receivedMemoryWarningInSession);
955 } 949 }
956 950
957 - (void)cleanUpViewsAndNotifications { 951 - (void)cleanUpViewsAndNotifications {
958 [_mainCardSet setDisplayView:nil]; 952 [_mainCardSet setDisplayView:nil];
959 [_otrCardSet setDisplayView:nil]; 953 [_otrCardSet setDisplayView:nil];
960 // Stop pre-loading cards. 954 // Stop pre-loading cards.
961 [NSObject cancelPreviousPerformRequestsWithTarget:self]; 955 [NSObject cancelPreviousPerformRequestsWithTarget:self];
962 [_scrollView setDelegate:nil]; 956 [_scrollView setDelegate:nil];
963 _scrollView.reset(); 957 _scrollView = nil;
964 _backgroundView.reset(); 958 _backgroundView = nil;
965 [[NSNotificationCenter defaultCenter] removeObserver:self]; 959 [[NSNotificationCenter defaultCenter] removeObserver:self];
966 } 960 }
967 961
968 - (UIStatusBarStyle)preferredStatusBarStyle { 962 - (UIStatusBarStyle)preferredStatusBarStyle {
969 // When dismissing the stack view, the status bar's style is updated when this 963 // When dismissing the stack view, the status bar's style is updated when this
970 // view controller is still responsible. If the stack view is dismissing into 964 // view controller is still responsible. If the stack view is dismissing into
971 // a non-incognito BVC, the status bar needs to use the default style. 965 // a non-incognito BVC, the status bar needs to use the default style.
972 BOOL useDefaultStyle = _isBeingDismissed && ![self isCurrentSetIncognito]; 966 BOOL useDefaultStyle = _isBeingDismissed && ![self isCurrentSetIncognito];
973 return useDefaultStyle ? UIStatusBarStyleDefault 967 return useDefaultStyle ? UIStatusBarStyleDefault
974 : UIStatusBarStyleLightContent; 968 : UIStatusBarStyleLightContent;
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1070 delay += kCascadingCardCloseDelay; 1064 delay += kCascadingCardCloseDelay;
1071 } 1065 }
1072 } 1066 }
1073 1067
1074 - (void)disableGestureHandlers { 1068 - (void)disableGestureHandlers {
1075 // Disable gesture handlers before modifying the stack. Don't call this too 1069 // Disable gesture handlers before modifying the stack. Don't call this too
1076 // late or a gesture callback could occur while still in the old state of the 1070 // late or a gesture callback could occur while still in the old state of the
1077 // world. 1071 // world.
1078 // (see the comment in -cardSet:willRemoveCard:atIndex for details). 1072 // (see the comment in -cardSet:willRemoveCard:atIndex for details).
1079 [_scrollView setScrollEnabled:NO]; 1073 [_scrollView setScrollEnabled:NO];
1080 _pinchRecognizer.get().enabled = NO; 1074 _pinchRecognizer.enabled = NO;
1081 _swipeGestureRecognizer.get().enabled = NO; 1075 _swipeGestureRecognizer.enabled = NO;
1082 } 1076 }
1083 1077
1084 - (void)enableGestureHandlers { 1078 - (void)enableGestureHandlers {
1085 // Reenable gesture handlers after modifying the stack. Don't call this too 1079 // Reenable gesture handlers after modifying the stack. Don't call this too
1086 // early or a gesture callback could occur while still in the old state of the 1080 // early or a gesture callback could occur while still in the old state of the
1087 // world. 1081 // world.
1088 // (see the comment in -cardSet:willRemoveCard:atIndex for details). 1082 // (see the comment in -cardSet:willRemoveCard:atIndex for details).
1089 [_scrollView setScrollEnabled:YES]; 1083 [_scrollView setScrollEnabled:YES];
1090 _pinchRecognizer.get().enabled = YES; 1084 _pinchRecognizer.enabled = YES;
1091 _swipeGestureRecognizer.get().enabled = YES; 1085 _swipeGestureRecognizer.enabled = YES;
1092 } 1086 }
1093 1087
1094 - (void)activeCardCountChanged { 1088 - (void)activeCardCountChanged {
1095 // Cancel any outstanding gestures (see the comment in 1089 // Cancel any outstanding gestures (see the comment in
1096 // -cardSet:willRemoveCard:atIndex). 1090 // -cardSet:willRemoveCard:atIndex).
1097 [self disableGestureHandlers]; 1091 [self disableGestureHandlers];
1098 [self enableGestureHandlers]; 1092 [self enableGestureHandlers];
1099 } 1093 }
1100 1094
1101 - (void)setInitialCardSizing { 1095 - (void)setInitialCardSizing {
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
1210 } 1204 }
1211 1205
1212 - (BOOL)bothDecksShouldBeDisplayed { 1206 - (BOOL)bothDecksShouldBeDisplayed {
1213 return [[_otrCardSet cards] count] > 0; 1207 return [[_otrCardSet cards] count] > 0;
1214 } 1208 }
1215 1209
1216 #pragma mark - 1210 #pragma mark -
1217 #pragma mark Current Set Handling 1211 #pragma mark Current Set Handling
1218 1212
1219 - (BOOL)isCurrentSetIncognito { 1213 - (BOOL)isCurrentSetIncognito {
1220 return _activeCardSet == _otrCardSet.get(); 1214 return _activeCardSet == _otrCardSet;
1221 } 1215 }
1222 1216
1223 - (CardSet*)inactiveCardSet { 1217 - (CardSet*)inactiveCardSet {
1224 return [self isCurrentSetIncognito] ? _mainCardSet.get() : _otrCardSet.get(); 1218 return [self isCurrentSetIncognito] ? _mainCardSet : _otrCardSet;
1225 } 1219 }
1226 1220
1227 - (void)setActiveCardSet:(CardSet*)cardSet { 1221 - (void)setActiveCardSet:(CardSet*)cardSet {
1228 DCHECK(cardSet); 1222 DCHECK(cardSet);
1229 if (cardSet == _activeCardSet) 1223 if (cardSet == _activeCardSet)
1230 return; 1224 return;
1231 [self activeCardCountChanged]; 1225 [self activeCardCountChanged];
1232 _activeCardSet = cardSet; 1226 _activeCardSet = cardSet;
1233 1227
1234 [self displayActiveCardSet]; 1228 [self displayActiveCardSet];
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
1467 [_activeCardSet.currentCard setIsActiveTab:YES]; 1461 [_activeCardSet.currentCard setIsActiveTab:YES];
1468 1462
1469 // When in accessbility mode, fan out cards from the start, announce open tabs 1463 // When in accessbility mode, fan out cards from the start, announce open tabs
1470 // and move the VoiceOver cursor to the New Tab button. Fanning out the cards 1464 // and move the VoiceOver cursor to the New Tab button. Fanning out the cards
1471 // from the start eliminates the screen change that would otherwise occur when 1465 // from the start eliminates the screen change that would otherwise occur when
1472 // moving the VoiceOver cursor from the Show Tabs button to the card stack. 1466 // moving the VoiceOver cursor from the Show Tabs button to the card stack.
1473 if (UIAccessibilityIsVoiceOverRunning()) { 1467 if (UIAccessibilityIsVoiceOverRunning()) {
1474 [_activeCardSet fanOutCardsWithStartIndex:0]; 1468 [_activeCardSet fanOutCardsWithStartIndex:0];
1475 [self postOpenTabsAccessibilityNotification]; 1469 [self postOpenTabsAccessibilityNotification];
1476 UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, 1470 UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification,
1477 _toolbarController.get().view); 1471 _toolbarController.view);
1478 } 1472 }
1479 } 1473 }
1480 1474
1481 - (void)cancelTransitionAnimation { 1475 - (void)cancelTransitionAnimation {
1482 // Set up transaction. 1476 // Set up transaction.
1483 [CATransaction begin]; 1477 [CATransaction begin];
1484 [CATransaction setCompletionBlock:^{ 1478 [CATransaction setCompletionBlock:^{
1485 [self finishTransitionAnimation]; 1479 [self finishTransitionAnimation];
1486 }]; 1480 }];
1487 self.transitionWasCancelled = YES; 1481 self.transitionWasCancelled = YES;
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
1578 BOOL isPresenting = self.transitionStyle == STACK_TRANSITION_STYLE_PRESENTING; 1572 BOOL isPresenting = self.transitionStyle == STACK_TRANSITION_STYLE_PRESENTING;
1579 1573
1580 // Get reference to toolbar for transition. 1574 // Get reference to toolbar for transition.
1581 self.transitionToolbarOwner = [_delegate tabSwitcherTransitionToolbarOwner]; 1575 self.transitionToolbarOwner = [_delegate tabSwitcherTransitionToolbarOwner];
1582 self.transitionToolbarController = 1576 self.transitionToolbarController =
1583 [self.transitionToolbarOwner relinquishedToolbarController]; 1577 [self.transitionToolbarOwner relinquishedToolbarController];
1584 self.transitionToolbarController.view.animatingTransition = YES; 1578 self.transitionToolbarController.view.animatingTransition = YES;
1585 self.transitionToolbarFrame = self.transitionToolbarController.view.frame; 1579 self.transitionToolbarFrame = self.transitionToolbarController.view.frame;
1586 1580
1587 // Create dummy toolbar background view. 1581 // Create dummy toolbar background view.
1588 self.dummyToolbarBackgroundView = 1582 self.dummyToolbarBackgroundView = [[UIView alloc] initWithFrame:CGRectZero];
1589 [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
1590 [self.dummyToolbarBackgroundView setClipsToBounds:YES]; 1583 [self.dummyToolbarBackgroundView setClipsToBounds:YES];
1591 1584
1592 // Set the transition completion block. 1585 // Set the transition completion block.
1593 [CATransaction begin]; 1586 [CATransaction begin];
1594 [CATransaction setCompletionBlock:^{ 1587 [CATransaction setCompletionBlock:^{
1595 [self finishTransitionAnimation]; 1588 [self finishTransitionAnimation];
1596 }]; 1589 }];
1597 1590
1598 // Slide in/out the inactive card set. 1591 // Slide in/out the inactive card set.
1599 [self animateInactiveSetTransition]; 1592 [self animateInactiveSetTransition];
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after
2058 inBackground:NO]; 2051 inBackground:NO];
2059 [_activeCardSet.tabModel setCurrentTab:tab]; 2052 [_activeCardSet.tabModel setCurrentTab:tab];
2060 2053
2061 [_delegate tabSwitcher:self 2054 [_delegate tabSwitcher:self
2062 dismissTransitionWillStartWithActiveModel:_activeCardSet.tabModel]; 2055 dismissTransitionWillStartWithActiveModel:_activeCardSet.tabModel];
2063 2056
2064 CGFloat statusBarHeight = StatusBarHeight(); 2057 CGFloat statusBarHeight = StatusBarHeight();
2065 CGRect viewBounds, remainder; 2058 CGRect viewBounds, remainder;
2066 CGRectDivide([self.view bounds], &remainder, &viewBounds, statusBarHeight, 2059 CGRectDivide([self.view bounds], &remainder, &viewBounds, statusBarHeight,
2067 CGRectMinYEdge); 2060 CGRectMinYEdge);
2068 UIImageView* newCard = 2061 UIImageView* newCard = [[UIImageView alloc] initWithFrame:viewBounds];
2069 [[[UIImageView alloc] initWithFrame:viewBounds] autorelease];
2070 // Temporarily resize the tab's view to ensure it matches the card while 2062 // Temporarily resize the tab's view to ensure it matches the card while
2071 // generating a snapshot, but then restore the original frame. 2063 // generating a snapshot, but then restore the original frame.
2072 CGRect originalTabFrame = [tab view].frame; 2064 CGRect originalTabFrame = [tab view].frame;
2073 [tab view].frame = viewBounds; 2065 [tab view].frame = viewBounds;
2074 newCard.image = [tab updateSnapshotWithOverlay:YES visibleFrameOnly:YES]; 2066 newCard.image = [tab updateSnapshotWithOverlay:YES visibleFrameOnly:YES];
2075 [tab view].frame = originalTabFrame; 2067 [tab view].frame = originalTabFrame;
2076 newCard.center = 2068 newCard.center =
2077 CGPointMake(CGRectGetMidX(viewBounds), CGRectGetMidY(viewBounds)); 2069 CGPointMake(CGRectGetMidX(viewBounds), CGRectGetMidY(viewBounds));
2078 [self.view addSubview:newCard]; 2070 [self.view addSubview:newCard];
2079 2071
(...skipping 25 matching lines...) Expand all
2105 2097
2106 #pragma mark UIGestureRecognizerDelegate methods 2098 #pragma mark UIGestureRecognizerDelegate methods
2107 2099
2108 - (BOOL)gestureRecognizer:(UIGestureRecognizer*)recognizer 2100 - (BOOL)gestureRecognizer:(UIGestureRecognizer*)recognizer
2109 shouldReceiveTouch:(UITouch*)touch { 2101 shouldReceiveTouch:(UITouch*)touch {
2110 // Don't swallow any touches while the tools popup menu is open. 2102 // Don't swallow any touches while the tools popup menu is open.
2111 if ([_toolbarController toolsPopupController]) 2103 if ([_toolbarController toolsPopupController])
2112 return NO; 2104 return NO;
2113 2105
2114 if ((recognizer == _pinchRecognizer) || 2106 if ((recognizer == _pinchRecognizer) ||
2115 (recognizer == _swipeGestureRecognizer.get())) 2107 (recognizer == _swipeGestureRecognizer))
2116 return YES; 2108 return YES;
2117 2109
2118 // Only the mode switch recognizer should be triggered in the inactive deck 2110 // Only the mode switch recognizer should be triggered in the inactive deck
2119 // region (and it should only be triggered there). 2111 // region (and it should only be triggered there).
2120 CGPoint touchLocation = [touch locationInView:_scrollView]; 2112 CGPoint touchLocation = [touch locationInView:_scrollView];
2121 BOOL inInactiveDeckRegion = 2113 BOOL inInactiveDeckRegion =
2122 CGRectContainsPoint([self inactiveDeckRegion], touchLocation); 2114 CGRectContainsPoint([self inactiveDeckRegion], touchLocation);
2123 if (recognizer == _modeSwitchRecognizer.get()) 2115 if (recognizer == _modeSwitchRecognizer)
2124 return inInactiveDeckRegion; 2116 return inInactiveDeckRegion;
2125 else if (inInactiveDeckRegion) 2117 else if (inInactiveDeckRegion)
2126 return NO; 2118 return NO;
2127 2119
2128 // Extract the card on which the touch is occurring. 2120 // Extract the card on which the touch is occurring.
2129 CardView* cardView = nil; 2121 CardView* cardView = nil;
2130 StackCard* card = nil; 2122 StackCard* card = nil;
2131 if (recognizer == _swipeDismissesCardRecognizer.get()) { 2123 if (recognizer == _swipeDismissesCardRecognizer) {
2132 UIView* activeView = _activeCardSet.displayView; 2124 UIView* activeView = _activeCardSet.displayView;
2133 CGPoint locationInActiveView = [touch locationInView:activeView]; 2125 CGPoint locationInActiveView = [touch locationInView:activeView];
2134 NSUInteger cardIndex = [self indexOfCardAtPoint:locationInActiveView]; 2126 NSUInteger cardIndex = [self indexOfCardAtPoint:locationInActiveView];
2135 // |_swipeDismissesCardRecognizer| is interested only in touches that are 2127 // |_swipeDismissesCardRecognizer| is interested only in touches that are
2136 // on cards in the active set. 2128 // on cards in the active set.
2137 if (cardIndex == NSNotFound) 2129 if (cardIndex == NSNotFound)
2138 return NO; 2130 return NO;
2139 DCHECK(cardIndex < [[_activeCardSet cards] count]); 2131 DCHECK(cardIndex < [[_activeCardSet cards] count]);
2140 card = [[_activeCardSet cards] objectAtIndex:cardIndex]; 2132 card = [[_activeCardSet cards] objectAtIndex:cardIndex];
2141 // This case seems like it should never happen, but it can be easily 2133 // This case seems like it should never happen, but it can be easily
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2173 otherGestureRecognizer == _scrollGestureRecognizer); 2165 otherGestureRecognizer == _scrollGestureRecognizer);
2174 if (pinchRecognizerInvolved && scrollRecognizerInvolved) 2166 if (pinchRecognizerInvolved && scrollRecognizerInvolved)
2175 return YES; 2167 return YES;
2176 2168
2177 // Swiping must be allowed to recognize simultaneously with the recognizer of 2169 // Swiping must be allowed to recognize simultaneously with the recognizer of
2178 // long presses that turn ambiguous swipes into card dismissals. 2170 // long presses that turn ambiguous swipes into card dismissals.
2179 BOOL swipeRecognizerInvolved = 2171 BOOL swipeRecognizerInvolved =
2180 (gestureRecognizer == _swipeGestureRecognizer || 2172 (gestureRecognizer == _swipeGestureRecognizer ||
2181 otherGestureRecognizer == _swipeGestureRecognizer); 2173 otherGestureRecognizer == _swipeGestureRecognizer);
2182 BOOL swipeDismissesCardRecognizerInvolved = 2174 BOOL swipeDismissesCardRecognizerInvolved =
2183 (gestureRecognizer == _swipeDismissesCardRecognizer.get() || 2175 (gestureRecognizer == _swipeDismissesCardRecognizer ||
2184 otherGestureRecognizer == _swipeDismissesCardRecognizer.get()); 2176 otherGestureRecognizer == _swipeDismissesCardRecognizer);
2185 if (swipeRecognizerInvolved && swipeDismissesCardRecognizerInvolved) 2177 if (swipeRecognizerInvolved && swipeDismissesCardRecognizerInvolved)
2186 return YES; 2178 return YES;
2187 2179
2188 // The swipe-triggers-card-dismissal long press recognizer must be allowed to 2180 // The swipe-triggers-card-dismissal long press recognizer must be allowed to
2189 // recognize simultaneously with the cards' long press recognizers that 2181 // recognize simultaneously with the cards' long press recognizers that
2190 // trigger show-more-of-card. 2182 // trigger show-more-of-card.
2191 BOOL longPressRecognizerInvolved = 2183 BOOL longPressRecognizerInvolved =
2192 ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]] || 2184 ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]] ||
2193 [otherGestureRecognizer 2185 [otherGestureRecognizer
2194 isKindOfClass:[UILongPressGestureRecognizer class]]); 2186 isKindOfClass:[UILongPressGestureRecognizer class]]);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2237 else 2229 else
2238 DLOG(ERROR) << "Closed card at an index out of range of the tab model"; 2230 DLOG(ERROR) << "Closed card at an index out of range of the tab model";
2239 [_activeCardSet removeCardAtIndex:tabIndex]; 2231 [_activeCardSet removeCardAtIndex:tabIndex];
2240 } 2232 }
2241 } 2233 }
2242 2234
2243 - (void)handleLongPressFrom:(UIGestureRecognizer*)recognizer { 2235 - (void)handleLongPressFrom:(UIGestureRecognizer*)recognizer {
2244 DCHECK(!_isBeingDismissed); 2236 DCHECK(!_isBeingDismissed);
2245 DCHECK(_isActive); 2237 DCHECK(_isActive);
2246 2238
2247 if (recognizer == _swipeDismissesCardRecognizer.get()) 2239 if (recognizer == _swipeDismissesCardRecognizer)
2248 return; 2240 return;
2249 2241
2250 UIGestureRecognizerState state = [recognizer state]; 2242 UIGestureRecognizerState state = [recognizer state];
2251 if (state != UIGestureRecognizerStateBegan) 2243 if (state != UIGestureRecognizerStateBegan)
2252 return; 2244 return;
2253 if ([recognizer numberOfTouches] == 0) 2245 if ([recognizer numberOfTouches] == 0)
2254 return; 2246 return;
2255 2247
2256 // Don't take action on a card that is in the inactive stack, collapsed, or 2248 // Don't take action on a card that is in the inactive stack, collapsed, or
2257 // the last card. 2249 // the last card.
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
2412 [_gestureStateTracker setPreviousFirstPinchOffset:firstOffset]; 2404 [_gestureStateTracker setPreviousFirstPinchOffset:firstOffset];
2413 [_gestureStateTracker setPreviousSecondPinchOffset:secondOffset]; 2405 [_gestureStateTracker setPreviousSecondPinchOffset:secondOffset];
2414 } 2406 }
2415 2407
2416 - (void)handleTapFrom:(UITapGestureRecognizer*)recognizer { 2408 - (void)handleTapFrom:(UITapGestureRecognizer*)recognizer {
2417 DCHECK(!_isBeingDismissed); 2409 DCHECK(!_isBeingDismissed);
2418 DCHECK(_isActive); 2410 DCHECK(_isActive);
2419 if (recognizer.state != UIGestureRecognizerStateEnded) 2411 if (recognizer.state != UIGestureRecognizerStateEnded)
2420 return; 2412 return;
2421 2413
2422 if (recognizer == _modeSwitchRecognizer.get()) { 2414 if (recognizer == _modeSwitchRecognizer) {
2423 DCHECK(CGRectContainsPoint([self inactiveDeckRegion], 2415 DCHECK(CGRectContainsPoint([self inactiveDeckRegion],
2424 [recognizer locationInView:_scrollView])); 2416 [recognizer locationInView:_scrollView]));
2425 [self setActiveCardSet:[self inactiveCardSet]]; 2417 [self setActiveCardSet:[self inactiveCardSet]];
2426 return; 2418 return;
2427 } 2419 }
2428 2420
2429 CardView* cardView = (CardView*)recognizer.view; 2421 CardView* cardView = (CardView*)recognizer.view;
2430 UIView* activeView = _activeCardSet.displayView; 2422 UIView* activeView = _activeCardSet.displayView;
2431 if ([cardView superview] != activeView) 2423 if ([cardView superview] != activeView)
2432 return; 2424 return;
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
2652 // Fade the card to become transparent at the conclusion of the animation, 2644 // Fade the card to become transparent at the conclusion of the animation,
2653 // and the card's tab to become transparent at the time that the card 2645 // and the card's tab to become transparent at the time that the card
2654 // reaches the threshold for being dismissed. 2646 // reaches the threshold for being dismissed.
2655 [card view].alpha = 1 - fractionOfAnimationBreadth; 2647 [card view].alpha = 1 - fractionOfAnimationBreadth;
2656 } else { 2648 } else {
2657 if (gesture.state == UIGestureRecognizerStateEnded && 2649 if (gesture.state == UIGestureRecognizerStateEnded &&
2658 [self swipeShouldTriggerAction:position]) { 2650 [self swipeShouldTriggerAction:position]) {
2659 // Track card if animation should dismiss in reverse from the norm of 2651 // Track card if animation should dismiss in reverse from the norm of
2660 // clockwise in portrait, counter-clockwise in landscape. 2652 // clockwise in portrait, counter-clockwise in landscape.
2661 if ((isPortrait && !clockwise) || (!isPortrait && clockwise)) 2653 if ((isPortrait && !clockwise) || (!isPortrait && clockwise))
2662 _reverseDismissCard.reset([card retain]); 2654 _reverseDismissCard = card;
2663 // This will trigger the completion of the close card animation. 2655 // This will trigger the completion of the close card animation.
2664 [self closeTab:card.view]; 2656 [self closeTab:card.view];
2665 } else { 2657 } else {
2666 // Animate back to starting position. 2658 // Animate back to starting position.
2667 [UIView animateWithDuration:kDefaultAnimationDuration 2659 [UIView animateWithDuration:kDefaultAnimationDuration
2668 delay:0 2660 delay:0
2669 options:UIViewAnimationCurveEaseOut 2661 options:UIViewAnimationCurveEaseOut
2670 animations:^{ 2662 animations:^{
2671 [card view].alpha = 1; 2663 [card view].alpha = 1;
2672 [[card view] setTabOpacity:1]; 2664 [[card view] setTabOpacity:1];
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2722 case IDC_TOGGLE_TAB_SWITCHER: 2714 case IDC_TOGGLE_TAB_SWITCHER:
2723 [self dismissWithSelectedTabAnimation]; 2715 [self dismissWithSelectedTabAnimation];
2724 break; 2716 break;
2725 default: 2717 default:
2726 [super chromeExecuteCommand:sender]; 2718 [super chromeExecuteCommand:sender];
2727 break; 2719 break;
2728 } 2720 }
2729 } 2721 }
2730 2722
2731 - (void)showToolsMenuPopup { 2723 - (void)showToolsMenuPopup {
2732 base::scoped_nsobject<ToolsMenuConfiguration> configuration( 2724 ToolsMenuConfiguration* configuration =
2733 [[ToolsMenuConfiguration alloc] initWithDisplayView:[self view]]); 2725 [[ToolsMenuConfiguration alloc] initWithDisplayView:[self view]];
2734 [configuration setInTabSwitcher:YES]; 2726 [configuration setInTabSwitcher:YES];
2735 // When checking for the existence of tabs, catch the case where the main set 2727 // When checking for the existence of tabs, catch the case where the main set
2736 // is both active and empty, but the incognito set has some cards. 2728 // is both active and empty, but the incognito set has some cards.
2737 if (([[_activeCardSet cards] count] == 0) && 2729 if (([[_activeCardSet cards] count] == 0) &&
2738 (_activeCardSet == _otrCardSet || [[_otrCardSet cards] count] == 0)) 2730 (_activeCardSet == _otrCardSet || [[_otrCardSet cards] count] == 0))
2739 [configuration setNoOpenedTabs:YES]; 2731 [configuration setNoOpenedTabs:YES];
2740 if (_activeCardSet == _otrCardSet) 2732 if (_activeCardSet == _otrCardSet)
2741 [configuration setInIncognito:YES]; 2733 [configuration setInIncognito:YES];
2742 [_toolbarController showToolsMenuPopupWithConfiguration:configuration]; 2734 [_toolbarController showToolsMenuPopupWithConfiguration:configuration];
2743 } 2735 }
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
2912 BOOL isPortrait = 2904 BOOL isPortrait =
2913 UIInterfaceOrientationIsPortrait(_lastInterfaceOrientation); 2905 UIInterfaceOrientationIsPortrait(_lastInterfaceOrientation);
2914 BOOL clockwise = isPortrait ? _reverseDismissCard != removedCard 2906 BOOL clockwise = isPortrait ? _reverseDismissCard != removedCard
2915 : _reverseDismissCard == removedCard; 2907 : _reverseDismissCard == removedCard;
2916 [self animateOutCardView:removedCard.view 2908 [self animateOutCardView:removedCard.view
2917 delay:0 2909 delay:0
2918 clockwise:clockwise 2910 clockwise:clockwise
2919 completion:nil]; 2911 completion:nil];
2920 // Reset |reverseDismissCard| if that card was the one dismissed. 2912 // Reset |reverseDismissCard| if that card was the one dismissed.
2921 if ((isPortrait && !clockwise) || (!isPortrait && clockwise)) 2913 if ((isPortrait && !clockwise) || (!isPortrait && clockwise))
2922 _reverseDismissCard.reset(); 2914 _reverseDismissCard = nil;
2923 } 2915 }
2924 // Nil out the the closing card after all closing animations have finished. 2916 // Nil out the the closing card after all closing animations have finished.
2925 [CATransaction begin]; 2917 [CATransaction begin];
2926 [CATransaction setCompletionBlock:^{ 2918 [CATransaction setCompletionBlock:^{
2927 cardSet.closingCard = nil; 2919 cardSet.closingCard = nil;
2928 }]; 2920 }];
2929 // If the last incognito card closes, switch back to just the main set. 2921 // If the last incognito card closes, switch back to just the main set.
2930 if ([cardSet.cards count] == 0 && cardSet == _otrCardSet.get()) { 2922 if ([cardSet.cards count] == 0 && cardSet == _otrCardSet) {
2931 [self displayMainCardSetOnly]; 2923 [self displayMainCardSetOnly];
2932 } else { 2924 } else {
2933 NSUInteger numCards = [[cardSet cards] count]; 2925 NSUInteger numCards = [[cardSet cards] count];
2934 if (numCards == 0) { 2926 if (numCards == 0) {
2935 // Commit the transaction before early return. 2927 // Commit the transaction before early return.
2936 [CATransaction commit]; 2928 [CATransaction commit];
2937 return; 2929 return;
2938 } 2930 }
2939 if (index == numCards) { 2931 if (index == numCards) {
2940 // If the card that was closed was the last card and was in the start 2932 // If the card that was closed was the last card and was in the start
(...skipping 28 matching lines...) Expand all
2969 } 2961 }
2970 [CATransaction commit]; 2962 [CATransaction commit];
2971 } 2963 }
2972 2964
2973 - (void)cardSet:(CardSet*)cardSet displayedCard:(StackCard*)card { 2965 - (void)cardSet:(CardSet*)cardSet displayedCard:(StackCard*)card {
2974 // Add gesture recognizers to the card. 2966 // Add gesture recognizers to the card.
2975 [card.view addCardCloseTarget:self action:@selector(closeTab:)]; 2967 [card.view addCardCloseTarget:self action:@selector(closeTab:)];
2976 [card.view addAccessibilityTarget:self 2968 [card.view addAccessibilityTarget:self
2977 action:@selector(accessibilityFocusedOnElement:)]; 2969 action:@selector(accessibilityFocusedOnElement:)];
2978 2970
2979 base::scoped_nsobject<UIGestureRecognizer> tapRecognizer([ 2971 UIGestureRecognizer* tapRecognizer =
2980 [UITapGestureRecognizer alloc] initWithTarget:self 2972 [[UITapGestureRecognizer alloc] initWithTarget:self
2981 action:@selector(handleTapFrom:)]); 2973 action:@selector(handleTapFrom:)];
2982 tapRecognizer.get().delegate = self; 2974 tapRecognizer.delegate = self;
2983 [card.view addGestureRecognizer:tapRecognizer.get()]; 2975 [card.view addGestureRecognizer:tapRecognizer];
2984 2976
2985 base::scoped_nsobject<UIGestureRecognizer> longPressRecognizer( 2977 UIGestureRecognizer* longPressRecognizer =
2986 [[UILongPressGestureRecognizer alloc] 2978 [[UILongPressGestureRecognizer alloc]
2987 initWithTarget:self 2979 initWithTarget:self
2988 action:@selector(handleLongPressFrom:)]); 2980 action:@selector(handleLongPressFrom:)];
2989 longPressRecognizer.get().delegate = self; 2981 longPressRecognizer.delegate = self;
2990 [card.view addGestureRecognizer:longPressRecognizer.get()]; 2982 [card.view addGestureRecognizer:longPressRecognizer];
2991 } 2983 }
2992 2984
2993 - (void)cardSetRecreatedCards:(CardSet*)cardSet { 2985 - (void)cardSetRecreatedCards:(CardSet*)cardSet {
2994 // Remove the old card views, if any, then start loading the new ones. 2986 // Remove the old card views, if any, then start loading the new ones.
2995 for (UIView* card in [cardSet.displayView subviews]) { 2987 for (UIView* card in [cardSet.displayView subviews]) {
2996 [card removeFromSuperview]; 2988 [card removeFromSuperview];
2997 } 2989 }
2998 [self preloadCardViewsAsynchronously]; 2990 [self preloadCardViewsAsynchronously];
2999 } 2991 }
3000 2992
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
3466 // the cards out starting with that card. 3458 // the cards out starting with that card.
3467 [_activeCardSet fanOutCardsWithStartIndex:index]; 3459 [_activeCardSet fanOutCardsWithStartIndex:index];
3468 [card.view postAccessibilityNotification]; 3460 [card.view postAccessibilityNotification];
3469 [self postOpenTabsAccessibilityNotification]; 3461 [self postOpenTabsAccessibilityNotification];
3470 } 3462 }
3471 } 3463 }
3472 3464
3473 #pragma mark - UIResponder 3465 #pragma mark - UIResponder
3474 3466
3475 - (NSArray*)keyCommands { 3467 - (NSArray*)keyCommands {
3476 base::WeakNSObject<StackViewController> weakSelf(self); 3468 __weak StackViewController* weakSelf = self;
3477 3469
3478 // Block to execute a command from the |tag|. 3470 // Block to execute a command from the |tag|.
3479 base::mac::ScopedBlock<void (^)(NSInteger)> execute( 3471 void (^execute)(NSInteger) = ^(NSInteger tag) {
3480 ^(NSInteger tag) { 3472 [weakSelf chromeExecuteCommand:[GenericChromeCommand commandWithTag:tag]];
3481 [weakSelf 3473 };
3482 chromeExecuteCommand:[GenericChromeCommand commandWithTag:tag]];
3483 },
3484 base::scoped_policy::RETAIN);
3485 3474
3486 return @[ 3475 return @[
3487 [UIKeyCommand cr_keyCommandWithInput:@"t" 3476 [UIKeyCommand cr_keyCommandWithInput:@"t"
3488 modifierFlags:UIKeyModifierCommand 3477 modifierFlags:UIKeyModifierCommand
3489 title:l10n_util::GetNSStringWithFixup( 3478 title:l10n_util::GetNSStringWithFixup(
3490 IDS_IOS_TOOLS_MENU_NEW_TAB) 3479 IDS_IOS_TOOLS_MENU_NEW_TAB)
3491 action:^{ 3480 action:^{
3492 if ([weakSelf isCurrentSetIncognito]) 3481 if ([weakSelf isCurrentSetIncognito])
3493 execute.get()(IDC_NEW_INCOGNITO_TAB); 3482 execute(IDC_NEW_INCOGNITO_TAB);
3494 else 3483 else
3495 execute.get()(IDC_NEW_TAB); 3484 execute(IDC_NEW_TAB);
3496 }], 3485 }],
3497 [UIKeyCommand 3486 [UIKeyCommand
3498 cr_keyCommandWithInput:@"n" 3487 cr_keyCommandWithInput:@"n"
3499 modifierFlags:UIKeyModifierCommand | UIKeyModifierShift 3488 modifierFlags:UIKeyModifierCommand | UIKeyModifierShift
3500 title:l10n_util::GetNSStringWithFixup( 3489 title:l10n_util::GetNSStringWithFixup(
3501 IDS_IOS_TOOLS_MENU_NEW_INCOGNITO_TAB) 3490 IDS_IOS_TOOLS_MENU_NEW_INCOGNITO_TAB)
3502 action:^{ 3491 action:^{
3503 execute.get()(IDC_NEW_INCOGNITO_TAB); 3492 execute(IDC_NEW_INCOGNITO_TAB);
3504 }], 3493 }],
3505 [UIKeyCommand cr_keyCommandWithInput:@"n" 3494 [UIKeyCommand cr_keyCommandWithInput:@"n"
3506 modifierFlags:UIKeyModifierCommand 3495 modifierFlags:UIKeyModifierCommand
3507 title:nil 3496 title:nil
3508 action:^{ 3497 action:^{
3509 if ([weakSelf isCurrentSetIncognito]) 3498 if ([weakSelf isCurrentSetIncognito])
3510 execute.get()(IDC_NEW_INCOGNITO_TAB); 3499 execute(IDC_NEW_INCOGNITO_TAB);
3511 else 3500 else
3512 execute.get()(IDC_NEW_TAB); 3501 execute(IDC_NEW_TAB);
3513 }], 3502 }],
3514 ]; 3503 ];
3515 } 3504 }
3516 3505
3517 @end 3506 @end
3518 3507
3519 @implementation StackViewController (Testing) 3508 @implementation StackViewController (Testing)
3520 3509
3521 - (UIScrollView*)scrollView { 3510 - (UIScrollView*)scrollView {
3522 return _scrollView.get(); 3511 return _scrollView;
3523 } 3512 }
3524 3513
3525 @end 3514 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698