From 355fddea91c8b49f07781fa26f49a7240ddc2018 Mon Sep 17 00:00:00 2001 From: Panayot Cankov Date: Wed, 9 Mar 2016 11:06:09 +0200 Subject: [PATCH] The webinspector debugger now does not requre http-request --- ...nds.ts => InspectorBackendCommands.ios.ts} | 0 debugger/debugger.ts | 132 +++------- debugger/webinspector.ios.ts | 229 ++++++++++++++++++ globals/decorators.ts | 32 +++ globals/globals.ts | 33 +-- http/http-request.d.ts | 2 - http/http-request.ios.ts | 60 ++--- http/resource-data.ts | 83 ------- inspector_modules.ios.ts | 2 + tsconfig.json | 8 +- 10 files changed, 324 insertions(+), 257 deletions(-) rename debugger/{InspectorBackendCommands.ts => InspectorBackendCommands.ios.ts} (100%) create mode 100644 debugger/webinspector.ios.ts create mode 100644 globals/decorators.ts delete mode 100644 http/resource-data.ts create mode 100644 inspector_modules.ios.ts diff --git a/debugger/InspectorBackendCommands.ts b/debugger/InspectorBackendCommands.ios.ts similarity index 100% rename from debugger/InspectorBackendCommands.ts rename to debugger/InspectorBackendCommands.ios.ts diff --git a/debugger/debugger.ts b/debugger/debugger.ts index 484f75566..7f5699038 100644 --- a/debugger/debugger.ts +++ b/debugger/debugger.ts @@ -1,103 +1,39 @@ -import definition = require("./InspectorBackendCommands"); -import http_request = require("http/http-request"); +export namespace domains { + export namespace network { + export interface NetworkDomainDebugger { + create(): domains.network.NetworkRequest; + } + + export interface Headers { + } -var resources_datas = []; + export interface Request { + url: string; + method: string; + headers: domains.network.Headers; + postData?: string; + } -@definition.DomainDispatcher("Network") -export class NetworkDomainDebugger implements definition.NetworkDomain.NetworkDomainDispatcher { - private events: definition.NetworkDomain.NetworkFrontend; + export interface Response { + url: string; + status: number; + statusText: string; + headers: Headers; + headersText?: string; + mimeType: string; + requestHeaders?: domains.network.Headers; + requestHeadersText?: string; + fromDiskCache?: boolean; + } - constructor(dispatchMessage: (message: String) => void) { - this.events = new definition.NetworkDomain.NetworkFrontend(dispatchMessage); - } - - /** - * Enables network tracking, network events will now be delivered to the client. - */ - enable(): void { - http_request.domainDebugger = { - "events": this.events, - "resource_datas": resources_datas - } - } - - /** - * Disables network tracking, prevents network events from being sent to the client. - */ - disable(): void { - // - } - - /** - * Specifies whether to always send extra HTTP headers with the requests from this page. - */ - setExtraHTTPHeaders(params: definition.NetworkDomain.SetExtraHTTPHeadersMethodArguments): void { - // - } - - /** - * Returns content served for the given request. - */ - getResponseBody(params: definition.NetworkDomain.GetResponseBodyMethodArguments): { body: string, base64Encoded: boolean } { - var resource_data = resources_datas[params.requestId]; - var body = resource_data.hasTextContent ? NSString.alloc().initWithDataEncoding(resource_data.data, 4).toString() : - resource_data.data.base64EncodedStringWithOptions(0); - - if(resource_data) { - return { - body: body, - base64Encoded: !resource_data.hasTextContent - }; - } - } - - /** - * Tells whether clearing browser cache is supported. - */ - canClearBrowserCache(): { result: boolean } { - return { - result: false - }; - } - - /** - * Clears browser cache. - */ - clearBrowserCache(): void { - // - } - - /** - * Tells whether clearing browser cookies is supported. - */ - canClearBrowserCookies(): { result: boolean } { - return { - result: false - }; - } - - /** - * Clears browser cookies. - */ - clearBrowserCookies(): void { - // - } - - /** - * Toggles ignoring cache for each request. If true, cache will not be used. - */ - setCacheDisabled(params: definition.NetworkDomain.SetCacheDisabledMethodArguments): void { - // - } - - /** - * Loads a resource in the context of a frame on the inspected page without cross origin checks. - */ - loadResource(params: definition.NetworkDomain.LoadResourceMethodArguments): { content: string, mimeType: string, status: number } { - return { - content: "", - mimeType: "", - status: 200 + export interface NetworkRequest { + mimeType: string; + data: any; + responseReceived(response: domains.network.Response); + loadingFinished(); + requestWillBeSent(request: domains.network.Request); } } -} \ No newline at end of file +} + +export var network: domains.network.NetworkDomainDebugger; diff --git a/debugger/webinspector.ios.ts b/debugger/webinspector.ios.ts new file mode 100644 index 000000000..fdc5b44fa --- /dev/null +++ b/debugger/webinspector.ios.ts @@ -0,0 +1,229 @@ +import * as inspectorCommandTypes from "./InspectorBackendCommands.ios"; +var inspectorCommands: typeof inspectorCommandTypes = require("./InspectorBackendCommands"); + +import * as debuggerDomains from "./debugger"; + +declare var __inspectorTimestamp; + +const frameId = "NativeScriptMainFrameIdentifier"; +const loaderId = "Loader Identifier"; + +var resources_datas = []; + +var documentTypeByMimeType = { + "text/xml": "Document", + "text/plain": "Document", + "text/html": "Document", + "application/xml": "Document", + "application/xhtml+xml": "Document", + "text/css": "Stylesheet", + "text/javascript": "Script", + "text/ecmascript": "Script", + "application/javascript": "Script", + "application/ecmascript": "Script", + "application/x-javascript": "Script", + "application/json": "Script", + "application/x-json": "Script", + "text/x-javascript": "Script", + "text/x-json": "Script", + "text/typescript": "Script" +} + +export class Request { + + private _resourceType: string; + private _data: any; + private _mimeType: string; + + constructor(private _networkDomainDebugger: NetworkDomainDebugger, private _requestID: string) { + } + + get mimeType(): string { + return this._mimeType; + } + + set mimeType(value: string) { + if (this._mimeType !== value) { + this._mimeType = value; + + var resourceType = "Other"; + + if (this._mimeType in documentTypeByMimeType) { + resourceType = documentTypeByMimeType[this._mimeType]; + } + + if(this._mimeType.indexOf("image/") !== -1) { + resourceType = "Image"; + } + + if (this._mimeType.indexOf("font/") !== -1) { + resourceType = "Font"; + } + + this._resourceType = resourceType; + } + } + + get requestID(): string { + return this._requestID; + } + + get hasTextContent(): boolean { + return [ "Document", "Stylesheet", "Script", "XHR" ].indexOf(this._resourceType) !== -1; + } + + get data(): any { + return this._data; + } + + set data(value: any) { + if (this._data !== value) { + this._data = value; + } + } + + get resourceType() { + return this._resourceType; + } + + set resourceType(value: string) { + if (this._resourceType !== value) { + this._resourceType = value; + } + } + + public responseReceived(response: inspectorCommandTypes.NetworkDomain.Response): void { + if (this._networkDomainDebugger.enabled) { + this._networkDomainDebugger.events.responseReceived(this.requestID, frameId, loaderId, __inspectorTimestamp(), this.resourceType, response); + } + } + + public loadingFinished(): void { + if (this._networkDomainDebugger.enabled) { + this._networkDomainDebugger.events.loadingFinished(this.requestID, __inspectorTimestamp()); + } + } + + public requestWillBeSent(request: inspectorCommandTypes.NetworkDomain.Request): void { + if (this._networkDomainDebugger.enabled) { + this._networkDomainDebugger.events.requestWillBeSent(this.requestID, frameId, loaderId, request.url, request, __inspectorTimestamp(), { type: 'Script' }); + } + } +} + +@inspectorCommands.DomainDispatcher("Network") +export class NetworkDomainDebugger implements inspectorCommandTypes.NetworkDomain.NetworkDomainDispatcher { + private _enabled: boolean; + public events: inspectorCommandTypes.NetworkDomain.NetworkFrontend; + + constructor(dispatchMessage: (message: String) => void) { + this.events = new inspectorCommands.NetworkDomain.NetworkFrontend(dispatchMessage); + } + + get enabled(): boolean { + return this._enabled; + } + + /** + * Enables network tracking, network events will now be delivered to the client. + */ + enable(): void { + if (debuggerDomains.network) { + throw new Error("One NetworkDomainDebugger may be enabled at a time."); + } else { + debuggerDomains.network = this; + } + this._enabled = true; + } + + /** + * Disables network tracking, prevents network events from being sent to the client. + */ + disable(): void { + if (debuggerDomains.network === this) { + debuggerDomains.network = null; + } + this._enabled = false; + } + + /** + * Specifies whether to always send extra HTTP headers with the requests from this page. + */ + setExtraHTTPHeaders(params: inspectorCommandTypes.NetworkDomain.SetExtraHTTPHeadersMethodArguments): void { + // + } + + /** + * Returns content served for the given request. + */ + getResponseBody(params: inspectorCommandTypes.NetworkDomain.GetResponseBodyMethodArguments): { body: string, base64Encoded: boolean } { + var resource_data = resources_datas[params.requestId]; + var body = resource_data.hasTextContent ? NSString.alloc().initWithDataEncoding(resource_data.data, 4).toString() : + resource_data.data.base64EncodedStringWithOptions(0); + + if(resource_data) { + return { + body: body, + base64Encoded: !resource_data.hasTextContent + }; + } + } + + /** + * Tells whether clearing browser cache is supported. + */ + canClearBrowserCache(): { result: boolean } { + return { + result: false + }; + } + + /** + * Clears browser cache. + */ + clearBrowserCache(): void { + // + } + + /** + * Tells whether clearing browser cookies is supported. + */ + canClearBrowserCookies(): { result: boolean } { + return { + result: false + }; + } + + /** + * Clears browser cookies. + */ + clearBrowserCookies(): void { + // + } + + /** + * Toggles ignoring cache for each request. If true, cache will not be used. + */ + setCacheDisabled(params: inspectorCommandTypes.NetworkDomain.SetCacheDisabledMethodArguments): void { + // + } + + /** + * Loads a resource in the context of a frame on the inspected page without cross origin checks. + */ + loadResource(params: inspectorCommandTypes.NetworkDomain.LoadResourceMethodArguments): { content: string, mimeType: string, status: number } { + return { + content: "", + mimeType: "", + status: 200 + } + } + + public static idSequence: number = 0; + create(): Request { + let id = (++NetworkDomainDebugger.idSequence).toString(); + let resourceData = new Request(this, id); + resources_datas[id] = resourceData; + return resourceData; + } +} \ No newline at end of file diff --git a/globals/decorators.ts b/globals/decorators.ts new file mode 100644 index 000000000..f3050cbe8 --- /dev/null +++ b/globals/decorators.ts @@ -0,0 +1,32 @@ +if (typeof global.__decorate !== "function") { + global.__decorate = function (decorators, target, key, desc) { + var c = arguments.length; + var r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + + if (typeof global.Reflect === "object" && typeof global.Reflect.decorate === "function") { + r = global.Reflect.decorate(decorators, target, key, desc); + } + else { + for (var i = decorators.length - 1; i >= 0; i--) { + if (d = decorators[i]) { + r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + } + } + } + return c > 3 && r && Object.defineProperty(target, key, r), r; + } +} + +if (typeof global.__metadata !== "function") { + global.__metadata = function (k, v) { + if (typeof global.Reflect === "object" && typeof global.Reflect.metadata === "function") { + return global.Reflect.metadata(k, v); + } + }; +} + +if (typeof global.__param !== "function") { + global.__param = (global && global.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } + }; +} \ No newline at end of file diff --git a/globals/globals.ts b/globals/globals.ts index 9d128c86e..a166615e2 100644 --- a/globals/globals.ts +++ b/globals/globals.ts @@ -100,38 +100,7 @@ if (platform.device.os === platform.platformNames.android) { global.console.dump = function (args) { c.dump(args); }; } -if (typeof global.__decorate !== "function") { - global.__decorate = function (decorators, target, key, desc) { - var c = arguments.length; - var r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - - if (typeof global.Reflect === "object" && typeof global.Reflect.decorate === "function") { - r = global.Reflect.decorate(decorators, target, key, desc); - } - else { - for (var i = decorators.length - 1; i >= 0; i--) { - if (d = decorators[i]) { - r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - } - } - } - return c > 3 && r && Object.defineProperty(target, key, r), r; - } -} - -if (typeof global.__metadata !== "function") { - global.__metadata = function (k, v) { - if (typeof global.Reflect === "object" && typeof global.Reflect.metadata === "function") { - return global.Reflect.metadata(k, v); - } - }; -} - -if (typeof global.__param !== "function") { - global.__param = (global && global.__param) || function (paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); } - }; -} +require("./decorators"); export function Deprecated(target: Object, key?: string | symbol, descriptor?: any) { if (descriptor) { diff --git a/http/http-request.d.ts b/http/http-request.d.ts index 2115aa05c..14f6afdce 100644 --- a/http/http-request.d.ts +++ b/http/http-request.d.ts @@ -2,7 +2,5 @@ declare module "http/http-request" { import http = require("http"); - - export var domainDebugger: any; export var request: (options: http.HttpRequestOptions) => Promise; } diff --git a/http/http-request.ios.ts b/http/http-request.ios.ts index e4633628c..c625631a0 100644 --- a/http/http-request.ios.ts +++ b/http/http-request.ios.ts @@ -2,7 +2,6 @@ * iOS specific http request implementation. */ -declare var __inspectorTimestamp; import http = require("http"); import * as types from "utils/types"; @@ -10,8 +9,7 @@ import * as imageSourceModule from "image-source"; import * as utilsModule from "utils/utils"; import * as fsModule from "file-system"; -import resource_data = require("./resource-data"); -import debuggerDomains = require("./../debugger/debugger"); +import domainDebugger = require("./../debugger/debugger"); var GET = "GET"; var USER_AGENT_HEADER = "User-Agent"; @@ -20,8 +18,6 @@ var sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration(); var queue = NSOperationQueue.mainQueue(); var session = NSURLSession.sessionWithConfigurationDelegateDelegateQueue(sessionConfig, null, queue); -export var domainDebugger: any; - var utils: typeof utilsModule; function ensureUtils() { if (!utils) { @@ -40,14 +36,7 @@ export function request(options: http.HttpRequestOptions): Promise((resolve, reject) => { try { - // var sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration(); - // var queue = NSOperationQueue.mainQueue(); - // var session = NSURLSession.sessionWithConfigurationDelegateDelegateQueue( - // sessionConfig, null, queue); - - var requestId = Math.random().toString(); - var resourceData = new resource_data.ResourceData(requestId); - domainDebugger.resource_datas[requestId] = resourceData; + var debugRequest = domainDebugger.network && domainDebugger.network.create(); var urlRequest = NSMutableURLRequest.requestWithURL( NSURL.URLWithString(options.url)); @@ -87,28 +76,22 @@ export function request(options: http.HttpRequestOptions): Promisehttp).addHeader(headers, key, value); } } - - domainDebugger.resource_datas[requestId].mimeType = response.MIMEType; - domainDebugger.resource_datas[requestId].data = data; - var debugResponse = { - // Response URL. This URL can be different from CachedResource.url in case of redirect. - url: options.url, - // HTTP response status code. - status: response.statusCode, - // HTTP response status text. - statusText: NSHTTPURLResponse.localizedStringForStatusCode(response.statusCode), - // HTTP response headers. - headers: headers, - // HTTP response headers text. - mimeType: response.MIMEType, - fromDiskCache: false + + if (debugRequest) { + debugRequest.mimeType = response.MIMEType; + debugRequest.data = data; + var debugResponse = { + url: options.url, + status: response.statusCode, + statusText: NSHTTPURLResponse.localizedStringForStatusCode(response.statusCode), + headers: headers, + mimeType: response.MIMEType, + fromDiskCache: false + } + debugRequest.responseReceived(debugResponse); + debugRequest.loadingFinished(); } - // Loader Identifier is hardcoded in the runtime and should be the same string - // __inspectorTimestamp is provided by the runtime and returns a frontend friendly timestamp - domainDebugger.events.responseReceived(requestId, "NativeScriptMainFrameIdentifier", "Loader Identifier", __inspectorTimestamp(), exports.domainDebugger.resource_datas[requestId].resourceType, debugResponse); - domainDebugger.events.loadingFinished(requestId, __inspectorTimestamp()); - resolve({ content: { raw: data, @@ -162,14 +145,13 @@ export function request(options: http.HttpRequestOptions): Promise