Chromium Code Reviews| Index: ios/chrome/browser/geolocation/omnibox_geolocation_controller.mm |
| diff --git a/ios/chrome/browser/geolocation/omnibox_geolocation_controller.mm b/ios/chrome/browser/geolocation/omnibox_geolocation_controller.mm |
| index 4add79f10dcf9c1150c887079e20820d7fef3a12..d35e06783eb5df7f147ecb29f90a83479e3240cb 100644 |
| --- a/ios/chrome/browser/geolocation/omnibox_geolocation_controller.mm |
| +++ b/ios/chrome/browser/geolocation/omnibox_geolocation_controller.mm |
| @@ -9,9 +9,7 @@ |
| #include <string> |
| -#import "base/ios/weak_nsobject.h" |
| #include "base/logging.h" |
| -#include "base/mac/scoped_nsobject.h" |
| #include "base/metrics/histogram_macros.h" |
| #include "base/version.h" |
| #include "components/google/core/browser/google_util.h" |
| @@ -29,6 +27,10 @@ |
| #import "ios/web/public/navigation_manager.h" |
| #include "url/gurl.h" |
| +#if !defined(__has_feature) || !__has_feature(objc_arc) |
| +#error "This file requires ARC support." |
| +#endif |
| + |
| namespace { |
| // Values for the histogram that records whether we sent the X-Geo header for |
| @@ -97,11 +99,10 @@ |
| @interface OmniboxGeolocationController ()< |
| LocationManagerDelegate, |
| OmniboxGeolocationAuthorizationAlertDelegate> { |
| - base::scoped_nsobject<OmniboxGeolocationLocalState> localState_; |
| - base::scoped_nsobject<LocationManager> locationManager_; |
| - base::scoped_nsobject<OmniboxGeolocationAuthorizationAlert> |
| - authorizationAlert_; |
| - base::WeakNSObject<Tab> weakTabToReload_; |
| + OmniboxGeolocationLocalState* localState_; |
| + LocationManager* locationManager_; |
| + OmniboxGeolocationAuthorizationAlert* authorizationAlert_; |
| + __weak Tab* weakTabToReload_; |
| // Records whether we have deliberately presented the system prompt, so that |
| // we can record the user's action in |
| @@ -119,10 +120,10 @@ @interface OmniboxGeolocationController ()< |
| @property(nonatomic, readonly) BOOL enabled; |
| // Convenience property lazily initializes |localState_|. |
| -@property(nonatomic, readonly) OmniboxGeolocationLocalState* localState; |
| +@property(nonatomic, weak, readonly) OmniboxGeolocationLocalState* localState; |
|
sdefresne
2017/06/07 09:22:23
The "weak" annotation is incorrect as the ivar is
liaoyuke
2017/06/13 17:49:05
Correct, thank you for the detailed review. The sc
|
| // Convenience property lazily initializes |locationManager_|. |
| -@property(nonatomic, readonly) LocationManager* locationManager; |
| +@property(nonatomic, weak, readonly) LocationManager* locationManager; |
|
sdefresne
2017/06/07 09:22:24
ditto
liaoyuke
2017/06/13 17:49:05
Done.
|
| // Returns YES if and only if |url| and |transition| specify an Omnibox query |
| // that is eligible for geolocation. |
| @@ -191,7 +192,7 @@ - (void)triggerSystemPromptForNewUser:(BOOL)newUser { |
| // Turn on location updates, so that iOS will prompt the user. |
| [self startUpdatingLocation]; |
| - weakTabToReload_.reset(); |
| + weakTabToReload_ = nil; |
| newUser_ = newUser; |
| } |
| } |
| @@ -343,7 +344,7 @@ - (void)finishPageLoadForTab:(Tab*)tab loadSuccess:(BOOL)loadSuccess { |
| // Save this tab in case we're able to transition to |
| // kAuthorizationStateAuthorized. |
| - weakTabToReload_.reset(tab); |
| + weakTabToReload_ = tab; |
| break; |
| case kCLAuthorizationStatusRestricted: |
| @@ -385,15 +386,15 @@ - (BOOL)enabled { |
| - (OmniboxGeolocationLocalState*)localState { |
| if (!localState_) { |
| - localState_.reset([[OmniboxGeolocationLocalState alloc] |
| - initWithLocationManager:self.locationManager]); |
| + localState_ = [[OmniboxGeolocationLocalState alloc] |
| + initWithLocationManager:self.locationManager]; |
| } |
| return localState_; |
| } |
| - (LocationManager*)locationManager { |
| if (!locationManager_) { |
| - locationManager_.reset([[LocationManager alloc] init]); |
| + locationManager_ = [[LocationManager alloc] init]; |
| [locationManager_ setDelegate:self]; |
| } |
| return locationManager_; |
| @@ -476,10 +477,10 @@ - (BOOL)shouldShowAuthorizationAlert { |
| - (void)showAuthorizationAlertForTab:(Tab*)tab { |
| // Save this tab in case we're able to transition to |
| // kAuthorizationStateAuthorized. |
| - weakTabToReload_.reset(tab); |
| + weakTabToReload_ = tab; |
| - authorizationAlert_.reset( |
| - [[OmniboxGeolocationAuthorizationAlert alloc] initWithDelegate:self]); |
| + authorizationAlert_ = |
| + [[OmniboxGeolocationAuthorizationAlert alloc] initWithDelegate:self]; |
| [authorizationAlert_ showAuthorizationAlert]; |
| self.localState.lastAuthorizationAlertVersion = |
| @@ -531,9 +532,9 @@ - (void)locationManagerDidChangeAuthorizationStatus: |
| geolocation::kAuthorizationStateAuthorized; |
| systemPrompt_ = NO; |
| - base::scoped_nsobject<Tab> tab([weakTabToReload_ retain]); |
| + Tab* tab = weakTabToReload_; |
| [self addLocationAndReloadTab:tab]; |
| - weakTabToReload_.reset(); |
| + weakTabToReload_ = nil; |
| [self recordAuthorizationAction:kAuthorizationActionAuthorized]; |
| break; |
| @@ -548,14 +549,11 @@ - (void)authorizationAlertDidAuthorize: |
| self.localState.authorizationState = |
| geolocation::kAuthorizationStateAuthorized; |
| - base::scoped_nsobject<Tab> tab([weakTabToReload_ retain]); |
| + Tab* tab = weakTabToReload_; |
| [self addLocationAndReloadTab:tab]; |
| - // Just resetting |authorizationAlert_| leads to a user-after-free crash |
| - // presumably due to a UIKit bug. Making authorizationAlert_ autorelease |
| - // will keep it alive long enough to avoid the crash. See crbug.com/381235 |
| - authorizationAlert_.autorelease(); |
| - weakTabToReload_.reset(); |
| + authorizationAlert_ = nil; |
| + weakTabToReload_ = nil; |
| [self recordAuthorizationAction:kAuthorizationActionAuthorized]; |
| } |
| @@ -566,11 +564,8 @@ - (void)authorizationAlertDidCancel: |
| // We won't use location, but we'll still be able to prompt at the next |
| // application update. |
| - // Just resetting |authorizationAlert_| leads to a user-after-free crash |
| - // presumably due to a UIKit bug. Making authorizationAlert_ autorelease |
| - // will keep it alive long enough to avoid the crash. See crbug.com/381235 |
| - authorizationAlert_.autorelease(); |
| - weakTabToReload_.reset(); |
| + authorizationAlert_ = nil; |
| + weakTabToReload_ = nil; |
| [self recordAuthorizationAction:kAuthorizationActionDenied]; |
| } |
| @@ -578,11 +573,11 @@ - (void)authorizationAlertDidCancel: |
| #pragma mark - OmniboxGeolocationController+Testing |
| - (void)setLocalState:(OmniboxGeolocationLocalState*)localState { |
| - localState_.reset([localState retain]); |
| + localState_ = localState; |
| } |
| - (void)setLocationManager:(LocationManager*)locationManager { |
| - locationManager_.reset([locationManager retain]); |
| + locationManager_ = locationManager; |
| } |
| @end |