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