OSDN Git Service

Mavericksで起動しない問題を修正
[kcd/KCD.git] / KCD / HMGameViewController.m
1 //
2 //  HMGameViewController.m
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2015/12/06.
6 //  Copyright (c) 2015年 Hori,Masaki. All rights reserved.
7 //
8
9 #import "HMGameViewController.h"
10
11 #import <WebKit/WebKit.h>
12 #import <JavaScriptCore/JavaScriptCore.h>
13
14 #import "HMAppDelegate.h"
15 #import "HMUserDefaults.h"
16 #import "HMScreenshotListWindowController.h"
17 #import "HMProgressPanel.h"
18
19 @interface HMGameViewController ()
20 @property NSPoint flashTopLeft;
21
22 @property (readonly) NSClipView *clipView;
23
24 @property (weak, nonatomic) IBOutlet WebView *webView;
25
26 @end
27
28 static NSString *gamePageURL = @"http://www.dmm.com/netgame/social/-/gadgets/=/app_id=854854/";
29 static NSString *loginPageURLPrefix = @"https://www.dmm.com/my/-/login/=/";
30
31 @implementation HMGameViewController
32
33 - (id)init
34 {
35         self = [super initWithNibName:NSStringFromClass([self class]) bundle:nil];
36         return self;
37 }
38 - (void)awakeFromNib
39 {
40         [self.clipView setDocumentView:self.webView];
41         
42         self.flashTopLeft = NSMakePoint(2600, 145);
43         [self adjustFlash];
44         
45         [[[self.webView mainFrame] frameView] setAllowsScrolling:NO];
46         
47         HMAppDelegate *appDelegate = [[NSApplication sharedApplication] delegate];
48         [self.webView setApplicationNameForUserAgent:appDelegate.appNameForUserAgent];
49         [self.webView setMainFrameURL:gamePageURL];
50         
51         // for Maverick
52         if(floor(NSAppKitVersionNumber) == NSAppKitVersionNumber10_9) {
53                 self.webView.layerUsesCoreImageFilters = YES;
54         }
55 }
56
57 - (NSClipView *)clipView
58 {
59         return (NSClipView *)self.view;
60 }
61
62 - (void)adjustFlash
63 {
64         id /*NSClipView * */ clip = [self.webView superview];
65         [clip scrollToPoint:self.flashTopLeft];
66 }
67
68
69 - (IBAction)reloadContent:(id)sender
70 {
71         // ゲームページでない場合はゲームページを表示する
72         NSString *currentURL = self.webView.mainFrameURL;
73         if(![currentURL isEqualToString:gamePageURL]) {
74                 [self.webView setMainFrameURL:gamePageURL];
75                 [self adjustFlash];
76                 return;
77         }
78         if([currentURL hasPrefix:loginPageURLPrefix]) {
79                 [self.webView reload:sender];
80                 return;
81         }
82         
83         [self adjustFlash];
84         
85         NSDate *prevDate = HMStandardDefaults.prevReloadDate;
86         if(prevDate) {
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", @"")
94                                                                                          defaultButton:nil
95                                                                                    alternateButton:nil
96                                                                                            otherButton:nil
97                                                                  informativeTextWithFormat:NSLocalizedString(@"Reload interval is too short.\nWait until %@.", @""), date];
98                         [alert runModal];
99                         
100                         return;
101                 }
102         }
103         
104         [self.webView reload:sender];
105         
106         HMStandardDefaults.prevReloadDate = [NSDate dateWithTimeIntervalSinceNow:0];
107 }
108 - (IBAction)deleteCacheAndReload:(id)sender
109 {
110         HMProgressPanel *panel = [HMProgressPanel new];
111         panel.title = @"";
112         panel.message = NSLocalizedString(@"Deleting caches...", @"Deleting caches...");
113         panel.animate = YES;
114         
115         [self.view.window beginSheet:panel.window
116                   completionHandler:^(NSModalResponse returnCode) {
117                           NSSound *sound = [NSSound soundNamed:@"Submarine"];
118                           [sound play];
119                   }];
120         
121         HMAppDelegate *appDelegate = [[NSApplication sharedApplication] delegate];
122         [appDelegate clearCache];
123         [self.webView reload:sender];
124         
125         [self.view.window endSheet:panel.window];
126 }
127
128 - (IBAction)screenShot:(id)sender
129 {
130         NSView *contentView = self.view.window.contentView;
131         
132         NSRect frame = [contentView convertRect:[self.webView visibleRect] fromView:self.webView];
133         CGFloat screenShotBorderWidth = HMStandardDefaults.screenShotBorderWidth;
134         frame = NSInsetRect(frame, -screenShotBorderWidth, -screenShotBorderWidth);
135         
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]];
141         
142 }
143
144
145 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
146 {
147         SEL action = menuItem.action;
148         
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");
154                 } else {
155                         menuItem.title = NSLocalizedString(@"Back To Game", @"Reload menu, back to game");
156                 }
157                 return YES;
158         }
159         if(action == @selector(screenShot:)) {
160                 return YES;
161         }
162         return NO;
163 }
164
165 #pragma mark - WebFrameLoadDelegate
166 - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
167 {
168         WebDataSource *datasource = frame.dataSource;
169         NSURLRequest *request = datasource.initialRequest;
170         NSURL *url = request.URL;
171         NSString *path = url.path;
172         
173         void (^handler)(JSContext *context, JSValue *exception) = ^(JSContext *context, JSValue *exception) {
174                 NSLog(@"caught exception in evaluateScript: -> %@", exception);
175         };
176         
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;"
185                  ];
186                 JSValue *top = context[@"atop"];
187                 JSValue *left = context[@"aleft"];
188                 
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);
191         }
192         
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;"
199                  @"if(iframe) {"
200                  @"    validIframe = 1;"
201                  @"    var rect = iframe.getBoundingClientRect();"
202                  @"    var atop = rect.top;"
203                  @"    var aleft = rect.left;"
204                  @"}"
205                  ];
206                 int32_t validIframe = context[@"validIframe"].toInt32;
207                 if(validIframe == 0) {
208                         //                      NSLog(@"game_frame is invalid");
209                         return;
210                 }
211                 
212                 JSValue *top = context[@"atop"];
213                 JSValue *left = context[@"aleft"];
214                 
215                 self.flashTopLeft = NSMakePoint(self.flashTopLeft.x + left.toDouble, self.flashTopLeft.y - top.toDouble);
216                 [self adjustFlash];
217         }
218 }
219
220 #pragma mark - WebUIDelegate
221 - (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems
222 {
223         NSMutableArray *items = [NSMutableArray new];
224         for(NSMenuItem *item in defaultMenuItems) {
225                 switch([item tag]) {
226                         case WebMenuItemTagOpenLinkInNewWindow:
227                         case WebMenuItemTagDownloadLinkToDisk:
228                         case WebMenuItemTagOpenImageInNewWindow:
229                         case WebMenuItemTagOpenFrameInNewWindow:
230                         case WebMenuItemTagGoBack:
231                         case WebMenuItemTagGoForward:
232                         case WebMenuItemTagStop:
233                         case WebMenuItemTagReload:
234                                 break;
235                         default:
236                                 [items addObject:item];
237                                 break;
238                 }
239         }
240         return items;
241 }
242 @end