ページ

2009年11月6日金曜日

Cocoaの日々: Safari用独自プラグインを作る(17) - ツールバーを追加する #6

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

(前回)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


- - - -
今回までで当初の目的は達成できた。この後は検証ではなく、ちゃんとアプリケーション開発に入る予定。