Web Inspector: consolidate code that hosts the Inspector page inside a WKWebView
authorbburg@apple.com <bburg@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 20 Oct 2017 17:29:01 +0000 (17:29 +0000)
committerbburg@apple.com <bburg@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 20 Oct 2017 17:29:01 +0000 (17:29 +0000)
https://bugs.webkit.org/show_bug.cgi?id=177661
<rdar://problem/34740286>

Reviewed by Joseph Pecoraro.

Introduce new platform methods to open and close the frontend page and window.
This matches how RemoteWebInspectorProxy divides work up into platform methods.
Move existing code from platformDidClose, platformOpen, and other methods into
the new platform methods. Move some identical platform code into WebInspectorProxy.cpp.

* UIProcess/WebInspectorProxy.h:
* UIProcess/WebInspectorProxy.cpp:
(WebKit::WebInspectorProxy::connect):
(WebKit::WebInspectorProxy::showConsole):
(WebKit::WebInspectorProxy::showResources):
(WebKit::WebInspectorProxy::showTimelines):
(WebKit::WebInspectorProxy::showMainResourceForFrame):
(WebKit::WebInspectorProxy::createFrontendPage):
(WebKit::WebInspectorProxy::createInspectorPage):
(WebKit::WebInspectorProxy::open):
(WebKit::WebInspectorProxy::didClose):
(WebKit::WebInspectorProxy::eagerlyCreateInspectorPage): Renamed.

* UIProcess/gtk/WebInspectorProxyGtk.cpp:
(WebKit::WebInspectorProxy::updateInspectorWindowTitle const):
(WebKit::WebInspectorProxy::platformCreateFrontendPage):
Do everything necessary to set up the frontend page WebView.

(WebKit::WebInspectorProxy::platformCreateFrontendWindow):
Do everything necessary to set up the detached NSWindow for the frontend.

(WebKit::WebInspectorProxy::platformCloseFrontendPageAndWindow):
(WebKit::WebInspectorProxy::platformDetach):
(WebKit::WebInspectorProxy::platformCreateInspectorPage): Deleted.
(WebKit::WebInspectorProxy::createInspectorWindow): Deleted.
(WebKit::WebInspectorProxy::platformOpen): Deleted.
(WebKit::WebInspectorProxy::platformDidClose): Deleted.

* UIProcess/mac/WebInspectorProxyMac.mm:
(WebKit::WebInspectorProxy::updateInspectorWindowTitle const):
(WebKit::WebInspectorProxy::platformCreateFrontendPage): Added.
Do everything necessary to set up the frontend page WebView.

(WebKit::WebInspectorProxy::platformCreateFrontendWindow): Added.
Do everything necessary to set up the detached NSWindow for the frontend.

(WebKit::WebInspectorProxy::closeFrontendPage):
(WebKit::WebInspectorProxy::closeFrontendAfterInactivityTimerFired):
(WebKit::WebInspectorProxy::platformCloseFrontendPageAndWindow):
(WebKit::WebInspectorProxy::platformDidCloseForCrash):
(WebKit::WebInspectorProxy::platformInvalidate):
(WebKit::WebInspectorProxy::platformBringToFront): Carry through renamings.

(WebKit::WebInspectorProxy::platformDetach):
Defer to the general open() method to create a window if needed and bring it to front.

(WebKit::WebInspectorProxy::platformCanAttach): Move this below open/close code.

(WebKit::WebInspectorProxy::closeFrontend): Deleted.
(WebKit::WebInspectorProxy::createInspectorWindow): Deleted.
(WebKit::WebInspectorProxy::platformCreateInspectorPage): Deleted.
(WebKit::WebInspectorProxy::platformOpen): Deleted.
(WebKit::WebInspectorProxy::platformDidClose): Deleted.
Defer to the general open() method to create a window if needed and bring it to front.

* UIProcess/wpe/WebInspectorProxyWPE.cpp:
(WebKit::WebInspectorProxy::platformCreateFrontendPage):
(WebKit::WebInspectorProxy::platformCreateFrontendWindow):
(WebKit::WebInspectorProxy::platformCloseFrontendPageAndWindow):
(WebKit::WebInspectorProxy::platformCreateInspectorPage): Deleted.
(WebKit::WebInspectorProxy::createInspectorWindow): Deleted.
(WebKit::WebInspectorProxy::platformOpen): Deleted.
(WebKit::WebInspectorProxy::platformDidClose): Deleted.
Update stubs.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@223773 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit/ChangeLog
Source/WebKit/UIProcess/WebInspectorProxy.cpp
Source/WebKit/UIProcess/WebInspectorProxy.h
Source/WebKit/UIProcess/gtk/WebInspectorProxyGtk.cpp
Source/WebKit/UIProcess/mac/WebInspectorProxyMac.mm
Source/WebKit/UIProcess/wpe/WebInspectorProxyWPE.cpp

index 86d03be..18d7b4c 100644 (file)
@@ -6,6 +6,84 @@
 
         Reviewed by Joseph Pecoraro.
 
+        Introduce new platform methods to open and close the frontend page and window.
+        This matches how RemoteWebInspectorProxy divides work up into platform methods.
+        Move existing code from platformDidClose, platformOpen, and other methods into
+        the new platform methods. Move some identical platform code into WebInspectorProxy.cpp.
+
+        * UIProcess/WebInspectorProxy.h:
+        * UIProcess/WebInspectorProxy.cpp:
+        (WebKit::WebInspectorProxy::connect):
+        (WebKit::WebInspectorProxy::showConsole):
+        (WebKit::WebInspectorProxy::showResources):
+        (WebKit::WebInspectorProxy::showTimelines):
+        (WebKit::WebInspectorProxy::showMainResourceForFrame):
+        (WebKit::WebInspectorProxy::createFrontendPage):
+        (WebKit::WebInspectorProxy::createInspectorPage):
+        (WebKit::WebInspectorProxy::open):
+        (WebKit::WebInspectorProxy::didClose):
+        (WebKit::WebInspectorProxy::eagerlyCreateInspectorPage): Renamed.
+
+        * UIProcess/gtk/WebInspectorProxyGtk.cpp:
+        (WebKit::WebInspectorProxy::updateInspectorWindowTitle const):
+        (WebKit::WebInspectorProxy::platformCreateFrontendPage):
+        Do everything necessary to set up the frontend page WebView.
+
+        (WebKit::WebInspectorProxy::platformCreateFrontendWindow):
+        Do everything necessary to set up the detached NSWindow for the frontend.
+
+        (WebKit::WebInspectorProxy::platformCloseFrontendPageAndWindow):
+        (WebKit::WebInspectorProxy::platformDetach):
+        (WebKit::WebInspectorProxy::platformCreateInspectorPage): Deleted.
+        (WebKit::WebInspectorProxy::createInspectorWindow): Deleted.
+        (WebKit::WebInspectorProxy::platformOpen): Deleted.
+        (WebKit::WebInspectorProxy::platformDidClose): Deleted.
+
+        * UIProcess/mac/WebInspectorProxyMac.mm:
+        (WebKit::WebInspectorProxy::updateInspectorWindowTitle const):
+        (WebKit::WebInspectorProxy::platformCreateFrontendPage): Added.
+        Do everything necessary to set up the frontend page WebView.
+
+        (WebKit::WebInspectorProxy::platformCreateFrontendWindow): Added.
+        Do everything necessary to set up the detached NSWindow for the frontend.
+
+        (WebKit::WebInspectorProxy::closeFrontendPage):
+        (WebKit::WebInspectorProxy::closeFrontendAfterInactivityTimerFired):
+        (WebKit::WebInspectorProxy::platformCloseFrontendPageAndWindow):
+        (WebKit::WebInspectorProxy::platformDidCloseForCrash):
+        (WebKit::WebInspectorProxy::platformInvalidate):
+        (WebKit::WebInspectorProxy::platformBringToFront): Carry through renamings.
+
+        (WebKit::WebInspectorProxy::platformDetach):
+        Defer to the general open() method to create a window if needed and bring it to front.
+
+        (WebKit::WebInspectorProxy::platformCanAttach): Move this below open/close code.
+
+        (WebKit::WebInspectorProxy::closeFrontend): Deleted.
+        (WebKit::WebInspectorProxy::createInspectorWindow): Deleted.
+        (WebKit::WebInspectorProxy::platformCreateInspectorPage): Deleted.
+        (WebKit::WebInspectorProxy::platformOpen): Deleted.
+        (WebKit::WebInspectorProxy::platformDidClose): Deleted.
+        Defer to the general open() method to create a window if needed and bring it to front.
+
+        * UIProcess/wpe/WebInspectorProxyWPE.cpp:
+        (WebKit::WebInspectorProxy::platformCreateFrontendPage):
+        (WebKit::WebInspectorProxy::platformCreateFrontendWindow):
+        (WebKit::WebInspectorProxy::platformCloseFrontendPageAndWindow):
+        (WebKit::WebInspectorProxy::platformCreateInspectorPage): Deleted.
+        (WebKit::WebInspectorProxy::createInspectorWindow): Deleted.
+        (WebKit::WebInspectorProxy::platformOpen): Deleted.
+        (WebKit::WebInspectorProxy::platformDidClose): Deleted.
+        Update stubs.
+
+2017-10-02  Brian Burg  <bburg@apple.com>
+
+        Web Inspector: consolidate code that hosts the Inspector page inside a WKWebView
+        https://bugs.webkit.org/show_bug.cgi?id=177661
+        <rdar://problem/34740286>
+
+        Reviewed by Joseph Pecoraro.
+
         This patch refactors some Cocoa code pathas.
         Rename the timer that closes the WebView so it's more obvious what it is for.
         Extract the common code to close the frontend window so its not implemented by
index 61a409e..694762c 100644 (file)
@@ -114,7 +114,7 @@ void WebInspectorProxy::connect()
     m_showMessageSent = true;
     m_ignoreFirstBringToFront = true;
 
-    eagerlyCreateInspectorPage();
+    createFrontendPage();
 
     m_inspectedPage->process().send(Messages::WebInspectorInterruptDispatcher::NotifyNeedDebuggerBreak(), 0);
     m_inspectedPage->process().send(Messages::WebInspector::Show(), m_inspectedPage->pageID());
@@ -168,7 +168,7 @@ void WebInspectorProxy::showConsole()
     if (!m_inspectedPage)
         return;
 
-    eagerlyCreateInspectorPage();
+    createFrontendPage();
 
     m_inspectedPage->process().send(Messages::WebInspector::ShowConsole(), m_inspectedPage->pageID());
 }
@@ -178,7 +178,7 @@ void WebInspectorProxy::showResources()
     if (!m_inspectedPage)
         return;
 
-    eagerlyCreateInspectorPage();
+    createFrontendPage();
 
     m_inspectedPage->process().send(Messages::WebInspector::ShowResources(), m_inspectedPage->pageID());
 }
@@ -188,7 +188,7 @@ void WebInspectorProxy::showTimelines()
     if (!m_inspectedPage)
         return;
 
-    eagerlyCreateInspectorPage();
+    createFrontendPage();
 
     m_inspectedPage->process().send(Messages::WebInspector::ShowTimelines(), m_inspectedPage->pageID());
 }
@@ -198,7 +198,7 @@ void WebInspectorProxy::showMainResourceForFrame(WebFrameProxy* frame)
     if (!m_inspectedPage)
         return;
 
-    eagerlyCreateInspectorPage();
+    createFrontendPage();
 
     m_inspectedPage->process().send(Messages::WebInspector::ShowMainResourceForFrame(frame->frameID()), m_inspectedPage->pageID());
 }
@@ -385,12 +385,12 @@ static void getContextMenuFromProposedMenu(WKPageRef pageRef, WKArrayRef propose
     *newMenuRef = menuItems;
 }
 
-void WebInspectorProxy::eagerlyCreateInspectorPage()
+void WebInspectorProxy::createFrontendPage()
 {
     if (m_inspectorPage)
         return;
 
-    m_inspectorPage = platformCreateInspectorPage();
+    m_inspectorPage = platformCreateFrontendPage();
     ASSERT(m_inspectorPage);
     if (!m_inspectorPage)
         return;
@@ -447,7 +447,7 @@ void WebInspectorProxy::createInspectorPage(IPC::Attachment connectionIdentifier
         return;
 
     m_underTest = underTest;
-    eagerlyCreateInspectorPage();
+    createFrontendPage();
 
     ASSERT(m_inspectorPage);
     if (!m_inspectorPage)
@@ -498,7 +498,12 @@ void WebInspectorProxy::open()
     m_isVisible = true;
     m_inspectorPage->process().send(Messages::WebInspectorUI::SetIsVisible(m_isVisible), m_inspectorPage->pageID());
 
-    platformOpen();
+    if (m_isAttached)
+        platformAttach();
+    else
+        platformCreateFrontendWindow();
+
+    platformBringToFront();
 }
 
 void WebInspectorProxy::didClose()
@@ -528,7 +533,7 @@ void WebInspectorProxy::didClose()
 
     m_connectionIdentifier = IPC::Attachment();
 
-    platformDidClose();
+    platformCloseFrontendPageAndWindow();
 }
 
 void WebInspectorProxy::frontendLoaded()
@@ -609,18 +614,18 @@ bool WebInspectorProxy::shouldOpenAttached()
 
 #if PLATFORM(IOS) || (PLATFORM(MAC) && !WK_API_ENABLED)
 
-WebPageProxy* WebInspectorProxy::platformCreateInspectorPage()
+WebPageProxy* WebInspectorProxy::platformCreateFrontendPage()
 {
     notImplemented();
     return nullptr;
 }
 
-void WebInspectorProxy::platformOpen()
+void WebInspectorProxy::platformCreateFrontendWindow()
 {
     notImplemented();
 }
 
-void WebInspectorProxy::platformDidClose()
+void WebInspectorProxy::platformCloseFrontendPageAndWindow()
 {
     notImplemented();
 }
index 63df356..da825a1 100644 (file)
@@ -95,7 +95,6 @@ public:
     static RetainPtr<WKWebViewConfiguration> createFrontendConfiguration(WebPageProxy*, bool underTest);
     static RetainPtr<NSWindow> createFrontendWindow(NSRect savedWindowFrame);
 
-    void createInspectorWindow();
     void updateInspectorWindowTitle() const;
     void inspectedViewFrameDidChange(CGFloat = 0);
     void windowFrameDidChange();
@@ -105,7 +104,7 @@ public:
     void setInspectorWindowFrame(WKRect&);
     WKRect inspectorWindowFrame();
 
-    void closeFrontend();
+    void closeFrontendPage();
     void closeFrontendAfterInactivityTimerFired();
 
     void attachmentViewDidChange(NSView *oldView, NSView *newView);
@@ -155,14 +154,15 @@ public:
 private:
     explicit WebInspectorProxy(WebPageProxy*);
 
-    void eagerlyCreateInspectorPage();
+    void createFrontendPage();
 
     // IPC::MessageReceiver
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
 
-    WebPageProxy* platformCreateInspectorPage();
-    void platformOpen();
-    void platformDidClose();
+    WebPageProxy* platformCreateFrontendPage();
+    void platformCreateFrontendWindow();
+    void platformCloseFrontendPageAndWindow();
+
     void platformDidCloseForCrash();
     void platformInvalidate();
     void platformBringToFront();
@@ -211,7 +211,6 @@ private:
     WebPreferences& inspectorPagePreferences() const;
 
 #if PLATFORM(GTK) || PLATFORM(WPE)
-    void createInspectorWindow();
     void updateInspectorWindowTitle() const;
 #endif
 
index dc2a7d7..a785eff 100644 (file)
@@ -62,7 +62,13 @@ void WebInspectorProxy::setClient(std::unique_ptr<WebInspectorProxyClient>&& cli
     m_client = WTFMove(client);
 }
 
-WebPageProxy* WebInspectorProxy::platformCreateInspectorPage()
+void WebInspectorProxy::updateInspectorWindowTitle() const
+{
+    ASSERT(m_inspectorWindow);
+    webkitInspectorWindowSetSubtitle(WEBKIT_INSPECTOR_WINDOW(m_inspectorWindow), !m_inspectedURLString.isEmpty() ? m_inspectedURLString.utf8().data() : nullptr);
+}
+
+WebPageProxy* WebInspectorProxy::platformCreateFrontendPage()
 {
     ASSERT(inspectedPage());
     ASSERT(!m_inspectorView);
@@ -83,6 +89,7 @@ WebPageProxy* WebInspectorProxy::platformCreateInspectorPage()
     pageConfiguration->setPageGroup(pageGroup.get());
     m_inspectorView = GTK_WIDGET(webkitWebViewBaseCreate(*pageConfiguration.ptr()));
     g_object_add_weak_pointer(G_OBJECT(m_inspectorView), reinterpret_cast<void**>(&m_inspectorView));
+    g_signal_connect(m_inspectorView, "destroy", G_CALLBACK(inspectorViewDestroyed), this);
 
     WKPageUIClientV2 uiClient = {
         { 2, this },
@@ -141,7 +148,7 @@ WebPageProxy* WebInspectorProxy::platformCreateInspectorPage()
     return inspectorPage;
 }
 
-void WebInspectorProxy::createInspectorWindow()
+void WebInspectorProxy::platformCreateFrontendWindow()
 {
     if (m_client && m_client->openWindow(*this))
         return;
@@ -162,37 +169,20 @@ void WebInspectorProxy::createInspectorWindow()
     gtk_window_present(GTK_WINDOW(m_inspectorWindow));
 }
 
-void WebInspectorProxy::updateInspectorWindowTitle() const
-{
-    ASSERT(m_inspectorWindow);
-    webkitInspectorWindowSetSubtitle(WEBKIT_INSPECTOR_WINDOW(m_inspectorWindow), !m_inspectedURLString.isEmpty() ? m_inspectedURLString.utf8().data() : nullptr);
-}
-
-void WebInspectorProxy::platformOpen()
+void WebInspectorProxy::platformCloseFrontendPageAndWindow()
 {
-    ASSERT(!m_inspectorWindow);
-    ASSERT(m_inspectorView);
-
-    if (m_isAttached)
-        platformAttach();
-    else
-        createInspectorWindow();
-    g_signal_connect(m_inspectorView, "destroy", G_CALLBACK(inspectorViewDestroyed), this);
-}
-
-void WebInspectorProxy::platformDidClose()
-{
-    if (m_inspectorView)
+    if (m_inspectorView) {
         g_signal_handlers_disconnect_by_func(m_inspectorView, reinterpret_cast<void*>(inspectorViewDestroyed), this);
+        m_inspectorView = nullptr;
+    }
 
     if (m_client)
         m_client->didClose(*this);
 
     if (m_inspectorWindow) {
         gtk_widget_destroy(m_inspectorWindow);
-        m_inspectorWindow = 0;
+        m_inspectorWindow = nullptr;
     }
-    m_inspectorView = 0;
 }
 
 void WebInspectorProxy::platformDidCloseForCrash()
@@ -319,7 +309,7 @@ void WebInspectorProxy::platformDetach()
         return;
     }
 
-    createInspectorWindow();
+    open();
 }
 
 void WebInspectorProxy::platformSetAttachedWindowHeight(unsigned height)
index 05576f4..9cbff79 100644 (file)
@@ -164,45 +164,21 @@ WKRect WebInspectorProxy::inspectorWindowFrame()
     return WKRectMake(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height);
 }
 
-void WebInspectorProxy::closeFrontendAfterInactivityTimerFired()
-{
-    closeFrontend();
-}
-
-void WebInspectorProxy::closeFrontend()
+void WebInspectorProxy::updateInspectorWindowTitle() const
 {
-    ASSERT(!m_isAttached || !m_inspectorWindow);
-    if (m_inspectorView) {
-        m_inspectorView->_page->close();
-        m_inspectorView = nil;
-    }
-
-    if (m_objCAdapter) {
-        [[NSNotificationCenter defaultCenter] removeObserver:m_objCAdapter.get()];
+    if (!m_inspectorWindow)
+        return;
 
-        [m_objCAdapter invalidate];
-        m_objCAdapter = nil;
+    unsigned level = inspectionLevel();
+    if (level > 1) {
+        NSString *debugTitle = [NSString stringWithFormat:WEB_UI_STRING("Web Inspector [%d] — %@", "Web Inspector window title when inspecting Web Inspector"), level, (NSString *)m_urlString];
+        [m_inspectorWindow setTitle:debugTitle];
+    } else {
+        NSString *title = [NSString stringWithFormat:WEB_UI_STRING("Web Inspector — %@", "Web Inspector window title"), (NSString *)m_urlString];
+        [m_inspectorWindow setTitle:title];
     }
 }
 
-void WebInspectorProxy::createInspectorWindow()
-{
-    ASSERT(!m_inspectorWindow);
-
-    NSString *savedWindowFrameString = inspectedPage()->pageGroup().preferences().inspectorWindowFrame();
-    NSRect savedWindowFrame = NSRectFromString(savedWindowFrameString);
-
-    m_inspectorWindow = WebInspectorProxy::createFrontendWindow(savedWindowFrame);
-    [m_inspectorWindow setDelegate:m_objCAdapter.get()];
-
-    NSView *contentView = [m_inspectorWindow contentView];
-    [m_inspectorView setFrame:[contentView bounds]];
-    [m_inspectorView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
-    [contentView addSubview:m_inspectorView.get()];
-
-    updateInspectorWindowTitle();
-}
-
 RetainPtr<WKWebViewConfiguration> WebInspectorProxy::createFrontendConfiguration(WebPageProxy* page, bool underTest)
 {
     auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
@@ -253,22 +229,7 @@ RetainPtr<NSWindow> WebInspectorProxy::createFrontendWindow(NSRect savedWindowFr
     return window;
 }
 
-void WebInspectorProxy::updateInspectorWindowTitle() const
-{
-    if (!m_inspectorWindow)
-        return;
-
-    unsigned level = inspectionLevel();
-    if (level > 1) {
-        NSString *debugTitle = [NSString stringWithFormat:WEB_UI_STRING("Web Inspector [%d] — %@", "Web Inspector window title when inspecting Web Inspector"), level, (NSString *)m_urlString];
-        [m_inspectorWindow setTitle:debugTitle];
-    } else {
-        NSString *title = [NSString stringWithFormat:WEB_UI_STRING("Web Inspector — %@", "Web Inspector window title"), (NSString *)m_urlString];
-        [m_inspectorWindow setTitle:title];
-    }
-}
-
-WebPageProxy* WebInspectorProxy::platformCreateInspectorPage()
+WebPageProxy* WebInspectorProxy::platformCreateFrontendPage()
 {
     ASSERT(inspectedPage());
 
@@ -319,36 +280,46 @@ WebPageProxy* WebInspectorProxy::platformCreateInspectorPage()
     return m_inspectorView->_page.get();
 }
 
-bool WebInspectorProxy::platformCanAttach(bool webProcessCanAttach)
+void WebInspectorProxy::platformCreateFrontendWindow()
 {
-    if ([m_inspectorWindow styleMask] & NSWindowStyleMaskFullScreen)
-        return false;
+    ASSERT(!m_inspectorWindow);
 
-    NSView *inspectedView = inspectedPage()->inspectorAttachmentView();
-    if ([inspectedView isKindOfClass:[WKWebInspectorWKWebView class]])
-        return webProcessCanAttach;
+    NSString *savedWindowFrameString = inspectedPage()->pageGroup().preferences().inspectorWindowFrame();
+    NSRect savedWindowFrame = NSRectFromString(savedWindowFrameString);
 
-    static const float minimumAttachedHeight = 250;
-    static const float maximumAttachedHeightRatio = 0.75;
-    static const float minimumAttachedWidth = 500;
+    m_inspectorWindow = WebInspectorProxy::createFrontendWindow(savedWindowFrame);
+    [m_inspectorWindow setDelegate:m_objCAdapter.get()];
 
-    NSRect inspectedViewFrame = inspectedView.frame;
+    NSView *contentView = [m_inspectorWindow contentView];
+    [m_inspectorView setFrame:[contentView bounds]];
+    [m_inspectorView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
+    [contentView addSubview:m_inspectorView.get()];
 
-    float maximumAttachedHeight = NSHeight(inspectedViewFrame) * maximumAttachedHeightRatio;
-    return minimumAttachedHeight <= maximumAttachedHeight && minimumAttachedWidth <= NSWidth(inspectedViewFrame);
+    updateInspectorWindowTitle();
 }
 
-void WebInspectorProxy::platformOpen()
+void WebInspectorProxy::closeFrontendPage()
 {
-    if (m_isAttached)
-        platformAttach();
-    else
-        createInspectorWindow();
+    ASSERT(!m_isAttached || !m_inspectorWindow);
+    if (m_inspectorView) {
+        m_inspectorView->_page->close();
+        m_inspectorView = nil;
+    }
 
-    platformBringToFront();
+    if (m_objCAdapter) {
+        [[NSNotificationCenter defaultCenter] removeObserver:m_objCAdapter.get()];
+
+        [m_objCAdapter invalidate];
+        m_objCAdapter = nil;
+    }
+}
+
+void WebInspectorProxy::closeFrontendAfterInactivityTimerFired()
+{
+    closeFrontendPage();
 }
 
-void WebInspectorProxy::platformDidClose()
+void WebInspectorProxy::platformCloseFrontendPageAndWindow()
 {
     if (m_inspectorWindow) {
         [m_inspectorWindow setDelegate:nil];
@@ -363,14 +334,14 @@ void WebInspectorProxy::platformDidCloseForCrash()
 {
     m_closeFrontendAfterInactivityTimer.stop();
 
-    closeFrontend();
+    closeFrontendPage();
 }
 
 void WebInspectorProxy::platformInvalidate()
 {
     m_closeFrontendAfterInactivityTimer.stop();
 
-    closeFrontend();
+    closeFrontendPage();
 }
 
 void WebInspectorProxy::platformHide()
@@ -393,7 +364,7 @@ void WebInspectorProxy::platformBringToFront()
     // then we need to reopen the Inspector to get it attached to the right window.
     // This can happen when dragging tabs to another window in Safari.
     if (m_isAttached && m_inspectorView.get().window != inspectedPage()->platformWindow()) {
-        platformOpen();
+        open();
         return;
     }
 
@@ -413,6 +384,25 @@ bool WebInspectorProxy::platformIsFront()
     return m_isVisible && [m_inspectorView.get().window isMainWindow];
 }
 
+bool WebInspectorProxy::platformCanAttach(bool webProcessCanAttach)
+{
+    if ([m_inspectorWindow styleMask] & NSWindowStyleMaskFullScreen)
+        return false;
+
+    NSView *inspectedView = inspectedPage()->inspectorAttachmentView();
+    if ([inspectedView isKindOfClass:[WKWebInspectorWKWebView class]])
+        return webProcessCanAttach;
+
+    static const float minimumAttachedHeight = 250;
+    static const float maximumAttachedHeightRatio = 0.75;
+    static const float minimumAttachedWidth = 500;
+
+    NSRect inspectedViewFrame = inspectedView.frame;
+
+    float maximumAttachedHeight = NSHeight(inspectedViewFrame) * maximumAttachedHeightRatio;
+    return minimumAttachedHeight <= maximumAttachedHeight && minimumAttachedWidth <= NSWidth(inspectedViewFrame);
+}
+
 void WebInspectorProxy::platformAttachAvailabilityChanged(bool available)
 {
     // Do nothing.
@@ -672,9 +662,7 @@ void WebInspectorProxy::platformDetach()
     if (!m_isVisible)
         return;
 
-    createInspectorWindow();
-
-    platformBringToFront();
+    open();
 }
 
 void WebInspectorProxy::platformSetAttachedWindowHeight(unsigned height)
index 5baeee3..f6b276a 100644 (file)
 
 namespace WebKit {
 
-WebPageProxy* WebInspectorProxy::platformCreateInspectorPage()
+WebPageProxy* WebInspectorProxy::platformCreateFrontendPage()
 {
     notImplemented();
     return nullptr;
 }
 
-void WebInspectorProxy::createInspectorWindow()
+void WebInspectorProxy::platformCreateFrontendWindow()
 {
     notImplemented();
 }
 
-void WebInspectorProxy::platformOpen()
-{
-    notImplemented();
-}
-
-void WebInspectorProxy::platformDidClose()
+void WebInspectorProxy::platformCloseFrontendPageAndWindow()
 {
     notImplemented();
 }