chromium/ios/chrome/browser/screenshot/model/screenshot_delegate.mm

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "ios/chrome/browser/screenshot/model/screenshot_delegate.h"

#import "ios/chrome/browser/shared/model/browser/browser.h"
#import "ios/chrome/browser/shared/model/browser/browser_provider.h"
#import "ios/chrome/browser/shared/model/browser/browser_provider_interface.h"
#import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h"
#import "ios/web/public/ui/crw_web_view_proxy.h"
#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
#import "ios/web/public/web_state.h"

@implementation ScreenshotDelegate {
  id<BrowserProviderInterface> _browserProviderInterface;
}

- (instancetype)initWithBrowserProviderInterface:
    (id<BrowserProviderInterface>)browserProviderInterface {
  self = [super init];
  if (self) {
    _browserProviderInterface = browserProviderInterface;
  }
  return self;
}

#pragma mark - UIScreenshotServiceDelegate

// When there are multiple windows in the foreground UIKit will ask each
// UIScreenshotServiceDelegate for the PDF data and will display the PDF data of
// the widest window in the foreground.
- (void)screenshotService:(UIScreenshotService*)screenshotService
    generatePDFRepresentationWithCompletion:
        (void (^)(NSData*, NSInteger, CGRect))completionHandler {
  Browser* browser = _browserProviderInterface.currentBrowserProvider.browser;

  if (!browser) {
    completionHandler(nil, 0, CGRectZero);
    return;
  }

  web::WebState* webState = browser->GetWebStateList()->GetActiveWebState();

  if (!webState) {
    completionHandler(nil, 0, CGRectZero);
    return;
  }

  // Pass the currently viewed frame to maintain scroll position in the
  // screenshot editing tool.
  id<CRWWebViewProxy> webProxy = webState->GetWebViewProxy();
  CRWWebViewScrollViewProxy* scrollProxy = webProxy.scrollViewProxy;
  CGPoint contentOffset = scrollProxy.contentOffset;
  CGSize contentSize = scrollProxy.contentSize;
  CGRect webViewFrame = scrollProxy.frame;
  webViewFrame.origin.x = contentOffset.x;
  webViewFrame.origin.y =
      contentSize.height - webViewFrame.size.height - contentOffset.y;

  base::OnceCallback<void(NSData*)> callback =
      base::BindOnce(^(NSData* pdfDoumentData) {
        completionHandler(pdfDoumentData, 0, webViewFrame);
      });

  webState->CreateFullPagePdf(std::move(callback));
}

@end