⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 243355 in webkit


Ignore:
Timestamp:
Mar 21, 2019, 7:33:38 PM (7 years ago)
Author:
Joseph Pecoraro
Message:

Web Inspector: Timelines - Cannot export on about:blank - suggested filename containing a colon silently fails
https://bugs.webkit.org/show_bug.cgi?id=196109

Reviewed by Timothy Hatcher.

Source/WebInspectorUI:

  • UserInterface/Base/FileUtilities.js:

(WI.FileUtilities.sanitizeFilename):
(WI.FileUtilities.inspectorURLForFilename):
New utility functions.

  • UserInterface/Test.html:

Include FileUtilities.

  • UserInterface/Base/Main.js:
  • UserInterface/Controllers/AuditManager.js:

(WI.AuditManager.prototype.export):

  • UserInterface/Debug/ProtocolTrace.js:

(WI.ProtocolTrace.prototype.get saveData):
(WI.ProtocolTrace):

  • UserInterface/Views/ConsoleMessageView.js:

(WI.ConsoleMessageView.prototype._handleContextMenu):
(WI.ConsoleMessageView):

  • UserInterface/Views/ContextMenuUtilities.js:
  • UserInterface/Views/HeapSnapshotContentView.js:

(WI.HeapSnapshotContentView.prototype._exportSnapshot):

  • UserInterface/Views/LogContentView.js:

(WI.LogContentView.prototype.get saveData):
(WI.LogContentView.prototype._handleContextMenuEvent):

  • UserInterface/Views/NetworkTableContentView.js:

(WI.NetworkTableContentView.prototype._exportHAR):

  • UserInterface/Views/RecordingContentView.js:

(WI.RecordingContentView.prototype._exportRecording):
(WI.RecordingContentView.prototype._exportReduction):

  • UserInterface/Views/ScriptContentView.js:

(WI.ScriptContentView.prototype.get saveData):

  • UserInterface/Views/ShaderProgramContentView.js:

(WI.ShaderProgramContentView.prototype.get saveData):

  • UserInterface/Views/TextContentView.js:

(WI.TextContentView.prototype.get saveData):

  • UserInterface/Views/TextResourceContentView.js:

(WI.TextResourceContentView.prototype.get saveData):

  • UserInterface/Views/TimelineRecordingContentView.js:

(WI.TimelineRecordingContentView.prototype._exportTimelineRecording):
Update "web-inspector:///" URL building code to use the utility.

LayoutTests:

  • inspector/unit-tests/file-utilities-expected.txt: Added.
  • inspector/unit-tests/file-utilities.html: Added.

Tests for FileUtilities.js

  • inspector/unit-tests/object-utilities.html:
  • inspector/unit-tests/promise-utilities.html:
Location:
trunk
Files:
2 added
20 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r243353 r243355  
     12019-03-21  Joseph Pecoraro  <pecoraro@apple.com>
     2
     3        Web Inspector: Timelines - Cannot export on about:blank - suggested filename containing a colon silently fails
     4        https://bugs.webkit.org/show_bug.cgi?id=196109
     5
     6        Reviewed by Timothy Hatcher.
     7
     8        * inspector/unit-tests/file-utilities-expected.txt: Added.
     9        * inspector/unit-tests/file-utilities.html: Added.
     10        Tests for FileUtilities.js
     11
     12        * inspector/unit-tests/object-utilities.html:
     13        * inspector/unit-tests/promise-utilities.html:
     14
    1152019-03-21  Chris Dumez  <cdumez@apple.com>
    216
  • trunk/LayoutTests/inspector/unit-tests/object-utilities.html

    r228336 r243355  
    44<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
    55<script>
    6 
    76function test()
    87{
  • trunk/LayoutTests/inspector/unit-tests/promise-utilities.html

    r237613 r243355  
    44<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
    55<script>
    6 
    76function test()
    87{
  • trunk/Source/WebInspectorUI/ChangeLog

    r243352 r243355  
     12019-03-21  Joseph Pecoraro  <pecoraro@apple.com>
     2
     3        Web Inspector: Timelines - Cannot export on about:blank - suggested filename containing a colon silently fails
     4        https://bugs.webkit.org/show_bug.cgi?id=196109
     5
     6        Reviewed by Timothy Hatcher.
     7
     8        * UserInterface/Base/FileUtilities.js:
     9        (WI.FileUtilities.sanitizeFilename):
     10        (WI.FileUtilities.inspectorURLForFilename):
     11        New utility functions.
     12
     13        * UserInterface/Test.html:
     14        Include FileUtilities.
     15
     16        * UserInterface/Base/Main.js:
     17        * UserInterface/Controllers/AuditManager.js:
     18        (WI.AuditManager.prototype.export):
     19        * UserInterface/Debug/ProtocolTrace.js:
     20        (WI.ProtocolTrace.prototype.get saveData):
     21        (WI.ProtocolTrace):
     22        * UserInterface/Views/ConsoleMessageView.js:
     23        (WI.ConsoleMessageView.prototype._handleContextMenu):
     24        (WI.ConsoleMessageView):
     25        * UserInterface/Views/ContextMenuUtilities.js:
     26        * UserInterface/Views/HeapSnapshotContentView.js:
     27        (WI.HeapSnapshotContentView.prototype._exportSnapshot):
     28        * UserInterface/Views/LogContentView.js:
     29        (WI.LogContentView.prototype.get saveData):
     30        (WI.LogContentView.prototype._handleContextMenuEvent):
     31        * UserInterface/Views/NetworkTableContentView.js:
     32        (WI.NetworkTableContentView.prototype._exportHAR):
     33        * UserInterface/Views/RecordingContentView.js:
     34        (WI.RecordingContentView.prototype._exportRecording):
     35        (WI.RecordingContentView.prototype._exportReduction):
     36        * UserInterface/Views/ScriptContentView.js:
     37        (WI.ScriptContentView.prototype.get saveData):
     38        * UserInterface/Views/ShaderProgramContentView.js:
     39        (WI.ShaderProgramContentView.prototype.get saveData):
     40        * UserInterface/Views/TextContentView.js:
     41        (WI.TextContentView.prototype.get saveData):
     42        * UserInterface/Views/TextResourceContentView.js:
     43        (WI.TextResourceContentView.prototype.get saveData):
     44        * UserInterface/Views/TimelineRecordingContentView.js:
     45        (WI.TimelineRecordingContentView.prototype._exportTimelineRecording):
     46        Update "web-inspector:///" URL building code to use the utility.
     47
    1482019-03-21  Nikita Vasilyev  <nvasilyev@apple.com>
    249
  • trunk/Source/WebInspectorUI/UserInterface/Base/FileUtilities.js

    r242992 r243355  
    3737        ];
    3838        return WI.UIString("Screen Shot %s-%s-%s at %s.%s.%s").format(...values);
     39    }
     40
     41    static sanitizeFilename(filename)
     42    {
     43        return filename.replace(/:+/g, "-");
     44    }
     45
     46    static inspectorURLForFilename(filename)
     47    {
     48        return "web-inspector:///" + encodeURIComponent(FileUtilities.sanitizeFilename(filename));
    3949    }
    4050
  • trunk/Source/WebInspectorUI/UserInterface/Base/Main.js

    r243024 r243355  
    30793079        let mainFrame = WI.networkManager.mainFrame;
    30803080        let archiveName = mainFrame.mainResource.urlComponents.host || mainFrame.mainResource.displayName || "Archive";
    3081         let url = "web-inspector:///" + encodeURI(archiveName) + ".webarchive";
     3081        let url = WI.FileUtilities.inspectorURLForFilename(archiveName + ".webarchive");
    30823082
    30833083        InspectorFrontendHost.save(url, data, true, true);
  • trunk/Source/WebInspectorUI/UserInterface/Controllers/AuditManager.js

    r243226 r243355  
    233233            filename = WI.UIString("%s Result").format(filename);
    234234
    235         let url = "web-inspector:///" + encodeURI(filename) + ".json";
    236 
    237235        WI.FileUtilities.save({
    238             url,
     236            url: WI.FileUtilities.inspectorURLForFilename(filename + ".json"),
    239237            content: JSON.stringify(object),
    240238            forceSaveAs: true,
  • trunk/Source/WebInspectorUI/UserInterface/Debug/ProtocolTrace.js

    r220119 r243355  
    5252        // When the Intl API is implemented, we can do a better job.
    5353        let filename = WI.unlocalizedString(`Protocol Trace at ${YYYY}-${MM}-${DD} ${hh}.${mm}.${ss}.json`);
    54         return {url: "web-inspector:///" + encodeURIComponent(filename), content: JSON.stringify(this._entries)};
     54        return {
     55            url: WI.FileUtilities.inspectorURLForFilename(filename),
     56            content: JSON.stringify(this._entries),
     57        };
    5558    }
    5659};
  • trunk/Source/WebInspectorUI/UserInterface/Test.html

    r242948 r243355  
    5858    <script src="Base/EventListener.js"></script>
    5959    <script src="Base/EventListenerSet.js"></script>
     60    <script src="Base/FileUtilities.js"></script>
    6061    <script src="Base/ImageUtilities.js"></script>
    6162    <script src="Base/MIMETypeUtilities.js"></script>
  • trunk/Source/WebInspectorUI/UserInterface/Views/ConsoleMessageView.js

    r243220 r243355  
    952952            const forceSaveAs = true;
    953953            WI.FileUtilities.save({
    954                 url: encodeURI("web-inspector:///" + image.getAttribute("filename")),
     954                url: WI.FileUtilities.inspectorURLForFilename(image.getAttribute("filename")),
    955955                content: parseDataURL(this._message.messageText).data,
    956956                base64Encoded: true,
  • trunk/Source/WebInspectorUI/UserInterface/Views/ContextMenuUtilities.js

    r243224 r243355  
    254254
    255255                WI.FileUtilities.save({
    256                     url: encodeURI(`web-inspector:///${WI.FileUtilities.screenshotString()}.png`),
     256                    url: WI.FileUtilities.inspectorURLForFilename(WI.FileUtilities.screenshotString() + ".png"),
    257257                    content: parseDataURL(dataURL).data,
    258258                    base64Encoded: true,
  • trunk/Source/WebInspectorUI/UserInterface/Views/HeapSnapshotContentView.js

    r243024 r243355  
    104104        ];
    105105        let filename = WI.UIString("Heap Snapshot %s-%s-%s at %s.%s.%s").format(...values);
    106         let url = "web-inspector:///" + encodeURI(filename) + ".json";
    107106        WI.FileUtilities.save({
    108             url,
     107            url: WI.FileUtilities.inspectorURLForFilename(filename + ".json"),
    109108            content: this.representedObject.snapshotStringData,
    110109            forceSaveAs: true,
  • trunk/Source/WebInspectorUI/UserInterface/Views/LogContentView.js

    r243260 r243355  
    266266    get saveData()
    267267    {
    268         return {url: "web-inspector:///Console.txt", content: this._formatMessagesAsData(false), forceSaveAs: true};
     268        return {
     269            url: WI.FileUtilities.inspectorURLForFilename("Console.txt"),
     270            content: this._formatMessagesAsData(false),
     271            forceSaveAs: true,
     272        };
    269273    }
    270274
     
    496500                const forceSaveAs = true;
    497501                WI.FileUtilities.save({
    498                     url: "web-inspector:///Console.txt",
     502                    url: WI.FileUtilities.inspectorURLForFilename("Console.txt"),
    499503                    content: this._formatMessagesAsData(true),
    500504                }, forceSaveAs);
  • trunk/Source/WebInspectorUI/UserInterface/Views/NetworkTableContentView.js

    r243180 r243355  
    21092109            let mainFrame = WI.networkManager.mainFrame;
    21102110            let archiveName = mainFrame.mainResource.urlComponents.host || mainFrame.mainResource.displayName || "Archive";
    2111             let url = "web-inspector:///" + encodeURI(archiveName) + ".har";
    21122111            WI.FileUtilities.save({
    2113                 url,
     2112                url: WI.FileUtilities.inspectorURLForFilename(archiveName + ".har"),
    21142113                content: JSON.stringify(har, null, 2),
    21152114                forceSaveAs: true,
  • trunk/Source/WebInspectorUI/UserInterface/Views/RecordingContentView.js

    r242809 r243355  
    177177    {
    178178        let filename = this.representedObject.displayName;
    179         let url = "web-inspector:///" + encodeURI(filename) + ".json";
    180179
    181180        WI.FileUtilities.save({
    182             url,
     181            url: WI.FileUtilities.inspectorURLForFilename(filename + ".json"),
    183182            content: JSON.stringify(this.representedObject.toJSON()),
    184183            forceSaveAs: true,
     
    194193
    195194        let filename = this.representedObject.displayName;
    196         let url = "web-inspector:///" + encodeURI(filename) + ".html";
    197195
    198196        WI.FileUtilities.save({
    199             url,
     197            url: WI.FileUtilities.inspectorURLForFilename(filename + ".html"),
    200198            content: this.representedObject.toHTML(),
    201199            forceSaveAs: true,
  • trunk/Source/WebInspectorUI/UserInterface/Views/ScriptContentView.js

    r237661 r243355  
    155155    get saveData()
    156156    {
    157         var url = this._script.url || "web-inspector:///" + encodeURI(this._script.displayName) + ".js";
     157        let url = this._script.url || WI.FileUtilities.inspectorURLForFilename(this._script.displayName + ".js");
    158158        return {url, content: this._textEditor.string};
    159159    }
  • trunk/Source/WebInspectorUI/UserInterface/Views/ShaderProgramContentView.js

    r242017 r243355  
    122122
    123123        return {
    124             url: `web-inspector:///${filename}.glsl`,
     124            url: WI.FileUtilities.inspectorURLForFilename(filename + ".glsl"),
    125125            content: this._lastActiveEditor.string,
    126126            forceSaveAs: true,
  • trunk/Source/WebInspectorUI/UserInterface/Views/TextContentView.js

    r237396 r243355  
    107107    get saveData()
    108108    {
    109         var url = "web-inspector:///" + encodeURI(WI.UIString("Untitled")) + ".txt";
     109        let url = WI.FileUtilities.inspectorURLForFilename(WI.UIString("Untitled") + ".txt");
    110110        return {url, content: this._textEditor.string, forceSaveAs: true};
    111111    }
  • trunk/Source/WebInspectorUI/UserInterface/Views/TextResourceContentView.js

    r237661 r243355  
    144144    get saveData()
    145145    {
    146         if (this.resource instanceof WI.CSSStyleSheet)
    147             return {url: "web-inspector:///InspectorStyleSheet.css", content: this._textEditor.string, forceSaveAs: true};
     146        if (this.resource instanceof WI.CSSStyleSheet) {
     147            let url = WI.FileUtilities.inspectorURLForFilename("InspectorStyleSheet.css");
     148            return {url, content: this._textEditor.string, forceSaveAs: true};
     149        }
    148150        return {url: this.resource.url, content: this._textEditor.string};
    149151    }
  • trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordingContentView.js

    r243301 r243355  
    605605
    606606        let filename = frameName ? `${frameName}-recording` : this._recording.displayName;
    607         let url = "web-inspector:///" + encodeURI(filename) + ".json";
     607
    608608        WI.FileUtilities.save({
    609             url,
     609            url: WI.FileUtilities.inspectorURLForFilename(filename + ".json"),
    610610            content: JSON.stringify(json),
    611611            forceSaveAs: true,
Note: See TracChangeset for help on using the changeset viewer.