Index: ios/chrome/app/chrome_overlay_window.mm |
diff --git a/ios/chrome/app/chrome_overlay_window.mm b/ios/chrome/app/chrome_overlay_window.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7962b2088c416060be5fd2d230b8a100150cacd9 |
--- /dev/null |
+++ b/ios/chrome/app/chrome_overlay_window.mm |
@@ -0,0 +1,96 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#import "ios/chrome/app/chrome_overlay_window.h" |
+ |
+#include "base/logging.h" |
+#import "base/mac/scoped_nsobject.h" |
+#import "ios/chrome/browser/crash_report/breakpad_helper.h" |
+#import "ios/chrome/browser/metrics/size_class_recorder.h" |
+#import "ios/chrome/browser/tabs/tab_model.h" |
+#import "ios/chrome/browser/ui/ui_util.h" |
+ |
+@interface ChromeOverlayWindow () { |
+ base::scoped_nsobject<SizeClassRecorder> _recorder; |
+} |
+ |
+// Initializes the size class recorder. On iPad iOS 9+, it starts tracking |
+// horizontal size class changes. Otherwise, it is a no-op. |
+- (void)initializeRecorderIfNeeded; |
+ |
+// Updates the Breakpad report with the current size class on iOS 8+. Otherwise, |
+// it's a no-op since size class doesn't exist. |
+- (void)updateBreakpad; |
+ |
+@end |
+ |
+@implementation ChromeOverlayWindow |
+ |
+- (instancetype)initWithFrame:(CGRect)frame { |
+ self = [super initWithFrame:frame]; |
+ if (self) { |
+ // When not created via a nib, create the recorder immediately. |
+ [self initializeRecorderIfNeeded]; |
+ [self updateBreakpad]; |
+ } |
+ return self; |
+} |
+ |
+- (void)awakeFromNib { |
+ [super awakeFromNib]; |
+ // When creating via a nib, wait to be awoken, as the size class is not |
+ // reliable before. |
+ [self initializeRecorderIfNeeded]; |
+ [self updateBreakpad]; |
+} |
+ |
+- (void)initializeRecorderIfNeeded { |
+ DCHECK(!_recorder); |
+ if (IsIPadIdiom()) { |
+ _recorder.reset([[SizeClassRecorder alloc] |
+ initWithHorizontalSizeClass:self.traitCollection.horizontalSizeClass]); |
+ [[NSNotificationCenter defaultCenter] |
+ addObserver:self |
+ selector:@selector(pageLoaded:) |
+ name:kTabModelTabDidFinishLoadingNotification |
+ object:nil]; |
+ } |
+} |
+ |
+- (void)updateBreakpad { |
+ breakpad_helper::SetCurrentHorizontalSizeClass( |
+ self.traitCollection.horizontalSizeClass); |
+} |
+ |
+- (void)dealloc { |
+ [[NSNotificationCenter defaultCenter] removeObserver:self]; |
+ [super dealloc]; |
+} |
+ |
+#pragma mark - UITraitEnvironment |
+ |
+- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { |
+ [super traitCollectionDidChange:previousTraitCollection]; |
+ if (previousTraitCollection.horizontalSizeClass != |
+ self.traitCollection.horizontalSizeClass) { |
+ [_recorder |
+ horizontalSizeClassDidChange:self.traitCollection.horizontalSizeClass]; |
+ [self updateBreakpad]; |
+ } |
+} |
+ |
+#pragma mark - Notification handler |
+ |
+- (void)pageLoaded:(NSNotification*)notification { |
+ [_recorder pageLoadedWithHorizontalSizeClass:self.traitCollection |
+ .horizontalSizeClass]; |
+} |
+ |
+#pragma mark - Testing methods |
+ |
+- (void)unsetSizeClassRecorder { |
+ _recorder.reset(); |
+} |
+ |
+@end |