Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 1 | // Copyright (c) 2015 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
Paul Lewis | 3b8ed65 | 2020-01-08 12:47:59 | [diff] [blame] | 4 | |
| 5 | import {InspectorFrontendHostInstance} from './InspectorFrontendHost.js'; |
| 6 | |
| 7 | export const ResourceLoader = {}; |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 8 | |
Tim van der Lippe | c96ccd9 | 2019-11-29 16:23:54 | [diff] [blame] | 9 | let _lastStreamId = 0; |
Tim van der Lippe | 50cfa9b | 2019-10-01 10:40:58 | [diff] [blame] | 10 | |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 11 | /** @type {!Object.<number, !Common.OutputStream>} */ |
Tim van der Lippe | c96ccd9 | 2019-11-29 16:23:54 | [diff] [blame] | 12 | const _boundStreams = {}; |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 13 | |
| 14 | /** |
| 15 | * @param {!Common.OutputStream} stream |
| 16 | * @return {number} |
| 17 | */ |
Tim van der Lippe | c96ccd9 | 2019-11-29 16:23:54 | [diff] [blame] | 18 | const _bindOutputStream = function(stream) { |
Tim van der Lippe | 50cfa9b | 2019-10-01 10:40:58 | [diff] [blame] | 19 | _boundStreams[++_lastStreamId] = stream; |
| 20 | return _lastStreamId; |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 21 | }; |
| 22 | |
| 23 | /** |
| 24 | * @param {number} id |
| 25 | */ |
Tim van der Lippe | c96ccd9 | 2019-11-29 16:23:54 | [diff] [blame] | 26 | const _discardOutputStream = function(id) { |
Tim van der Lippe | 50cfa9b | 2019-10-01 10:40:58 | [diff] [blame] | 27 | _boundStreams[id].close(); |
| 28 | delete _boundStreams[id]; |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 29 | }; |
| 30 | |
| 31 | /** |
| 32 | * @param {number} id |
| 33 | * @param {string} chunk |
| 34 | */ |
Tim van der Lippe | 50cfa9b | 2019-10-01 10:40:58 | [diff] [blame] | 35 | export const streamWrite = function(id, chunk) { |
| 36 | _boundStreams[id].write(chunk); |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 37 | }; |
| 38 | |
| 39 | /** |
| 40 | * @param {string} url |
| 41 | * @param {?Object.<string, string>} headers |
Sigurd Schneider | 4c5f0c6 | 2019-12-11 12:24:09 | [diff] [blame] | 42 | * @param {function(number, !Object.<string, string>, string, number)} callback |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 43 | */ |
Tim van der Lippe | 50cfa9b | 2019-10-01 10:40:58 | [diff] [blame] | 44 | export function load(url, headers, callback) { |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 45 | const stream = new Common.StringOutputStream(); |
Tim van der Lippe | 50cfa9b | 2019-10-01 10:40:58 | [diff] [blame] | 46 | loadAsStream(url, headers, stream, mycallback); |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 47 | |
| 48 | /** |
| 49 | * @param {number} statusCode |
| 50 | * @param {!Object.<string, string>} headers |
Sigurd Schneider | 4c5f0c6 | 2019-12-11 12:24:09 | [diff] [blame] | 51 | * @param {number} netError |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 52 | */ |
Sigurd Schneider | 4c5f0c6 | 2019-12-11 12:24:09 | [diff] [blame] | 53 | function mycallback(statusCode, headers, netError) { |
| 54 | callback(statusCode, headers, stream.data(), netError); |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 55 | } |
Tim van der Lippe | 50cfa9b | 2019-10-01 10:40:58 | [diff] [blame] | 56 | } |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 57 | |
| 58 | /** |
| 59 | * @param {string} url |
| 60 | * @param {?Object.<string, string>} headers |
| 61 | * @param {!Common.OutputStream} stream |
Sigurd Schneider | 4c5f0c6 | 2019-12-11 12:24:09 | [diff] [blame] | 62 | * @param {function(number, !Object.<string, string>, number)=} callback |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 63 | */ |
Tim van der Lippe | 50cfa9b | 2019-10-01 10:40:58 | [diff] [blame] | 64 | export const loadAsStream = function(url, headers, stream, callback) { |
| 65 | const streamId = _bindOutputStream(stream); |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 66 | const parsedURL = new Common.ParsedURL(url); |
| 67 | if (parsedURL.isDataURL()) { |
| 68 | loadXHR(url).then(dataURLDecodeSuccessful).catch(dataURLDecodeFailed); |
| 69 | return; |
| 70 | } |
| 71 | |
| 72 | const rawHeaders = []; |
| 73 | if (headers) { |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 74 | for (const key in headers) { |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 75 | rawHeaders.push(key + ': ' + headers[key]); |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 76 | } |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 77 | } |
Paul Lewis | 3b8ed65 | 2020-01-08 12:47:59 | [diff] [blame] | 78 | InspectorFrontendHostInstance.loadNetworkResource(url, rawHeaders.join('\r\n'), streamId, finishedCallback); |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 79 | |
| 80 | /** |
| 81 | * @param {!InspectorFrontendHostAPI.LoadNetworkResourceResult} response |
| 82 | */ |
| 83 | function finishedCallback(response) { |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 84 | if (callback) { |
Sigurd Schneider | 4c5f0c6 | 2019-12-11 12:24:09 | [diff] [blame] | 85 | callback(response.statusCode, response.headers || {}, response.netError || 0); |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 86 | } |
Tim van der Lippe | 50cfa9b | 2019-10-01 10:40:58 | [diff] [blame] | 87 | _discardOutputStream(streamId); |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 88 | } |
| 89 | |
| 90 | /** |
| 91 | * @param {string} text |
| 92 | */ |
| 93 | function dataURLDecodeSuccessful(text) { |
Tim van der Lippe | 50cfa9b | 2019-10-01 10:40:58 | [diff] [blame] | 94 | streamWrite(streamId, text); |
Blink Reformat | 4c46d09 | 2018-04-07 15:32:37 | [diff] [blame] | 95 | finishedCallback(/** @type {!InspectorFrontendHostAPI.LoadNetworkResourceResult} */ ({statusCode: 200})); |
| 96 | } |
| 97 | |
| 98 | function dataURLDecodeFailed() { |
| 99 | finishedCallback(/** @type {!InspectorFrontendHostAPI.LoadNetworkResourceResult} */ ({statusCode: 404})); |
| 100 | } |
| 101 | }; |