OLD | NEW |
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/browser_view_controller.h" | 5 #import "ios/chrome/browser/ui/browser_view_controller.h" |
6 | 6 |
7 #import <AssetsLibrary/AssetsLibrary.h> | 7 #import <AssetsLibrary/AssetsLibrary.h> |
8 #import <MobileCoreServices/MobileCoreServices.h> | 8 #import <MobileCoreServices/MobileCoreServices.h> |
9 #import <PassKit/PassKit.h> | 9 #import <PassKit/PassKit.h> |
10 #import <Photos/Photos.h> | 10 #import <Photos/Photos.h> |
(...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
727 - (void)updateVoiceSearchBarVisibilityAnimated:(BOOL)animated; | 727 - (void)updateVoiceSearchBarVisibilityAnimated:(BOOL)animated; |
728 // The LogoAnimationControllerOwner to be used for the next logo transition | 728 // The LogoAnimationControllerOwner to be used for the next logo transition |
729 // animation. | 729 // animation. |
730 - (id<LogoAnimationControllerOwner>)currentLogoAnimationControllerOwner; | 730 - (id<LogoAnimationControllerOwner>)currentLogoAnimationControllerOwner; |
731 // Returns the header views, all the chrome on top of the page, including the | 731 // Returns the header views, all the chrome on top of the page, including the |
732 // ones that cannot be scrolled off screen by full screen. | 732 // ones that cannot be scrolled off screen by full screen. |
733 - (const std::vector<HeaderDefinition>)headerViews; | 733 - (const std::vector<HeaderDefinition>)headerViews; |
734 // Returns the footer view if one exists (e.g. the voice search bar). | 734 // Returns the footer view if one exists (e.g. the voice search bar). |
735 - (UIView*)footerView; | 735 - (UIView*)footerView; |
736 // Returns the height of the header view for the tab model's current tab. | 736 // Returns the height of the header view for the tab model's current tab. |
737 - (CGFloat)headerHeight; | 737 - (CGFloat)headerHeightForCurrentTab; |
738 // Returns the height of the header view for |tab|. | 738 // Returns the height of the header view for |tab|. |
739 - (CGFloat)headerHeightForTab:(Tab*)tab; | 739 - (CGFloat)headerHeightForTab:(Tab*)tab; |
740 // Sets the frame for the headers. | 740 // Sets the frame for the headers. |
741 - (void)setFramesForHeaders:(const std::vector<HeaderDefinition>)headers | 741 - (void)setFramesForHeaders:(const std::vector<HeaderDefinition>)headers |
742 atOffset:(CGFloat)headerOffset; | 742 atOffset:(CGFloat)headerOffset; |
743 // Returns the y coordinate for the footer's frame when animating the footer | 743 // Returns the y coordinate for the footer's frame when animating the footer |
744 // in/out of fullscreen. | 744 // in/out of fullscreen. |
745 - (CGFloat)footerYForHeaderOffset:(CGFloat)headerOffset; | 745 - (CGFloat)footerYForHeaderOffset:(CGFloat)headerOffset; |
746 // Called when the animation for setting the header view's offset is finished. | 746 // Called when the animation for setting the header view's offset is finished. |
747 // |completed| should indicate if the animation finished completely or was | 747 // |completed| should indicate if the animation finished completely or was |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1108 | 1108 |
1109 - (void)setViewVisible:(BOOL)viewVisible { | 1109 - (void)setViewVisible:(BOOL)viewVisible { |
1110 if (_viewVisible == viewVisible) | 1110 if (_viewVisible == viewVisible) |
1111 return; | 1111 return; |
1112 _viewVisible = viewVisible; | 1112 _viewVisible = viewVisible; |
1113 self.visible = viewVisible; | 1113 self.visible = viewVisible; |
1114 [self updateDialogPresenterActiveState]; | 1114 [self updateDialogPresenterActiveState]; |
1115 } | 1115 } |
1116 | 1116 |
1117 - (BOOL)isToolbarOnScreen { | 1117 - (BOOL)isToolbarOnScreen { |
1118 return [self headerHeight] - [self currentHeaderOffset] > 0; | 1118 return [self headerHeightForCurrentTab] - [self currentHeaderOffset] > 0; |
1119 } | 1119 } |
1120 | 1120 |
1121 - (BOOL)isInNewTabAnimation { | 1121 - (BOOL)isInNewTabAnimation { |
1122 return _inNewTabAnimation; | 1122 return _inNewTabAnimation; |
1123 } | 1123 } |
1124 | 1124 |
1125 - (BOOL)shouldShowVoiceSearchBar { | 1125 - (BOOL)shouldShowVoiceSearchBar { |
1126 // On iPads, the voice search bar should only be shown for regular horizontal | 1126 // On iPads, the voice search bar should only be shown for regular horizontal |
1127 // size class configurations. It should always be shown for voice search | 1127 // size class configurations. It should always be shown for voice search |
1128 // results Tabs on iPhones, including configurations with regular horizontal | 1128 // results Tabs on iPhones, including configurations with regular horizontal |
(...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1823 minY += CGRectGetHeight(toolbarFrame); | 1823 minY += CGRectGetHeight(toolbarFrame); |
1824 | 1824 |
1825 // Account for the toolbar's drop shadow. The toolbar overlaps with the web | 1825 // Account for the toolbar's drop shadow. The toolbar overlaps with the web |
1826 // content slightly. | 1826 // content slightly. |
1827 minY -= [ToolbarController toolbarDropShadowHeight]; | 1827 minY -= [ToolbarController toolbarDropShadowHeight]; |
1828 | 1828 |
1829 // Adjust the content area to be under the toolbar, for fullscreen or below | 1829 // Adjust the content area to be under the toolbar, for fullscreen or below |
1830 // the toolbar is not fullscreen. | 1830 // the toolbar is not fullscreen. |
1831 CGRect contentFrame = [_contentArea frame]; | 1831 CGRect contentFrame = [_contentArea frame]; |
1832 CGFloat marginWithHeader = StatusBarHeight(); | 1832 CGFloat marginWithHeader = StatusBarHeight(); |
1833 CGFloat overlap = [self headerHeight] != 0 ? marginWithHeader : minY; | 1833 CGFloat overlap = |
| 1834 [self headerHeightForCurrentTab] != 0 ? marginWithHeader : minY; |
1834 contentFrame.size.height = CGRectGetMaxY(contentFrame) - overlap; | 1835 contentFrame.size.height = CGRectGetMaxY(contentFrame) - overlap; |
1835 contentFrame.origin.y = overlap; | 1836 contentFrame.origin.y = overlap; |
1836 [_contentArea setFrame:contentFrame]; | 1837 [_contentArea setFrame:contentFrame]; |
1837 | 1838 |
1838 // Adjust the infobar container to be either at the bottom of the screen | 1839 // Adjust the infobar container to be either at the bottom of the screen |
1839 // (iPhone) or on the lower toolbar edge (iPad). | 1840 // (iPhone) or on the lower toolbar edge (iPad). |
1840 CGRect infoBarFrame = contentFrame; | 1841 CGRect infoBarFrame = contentFrame; |
1841 infoBarFrame.origin.y = CGRectGetMaxY(contentFrame); | 1842 infoBarFrame.origin.y = CGRectGetMaxY(contentFrame); |
1842 infoBarFrame.size.height = 0; | 1843 infoBarFrame.size.height = 0; |
1843 [infoBarContainerView setFrame:infoBarFrame]; | 1844 [infoBarContainerView setFrame:infoBarFrame]; |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2077 - (UIImageView*)pageFullScreenOpenCloseAnimationView { | 2078 - (UIImageView*)pageFullScreenOpenCloseAnimationView { |
2078 CGRect viewBounds, remainder; | 2079 CGRect viewBounds, remainder; |
2079 CGRectDivide(self.view.bounds, &remainder, &viewBounds, StatusBarHeight(), | 2080 CGRectDivide(self.view.bounds, &remainder, &viewBounds, StatusBarHeight(), |
2080 CGRectMinYEdge); | 2081 CGRectMinYEdge); |
2081 return [[[UIImageView alloc] initWithFrame:viewBounds] autorelease]; | 2082 return [[[UIImageView alloc] initWithFrame:viewBounds] autorelease]; |
2082 } | 2083 } |
2083 | 2084 |
2084 - (UIImageView*)pageOpenCloseAnimationView { | 2085 - (UIImageView*)pageOpenCloseAnimationView { |
2085 CGRect frame = [_contentArea bounds]; | 2086 CGRect frame = [_contentArea bounds]; |
2086 | 2087 |
2087 frame.size.height = frame.size.height - [self headerHeight]; | 2088 frame.size.height = frame.size.height - [self headerHeightForCurrentTab]; |
2088 frame.origin.y = [self headerHeight]; | 2089 frame.origin.y = [self headerHeightForCurrentTab]; |
2089 | 2090 |
2090 UIImageView* pageView = | 2091 UIImageView* pageView = |
2091 [[[UIImageView alloc] initWithFrame:frame] autorelease]; | 2092 [[[UIImageView alloc] initWithFrame:frame] autorelease]; |
2092 CGPoint center = CGPointMake(CGRectGetMidX(frame), CGRectGetMidY(frame)); | 2093 CGPoint center = CGPointMake(CGRectGetMidX(frame), CGRectGetMidY(frame)); |
2093 pageView.center = center; | 2094 pageView.center = center; |
2094 | 2095 |
2095 pageView.backgroundColor = [UIColor whiteColor]; | 2096 pageView.backgroundColor = [UIColor whiteColor]; |
2096 return pageView; | 2097 return pageView; |
2097 } | 2098 } |
2098 | 2099 |
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2577 results.push_back(header); | 2578 results.push_back(header); |
2578 } | 2579 } |
2579 } | 2580 } |
2580 return results; | 2581 return results; |
2581 } | 2582 } |
2582 | 2583 |
2583 - (UIView*)footerView { | 2584 - (UIView*)footerView { |
2584 return _voiceSearchBar; | 2585 return _voiceSearchBar; |
2585 } | 2586 } |
2586 | 2587 |
2587 - (CGFloat)headerHeight { | 2588 - (CGFloat)headerHeightForCurrentTab { |
2588 return [self headerHeightForTab:[_model currentTab]]; | 2589 return [self headerHeightForTab:[_model currentTab]]; |
2589 } | 2590 } |
2590 | 2591 |
2591 - (CGFloat)headerHeightForTab:(Tab*)tab { | 2592 - (CGFloat)headerHeightForTab:(Tab*)tab { |
2592 id nativeController = [self nativeControllerForTab:tab]; | 2593 id nativeController = [self nativeControllerForTab:tab]; |
2593 if ([nativeController conformsToProtocol:@protocol(ToolbarOwner)] && | 2594 if ([nativeController conformsToProtocol:@protocol(ToolbarOwner)] && |
2594 [nativeController respondsToSelector:@selector(toolbarHeight)] && | 2595 [nativeController respondsToSelector:@selector(toolbarHeight)] && |
2595 [nativeController toolbarHeight] > 0.0 && !IsIPadIdiom()) { | 2596 [nativeController toolbarHeight] > 0.0 && !IsIPadIdiom()) { |
2596 // On iPhone, don't add any header height for ToolbarOwner native | 2597 // On iPhone, don't add any header height for ToolbarOwner native |
2597 // controllers when they're displaying their own toolbar. | 2598 // controllers when they're displaying their own toolbar. |
(...skipping 16 matching lines...) Expand all Loading... |
2614 - (BOOL)isTabWithIDCurrent:(NSString*)sessionID { | 2615 - (BOOL)isTabWithIDCurrent:(NSString*)sessionID { |
2615 return self.visible && | 2616 return self.visible && |
2616 [sessionID isEqualToString:[[_model currentTab] currentSessionID]]; | 2617 [sessionID isEqualToString:[[_model currentTab] currentSessionID]]; |
2617 } | 2618 } |
2618 | 2619 |
2619 - (CGFloat)currentHeaderOffset { | 2620 - (CGFloat)currentHeaderOffset { |
2620 const std::vector<HeaderDefinition> headers = [self headerViews]; | 2621 const std::vector<HeaderDefinition> headers = [self headerViews]; |
2621 if (!headers.size()) | 2622 if (!headers.size()) |
2622 return 0.0; | 2623 return 0.0; |
2623 | 2624 |
2624 // Prerender tab does not have a toolbar, return |headerHeight| as promised by | 2625 // Prerender tab does not have a toolbar, return |headerHeightForCurrentTab| |
| 2626 // as promised by |
2625 // API documentation. | 2627 // API documentation. |
2626 if ([[[self tabModel] currentTab] isPrerenderTab]) | 2628 if ([[[self tabModel] currentTab] isPrerenderTab]) |
2627 return [self headerHeight]; | 2629 return [self headerHeightForCurrentTab]; |
2628 | 2630 |
2629 UIView* topHeader = headers[0].view; | 2631 UIView* topHeader = headers[0].view; |
2630 return -(topHeader.frame.origin.y - [self headerOffset]); | 2632 return -(topHeader.frame.origin.y - [self headerOffset]); |
2631 } | 2633 } |
2632 | 2634 |
2633 - (CGFloat)footerYForHeaderOffset:(CGFloat)headerOffset { | 2635 - (CGFloat)footerYForHeaderOffset:(CGFloat)headerOffset { |
2634 UIView* footer = [self footerView]; | 2636 UIView* footer = [self footerView]; |
2635 CGFloat headerHeight = [self headerHeight]; | 2637 CGFloat headerHeight = [self headerHeightForCurrentTab]; |
2636 if (!footer || headerHeight == 0) | 2638 if (!footer || headerHeight == 0) |
2637 return 0.0; | 2639 return 0.0; |
2638 | 2640 |
2639 CGFloat footerHeight = CGRectGetHeight(footer.frame); | 2641 CGFloat footerHeight = CGRectGetHeight(footer.frame); |
2640 CGFloat offset = headerOffset * footerHeight / headerHeight; | 2642 CGFloat offset = headerOffset * footerHeight / headerHeight; |
2641 return std::ceil(CGRectGetHeight(self.view.bounds) - footerHeight + offset); | 2643 return std::ceil(CGRectGetHeight(self.view.bounds) - footerHeight + offset); |
2642 } | 2644 } |
2643 | 2645 |
2644 - (void)fullScreenController:(FullScreenController*)controller | 2646 - (void)fullScreenController:(FullScreenController*)controller |
2645 headerAnimationCompleted:(BOOL)completed | 2647 headerAnimationCompleted:(BOOL)completed |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2791 return [_toolbarController view]; | 2793 return [_toolbarController view]; |
2792 } | 2794 } |
2793 | 2795 |
2794 - (UIView*)toolbarSnapshotView { | 2796 - (UIView*)toolbarSnapshotView { |
2795 return [[_toolbarController view] snapshotViewAfterScreenUpdates:NO]; | 2797 return [[_toolbarController view] snapshotViewAfterScreenUpdates:NO]; |
2796 } | 2798 } |
2797 | 2799 |
2798 - (CGFloat)overscrollActionsControllerHeaderInset: | 2800 - (CGFloat)overscrollActionsControllerHeaderInset: |
2799 (OverscrollActionsController*)controller { | 2801 (OverscrollActionsController*)controller { |
2800 if (controller == [[[self tabModel] currentTab] overscrollActionsController]) | 2802 if (controller == [[[self tabModel] currentTab] overscrollActionsController]) |
2801 return [self headerHeight]; | 2803 return [self headerHeightForCurrentTab]; |
2802 else | 2804 else |
2803 return 0; | 2805 return 0; |
2804 } | 2806 } |
2805 | 2807 |
2806 - (CGFloat)overscrollHeaderHeight { | 2808 - (CGFloat)overscrollHeaderHeight { |
2807 return [self headerHeight] + StatusBarHeight(); | 2809 return [self headerHeightForCurrentTab] + StatusBarHeight(); |
2808 } | 2810 } |
2809 | 2811 |
2810 #pragma mark - TabSnapshottingDelegate methods. | 2812 #pragma mark - TabSnapshottingDelegate methods. |
2811 | 2813 |
2812 - (CGRect)snapshotContentAreaForTab:(Tab*)tab { | 2814 - (CGRect)snapshotContentAreaForTab:(Tab*)tab { |
2813 CGRect pageContentArea = _contentArea.bounds; | 2815 CGRect pageContentArea = _contentArea.bounds; |
2814 if ([_model webUsageEnabled]) | 2816 if ([_model webUsageEnabled]) |
2815 pageContentArea = tab.view.bounds; | 2817 pageContentArea = tab.view.bounds; |
2816 CGFloat headerHeight = [self headerHeightForTab:tab]; | 2818 CGFloat headerHeight = [self headerHeightForTab:tab]; |
2817 id nativeController = [self nativeControllerForTab:tab]; | 2819 id nativeController = [self nativeControllerForTab:tab]; |
(...skipping 858 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3676 [[_model currentTab].webController executeUserJavaScript:script | 3678 [[_model currentTab].webController executeUserJavaScript:script |
3677 completionHandler:nil]; | 3679 completionHandler:nil]; |
3678 } | 3680 } |
3679 | 3681 |
3680 - (web::WebState*)currentWebState { | 3682 - (web::WebState*)currentWebState { |
3681 return [[_model currentTab] webState]; | 3683 return [[_model currentTab] webState]; |
3682 } | 3684 } |
3683 | 3685 |
3684 // This is called from within an animation block. | 3686 // This is called from within an animation block. |
3685 - (void)toolbarHeightChanged { | 3687 - (void)toolbarHeightChanged { |
3686 if ([self headerHeight] != 0) { | 3688 if ([self headerHeightForCurrentTab] != 0) { |
3687 // Ensure full screen height is updated. | 3689 // Ensure full screen height is updated. |
3688 Tab* currentTab = [_model currentTab]; | 3690 Tab* currentTab = [_model currentTab]; |
3689 BOOL visible = self.isToolbarOnScreen; | 3691 BOOL visible = self.isToolbarOnScreen; |
3690 [currentTab updateFullscreenWithToolbarVisible:visible]; | 3692 [currentTab updateFullscreenWithToolbarVisible:visible]; |
3691 } | 3693 } |
3692 } | 3694 } |
3693 | 3695 |
3694 // Load a new URL on a new page/tab. | 3696 // Load a new URL on a new page/tab. |
3695 - (void)webPageOrderedOpen:(const GURL&)URL | 3697 - (void)webPageOrderedOpen:(const GURL&)URL |
3696 referrer:(const web::Referrer&)referrer | 3698 referrer:(const web::Referrer&)referrer |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3832 } | 3834 } |
3833 | 3835 |
3834 - (void)willUpdateToolbarSnapshot { | 3836 - (void)willUpdateToolbarSnapshot { |
3835 [[_model currentTab].overscrollActionsController clear]; | 3837 [[_model currentTab].overscrollActionsController clear]; |
3836 } | 3838 } |
3837 | 3839 |
3838 - (CardView*)addCardViewInFullscreen:(BOOL)fullScreen { | 3840 - (CardView*)addCardViewInFullscreen:(BOOL)fullScreen { |
3839 CGRect frame = [_contentArea frame]; | 3841 CGRect frame = [_contentArea frame]; |
3840 if (!fullScreen) { | 3842 if (!fullScreen) { |
3841 // Changing the origin here is unnecessary, it's set in page_animation_util. | 3843 // Changing the origin here is unnecessary, it's set in page_animation_util. |
3842 frame.size.height -= [self headerHeight]; | 3844 frame.size.height -= [self headerHeightForCurrentTab]; |
3843 } | 3845 } |
3844 | 3846 |
3845 CGFloat shortAxis = frame.size.width; | 3847 CGFloat shortAxis = frame.size.width; |
3846 CGFloat shortInset = kCardImageInsets.left + kCardImageInsets.right; | 3848 CGFloat shortInset = kCardImageInsets.left + kCardImageInsets.right; |
3847 shortAxis -= shortInset + 2 * ios_internal::page_animation_util::kCardMargin; | 3849 shortAxis -= shortInset + 2 * ios_internal::page_animation_util::kCardMargin; |
3848 CGFloat aspectRatio = frame.size.height / frame.size.width; | 3850 CGFloat aspectRatio = frame.size.height / frame.size.width; |
3849 CGFloat longAxis = std::floor(aspectRatio * shortAxis); | 3851 CGFloat longAxis = std::floor(aspectRatio * shortAxis); |
3850 CGFloat longInset = kCardImageInsets.top + kCardImageInsets.bottom; | 3852 CGFloat longInset = kCardImageInsets.top + kCardImageInsets.bottom; |
3851 CGSize cardSize = CGSizeMake(shortAxis + shortInset, longAxis + longInset); | 3853 CGSize cardSize = CGSizeMake(shortAxis + shortInset, longAxis + longInset); |
3852 CGRect cardFrame = {frame.origin, cardSize}; | 3854 CGRect cardFrame = {frame.origin, cardSize}; |
(...skipping 876 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4729 // Panel has become visible. | 4731 // Panel has become visible. |
4730 _infoBarContainer->SuspendInfobars(); | 4732 _infoBarContainer->SuspendInfobars(); |
4731 } | 4733 } |
4732 } | 4734 } |
4733 | 4735 |
4734 - (void)panelWillPromote:(ContextualSearchPanelView*)panel { | 4736 - (void)panelWillPromote:(ContextualSearchPanelView*)panel { |
4735 [panel removeMotionObserver:self]; | 4737 [panel removeMotionObserver:self]; |
4736 } | 4738 } |
4737 | 4739 |
4738 - (CGFloat)currentHeaderHeight { | 4740 - (CGFloat)currentHeaderHeight { |
4739 return [self headerHeight] - [self currentHeaderOffset]; | 4741 return [self headerHeightForCurrentTab] - [self currentHeaderOffset]; |
4740 } | 4742 } |
4741 | 4743 |
4742 #pragma mark - InfoBarControllerDelegate | 4744 #pragma mark - InfoBarControllerDelegate |
4743 | 4745 |
4744 - (void)infoBarContainerStateChanged:(bool)isAnimating { | 4746 - (void)infoBarContainerStateChanged:(bool)isAnimating { |
4745 InfoBarContainerView* infoBarContainerView = _infoBarContainer->view(); | 4747 InfoBarContainerView* infoBarContainerView = _infoBarContainer->view(); |
4746 DCHECK(infoBarContainerView); | 4748 DCHECK(infoBarContainerView); |
4747 CGRect containerFrame = infoBarContainerView.frame; | 4749 CGRect containerFrame = infoBarContainerView.frame; |
4748 CGFloat height = [infoBarContainerView topmostVisibleInfoBarHeight]; | 4750 CGFloat height = [infoBarContainerView topmostVisibleInfoBarHeight]; |
4749 containerFrame.origin.y = CGRectGetMaxY(_contentArea.frame) - height; | 4751 containerFrame.origin.y = CGRectGetMaxY(_contentArea.frame) - height; |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5096 | 5098 |
5097 - (UIView*)voiceSearchButton { | 5099 - (UIView*)voiceSearchButton { |
5098 return _voiceSearchButton; | 5100 return _voiceSearchButton; |
5099 } | 5101 } |
5100 | 5102 |
5101 - (id<LogoAnimationControllerOwner>)logoAnimationControllerOwner { | 5103 - (id<LogoAnimationControllerOwner>)logoAnimationControllerOwner { |
5102 return [self currentLogoAnimationControllerOwner]; | 5104 return [self currentLogoAnimationControllerOwner]; |
5103 } | 5105 } |
5104 | 5106 |
5105 @end | 5107 @end |
OLD | NEW |