(前回)Cocoaの日々: Safari用独自プラグインを作る(10) - コンテキストメニューの調査
さていよいよ本題の(?)スクリーンショットを試す。コンテキストメニューへの独自メニュー追加はできているので、ここにスクリーンショットを撮る処理を追加する。
まずメニュー追加の箇所。
SXSafariContextMenuSwizzler.m
- (NSArray *)_sx_webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element
defaultMenuItems:(NSArray *)defaultMenuItems {
NSArray* menu_items = [self _sx_webView:sender
contextMenuItemsForElement:element
defaultMenuItems:defaultMenuItems];
NSMutableArray* new_menu_items = [NSMutableArray arrayWithArray:menu_items];
[new_menu_items addObject:[NSMenuItem separatorItem]];
NSMenuItem* item = [[[NSMenuItem alloc] initWithTitle:@"Take a screenshot"
action:@selector(takeScreenshot:)
keyEquivalent:@""] autorelease];
[item setRepresentedObject:sender];
[item setTarget:_shared_instance];
[new_menu_items addObject:item];
return new_menu_items;
}
そしてスクリーンショットを撮る処理。
- (void)takeScreenshot:(id)sender
{
WebView* web_view = [sender representedObject];
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");
}
これは以前検証した時のコードを参考にした
Cocoaの日々: WebKit検証(3) - ビューを画像に保存
Cocoaの日々: WebKit検証(4) - Webのキャプチャ
さて実行してみよう。
apple.com を撮影してみる。まずページを開く。
コンテキストメニューから "Take a screenshot" を選択する。
デスクトップに画像ファイルが作成された。
できた。
おお、いい感じだ。
ついでに Flash ページも見ておく。Flashが含まれるページを開く。
撮影すると。。
出た。
Flash でも問題ないな。
以前の検証ではこの方法を使った場合 Flashの色がおかしかったが今回は問題なかった。 Safariをバージョンアップしたせいかもしれない(以前の検証時は バージョン 3、現在はバージョン 4)。
(以前のFlash検証)Cocoaの日々: WebKit検証(11) - Flash