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