2011-03-31 Sam Weinig <sam@webkit.org>
[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 <WebCore/LocalizedStrings.h>
36 #import <wtf/text/WTFString.h>
37
38 using namespace WebCore;
39 using namespace WebKit;
40
41 // The height needed to match a typical NSToolbar.
42 static const CGFloat windowContentBorderThickness = 55;
43
44 // WebInspectorProxyObjCAdapter is a helper ObjC object used as a delegate or notification observer
45 // for the sole purpose of getting back into the C++ code from an ObjC caller.
46
47 @interface WebInspectorProxyObjCAdapter : NSObject <NSWindowDelegate> {
48     WebInspectorProxy* _inspectorProxy; // Not retained to prevent cycles
49 }
50
51 - (id)initWithWebInspectorProxy:(WebInspectorProxy*)inspectorProxy;
52
53 @end
54
55 @implementation WebInspectorProxyObjCAdapter
56
57 - (id)initWithWebInspectorProxy:(WebInspectorProxy*)inspectorProxy
58 {
59     ASSERT_ARG(inspectorProxy, inspectorProxy);
60
61     if (!(self = [super init]))
62         return nil;
63
64     _inspectorProxy = inspectorProxy; // Not retained to prevent cycles
65
66     return self;
67 }
68
69 - (void)windowWillClose:(NSNotification *)notification
70 {
71     _inspectorProxy->close();
72 }
73
74 @end
75
76 namespace WebKit {
77
78 WebPageProxy* WebInspectorProxy::platformCreateInspectorPage()
79 {
80     ASSERT(m_page);
81     ASSERT(!m_inspectorView);
82
83     m_inspectorView.adoptNS([[WKView alloc] initWithFrame:NSZeroRect contextRef:toAPI(page()->context()) pageGroupRef:toAPI(inspectorPageGroup())]);
84     ASSERT(m_inspectorView);
85
86     [m_inspectorView.get() setDrawsBackground:NO];
87
88     return toImpl(m_inspectorView.get().pageRef);
89 }
90
91 void WebInspectorProxy::platformOpen()
92 {
93     ASSERT(!m_inspectorWindow);
94
95     m_inspectorProxyObjCAdapter.adoptNS([[WebInspectorProxyObjCAdapter alloc] initWithWebInspectorProxy:this]);
96
97     // FIXME: support opening in docked mode here.
98
99     NSUInteger styleMask = (NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask | NSTexturedBackgroundWindowMask);
100     NSWindow *window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, initialWindowWidth, initialWindowHeight) styleMask:styleMask backing:NSBackingStoreBuffered defer:NO];
101     [window setAutorecalculatesContentBorderThickness:NO forEdge:NSMaxYEdge];
102     [window setContentBorderThickness:windowContentBorderThickness forEdge:NSMaxYEdge];
103     [window setDelegate:m_inspectorProxyObjCAdapter.get()];
104     [window setMinSize:NSMakeSize(minimumWindowWidth, minimumWindowHeight)];
105     [window setReleasedWhenClosed:NO];
106
107     // Center the window initially before setting the frame autosave name so that the window will be in a good
108     // position if there is no saved frame yet.
109     [window center];
110     [window setFrameAutosaveName:@"Web Inspector 2"];
111
112     WKNSWindowMakeBottomCornersSquare(window);
113
114     NSView *contentView = [window contentView];
115     [m_inspectorView.get() setFrame:[contentView bounds]];
116     [m_inspectorView.get() setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
117     [contentView addSubview:m_inspectorView.get()];
118
119     [window makeKeyAndOrderFront:nil];
120
121     m_inspectorWindow.adoptNS(window);
122 }
123
124 void WebInspectorProxy::platformClose()
125 {
126     // FIXME: support closing in docked mode here.
127
128     [m_inspectorWindow.get() setDelegate:nil];
129     [m_inspectorWindow.get() orderOut:nil];
130
131     m_inspectorWindow = 0;
132     m_inspectorView = 0;
133     m_inspectorProxyObjCAdapter = 0;
134 }
135
136 void WebInspectorProxy::platformInspectedURLChanged(const String& urlString)
137 {
138     NSString *title = [NSString stringWithFormat:WEB_UI_STRING("Web Inspector — %@", "Web Inspector window title"), (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)