| 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> |
| 11 #import <QuartzCore/QuartzCore.h> | 11 #import <QuartzCore/QuartzCore.h> |
| 12 | 12 |
| 13 #include <stdint.h> | 13 #include <stdint.h> |
| 14 #include <cmath> | 14 #include <cmath> |
| 15 #include <memory> | 15 #include <memory> |
| 16 | 16 |
| 17 #include "base/base64.h" | 17 #include "base/base64.h" |
| 18 #include "base/command_line.h" | 18 #include "base/command_line.h" |
| 19 #include "base/files/file_path.h" |
| 19 #include "base/format_macros.h" | 20 #include "base/format_macros.h" |
| 20 #include "base/i18n/rtl.h" | 21 #include "base/i18n/rtl.h" |
| 21 #include "base/ios/block_types.h" | 22 #include "base/ios/block_types.h" |
| 22 #include "base/ios/ios_util.h" | 23 #include "base/ios/ios_util.h" |
| 23 #include "base/ios/weak_nsobject.h" | 24 #include "base/ios/weak_nsobject.h" |
| 24 #include "base/logging.h" | 25 #include "base/logging.h" |
| 25 #include "base/mac/bind_objc_block.h" | 26 #include "base/mac/bind_objc_block.h" |
| 26 #include "base/mac/bundle_locations.h" | 27 #include "base/mac/bundle_locations.h" |
| 27 #include "base/mac/foundation_util.h" | 28 #include "base/mac/foundation_util.h" |
| 28 #include "base/mac/objc_property_releaser.h" | 29 #include "base/mac/objc_property_releaser.h" |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 #include "ios/web/public/url_scheme_util.h" | 178 #include "ios/web/public/url_scheme_util.h" |
| 178 #include "ios/web/public/web_client.h" | 179 #include "ios/web/public/web_client.h" |
| 179 #import "ios/web/public/web_state/context_menu_params.h" | 180 #import "ios/web/public/web_state/context_menu_params.h" |
| 180 #import "ios/web/public/web_state/crw_web_view_proxy.h" | 181 #import "ios/web/public/web_state/crw_web_view_proxy.h" |
| 181 #import "ios/web/public/web_state/ui/crw_native_content_provider.h" | 182 #import "ios/web/public/web_state/ui/crw_native_content_provider.h" |
| 182 #include "ios/web/public/web_state/web_state.h" | 183 #include "ios/web/public/web_state/web_state.h" |
| 183 #import "ios/web/public/web_state/web_state_delegate_bridge.h" | 184 #import "ios/web/public/web_state/web_state_delegate_bridge.h" |
| 184 #include "ios/web/public/web_thread.h" | 185 #include "ios/web/public/web_thread.h" |
| 185 #import "ios/web/web_state/ui/crw_web_controller.h" | 186 #import "ios/web/web_state/ui/crw_web_controller.h" |
| 186 #import "net/base/mac/url_conversions.h" | 187 #import "net/base/mac/url_conversions.h" |
| 188 #include "net/base/mime_util.h" |
| 187 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" | 189 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" |
| 188 #include "net/ssl/ssl_info.h" | 190 #include "net/ssl/ssl_info.h" |
| 189 #include "net/url_request/url_request_context_getter.h" | 191 #include "net/url_request/url_request_context_getter.h" |
| 190 #include "third_party/google_toolbox_for_mac/src/iPhone/GTMUIImage+Resize.h" | 192 #include "third_party/google_toolbox_for_mac/src/iPhone/GTMUIImage+Resize.h" |
| 191 #include "ui/base/l10n/l10n_util.h" | 193 #include "ui/base/l10n/l10n_util.h" |
| 192 #include "ui/base/l10n/l10n_util_mac.h" | 194 #include "ui/base/l10n/l10n_util_mac.h" |
| 193 #include "ui/base/page_transition_types.h" | 195 #include "ui/base/page_transition_types.h" |
| 194 #include "url/gurl.h" | 196 #include "url/gurl.h" |
| 195 | 197 |
| 196 using base::UserMetricsAction; | 198 using base::UserMetricsAction; |
| (...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 671 // Dismisses previous alert if it has not been dismissed yet. | 673 // Dismisses previous alert if it has not been dismissed yet. |
| 672 - (void)showErrorAlertWithStringTitle:(NSString*)title | 674 - (void)showErrorAlertWithStringTitle:(NSString*)title |
| 673 message:(NSString*)message; | 675 message:(NSString*)message; |
| 674 // Shows a self-dismissing snackbar displaying |message|. | 676 // Shows a self-dismissing snackbar displaying |message|. |
| 675 - (void)showSnackbar:(NSString*)message; | 677 - (void)showSnackbar:(NSString*)message; |
| 676 // Induces an intentional crash in the browser process. | 678 // Induces an intentional crash in the browser process. |
| 677 - (void)induceBrowserCrash; | 679 - (void)induceBrowserCrash; |
| 678 // Returns Tab that corresponds to the given |webState|. | 680 // Returns Tab that corresponds to the given |webState|. |
| 679 - (Tab*)tabForWebState:(web::WebState*)webState; | 681 - (Tab*)tabForWebState:(web::WebState*)webState; |
| 680 // Saves the image or display error message, based on privacy settings. | 682 // Saves the image or display error message, based on privacy settings. |
| 681 - (void)managePermissionAndSaveImage:(NSData*)data; | 683 - (void)managePermissionAndSaveImage:(NSData*)data |
| 684 fileExtension:(NSString*)fileExtension; |
| 682 // Saves the image. In order to keep the metadata of the image, the image is | 685 // Saves the image. In order to keep the metadata of the image, the image is |
| 683 // saved as a temporary file on disk then saved in photos. | 686 // saved as a temporary file on disk then saved in photos. |
| 684 // This should be called on FILE thread. | 687 // This should be called on FILE thread. |
| 685 - (void)saveImage:(NSData*)data; | 688 - (void)saveImage:(NSData*)data fileExtension:(NSString*)fileExtension; |
| 686 // Called when Chrome has been denied access to the photos or videos and the | 689 // Called when Chrome has been denied access to the photos or videos and the |
| 687 // user can change it. | 690 // user can change it. |
| 688 // Shows a privacy alert on the main queue, allowing the user to go to Chrome's | 691 // Shows a privacy alert on the main queue, allowing the user to go to Chrome's |
| 689 // settings. Dismiss previous alert if it has not been dismissed yet. | 692 // settings. Dismiss previous alert if it has not been dismissed yet. |
| 690 - (void)displayImageErrorAlertWithSettingsOnMainQueue; | 693 - (void)displayImageErrorAlertWithSettingsOnMainQueue; |
| 691 // Shows a privacy alert allowing the user to go to Chrome's settings. Dismiss | 694 // Shows a privacy alert allowing the user to go to Chrome's settings. Dismiss |
| 692 // previous alert if it has not been dismissed yet. | 695 // previous alert if it has not been dismissed yet. |
| 693 - (void)displayImageErrorAlertWithSettings:(NSURL*)settingURL; | 696 - (void)displayImageErrorAlertWithSettings:(NSURL*)settingURL; |
| 694 // Called when Chrome has been denied access to the photos or videos and the | 697 // Called when Chrome has been denied access to the photos or videos and the |
| 695 // user cannot change it. | 698 // user cannot change it. |
| (...skipping 2289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2985 } | 2988 } |
| 2986 } | 2989 } |
| 2987 | 2990 |
| 2988 #pragma mark - Context menu methods | 2991 #pragma mark - Context menu methods |
| 2989 | 2992 |
| 2990 - (void)searchByImageAtURL:(const GURL&)url | 2993 - (void)searchByImageAtURL:(const GURL&)url |
| 2991 referrer:(const web::Referrer)referrer { | 2994 referrer:(const web::Referrer)referrer { |
| 2992 DCHECK(url.is_valid()); | 2995 DCHECK(url.is_valid()); |
| 2993 base::WeakNSObject<BrowserViewController> weakSelf(self); | 2996 base::WeakNSObject<BrowserViewController> weakSelf(self); |
| 2994 const GURL image_source_url = url; | 2997 const GURL image_source_url = url; |
| 2995 image_fetcher::IOSImageDataFetcherCallback callback = ^(NSData* data) { | 2998 image_fetcher::IOSImageDataFetcherCallback callback = ^( |
| 2999 NSData* data, const std::string& mimeType) { |
| 2996 DCHECK(data); | 3000 DCHECK(data); |
| 2997 dispatch_async(dispatch_get_main_queue(), ^{ | 3001 dispatch_async(dispatch_get_main_queue(), ^{ |
| 2998 [weakSelf searchByImageData:data atURL:image_source_url]; | 3002 [weakSelf searchByImageData:data atURL:image_source_url]; |
| 2999 }); | 3003 }); |
| 3000 }; | 3004 }; |
| 3001 _imageFetcher->FetchImageDataWebpDecoded( | 3005 _imageFetcher->FetchImageDataWebpDecoded( |
| 3002 url, callback, web::ReferrerHeaderValueForNavigation(url, referrer), | 3006 url, callback, web::ReferrerHeaderValueForNavigation(url, referrer), |
| 3003 web::PolicyForNavigation(url, referrer)); | 3007 web::PolicyForNavigation(url, referrer)); |
| 3004 } | 3008 } |
| 3005 | 3009 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3041 search_args, templateUrlService->search_terms_data(), &post_content)); | 3045 search_args, templateUrlService->search_terms_data(), &post_content)); |
| 3042 [self addSelectedTabWithURL:result | 3046 [self addSelectedTabWithURL:result |
| 3043 postData:&post_content | 3047 postData:&post_content |
| 3044 transition:ui::PAGE_TRANSITION_TYPED]; | 3048 transition:ui::PAGE_TRANSITION_TYPED]; |
| 3045 } | 3049 } |
| 3046 | 3050 |
| 3047 - (void)saveImageAtURL:(const GURL&)url | 3051 - (void)saveImageAtURL:(const GURL&)url |
| 3048 referrer:(const web::Referrer&)referrer { | 3052 referrer:(const web::Referrer&)referrer { |
| 3049 DCHECK(url.is_valid()); | 3053 DCHECK(url.is_valid()); |
| 3050 | 3054 |
| 3051 image_fetcher::IOSImageDataFetcherCallback callback = ^(NSData* data) { | 3055 image_fetcher::IOSImageDataFetcherCallback callback = |
| 3052 DCHECK(data); | 3056 ^(NSData* data, const std::string& mimeType) { |
| 3057 DCHECK(data); |
| 3053 | 3058 |
| 3054 [self managePermissionAndSaveImage:data]; | 3059 base::FilePath::StringType extension; |
| 3055 }; | 3060 |
| 3061 bool extensionSuccess = |
| 3062 net::GetPreferredExtensionForMimeType(mimeType, &extension); |
| 3063 if (!extensionSuccess || extension.length() == 0) { |
| 3064 extension = "png"; |
| 3065 } |
| 3066 |
| 3067 NSString* fileExtension = |
| 3068 [@"." stringByAppendingString:base::SysUTF8ToNSString(extension)]; |
| 3069 [self managePermissionAndSaveImage:data fileExtension:fileExtension]; |
| 3070 }; |
| 3056 _imageFetcher->FetchImageDataWebpDecoded( | 3071 _imageFetcher->FetchImageDataWebpDecoded( |
| 3057 url, callback, web::ReferrerHeaderValueForNavigation(url, referrer), | 3072 url, callback, web::ReferrerHeaderValueForNavigation(url, referrer), |
| 3058 web::PolicyForNavigation(url, referrer)); | 3073 web::PolicyForNavigation(url, referrer)); |
| 3059 } | 3074 } |
| 3060 | 3075 |
| 3061 - (void)managePermissionAndSaveImage:(NSData*)data { | 3076 - (void)managePermissionAndSaveImage:(NSData*)data |
| 3077 fileExtension:(NSString*)fileExtension { |
| 3062 switch ([PHPhotoLibrary authorizationStatus]) { | 3078 switch ([PHPhotoLibrary authorizationStatus]) { |
| 3063 // User was never asked for permission to access photos. | 3079 // User was never asked for permission to access photos. |
| 3064 case PHAuthorizationStatusNotDetermined: | 3080 case PHAuthorizationStatusNotDetermined: |
| 3065 [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { | 3081 [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { |
| 3066 // Call -saveImage again to check if chrome needs to display an error or | 3082 // Call -saveImage again to check if chrome needs to display an error or |
| 3067 // saves the image. | 3083 // saves the image. |
| 3068 if (status != PHAuthorizationStatusNotDetermined) | 3084 if (status != PHAuthorizationStatusNotDetermined) |
| 3069 [self managePermissionAndSaveImage:data]; | 3085 [self managePermissionAndSaveImage:data fileExtension:fileExtension]; |
| 3070 }]; | 3086 }]; |
| 3071 break; | 3087 break; |
| 3072 | 3088 |
| 3073 // The application doesn't have permission to access photo and the user | 3089 // The application doesn't have permission to access photo and the user |
| 3074 // cannot grant it. | 3090 // cannot grant it. |
| 3075 case PHAuthorizationStatusRestricted: | 3091 case PHAuthorizationStatusRestricted: |
| 3076 [self displayPrivacyErrorAlertOnMainQueue: | 3092 [self displayPrivacyErrorAlertOnMainQueue: |
| 3077 l10n_util::GetNSString( | 3093 l10n_util::GetNSString( |
| 3078 IDS_IOS_SAVE_IMAGE_RESTRICTED_PRIVACY_ALERT_MESSAGE)]; | 3094 IDS_IOS_SAVE_IMAGE_RESTRICTED_PRIVACY_ALERT_MESSAGE)]; |
| 3079 break; | 3095 break; |
| 3080 | 3096 |
| 3081 // The application doesn't have permission to access photo and the user | 3097 // The application doesn't have permission to access photo and the user |
| 3082 // can grant it. | 3098 // can grant it. |
| 3083 case PHAuthorizationStatusDenied: | 3099 case PHAuthorizationStatusDenied: |
| 3084 [self displayImageErrorAlertWithSettingsOnMainQueue]; | 3100 [self displayImageErrorAlertWithSettingsOnMainQueue]; |
| 3085 break; | 3101 break; |
| 3086 | 3102 |
| 3087 // The application has permission to access the photos. | 3103 // The application has permission to access the photos. |
| 3088 default: { | 3104 default: { |
| 3089 web::WebThread::PostTask(web::WebThread::FILE, FROM_HERE, | 3105 web::WebThread::PostTask( |
| 3090 base::BindBlock(^{ | 3106 web::WebThread::FILE, FROM_HERE, base::BindBlock(^{ |
| 3091 [self saveImage:data]; | 3107 [self saveImage:data fileExtension:fileExtension]; |
| 3092 })); | 3108 })); |
| 3093 break; | 3109 break; |
| 3094 } | 3110 } |
| 3095 } | 3111 } |
| 3096 } | 3112 } |
| 3097 | 3113 |
| 3098 - (void)saveImage:(NSData*)data { | 3114 - (void)saveImage:(NSData*)data fileExtension:(NSString*)fileExtension { |
| 3099 NSString* fileName = [[[NSProcessInfo processInfo] globallyUniqueString] | 3115 NSString* fileName = [[[NSProcessInfo processInfo] globallyUniqueString] |
| 3100 stringByAppendingString:@".png"]; | 3116 stringByAppendingString:@".png"]; |
| 3101 NSURL* fileURL = | 3117 NSURL* fileURL = |
| 3102 [NSURL fileURLWithPath:[NSTemporaryDirectory() | 3118 [NSURL fileURLWithPath:[NSTemporaryDirectory() |
| 3103 stringByAppendingPathComponent:fileName]]; | 3119 stringByAppendingPathComponent:fileName]]; |
| 3104 NSError* error = nil; | 3120 NSError* error = nil; |
| 3105 [data writeToURL:fileURL options:NSDataWritingAtomic error:&error]; | 3121 [data writeToURL:fileURL options:NSDataWritingAtomic error:&error]; |
| 3106 | 3122 |
| 3107 // Error while writing the image to disk. | 3123 // Error while writing the image to disk. |
| 3108 if (error) { | 3124 if (error) { |
| (...skipping 1853 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4962 | 4978 |
| 4963 - (UIView*)voiceSearchButton { | 4979 - (UIView*)voiceSearchButton { |
| 4964 return _voiceSearchButton; | 4980 return _voiceSearchButton; |
| 4965 } | 4981 } |
| 4966 | 4982 |
| 4967 - (id<LogoAnimationControllerOwner>)logoAnimationControllerOwner { | 4983 - (id<LogoAnimationControllerOwner>)logoAnimationControllerOwner { |
| 4968 return [self currentLogoAnimationControllerOwner]; | 4984 return [self currentLogoAnimationControllerOwner]; |
| 4969 } | 4985 } |
| 4970 | 4986 |
| 4971 @end | 4987 @end |
| OLD | NEW |