void WebInspectorProxy::platformAttach() { GRefPtr<GtkWidget> inspectorView = m_inspectorView; if (m_inspectorWindow) { gtk_container_remove(GTK_CONTAINER(m_inspectorWindow), m_inspectorView); gtk_widget_destroy(m_inspectorWindow); m_inspectorWindow = 0; } // Set a default sizes based on InspectorFrontendClientLocal. static const unsigned defaultAttachedSize = 300; static const unsigned minimumAttachedWidth = 750; static const unsigned minimumAttachedHeight = 250; if (m_attachmentSide == AttachmentSide::Bottom) { unsigned maximumAttachedHeight = platformInspectedWindowHeight() * 3 / 4; platformSetAttachedWindowHeight(std::max(minimumAttachedHeight, std::min(defaultAttachedSize, maximumAttachedHeight))); } else { unsigned maximumAttachedWidth = platformInspectedWindowWidth() * 3 / 4; platformSetAttachedWindowWidth(std::max(minimumAttachedWidth, std::min(defaultAttachedSize, maximumAttachedWidth))); } if (m_client.attach(this)) return; webkitWebViewBaseAddWebInspector(WEBKIT_WEB_VIEW_BASE(inspectedPage()->viewWidget()), m_inspectorView, m_attachmentSide); gtk_widget_show(m_inspectorView); }
void WebInspectorProxy::platformDetach() { if (!inspectedPage()->isValid()) return; GRefPtr<GtkWidget> inspectorView = m_inspectorView; if (!m_client.detach(this)) { // Detach is called when m_isAttached is true, but it could called before // the inspector is opened if the inspector is shown/closed quickly. So, // we might not have a parent yet. if (GtkWidget* parent = gtk_widget_get_parent(m_inspectorView)) gtk_container_remove(GTK_CONTAINER(parent), m_inspectorView); } // Return early if we are not visible. This means the inspector was closed while attached // and we should not create and show the inspector window. if (!m_isVisible) { // The inspector view will be destroyed, but we don't need to notify the web process to close the // inspector in this case, since it's already closed. g_signal_handlers_disconnect_by_func(m_inspectorView, reinterpret_cast<void*>(inspectorViewDestroyed), this); m_inspectorView = nullptr; return; } createInspectorWindow(); }
void WebInspectorProxy::platformSetAttachedWindowWidth(unsigned width) { if (!m_isAttached) return; m_client.didChangeAttachedWidth(this, width); webkitWebViewBaseSetInspectorViewSize(WEBKIT_WEB_VIEW_BASE(inspectedPage()->viewWidget()), width); }
unsigned WebInspectorProxy::inspectionLevel() const { auto findResult = pageLevelMap().find(inspectedPage()); if (findResult != pageLevelMap().end()) return findResult->value + 1; return 1; }
void WebInspectorProxy::createInspectorWindow() { if (m_client.openWindow(this)) return; ASSERT(!m_inspectorWindow); m_inspectorWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); GtkWidget* inspectedViewParent = gtk_widget_get_toplevel(inspectedPage()->viewWidget()); if (WebCore::widgetIsOnscreenToplevelWindow(inspectedViewParent)) gtk_window_set_transient_for(GTK_WINDOW(m_inspectorWindow), GTK_WINDOW(inspectedViewParent)); #if GTK_CHECK_VERSION(3, 10, 0) m_headerBar = gtk_header_bar_new(); gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(m_headerBar), TRUE); m_dockBottomButton = gtk_button_new(); g_object_add_weak_pointer(G_OBJECT(m_dockBottomButton), reinterpret_cast<void**>(&m_dockBottomButton)); g_signal_connect(m_dockBottomButton, "clicked", G_CALLBACK(dockButtonClicked), this); gtk_widget_set_sensitive(m_dockBottomButton, canAttach()); gtk_button_set_relief(GTK_BUTTON(m_dockBottomButton), GTK_RELIEF_NONE); gtk_button_set_image(GTK_BUTTON(m_dockBottomButton), gtk_image_new_from_resource("/org/webkitgtk/inspector/UserInterface/Images/DockBottom.svg")); gtk_header_bar_pack_start(GTK_HEADER_BAR(m_headerBar), m_dockBottomButton); gtk_widget_show(m_dockBottomButton); m_dockRightButton = gtk_button_new(); g_object_add_weak_pointer(G_OBJECT(m_dockRightButton), reinterpret_cast<void**>(&m_dockRightButton)); g_signal_connect(m_dockRightButton, "clicked", G_CALLBACK(dockButtonClicked), this); gtk_widget_set_sensitive(m_dockRightButton, canAttach()); gtk_button_set_relief(GTK_BUTTON(m_dockRightButton), GTK_RELIEF_NONE); gtk_button_set_image(GTK_BUTTON(m_dockRightButton), gtk_image_new_from_resource("/org/webkitgtk/inspector/UserInterface/Images/DockRight.svg")); gtk_header_bar_pack_start(GTK_HEADER_BAR(m_headerBar), m_dockRightButton); gtk_widget_show(m_dockRightButton); gtk_window_set_titlebar(GTK_WINDOW(m_inspectorWindow), m_headerBar); gtk_widget_show(m_headerBar); #endif updateInspectorWindowTitle(); gtk_window_set_default_size(GTK_WINDOW(m_inspectorWindow), initialWindowWidth, initialWindowHeight); gtk_container_add(GTK_CONTAINER(m_inspectorWindow), m_inspectorView); gtk_widget_show(m_inspectorView); g_object_add_weak_pointer(G_OBJECT(m_inspectorWindow), reinterpret_cast<void**>(&m_inspectorWindow)); gtk_window_present(GTK_WINDOW(m_inspectorWindow)); }
void WebInspectorProxy::platformDetach() { if (!inspectedPage()->isValid()) return; GRefPtr<GtkWidget> inspectorView = m_inspectorView; if (!m_client.detach(this)) { GtkWidget* parent = gtk_widget_get_parent(m_inspectorView); ASSERT(parent); gtk_container_remove(GTK_CONTAINER(parent), m_inspectorView); } if (!m_isVisible) return; createInspectorWindow(); }
WebPageProxy* WebInspectorProxy::platformCreateInspectorPage() { ASSERT(inspectedPage()); ASSERT(!m_inspectorView); RefPtr<WebPreferences> preferences = WebPreferences::create(String(), "WebKit2.", "WebKit2."); #ifndef NDEBUG // Allow developers to inspect the Web Inspector in debug builds without changing settings. preferences->setDeveloperExtrasEnabled(true); preferences->setLogsPageMessagesToSystemConsoleEnabled(true); #endif preferences->setAllowFileAccessFromFileURLs(true); preferences->setJavaScriptRuntimeFlags({ }); RefPtr<WebPageGroup> pageGroup = WebPageGroup::create(inspectorPageGroupIdentifier(), false, false); m_inspectorView = GTK_WIDGET(webkitWebViewBaseCreate(&inspectorProcessPool(), preferences.get(), pageGroup.get(), nullptr, nullptr)); g_object_add_weak_pointer(G_OBJECT(m_inspectorView), reinterpret_cast<void**>(&m_inspectorView)); return webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(m_inspectorView)); }
unsigned WebInspectorProxy::platformInspectedWindowWidth() { return gtk_widget_get_allocated_width(inspectedPage()->viewWidget()); }
WebPageProxy* WebInspectorProxy::platformCreateInspectorPage() { ASSERT(inspectedPage()); ASSERT(!m_inspectorView); RefPtr<WebPreferences> preferences = WebPreferences::create(String(), "WebKit2.", "WebKit2."); #ifndef NDEBUG // Allow developers to inspect the Web Inspector in debug builds without changing settings. preferences->setDeveloperExtrasEnabled(true); preferences->setLogsPageMessagesToSystemConsoleEnabled(true); #endif preferences->setJavaScriptRuntimeFlags({ }); RefPtr<WebPageGroup> pageGroup = WebPageGroup::create(inspectorPageGroupIdentifier(), false, false); auto pageConfiguration = API::PageConfiguration::create(); pageConfiguration->setProcessPool(&inspectorProcessPool(inspectionLevel())); pageConfiguration->setPreferences(preferences.get()); 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)); WKPageUIClientV2 uiClient = { { 2, this }, nullptr, // createNewPage_deprecatedForUseWithV0 nullptr, // showPage nullptr, // closePage nullptr, // takeFocus nullptr, // focus nullptr, // unfocus nullptr, // runJavaScriptAlert nullptr, // runJavaScriptConfirm nullptr, // runJavaScriptPrompt nullptr, // setStatusText nullptr, // mouseDidMoveOverElement_deprecatedForUseWithV0 nullptr, // missingPluginButtonClicked_deprecatedForUseWithV0 nullptr, // didNotHandleKeyEvent nullptr, // didNotHandleWheelEvent nullptr, // areToolbarsVisible nullptr, // setToolbarsVisible nullptr, // isMenuBarVisible nullptr, // setMenuBarVisible nullptr, // isStatusBarVisible nullptr, // setStatusBarVisible nullptr, // isResizable nullptr, // setResizable nullptr, // getWindowFrame, nullptr, // setWindowFrame, nullptr, // runBeforeUnloadConfirmPanel nullptr, // didDraw nullptr, // pageDidScroll exceededDatabaseQuota, nullptr, // runOpenPanel, nullptr, // decidePolicyForGeolocationPermissionRequest nullptr, // headerHeight nullptr, // footerHeight nullptr, // drawHeader nullptr, // drawFooter nullptr, // printFrame nullptr, // runModal nullptr, // unused nullptr, // saveDataToFileInDownloadsFolder nullptr, // shouldInterruptJavaScript nullptr, // createPage nullptr, // mouseDidMoveOverElement nullptr, // decidePolicyForNotificationPermissionRequest nullptr, // unavailablePluginButtonClicked_deprecatedForUseWithV1 nullptr, // showColorPicker nullptr, // hideColorPicker nullptr, // unavailablePluginButtonClicked }; WebPageProxy* inspectorPage = webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(m_inspectorView)); ASSERT(inspectorPage); WKPageSetPageUIClient(toAPI(inspectorPage), &uiClient.base); return inspectorPage; }
void WebInspectorProxy::createInspectorWindow() { if (m_client.openWindow(this)) return; ASSERT(!m_inspectorWindow); m_inspectorWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); GtkWidget* inspectedViewParent = gtk_widget_get_toplevel(inspectedPage()->viewWidget()); if (WebCore::widgetIsOnscreenToplevelWindow(inspectedViewParent)) gtk_window_set_transient_for(GTK_WINDOW(m_inspectorWindow), GTK_WINDOW(inspectedViewParent)); #if GTK_CHECK_VERSION(3, 10, 0) m_headerBar = gtk_header_bar_new(); gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(m_headerBar), TRUE); gtk_window_set_titlebar(GTK_WINDOW(m_inspectorWindow), m_headerBar); gtk_widget_show(m_headerBar); #endif updateInspectorWindowTitle(); gtk_window_set_default_size(GTK_WINDOW(m_inspectorWindow), initialWindowWidth, initialWindowHeight); gtk_container_add(GTK_CONTAINER(m_inspectorWindow), m_inspectorView); gtk_widget_show(m_inspectorView); g_object_add_weak_pointer(G_OBJECT(m_inspectorWindow), reinterpret_cast<void**>(&m_inspectorWindow)); gtk_window_present(GTK_WINDOW(m_inspectorWindow)); }