| 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
 | 
| 
 |