2011-02-23 Anders Carlsson <andersca@apple.com>
[WebKit-https.git] / Source / WebKit2 / UIProcess / mac / WebInspectorProxyMac.mm
1 /*
2  * Copyright (C) 2010 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "WebInspectorProxy.h"
28
29 #if ENABLE(INSPECTOR)
30
31 #import "WKAPICast.h"
32 #import "WKView.h"
33 #import "WebPageProxy.h"
34 #import <WebKitSystemInterface.h>
35 #import <wtf/text/WTFString.h>
36
37 using namespace WebCore;
38 using namespace WebKit;
39
40 // The height needed to match a typical NSToolbar.
41 static const CGFloat windowContentBorderThickness = 55;
42
43 // WebInspectorProxyObjCAdapter is a helper ObjC object used as a delegate or notification observer
44 // for the sole purpose of getting back into the C++ code from an ObjC caller.
45
46 @interface WebInspectorProxyObjCAdapter : NSObject <NSWindowDelegate> {
47     WebInspectorProxy* _inspectorProxy; // Not retained to prevent cycles
48 }
49
50 - (id)initWithWebInspectorProxy:(WebInspectorProxy*)inspectorProxy;
51
52 @end
53
54 @implementation WebInspectorProxyObjCAdapter
55
56 - (id)initWithWebInspectorProxy:(WebInspectorProxy*)inspectorProxy
57 {
58     ASSERT_ARG(inspectorProxy, inspectorProxy);
59
60     if (!(self = [super init]))
61         return nil;
62
63     _inspectorProxy = inspectorProxy; // Not retained to prevent cycles
64
65     return self;
66 }
67
68 - (void)windowWillClose:(NSNotification *)notification
69 {
70     _inspectorProxy->close();
71 }
72
73 @end
74
75 namespace WebKit {
76
77 WebPageProxy* WebInspectorProxy::platformCreateInspectorPage()
78 {
79     ASSERT(m_page);
80     ASSERT(!m_inspectorView);
81
82     m_inspectorView.adoptNS([[WKView alloc] initWithFrame:NSZeroRect contextRef:toAPI(page()->context()) pageGroupRef:toAPI(inspectorPageGroup())]);
83     ASSERT(m_inspectorView);
84
85     [m_inspectorView.get() setDrawsBackground:NO];
86
87     return toImpl(m_inspectorView.get().pageRef);
88 }
89
90 void WebInspectorProxy::platformOpen()
91 {
92     ASSERT(!m_inspectorWindow);
93
94     m_inspectorProxyObjCAdapter.adoptNS([[WebInspectorProxyObjCAdapter alloc] initWithWebInspectorProxy:this]);
95
96     // FIXME: support opening in docked mode here.
97
98     NSUInteger styleMask = (NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask | NSTexturedBackgroundWindowMask);
99     NSWindow *window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, initialWindowWidth, initialWindowHeight) styleMask:styleMask backing:NSBackingStoreBuffered defer:NO];
100     [window setAutorecalculatesContentBorderThickness:NO forEdge:NSMaxYEdge];
101     [window setContentBorderThickness:windowContentBorderThickness forEdge:NSMaxYEdge];
102     [window setDelegate:m_inspectorProxyObjCAdapter.get()];
103     [window setMinSize:NSMakeSize(minimumWindowWidth, minimumWindowHeight)];
104     [window setReleasedWhenClosed:NO];
105
106     // Center the window initially before setting the frame autosave name so that the window will be in a good
107     // position if there is no saved frame yet.
108     [window center];
109     [window setFrameAutosaveName:@"Web Inspector 2"];
110
111     WKNSWindowMakeBottomCornersSquare(window);
112
113     NSView *contentView = [window contentView];
114     [m_inspectorView.get() setFrame:[contentView bounds]];
115     [m_inspectorView.get() setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
116     [contentView addSubview:m_inspectorView.get()];
117
118     [window makeKeyAndOrderFront:nil];
119
120     m_inspectorWindow.adoptNS(window);
121 }
122
123 void WebInspectorProxy::platformClose()
124 {
125     // FIXME: support closing in docked mode here.
126
127     [m_inspectorWindow.get() setDelegate:nil];
128     [m_inspectorWindow.get() orderOut:nil];
129
130     m_inspectorWindow = 0;
131     m_inspectorView = 0;
132     m_inspectorProxyObjCAdapter = 0;
133 }
134
135 void WebInspectorProxy::platformInspectedURLChanged(const String& urlString)
136 {
137     // FIXME: this should be made localizable once WebKit2 supports it. <rdar://problem/8728860>
138     NSString *title = [NSString stringWithFormat:@"Web Inspector \u2014 %@", (NSString *)urlString];
139     [m_inspectorWindow.get() setTitle:title];
140 }
141
142 String WebInspectorProxy::inspectorPageURL() const
143 {
144     NSString *path = [[NSBundle bundleWithIdentifier:@"com.apple.WebCore"] pathForResource:@"inspector" ofType:@"html" inDirectory:@"inspector"];
145     ASSERT(path);
146
147     return [[NSURL fileURLWithPath:path] absoluteString];
148 }
149
150 } // namespace WebKit
151
152 #endif // ENABLE(INSPECTOR)