From 7b57d07e345943c908fe905190c618799b13cd9b Mon Sep 17 00:00:00 2001 From: kev Date: Thu, 25 Dec 2014 14:58:24 +0800 Subject: [PATCH] update parser --- webkit/parser.js | 232 +++++++++++++++++++++-------------------------- 1 file changed, 101 insertions(+), 131 deletions(-) diff --git a/webkit/parser.js b/webkit/parser.js index 49acb2d..3bd0cd7 100644 --- a/webkit/parser.js +++ b/webkit/parser.js @@ -1,140 +1,110 @@ var utils = require('./utils'); +var _ = utils._; +var _s = utils._s; + var setDefaults = function(req) { - - /* - - isDebug - - requestId - - targetUrl (required) - - targetContent - - requestType - - timeout - - loadImages - - delayTime - - userAgent - - resourceUrlWhitelist (FIXME) - - resourceUrlBlacklist - - viewportSize - - clipRectangle - - scrollTo (FIXME) - - injectedScripts - - execScripts (FIXME: targetPageLoaded) - */ - - if(req.isDebug === undefined) { - req.isDebug = false; - } else if(typeof req.isDebug !== 'boolean') { - throw 'isDebug: type-error'; - } - - if(req.requestId === undefined) { - req.requestId = utils.guid(); - } else if(typeof req.requestId !== 'string') { - throw 'requestId: type-error'; - } - - if(req.userAgent === undefined) { - req.userAgent = 'Mozilla/5.0 PhantomJS/1.9.8'; - } else if(typeof req.userAgent !== 'string') { - throw 'userAgent: type-error'; - } - - if(req.targetUrl === undefined) { - throw 'targetUrl: missing'; - } else if(typeof req.targetUrl !== 'string') { - throw 'targetUrl: type-error'; - } - - if(req.targetContent === undefined) { - } else if(typeof req.targetContent !== 'string') { - throw 'targetContent: type-error'; - } - - if(req.requestType === undefined) { - req.requestType = 'text'; - } else if(typeof req.requestType !== 'string') { - throw 'targetType: type-error'; - } - - if(req.delayTime === undefined) { - req.delayTime = 0; - } else if(typeof req.delayTime !== 'number') { - throw 'delayTime: type-error'; - } else if(req.delayTime < 0 || req.delayTime > 300000) { - throw 'delayTime: out-of-range'; - } - - if(req.timeout === undefined) { - req.timeout = 60000; - } else if(typeof req.timeout !== 'number') { - throw 'timeout: type-error'; - } else if(req.timeout < 1000 || req.timeout > 300000) { - throw 'timeout: out-of-range'; - } - - if(req.loadImages === undefined) { - req.loadImages = false; - } else if(typeof req.loadImages !== 'boolean') { - throw 'timeout: type-error'; - } - - if(req.cookies === undefined) { - req.cookies = []; - } else if(req.cookies.length === undefined) { - throw 'cookies: type-error'; - } - - if(req.customRequestHeaders === undefined) { - req.customRequestHeaders = []; - } else if(req.customRequestHeaders.length === undefined) { - throw 'customRequestHeaders: type-error'; - } - - if(req.resourceUrlWhitelist === undefined) { - req.resourceUrlWhitelist = []; - } else if(req.resourceUrlWhitelist.length === undefined) { - throw 'resourceUrlWhitelist: type-error'; - } - - if(req.resourceUrlBlacklist === undefined) { - req.resourceUrlBlacklist = []; // set it to ['.*\.css.*'] to block stylesheet - } else if(req.resourceUrlBlacklist.length === undefined) { - throw 'resourceUrlBlacklist: type-error'; - } - - if(req.viewportSize === undefined) { - req.viewportSize = {width: 800, height: 600, zoomFactor: 1}; - } else if(typeof req.viewportSize !== 'object') { - throw 'viewportSize: type-error'; - } - - if(req.clipRectangle === undefined) { - req.clipRectangle = {top: 0, left: 0, width: 0, height: 0}; - } else if(typeof req.clipRectangle !== 'object') { - throw 'clipRectangle: type-error'; - } - - if(req.scrollTo === undefined) { - req.scrollTo = {top: 0, left: 0}; - } else if(typeof req.scrollTo !== 'object') { - throw 'scrollTo: type-error'; - } - - if(req.injectedScripts === undefined) { - req.injectedScripts = []; - } else if(req.injectedScripts.length === undefined) { - throw 'injectedScripts: type-error'; - } - - if(req.execScripts === undefined) { - req.execScripts = {preInjected: [], postInjected: []}; - } else if(typeof req.execScripts !== 'object') { - throw 'execScripts: type-error'; - } - + req.clipRectangle = checkObject('clipRectangle', req.clipRectangle, {top: 0, left: 0, width: 0, height: 0}); + req.cookies = checkArray('cookies', req.cookies, []); + req.customRequestHeaders = checkArray('customRequestHeaders', req.customRequestHeaders, []); + req.delayTime = checkNumber('delayTime', req.delayTime, 0, 300000, 0); + req.execScripts = checkObject('execScripts', req.execScripts, {preInjected: [], postInjected: []}); + req.injectedScripts = checkArray('injectedScripts', req.injectedScripts, []); + req.isDebug = checkBoolean('isDebug', req.isDebug, false); + req.loadImages = checkBoolean('loadImages', req.loadImages, false); + req.outputAsJson = checkBoolean('outputAsJson', req.outputAsJson, true); //FIXME: it is ignored + req.requestId = checkString('requestId', req.requestId, utils.guid()); + req.requestType = checkString('requestType', req.requestType, 'text'); + req.resourceUrlBlacklist = checkArray('resourceUrlBlacklist', req.resourceUrlBlacklist, []); //HINT: set it to ['.*\.css.*'] to block stylesheet + req.resourceUrlWhitelist = checkArray('resourceUrlWhitelist', req.resourceUrlWhitelist, []); //FIXME: not implemented + req.scrollTo = checkObject('scrollTo', req.scrollTo, {top: 0, left: 0}); //FIXME: it doesn't work as expected + req.targetContent = checkString('targetContent', req.targetContent, ''); + req.targetUrl = checkString('targetUrl', req.targetUrl); // required + req.timeout = checkNumber('timeout', req.timeout, 1000, 300000, 60000); + req.userAgent = checkString('userAgent', req.userAgent, 'Mozilla/5.0 PhantomJS/1.9.8'); + req.viewportSize = checkObject('viewportSize', req.viewportSize, {width: 800, height: 600, zoomFactor: 1}); return req; } + +function checkNumber(name, value, min, max, defaultValue) { + if(_.isUndefined(value)) { + if(_.isUndefined(defaultValue)) { + throw _s.sprintf('ValueError: `%s` is undefined', name); + } else { + return defaultValue; + } + } else if(!_.isNumber(value)) { + throw _s.sprintf('TypeError: `%s` is not a number', name); + } else if(value < min || value > max) { + throw _s.sprintf('ValueError: `%s` is out of range []', name); + } else { + return value; + } +} + + +function checkBoolean(name, value, defaultValue) { + if(_.isUndefined(value)) { + if(_.isUndefined(defaultValue)) { + throw _s.sprintf('ValueError: `%s` is undefined', name); + } else { + return defaultValue; + } + } else if(!_.isBoolean(value)) { + throw _s.sprintf('TypeError: `%s` is not a boolean', name); + } else { + return value; + } +} + + +function checkString(name, value, defaultValue) { + if(_.isUndefined(value)) { + if(_.isUndefined(defaultValue)) { + throw _s.sprintf('ValueError: `%s` is undefined', name); + } else { + return defaultValue; + } + } else if(!_.isString(value)) { + throw _s.sprintf('TypeError: `%s` is not a string', name); + } else { + return value; + } +} + + +function checkArray(name, value, defaultValue) { + if(_.isUndefined(value)) { + if(_.isUndefined(defaultValue)) { + throw _s.sprintf('ValueError: `%s` is undefined', name); + } else { + return defaultValue; + } + } else if(!_.isArray(value)) { + throw _s.sprintf('TypeError: `%s` is not a array', name); + } else { + return value; + } +} + + +function checkObject(name, value, defaultValue) { + if(_.isUndefined(value)) { + if(_.isUndefined(defaultValue)) { + throw _s.sprintf('ValueError: `%s` is undefined', name); + } else { + return defaultValue; + } + } else if(!_.isObject(value)) { + throw _s.sprintf('TypeError: `%s` is not a object', name); + } else { + _.defaults(value, defaultValue); + return value; + } +} + + module.exports.setDefaults = setDefaults;