[GTK][WebInspector] Support for saving data
https://bugs.webkit.org/show_bug.cgi?id=202894

Reviewed by Carlos Garcia Campos.

Implement the WebInspectorProxy::platformSave() method. This
allows users to save the inspector performance measurements, for
instance.

* UIProcess/gtk/WebInspectorProxyGtk.cpp:
(WebKit::WebInspectorProxy::platformSave):
* WebProcess/WebPage/gtk/WebInspectorUIGtk.cpp:
(WebKit::WebInspectorUI::canSave):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@251069 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog
index 8d6b0ae..75aaac4 100644
--- a/Source/WebKit/ChangeLog
+++ b/Source/WebKit/ChangeLog
@@ -1,3 +1,19 @@
+2019-10-14  Philippe Normand  <pnormand@igalia.com>
+
+        [GTK][WebInspector] Support for saving data
+        https://bugs.webkit.org/show_bug.cgi?id=202894
+
+        Reviewed by Carlos Garcia Campos.
+
+        Implement the WebInspectorProxy::platformSave() method. This
+        allows users to save the inspector performance measurements, for
+        instance.
+
+        * UIProcess/gtk/WebInspectorProxyGtk.cpp:
+        (WebKit::WebInspectorProxy::platformSave):
+        * WebProcess/WebPage/gtk/WebInspectorUIGtk.cpp:
+        (WebKit::WebInspectorUI::canSave):
+
 2019-10-14  youenn fablet  <youenn@apple.com>
 
         Reuse existing web processes for running service workers
diff --git a/Source/WebKit/UIProcess/gtk/WebInspectorProxyGtk.cpp b/Source/WebKit/UIProcess/gtk/WebInspectorProxyGtk.cpp
index 8527198..4229804 100644
--- a/Source/WebKit/UIProcess/gtk/WebInspectorProxyGtk.cpp
+++ b/Source/WebKit/UIProcess/gtk/WebInspectorProxyGtk.cpp
@@ -36,6 +36,7 @@
 #include "WKMutableArray.h"
 #include "WebFramePolicyListenerProxy.h"
 #include "WebInspectorProxyClient.h"
+#include "WebInspectorUIMessages.h"
 #include "WebKitInspectorWindow.h"
 #include "WebKitWebViewBasePrivate.h"
 #include "WebPageGroup.h"
@@ -45,6 +46,7 @@
 #include <WebCore/GtkUtilities.h>
 #include <WebCore/NotImplemented.h>
 #include <wtf/FileSystem.h>
+#include <wtf/text/Base64.h>
 #include <wtf/text/CString.h>
 #include <wtf/text/WTFString.h>
 
@@ -458,9 +460,44 @@
     notImplemented();
 }
 
-void WebInspectorProxy::platformSave(const String&, const String&, bool, bool)
+void WebInspectorProxy::platformSave(const String& filename, const String& content, bool base64Encoded, bool forceSaveDialog)
 {
-    notImplemented();
+    UNUSED_PARAM(forceSaveDialog);
+
+    GtkWidget* parent = gtk_widget_get_toplevel(m_inspectorView);
+    if (!WebCore::widgetIsOnscreenToplevelWindow(parent))
+        return;
+
+    GRefPtr<GtkFileChooserNative> dialog = adoptGRef(gtk_file_chooser_native_new("Save File",
+        GTK_WINDOW(parent), GTK_FILE_CHOOSER_ACTION_SAVE, "Save", "Cancel"));
+
+    GtkFileChooser* chooser = GTK_FILE_CHOOSER(dialog.get());
+    gtk_file_chooser_set_do_overwrite_confirmation(chooser, TRUE);
+    gtk_file_chooser_set_current_name(chooser, filename.utf8().data());
+
+    if (gtk_native_dialog_run(GTK_NATIVE_DIALOG(dialog.get())) != GTK_RESPONSE_ACCEPT)
+        return;
+
+    gssize dataLength = 0;
+    const char* data;
+
+    if (base64Encoded) {
+        Vector<char> out;
+        if (!base64Decode(content, out, Base64ValidatePadding))
+            return;
+
+        out.shrinkToFit();
+        data = out.data();
+        dataLength = out.size();
+    } else {
+        data = content.utf8().data();
+        dataLength = content.utf8().length();
+    }
+
+    GRefPtr<GFile> file = adoptGRef(gtk_file_chooser_get_file(chooser));
+    GUniquePtr<char> path(g_file_get_path(file.get()));
+    if (g_file_set_contents(path.get(), data, dataLength, nullptr))
+        m_inspectorPage->process().send(Messages::WebInspectorUI::DidSave(path.get()), m_inspectorPage->webPageID());
 }
 
 void WebInspectorProxy::platformAppend(const String&, const String&)
diff --git a/Source/WebKit/WebProcess/WebPage/gtk/WebInspectorUIGtk.cpp b/Source/WebKit/WebProcess/WebPage/gtk/WebInspectorUIGtk.cpp
index dbb2a91..9d25a1a 100644
--- a/Source/WebKit/WebProcess/WebPage/gtk/WebInspectorUIGtk.cpp
+++ b/Source/WebKit/WebProcess/WebPage/gtk/WebInspectorUIGtk.cpp
@@ -36,7 +36,7 @@
 
 bool WebInspectorUI::canSave()
 {
-    return false;
+    return true;
 }
 
 String WebInspectorUI::localizedStringsURL()