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 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
178 #include "ios/web/public/url_scheme_util.h" | 179 #include "ios/web/public/url_scheme_util.h" |
179 #include "ios/web/public/web_client.h" | 180 #include "ios/web/public/web_client.h" |
180 #import "ios/web/public/web_state/context_menu_params.h" | 181 #import "ios/web/public/web_state/context_menu_params.h" |
181 #import "ios/web/public/web_state/crw_web_view_proxy.h" | 182 #import "ios/web/public/web_state/crw_web_view_proxy.h" |
182 #import "ios/web/public/web_state/ui/crw_native_content_provider.h" | 183 #import "ios/web/public/web_state/ui/crw_native_content_provider.h" |
183 #include "ios/web/public/web_state/web_state.h" | 184 #include "ios/web/public/web_state/web_state.h" |
184 #import "ios/web/public/web_state/web_state_delegate_bridge.h" | 185 #import "ios/web/public/web_state/web_state_delegate_bridge.h" |
185 #include "ios/web/public/web_thread.h" | 186 #include "ios/web/public/web_thread.h" |
186 #import "ios/web/web_state/ui/crw_web_controller.h" | 187 #import "ios/web/web_state/ui/crw_web_controller.h" |
187 #import "net/base/mac/url_conversions.h" | 188 #import "net/base/mac/url_conversions.h" |
189 #include "net/base/mime_util.h" | |
188 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" | 190 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" |
189 #include "net/ssl/ssl_info.h" | 191 #include "net/ssl/ssl_info.h" |
190 #include "net/url_request/url_request_context_getter.h" | 192 #include "net/url_request/url_request_context_getter.h" |
191 #include "third_party/google_toolbox_for_mac/src/iPhone/GTMUIImage+Resize.h" | 193 #include "third_party/google_toolbox_for_mac/src/iPhone/GTMUIImage+Resize.h" |
192 #include "ui/base/l10n/l10n_util.h" | 194 #include "ui/base/l10n/l10n_util.h" |
193 #include "ui/base/l10n/l10n_util_mac.h" | 195 #include "ui/base/l10n/l10n_util_mac.h" |
194 #include "ui/base/page_transition_types.h" | 196 #include "ui/base/page_transition_types.h" |
195 #include "url/gurl.h" | 197 #include "url/gurl.h" |
196 | 198 |
197 using base::UserMetricsAction; | 199 using base::UserMetricsAction; |
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
670 - (void)showErrorAlert:(int)titleMessageId message:(int)messageId; | 672 - (void)showErrorAlert:(int)titleMessageId message:(int)messageId; |
671 // Helper method displaying an alert with the given title and message. | 673 // Helper method displaying an alert with the given title and message. |
672 // Dismisses previous alert if it has not been dismissed yet. | 674 // Dismisses previous alert if it has not been dismissed yet. |
673 - (void)showErrorAlertWithStringTitle:(NSString*)title | 675 - (void)showErrorAlertWithStringTitle:(NSString*)title |
674 message:(NSString*)message; | 676 message:(NSString*)message; |
675 // Shows a self-dismissing snackbar displaying |message|. | 677 // Shows a self-dismissing snackbar displaying |message|. |
676 - (void)showSnackbar:(NSString*)message; | 678 - (void)showSnackbar:(NSString*)message; |
677 // Induces an intentional crash in the browser process. | 679 // Induces an intentional crash in the browser process. |
678 - (void)induceBrowserCrash; | 680 - (void)induceBrowserCrash; |
679 // Saves the image or display error message, based on privacy settings. | 681 // Saves the image or display error message, based on privacy settings. |
680 - (void)managePermissionAndSaveImage:(NSData*)data; | 682 - (void)managePermissionAndSaveImage:(NSData*)data |
683 withFileExtension:(NSString*)fileExtension; | |
681 // Saves the image. In order to keep the metadata of the image, the image is | 684 // Saves the image. In order to keep the metadata of the image, the image is |
682 // saved as a temporary file on disk then saved in photos. | 685 // saved as a temporary file on disk then saved in photos. |
683 // This should be called on FILE thread. | 686 // This should be called on FILE thread. |
684 - (void)saveImage:(NSData*)data; | 687 - (void)saveImage:(NSData*)data withFileExtension:(NSString*)fileExtension; |
685 // Called when Chrome has been denied access to the photos or videos and the | 688 // Called when Chrome has been denied access to the photos or videos and the |
686 // user can change it. | 689 // user can change it. |
687 // Shows a privacy alert on the main queue, allowing the user to go to Chrome's | 690 // Shows a privacy alert on the main queue, allowing the user to go to Chrome's |
688 // settings. Dismiss previous alert if it has not been dismissed yet. | 691 // settings. Dismiss previous alert if it has not been dismissed yet. |
689 - (void)displayImageErrorAlertWithSettingsOnMainQueue; | 692 - (void)displayImageErrorAlertWithSettingsOnMainQueue; |
690 // Shows a privacy alert allowing the user to go to Chrome's settings. Dismiss | 693 // Shows a privacy alert allowing the user to go to Chrome's settings. Dismiss |
691 // previous alert if it has not been dismissed yet. | 694 // previous alert if it has not been dismissed yet. |
692 - (void)displayImageErrorAlertWithSettings:(NSURL*)settingURL; | 695 - (void)displayImageErrorAlertWithSettings:(NSURL*)settingURL; |
693 // Called when Chrome has been denied access to the photos or videos and the | 696 // Called when Chrome has been denied access to the photos or videos and the |
694 // user cannot change it. | 697 // user cannot change it. |
(...skipping 2289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2984 } | 2987 } |
2985 } | 2988 } |
2986 | 2989 |
2987 #pragma mark - Context menu methods | 2990 #pragma mark - Context menu methods |
2988 | 2991 |
2989 - (void)searchByImageAtURL:(const GURL&)url | 2992 - (void)searchByImageAtURL:(const GURL&)url |
2990 referrer:(const web::Referrer)referrer { | 2993 referrer:(const web::Referrer)referrer { |
2991 DCHECK(url.is_valid()); | 2994 DCHECK(url.is_valid()); |
2992 base::WeakNSObject<BrowserViewController> weakSelf(self); | 2995 base::WeakNSObject<BrowserViewController> weakSelf(self); |
2993 const GURL image_source_url = url; | 2996 const GURL image_source_url = url; |
2994 image_fetcher::IOSImageDataFetcherCallback callback = ^(NSData* data) { | 2997 image_fetcher::IOSImageDataFetcherCallback callback = ^( |
2998 NSData* data, const image_fetcher::RequestMetadata& metadata) { | |
2995 DCHECK(data); | 2999 DCHECK(data); |
2996 dispatch_async(dispatch_get_main_queue(), ^{ | 3000 dispatch_async(dispatch_get_main_queue(), ^{ |
2997 [weakSelf searchByImageData:data atURL:image_source_url]; | 3001 [weakSelf searchByImageData:data atURL:image_source_url]; |
2998 }); | 3002 }); |
2999 }; | 3003 }; |
3000 _imageFetcher->FetchImageDataWebpDecoded( | 3004 _imageFetcher->FetchImageDataWebpDecoded( |
3001 url, callback, web::ReferrerHeaderValueForNavigation(url, referrer), | 3005 url, callback, web::ReferrerHeaderValueForNavigation(url, referrer), |
3002 web::PolicyForNavigation(url, referrer)); | 3006 web::PolicyForNavigation(url, referrer)); |
3003 } | 3007 } |
3004 | 3008 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3040 search_args, templateUrlService->search_terms_data(), &post_content)); | 3044 search_args, templateUrlService->search_terms_data(), &post_content)); |
3041 [self addSelectedTabWithURL:result | 3045 [self addSelectedTabWithURL:result |
3042 postData:&post_content | 3046 postData:&post_content |
3043 transition:ui::PAGE_TRANSITION_TYPED]; | 3047 transition:ui::PAGE_TRANSITION_TYPED]; |
3044 } | 3048 } |
3045 | 3049 |
3046 - (void)saveImageAtURL:(const GURL&)url | 3050 - (void)saveImageAtURL:(const GURL&)url |
3047 referrer:(const web::Referrer&)referrer { | 3051 referrer:(const web::Referrer&)referrer { |
3048 DCHECK(url.is_valid()); | 3052 DCHECK(url.is_valid()); |
3049 | 3053 |
3050 image_fetcher::IOSImageDataFetcherCallback callback = ^(NSData* data) { | 3054 image_fetcher::IOSImageDataFetcherCallback callback = ^( |
3055 NSData* data, const image_fetcher::RequestMetadata& metadata) { | |
3051 DCHECK(data); | 3056 DCHECK(data); |
3052 | 3057 |
3053 [self managePermissionAndSaveImage:data]; | 3058 base::FilePath::StringType extension; |
3059 | |
3060 bool extensionSuccess = | |
3061 net::GetPreferredExtensionForMimeType(metadata.mime_type, &extension); | |
3062 if (!extensionSuccess || extension.length() == 0) { | |
3063 extension = "png"; | |
3064 } | |
3065 | |
3066 NSString* fileExtension = | |
3067 [@"." stringByAppendingString:base::SysUTF8ToNSString(extension)]; | |
3068 [self managePermissionAndSaveImage:data withFileExtension:fileExtension]; | |
3054 }; | 3069 }; |
3055 _imageFetcher->FetchImageDataWebpDecoded( | 3070 _imageFetcher->FetchImageDataWebpDecoded( |
3056 url, callback, web::ReferrerHeaderValueForNavigation(url, referrer), | 3071 url, callback, web::ReferrerHeaderValueForNavigation(url, referrer), |
3057 web::PolicyForNavigation(url, referrer)); | 3072 web::PolicyForNavigation(url, referrer)); |
3058 } | 3073 } |
3059 | 3074 |
3060 - (void)managePermissionAndSaveImage:(NSData*)data { | 3075 - (void)managePermissionAndSaveImage:(NSData*)data |
3076 withFileExtension:(NSString*)fileExtension { | |
3061 switch ([PHPhotoLibrary authorizationStatus]) { | 3077 switch ([PHPhotoLibrary authorizationStatus]) { |
3062 // User was never asked for permission to access photos. | 3078 // User was never asked for permission to access photos. |
3063 case PHAuthorizationStatusNotDetermined: | 3079 case PHAuthorizationStatusNotDetermined: |
3064 [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { | 3080 [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { |
3065 // Call -saveImage again to check if chrome needs to display an error or | 3081 // Call -saveImage again to check if chrome needs to display an error or |
3066 // saves the image. | 3082 // saves the image. |
3067 if (status != PHAuthorizationStatusNotDetermined) | 3083 if (status != PHAuthorizationStatusNotDetermined) |
3068 [self managePermissionAndSaveImage:data]; | 3084 [self managePermissionAndSaveImage:data |
3085 withFileExtension:fileExtension]; | |
3069 }]; | 3086 }]; |
3070 break; | 3087 break; |
3071 | 3088 |
3072 // 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 |
3073 // cannot grant it. | 3090 // cannot grant it. |
3074 case PHAuthorizationStatusRestricted: | 3091 case PHAuthorizationStatusRestricted: |
3075 [self displayPrivacyErrorAlertOnMainQueue: | 3092 [self displayPrivacyErrorAlertOnMainQueue: |
3076 l10n_util::GetNSString( | 3093 l10n_util::GetNSString( |
3077 IDS_IOS_SAVE_IMAGE_RESTRICTED_PRIVACY_ALERT_MESSAGE)]; | 3094 IDS_IOS_SAVE_IMAGE_RESTRICTED_PRIVACY_ALERT_MESSAGE)]; |
3078 break; | 3095 break; |
3079 | 3096 |
3080 // 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 |
3081 // can grant it. | 3098 // can grant it. |
3082 case PHAuthorizationStatusDenied: | 3099 case PHAuthorizationStatusDenied: |
3083 [self displayImageErrorAlertWithSettingsOnMainQueue]; | 3100 [self displayImageErrorAlertWithSettingsOnMainQueue]; |
3084 break; | 3101 break; |
3085 | 3102 |
3086 // The application has permission to access the photos. | 3103 // The application has permission to access the photos. |
3087 default: { | 3104 default: { |
3088 web::WebThread::PostTask(web::WebThread::FILE, FROM_HERE, | 3105 web::WebThread::PostTask( |
3089 base::BindBlock(^{ | 3106 web::WebThread::FILE, FROM_HERE, base::BindBlock(^{ |
3090 [self saveImage:data]; | 3107 [self saveImage:data withFileExtension:fileExtension]; |
3091 })); | 3108 })); |
3092 break; | 3109 break; |
3093 } | 3110 } |
3094 } | 3111 } |
3095 } | 3112 } |
3096 | 3113 |
3097 - (void)saveImage:(NSData*)data { | 3114 - (void)saveImage:(NSData*)data withFileExtension:(NSString*)fileExtension { |
3098 NSString* fileName = [[[NSProcessInfo processInfo] globallyUniqueString] | 3115 NSString* fileName = [[[NSProcessInfo processInfo] globallyUniqueString] |
3099 stringByAppendingString:@".png"]; | 3116 stringByAppendingString:fileExtension]; |
Olivier
2017/02/10 08:54:43
nit, and not important for this CL:
Whenever manip
| |
3100 NSURL* fileURL = | 3117 NSURL* fileURL = |
3101 [NSURL fileURLWithPath:[NSTemporaryDirectory() | 3118 [NSURL fileURLWithPath:[NSTemporaryDirectory() |
3102 stringByAppendingPathComponent:fileName]]; | 3119 stringByAppendingPathComponent:fileName]]; |
3103 NSError* error = nil; | 3120 NSError* error = nil; |
3104 [data writeToURL:fileURL options:NSDataWritingAtomic error:&error]; | 3121 [data writeToURL:fileURL options:NSDataWritingAtomic error:&error]; |
3105 | 3122 |
3106 // Error while writing the image to disk. | 3123 // Error while writing the image to disk. |
3107 if (error) { | 3124 if (error) { |
3108 NSString* errorMessage = [NSString | 3125 NSString* errorMessage = [NSString |
3109 stringWithFormat:@"%@ (%@ %" PRIdNS ")", [error localizedDescription], | 3126 stringWithFormat:@"%@ (%@ %" PRIdNS ")", [error localizedDescription], |
(...skipping 1843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4953 | 4970 |
4954 - (UIView*)voiceSearchButton { | 4971 - (UIView*)voiceSearchButton { |
4955 return _voiceSearchButton; | 4972 return _voiceSearchButton; |
4956 } | 4973 } |
4957 | 4974 |
4958 - (id<LogoAnimationControllerOwner>)logoAnimationControllerOwner { | 4975 - (id<LogoAnimationControllerOwner>)logoAnimationControllerOwner { |
4959 return [self currentLogoAnimationControllerOwner]; | 4976 return [self currentLogoAnimationControllerOwner]; |
4960 } | 4977 } |
4961 | 4978 |
4962 @end | 4979 @end |
OLD | NEW |