2 // HMGameViewController.m
5 // Created by Hori,Masaki on 2015/12/06.
6 // Copyright (c) 2015年 Hori,Masaki. All rights reserved.
9 #import "HMGameViewController.h"
11 #import <WebKit/WebKit.h>
12 #import <JavaScriptCore/JavaScriptCore.h>
14 #import "HMAppDelegate.h"
15 #import "HMUserDefaults.h"
16 #import "HMScreenshotListWindowController.h"
17 #import "HMProgressPanel.h"
19 @interface HMGameViewController ()
20 @property NSPoint flashTopLeft;
22 @property (readonly) NSClipView *clipView;
24 @property (weak, nonatomic) IBOutlet WebView *webView;
28 static NSString *gamePageURL = @"http://www.dmm.com/netgame/social/-/gadgets/=/app_id=854854/";
29 static NSString *loginPageURLPrefix = @"https://www.dmm.com/my/-/login/=/";
31 @implementation HMGameViewController
35 self = [super initWithNibName:NSStringFromClass([self class]) bundle:nil];
40 [self.clipView setDocumentView:self.webView];
42 self.flashTopLeft = NSMakePoint(2600, 145);
45 [[[self.webView mainFrame] frameView] setAllowsScrolling:NO];
47 HMAppDelegate *appDelegate = [[NSApplication sharedApplication] delegate];
48 [self.webView setApplicationNameForUserAgent:appDelegate.appNameForUserAgent];
49 [self.webView setMainFrameURL:gamePageURL];
52 if(floor(NSAppKitVersionNumber) == NSAppKitVersionNumber10_9) {
53 self.webView.layerUsesCoreImageFilters = YES;
57 - (NSClipView *)clipView
59 return (NSClipView *)self.view;
64 id /*NSClipView * */ clip = [self.webView superview];
65 [clip scrollToPoint:self.flashTopLeft];
69 - (IBAction)reloadContent:(id)sender
71 // ゲームページでない場合はゲームページを表示する
72 NSString *currentURL = self.webView.mainFrameURL;
73 if(![currentURL isEqualToString:gamePageURL]) {
74 [self.webView setMainFrameURL:gamePageURL];
78 if([currentURL hasPrefix:loginPageURLPrefix]) {
79 [self.webView reload:sender];
85 NSDate *prevDate = HMStandardDefaults.prevReloadDate;
87 NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0];
88 if([now timeIntervalSinceDate:prevDate] < 1 * 60) {
89 NSDate *untilDate = [prevDate dateByAddingTimeInterval:1 * 60];
90 NSString *date = [NSDateFormatter localizedStringFromDate:untilDate
91 dateStyle:NSDateFormatterNoStyle
92 timeStyle:NSDateFormatterMediumStyle];
93 NSAlert *alert = [NSAlert alertWithMessageText:NSLocalizedString(@"Reload interval is too short", @"")
97 informativeTextWithFormat:NSLocalizedString(@"Reload interval is too short.\nWait until %@.", @""), date];
104 [self.webView reload:sender];
106 HMStandardDefaults.prevReloadDate = [NSDate dateWithTimeIntervalSinceNow:0];
108 - (IBAction)deleteCacheAndReload:(id)sender
110 HMProgressPanel *panel = [HMProgressPanel new];
112 panel.message = NSLocalizedString(@"Deleting caches...", @"Deleting caches...");
115 [self.view.window beginSheet:panel.window
116 completionHandler:^(NSModalResponse returnCode) {
117 NSSound *sound = [NSSound soundNamed:@"Submarine"];
121 HMAppDelegate *appDelegate = [[NSApplication sharedApplication] delegate];
122 [appDelegate clearCache];
123 [self.webView reload:sender];
125 [self.view.window endSheet:panel.window];
128 - (IBAction)screenShot:(id)sender
130 NSView *contentView = self.view.window.contentView;
132 NSRect frame = [contentView convertRect:[self.webView visibleRect] fromView:self.webView];
133 CGFloat screenShotBorderWidth = HMStandardDefaults.screenShotBorderWidth;
134 frame = NSInsetRect(frame, -screenShotBorderWidth, -screenShotBorderWidth);
136 NSBitmapImageRep *rep = [contentView bitmapImageRepForCachingDisplayInRect:frame];
137 [contentView cacheDisplayInRect:frame toBitmapImageRep:rep];
138 HMAppDelegate *appDelegate = [[NSApplication sharedApplication] delegate];
139 HMScreenshotListWindowController *slwController = appDelegate.screenshotListWindowController;
140 [slwController registerScreenshot:rep fromOnScreen:[contentView convertRect:frame toView:nil]];
145 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
147 SEL action = menuItem.action;
149 if(action == @selector(reloadContent:)) {
150 if([self.webView.mainFrameURL isEqualToString:gamePageURL]) {
151 menuItem.title = NSLocalizedString(@"Reload", @"Reload menu, reload");
152 } else if ([self.webView.mainFrameURL hasPrefix:loginPageURLPrefix]) {
153 menuItem.title = NSLocalizedString(@"Reload", @"Reload menu, reload");
155 menuItem.title = NSLocalizedString(@"Back To Game", @"Reload menu, back to game");
159 if(action == @selector(screenShot:)) {
165 #pragma mark - WebFrameLoadDelegate
166 - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
168 WebDataSource *datasource = frame.dataSource;
169 NSURLRequest *request = datasource.initialRequest;
170 NSURL *url = request.URL;
171 NSString *path = url.path;
173 void (^handler)(JSContext *context, JSValue *exception) = ^(JSContext *context, JSValue *exception) {
174 NSLog(@"caught exception in evaluateScript: -> %@", exception);
177 if([path hasSuffix:@"gadgets/ifr"]) {
178 JSContext *context = [frame javaScriptContext];
179 context.exceptionHandler = handler;
180 [context evaluateScript:
181 @"var emb = document.getElementById('flashWrap');"
182 @"var rect = emb.getBoundingClientRect();"
183 @"var atop = rect.top;"
184 @"var aleft = rect.left;"
186 JSValue *top = context[@"atop"];
187 JSValue *left = context[@"aleft"];
189 self.flashTopLeft = NSMakePoint(0, self.webView.frame.size.height);
190 self.flashTopLeft = NSMakePoint(self.flashTopLeft.x + left.toDouble, self.flashTopLeft.y - top.toDouble - 480);
193 if([path hasSuffix:@"app_id=854854"]) {
194 JSContext *context = [frame javaScriptContext];
195 context.exceptionHandler = handler;
196 [context evaluateScript:
197 @"var iframe = document.getElementById('game_frame');"
198 @"var validIframe = 0;"
201 @" var rect = iframe.getBoundingClientRect();"
202 @" var atop = rect.top;"
203 @" var aleft = rect.left;"
206 int32_t validIframe = context[@"validIframe"].toInt32;
207 if(validIframe == 0) {
208 // NSLog(@"game_frame is invalid");
212 JSValue *top = context[@"atop"];
213 JSValue *left = context[@"aleft"];
215 self.flashTopLeft = NSMakePoint(self.flashTopLeft.x + left.toDouble, self.flashTopLeft.y - top.toDouble);
220 #pragma mark - WebUIDelegate
221 - (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems
223 NSMutableArray *items = [NSMutableArray new];
224 for(NSMenuItem *item in defaultMenuItems) {
226 case WebMenuItemTagOpenLinkInNewWindow:
227 case WebMenuItemTagDownloadLinkToDisk:
228 case WebMenuItemTagOpenImageInNewWindow:
229 case WebMenuItemTagOpenFrameInNewWindow:
230 case WebMenuItemTagGoBack:
231 case WebMenuItemTagGoForward:
232 case WebMenuItemTagStop:
233 case WebMenuItemTagReload:
236 [items addObject:item];