(前回)Cocoaの日々: Cocoaの日々: Safari用独自プラグインを作る(16) - ツールバーを追加する #5
今回はボタンを押してスクリーンショットが撮ってみよう。
スクリーンショットを撮る
スクリーンショットを撮るには WebView が必要。これをどこから手に入れるか。
再び Safari のヘッダファイルを眺めていると BrowserDocument.h に _currentWebView というメンバ変数およびゲッターメソッドがあった。
BrowserDocument.h
@interface BrowserDocument : NSDocument{ BrowserWebView *_currentWebView; : } : - (id)currentWebView; :
恐らくここにアクティブな WebView が入っているのだろう、とあたりを付けてコードを書いてみる。
SXSafariToolbarSwizzler.m
- (void)takeScreenshot:(id)sender
{
NSWindow* win = [sender window];
NSWindowController* wc = [win windowController];
NSDocument* doc = [wc document] ;
WebView* web_view = [doc performSelector:@selector(currentWebView)];
NSView* doc_view = [[[web_view mainFrame] frameView] documentView];
NSBitmapImageRep* bitmap = [doc_view bitmapImageRepForCachingDisplayInRect:[doc_view bounds]];
[doc_view cacheDisplayInRect:[doc_view bounds] toBitmapImageRep:bitmap];
NSData* outdata = [bitmap representationUsingType:NSPNGFileType
properties:[NSDictionary dictionary]];
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES);
NSString* path = [NSString stringWithFormat:@"%@/test.png", [paths objectAtIndex:0]];
[outdata writeToFile:path atomically:YES];
NSLog(@"took a screenshot (from toolbar)");
}
BrowserWindow のインスタンスは WindowController(NSWindowControllerのサブクラス)から、WindowController は sender(ボタンすなわちNSButton)の windowを経由して取得した。実態はそれぞれ Safari のサブクラスなのだが、ビルド時に Warningが出るのを嫌ってすべて親クラスで通した。スクリーンショットを撮る部分は以前のメニューの時と同じコード。
さて実行してみよう。Safari が起動したらボタンを押す。
できた。
おおこれはいいかも。
その後、別のウィンドウを開いたり、タブを複数開いたりと試してみたがうまく動いているようだ。-[BrowserDocument currentWebView] が目的の WebView だった。
ソースコードはこちら
SafariPlugInStudy at 1 from xcatsan's SampleCode - GitHub
(メモ)git のタグ打ち
$ git tag <tag>
$ git push --tags
- - - -
今回までで当初の目的は達成できた。この後は検証ではなく、ちゃんとアプリケーション開発に入る予定。