165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/* 265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved. 365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without 565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions 665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met: 765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright 865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer. 965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer in the 1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * documentation and/or other materials provided with the distribution. 1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE. 2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */ 2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "config.h" 2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebInspectorProxy.h" 2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if ENABLE(INSPECTOR) 3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WKAPICast.h" 3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WKView.h" 3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebPageProxy.h" 342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#import "WebProcessProxy.h" 3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebKitSystemInterface.h> 362bde8e466a4451c7319e3a072d118917957d6554Steve Block#import <WebCore/LocalizedStrings.h> 3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <wtf/text/WTFString.h> 3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore; 4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebKit; 4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// The height needed to match a typical NSToolbar. 4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const CGFloat windowContentBorderThickness = 55; 4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// WebInspectorProxyObjCAdapter is a helper ObjC object used as a delegate or notification observer 4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// for the sole purpose of getting back into the C++ code from an ObjC caller. 4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@interface WebInspectorProxyObjCAdapter : NSObject <NSWindowDelegate> { 4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch WebInspectorProxy* _inspectorProxy; // Not retained to prevent cycles 5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (id)initWithWebInspectorProxy:(WebInspectorProxy*)inspectorProxy; 5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end 5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@implementation WebInspectorProxyObjCAdapter 5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (id)initWithWebInspectorProxy:(WebInspectorProxy*)inspectorProxy 5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT_ARG(inspectorProxy, inspectorProxy); 6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!(self = [super init])) 6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return nil; 6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _inspectorProxy = inspectorProxy; // Not retained to prevent cycles 6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return self; 6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)windowWillClose:(NSNotification *)notification 7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _inspectorProxy->close(); 7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end 7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit { 7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebPageProxy* WebInspectorProxy::platformCreateInspectorPage() 8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(m_page); 8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(!m_inspectorView); 8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_inspectorView.adoptNS([[WKView alloc] initWithFrame:NSZeroRect contextRef:toAPI(page()->process()->context()) pageGroupRef:toAPI(inspectorPageGroup())]); 8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(m_inspectorView); 8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch [m_inspectorView.get() setDrawsBackground:NO]; 8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return toImpl(m_inspectorView.get().pageRef); 9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebInspectorProxy::platformOpen() 9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(!m_inspectorWindow); 9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_inspectorProxyObjCAdapter.adoptNS([[WebInspectorProxyObjCAdapter alloc] initWithWebInspectorProxy:this]); 9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // FIXME: support opening in docked mode here. 9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSUInteger styleMask = (NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask | NSTexturedBackgroundWindowMask); 10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSWindow *window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, initialWindowWidth, initialWindowHeight) styleMask:styleMask backing:NSBackingStoreBuffered defer:NO]; 10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [window setAutorecalculatesContentBorderThickness:NO forEdge:NSMaxYEdge]; 10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [window setContentBorderThickness:windowContentBorderThickness forEdge:NSMaxYEdge]; 10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [window setDelegate:m_inspectorProxyObjCAdapter.get()]; 10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [window setMinSize:NSMakeSize(minimumWindowWidth, minimumWindowHeight)]; 10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [window setReleasedWhenClosed:NO]; 10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Center the window initially before setting the frame autosave name so that the window will be in a good 10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // position if there is no saved frame yet. 11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [window center]; 11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [window setFrameAutosaveName:@"Web Inspector 2"]; 11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch WKNSWindowMakeBottomCornersSquare(window); 11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSView *contentView = [window contentView]; 11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [m_inspectorView.get() setFrame:[contentView bounds]]; 11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [m_inspectorView.get() setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; 11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [contentView addSubview:m_inspectorView.get()]; 11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [window makeKeyAndOrderFront:nil]; 12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_inspectorWindow.adoptNS(window); 12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebInspectorProxy::platformClose() 12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // FIXME: support closing in docked mode here. 12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [m_inspectorWindow.get() setDelegate:nil]; 13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [m_inspectorWindow.get() orderOut:nil]; 13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_inspectorWindow = 0; 13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_inspectorView = 0; 13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_inspectorProxyObjCAdapter = 0; 13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid WebInspectorProxy::platformInspectedURLChanged(const String& urlString) 13881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 1392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch NSString *title = [NSString stringWithFormat:WEB_UI_STRING("Web Inspector — %@", "Web Inspector window title"), (NSString *)urlString]; 14081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch [m_inspectorWindow.get() setTitle:title]; 14181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 14281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochString WebInspectorProxy::inspectorPageURL() const 14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSString *path = [[NSBundle bundleWithIdentifier:@"com.apple.WebCore"] pathForResource:@"inspector" ofType:@"html" inDirectory:@"inspector"]; 14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(path); 14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return [[NSURL fileURLWithPath:path] absoluteString]; 14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit 15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // ENABLE(INSPECTOR) 154