18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebInspectorClient.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "DOMNodeInternal.h"
320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebDelegateImplementationCaching.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFrameInternal.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFrameView.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebInspector.h"
36f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#import "WebInspectorPrivate.h"
37f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#import "WebInspectorFrontend.h"
3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#import "WebLocalizableStringsInternal.h"
392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#import "WebNodeHighlighter.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebUIDelegate.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebViewInternal.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/InspectorController.h>
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/Page.h>
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/DOMExtensions.h>
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKitSystemInterface.h>
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <wtf/PassOwnPtr.h>
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore;
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface WebInspectorWindowController : NSWindowController <NSWindowDelegate> {
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@private
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView *_inspectedWebView;
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView *_webView;
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebInspectorFrontendClient* _frontendClient;
55545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    WebInspectorClient* _inspectorClient;
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL _attachedToInspectedWebView;
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL _shouldAttach;
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL _visible;
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    BOOL _destroyingInspectorView;
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithInspectedWebView:(WebView *)webView;
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebView *)webView;
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)attach;
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)detach;
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (BOOL)attached;
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)setFrontendClient:(WebInspectorFrontendClient*)frontendClient;
67545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch- (void)setInspectorClient:(WebInspectorClient*)inspectorClient;
682bde8e466a4451c7319e3a072d118917957d6554Steve Block- (WebInspectorClient*)inspectorClient;
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setAttachedWindowHeight:(unsigned)height;
705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick- (void)destroyInspectorView:(bool)notifyInspectorController;
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block@end
72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
74cad810f21b803229eb11403f9209855525a25d57Steve Block// MARK: -
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebInspectorClient::WebInspectorClient(WebView *webView)
772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    : m_webView(webView)
782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_highlighter(AdoptNS, [[WebNodeHighlighter alloc] initWithInspectedWebView:webView])
792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_frontendPage(0)
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WebInspectorClient::inspectorDestroyed()
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete this;
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebInspectorClient::openInspectorFrontend(InspectorController* inspectorController)
89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RetainPtr<WebInspectorWindowController> windowController(AdoptNS, [[WebInspectorWindowController alloc] initWithInspectedWebView:m_webView]);
91545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    [windowController.get() setInspectorClient:this];
92f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
93545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    m_frontendPage = core([windowController.get() webView]);
942bde8e466a4451c7319e3a072d118917957d6554Steve Block    OwnPtr<WebInspectorFrontendClient> frontendClient = adoptPtr(new WebInspectorFrontendClient(m_webView, windowController.get(), inspectorController, m_frontendPage, createFrontendSettings()));
952bde8e466a4451c7319e3a072d118917957d6554Steve Block    RetainPtr<WebInspectorFrontend> webInspectorFrontend(AdoptNS, [[WebInspectorFrontend alloc] initWithFrontendClient:frontendClient.get()]);
962bde8e466a4451c7319e3a072d118917957d6554Steve Block    [[m_webView inspector] setFrontend:webInspectorFrontend.get()];
972bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_frontendPage->inspectorController()->setInspectorFrontendClient(frontendClient.release());
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebInspectorClient::highlight(Node* node)
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [m_highlighter.get() highlightNode:kit(node)];
103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebInspectorClient::hideHighlight()
106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [m_highlighter.get() hideHighlight];
108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1102fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWebInspectorFrontendClient::WebInspectorFrontendClient(WebView* inspectedWebView, WebInspectorWindowController* windowController, InspectorController* inspectorController, Page* frontendPage, WTF::PassOwnPtr<Settings> settings)
1112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : InspectorFrontendClientLocal(inspectorController,  frontendPage, settings)
112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_inspectedWebView(inspectedWebView)
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_windowController(windowController)
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [windowController setFrontendClient:this];
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebInspectorFrontendClient::frontendLoaded()
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [m_windowController.get() showWindow:nil];
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if ([m_windowController.get() attached])
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        restoreAttachedWindowHeight();
123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    InspectorFrontendClientLocal::frontendLoaded();
125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebFrame *frame = [m_inspectedWebView mainFrame];
127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebFrameLoadDelegateImplementationCache* implementations = WebViewGetFrameLoadDelegateImplementations(m_inspectedWebView);
129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (implementations->didClearInspectorWindowObjectForFrameFunc)
130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        CallFrameLoadDelegate(implementations->didClearInspectorWindowObjectForFrameFunc, m_inspectedWebView,
131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                              @selector(webView:didClearInspectorWindowObject:forFrame:), [frame windowObject], frame);
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool attached = [m_windowController.get() attached];
134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    setAttachedWindow(attached);
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockString WebInspectorFrontendClient::localizedStringsURL()
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *path = [[NSBundle bundleWithIdentifier:@"com.apple.WebCore"] pathForResource:@"localizedStrings" ofType:@"js"];
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (path)
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [[NSURL fileURLWithPath:path] absoluteString];
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return String();
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockString WebInspectorFrontendClient::hiddenPanels()
146563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
147563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    NSString *hiddenPanels = [[NSUserDefaults standardUserDefaults] stringForKey:@"WebKitInspectorHiddenPanels"];
148563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (hiddenPanels)
149563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return hiddenPanels;
150563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return String();
151563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
152563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebInspectorFrontendClient::bringToFront()
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    updateWindowTitle();
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [m_windowController.get() showWindow:nil];
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebInspectorFrontendClient::closeWindow()
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    [m_windowController.get() destroyInspectorView:true];
1625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
1635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid WebInspectorFrontendClient::disconnectFromBackend()
1655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
1665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    [m_windowController.get() destroyInspectorView:false];
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebInspectorFrontendClient::attachWindow()
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if ([m_windowController.get() attached])
172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [m_windowController.get() attach];
174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    restoreAttachedWindowHeight();
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebInspectorFrontendClient::detachWindow()
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [m_windowController.get() detach];
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebInspectorFrontendClient::setAttachedWindowHeight(unsigned height)
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [m_windowController.get() setAttachedWindowHeight:height];
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebInspectorFrontendClient::inspectedURLChanged(const String& newURL)
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_inspectedURL = newURL;
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    updateWindowTitle();
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1932bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebInspectorFrontendClient::saveSessionSetting(const String& key, const String& value)
1942bde8e466a4451c7319e3a072d118917957d6554Steve Block{
1952bde8e466a4451c7319e3a072d118917957d6554Steve Block    WebInspectorClient* client = [m_windowController.get() inspectorClient];
1962bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (client)
1972bde8e466a4451c7319e3a072d118917957d6554Steve Block        client->saveSessionSetting(key, value);
1982bde8e466a4451c7319e3a072d118917957d6554Steve Block}
1992bde8e466a4451c7319e3a072d118917957d6554Steve Block
2002bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebInspectorFrontendClient::loadSessionSetting(const String& key, String* value)
2012bde8e466a4451c7319e3a072d118917957d6554Steve Block{
2022bde8e466a4451c7319e3a072d118917957d6554Steve Block    WebInspectorClient* client = [m_windowController.get() inspectorClient];
2032bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (client)
2042bde8e466a4451c7319e3a072d118917957d6554Steve Block        client->loadSessionSetting(key, value);
2052bde8e466a4451c7319e3a072d118917957d6554Steve Block}
2062bde8e466a4451c7319e3a072d118917957d6554Steve Block
207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebInspectorFrontendClient::updateWindowTitle() const
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    NSString *title = [NSString stringWithFormat:UI_STRING_INTERNAL("Web Inspector — %@", "Web Inspector window title"), (NSString *)m_inspectedURL];
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[m_windowController.get() window] setTitle:title];
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
214cad810f21b803229eb11403f9209855525a25d57Steve Block// MARK: -
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebInspectorWindowController
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)init
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!(self = [super initWithWindow:nil]))
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Keep preferences separate from the rest of the client, making sure we are using expected preference values.
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebPreferences *preferences = [[WebPreferences alloc] init];
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [preferences setAutosaves:NO];
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [preferences setLoadsImagesAutomatically:YES];
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [preferences setAuthorAndUserStylesEnabled:YES];
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [preferences setJavaScriptEnabled:YES];
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [preferences setAllowsAnimatedImages:YES];
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [preferences setPlugInsEnabled:NO];
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [preferences setJavaEnabled:NO];
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [preferences setUserStyleSheetEnabled:NO];
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [preferences setTabsToLinks:NO];
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [preferences setMinimumFontSize:0];
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [preferences setMinimumLogicalFontSize:9];
2360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
2370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [preferences setFixedFontFamily:@"Menlo"];
2380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [preferences setDefaultFixedFontSize:11];
2390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
2400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [preferences setFixedFontFamily:@"Monaco"];
2410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [preferences setDefaultFixedFontSize:10];
2420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _webView = [[WebView alloc] init];
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_webView setPreferences:preferences];
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_webView setDrawsBackground:NO];
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_webView setProhibitsMainFrameScrolling:YES];
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_webView setUIDelegate:self];
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [preferences release];
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *path = [[NSBundle bundleWithIdentifier:@"com.apple.WebCore"] pathForResource:@"inspector" ofType:@"html" inDirectory:@"inspector"];
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL fileURLWithPath:path]];
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[_webView mainFrame] loadRequest:request];
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [request release];
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setWindowFrameAutosaveName:@"Web Inspector 2"];
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithInspectedWebView:(WebView *)webView
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!(self = [self init]))
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Don't retain to avoid a circular reference.
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _inspectedWebView = webView;
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_webView release];
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super dealloc];
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
277cad810f21b803229eb11403f9209855525a25d57Steve Block// MARK: -
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebView *)webView
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _webView;
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSWindow *)window
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSWindow *window = [super window];
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (window)
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return window;
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSUInteger styleMask = (NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask);
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    styleMask |= NSTexturedBackgroundWindowMask;
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    window = [[NSWindow alloc] initWithContentRect:NSMakeRect(60.0, 200.0, 750.0, 650.0) styleMask:styleMask backing:NSBackingStoreBuffered defer:NO];
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [window setDelegate:self];
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [window setMinSize:NSMakeSize(400.0, 400.0)];
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [window setAutorecalculatesContentBorderThickness:NO forEdge:NSMaxYEdge];
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [window setContentBorderThickness:55. forEdge:NSMaxYEdge];
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WKNSWindowMakeBottomCornersSquare(window);
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setWindow:window];
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [window release];
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return window;
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
313cad810f21b803229eb11403f9209855525a25d57Steve Block// MARK: -
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)windowShouldClose:(id)sender
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    [self destroyInspectorView:true];
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return YES;
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)close
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_visible)
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _visible = NO;
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_attachedToInspectedWebView) {
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([_inspectedWebView _isClosed])
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_webView removeFromSuperview];
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebFrameView *frameView = [[_inspectedWebView mainFrame] frameView];
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSRect frameViewRect = [frameView frame];
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Setting the height based on the previous height is done to work with
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Safari's find banner. This assumes the previous height is the Y origin.
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        frameViewRect.size.height += NSMinY(frameViewRect);
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        frameViewRect.origin.y = 0.0;
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [frameView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [frameView setFrame:frameViewRect];
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_inspectedWebView displayIfNeeded];
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [super close];
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)showWindow:(id)sender
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_visible) {
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!_attachedToInspectedWebView)
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [super showWindow:sender]; // call super so the window will be ordered front if needed
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _visible = YES;
3600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _shouldAttach = _inspectorClient->inspectorStartsAttached();
362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
363dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (_shouldAttach && !_frontendClient->canAttachWindow())
364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _shouldAttach = NO;
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_shouldAttach) {
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebFrameView *frameView = [[_inspectedWebView mainFrame] frameView];
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_webView removeFromSuperview];
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_inspectedWebView addSubview:_webView positioned:NSWindowBelow relativeTo:(NSView *)frameView];
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_webView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable | NSViewMaxYMargin)];
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [frameView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable | NSViewMinYMargin)];
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _attachedToInspectedWebView = YES;
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _attachedToInspectedWebView = NO;
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSView *contentView = [[self window] contentView];
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_webView setFrame:[contentView frame]];
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_webView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_webView removeFromSuperview];
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [contentView addSubview:_webView];
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [super showWindow:nil];
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
389cad810f21b803229eb11403f9209855525a25d57Steve Block// MARK: -
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)attach
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_attachedToInspectedWebView)
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _inspectorClient->setInspectorStartsAttached(true);
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self close];
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self showWindow:nil];
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)detach
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_attachedToInspectedWebView)
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _inspectorClient->setInspectorStartsAttached(false);
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self close];
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self showWindow:nil];
411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (BOOL)attached
414dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
415dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _attachedToInspectedWebView;
416dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)setFrontendClient:(WebInspectorFrontendClient*)frontendClient
419dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
420dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _frontendClient = frontendClient;
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
423545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch- (void)setInspectorClient:(WebInspectorClient*)inspectorClient
424545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
425545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    _inspectorClient = inspectorClient;
426545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
427545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
4282bde8e466a4451c7319e3a072d118917957d6554Steve Block- (WebInspectorClient*)inspectorClient
4292bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4302bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _inspectorClient;
4312bde8e466a4451c7319e3a072d118917957d6554Steve Block}
4322bde8e466a4451c7319e3a072d118917957d6554Steve Block
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setAttachedWindowHeight:(unsigned)height
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_attachedToInspectedWebView)
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrameView *frameView = [[_inspectedWebView mainFrame] frameView];
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSRect frameViewRect = [frameView frame];
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Setting the height based on the difference is done to work with
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Safari's find banner. This assumes the previous height is the Y origin.
4430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CGFloat heightDifference = (NSMinY(frameViewRect) - height);
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    frameViewRect.size.height += heightDifference;
4450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    frameViewRect.origin.y = height;
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [_webView setFrame:NSMakeRect(0.0, 0.0, NSWidth(frameViewRect), height)];
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [frameView setFrame:frameViewRect];
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick- (void)destroyInspectorView:(bool)notifyInspectorController
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
453dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (_destroyingInspectorView)
454dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
455dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _destroyingInspectorView = YES;
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
457dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (_attachedToInspectedWebView)
458dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        [self close];
4596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
460dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _visible = NO;
4616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
4625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (notifyInspectorController) {
4635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (Page* inspectedPage = [_inspectedWebView page])
4645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            inspectedPage->inspectorController()->disconnectFrontend();
4656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
4665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        _inspectorClient->releaseFrontendPage();
4675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
468545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [_webView close];
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
472cad810f21b803229eb11403f9209855525a25d57Steve Block// MARK: -
473cad810f21b803229eb11403f9209855525a25d57Steve Block// MARK: UI delegate
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSUInteger)webView:(WebView *)sender dragDestinationActionMaskForDraggingInfo:(id <NSDraggingInfo>)draggingInfo
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return WebDragDestinationActionNone;
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
480cad810f21b803229eb11403f9209855525a25d57Steve Block// MARK: -
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// These methods can be used by UI elements such as menu items and toolbar buttons when the inspector is the key window.
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This method is really only implemented to keep any UI elements enabled.
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)showWebInspector:(id)sender
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[_inspectedWebView inspector] show:sender];
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)showErrorConsole:(id)sender
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[_inspectedWebView inspector] showConsole:sender];
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)toggleDebuggingJavaScript:(id)sender
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[_inspectedWebView inspector] toggleDebuggingJavaScript:sender];
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)toggleProfilingJavaScript:(id)sender
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[_inspectedWebView inspector] toggleProfilingJavaScript:sender];
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL isMenuItem = [(id)item isKindOfClass:[NSMenuItem class]];
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([item action] == @selector(toggleDebuggingJavaScript:) && isMenuItem) {
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSMenuItem *menuItem = (NSMenuItem *)item;
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([[_inspectedWebView inspector] isDebuggingJavaScript])
51181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            [menuItem setTitle:UI_STRING_INTERNAL("Stop Debugging JavaScript", "title for Stop Debugging JavaScript menu item")];
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
51381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            [menuItem setTitle:UI_STRING_INTERNAL("Start Debugging JavaScript", "title for Start Debugging JavaScript menu item")];
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if ([item action] == @selector(toggleProfilingJavaScript:) && isMenuItem) {
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSMenuItem *menuItem = (NSMenuItem *)item;
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([[_inspectedWebView inspector] isProfilingJavaScript])
51781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            [menuItem setTitle:UI_STRING_INTERNAL("Stop Profiling JavaScript", "title for Stop Profiling JavaScript menu item")];
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
51981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            [menuItem setTitle:UI_STRING_INTERNAL("Start Profiling JavaScript", "title for Start Profiling JavaScript menu item")];
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return YES;
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
526