From ea64c4c2c7bc25dd2dbf3d09cade0d6827ddf015 Mon Sep 17 00:00:00 2001 From: passbe Date: Sat, 4 Dec 2010 00:54:04 +0000 Subject: [PATCH] Corrected JSON.stringify failing in IE8, plus added generic return message for browsers not supporting navigator.plugins. Ref Issue #40 git-svn-id: https://beef.googlecode.com/svn/trunk@594 b87d56ec-f9c0-11de-8c8a-61c5e9addfc9 --- modules/beefjs/browser.js | 2 + .../browser/detect_details/detect_details.js | 58 +++++++++++++++++-- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/modules/beefjs/browser.js b/modules/beefjs/browser.js index 3d92c527b..83a4847cd 100644 --- a/modules/beefjs/browser.js +++ b/modules/beefjs/browser.js @@ -276,6 +276,8 @@ beef.browser = { results += ','; results += navigator.plugins[i].name; } + } else { + results = 'navigator.plugins is not supported in this browser!'; } return results; }, diff --git a/modules/commands/browser/detect_details/detect_details.js b/modules/commands/browser/detect_details/detect_details.js index af62c4b84..7029b0952 100644 --- a/modules/commands/browser/detect_details/detect_details.js +++ b/modules/commands/browser/detect_details/detect_details.js @@ -1,11 +1,61 @@ beef.execute(function() { + +function serialize(_obj) +{ + // Let Gecko browsers do this the easy way + if (typeof _obj.toSource !== 'undefined' && typeof _obj.callee === 'undefined') + { + return _obj.toSource(); + } + + // Other browsers must do it the hard way + switch (typeof _obj) + { + // numbers, booleans, and functions are trivial: + // just return the object itself since its default .toString() + // gives us exactly what we want + case 'number': + case 'boolean': + case 'function': + return _obj; + break; + + // for JSON format, strings need to be wrapped in quotes + case 'string': + return '\'' + _obj + '\''; + break; + + case 'object': + var str; + if (_obj.constructor === Array || typeof _obj.callee !== 'undefined') + { + str = '['; + var i, len = _obj.length; + for (i = 0; i < len-1; i++) { str += serialize(_obj[i]) + ','; } + str += serialize(_obj[i]) + ']'; + } + else + { + str = '{'; + var key; + for (key in _obj) { str += key + ':' + serialize(_obj[key]) + ','; } + str = str.replace(/\,$/, '') + '}'; + } + return str; + break; + + default: + return 'UNKNOWN'; + break; + } +} + var plugins = beef.browser.getPlugins(); - var browser_type = JSON.stringify(beef.browser.type()); + var browser_type = serialize(beef.browser.type()); var java_enabled = (beef.browser.hasJava())? "Yes" : "No"; var vbscript_enabled = (beef.browser.hasVBScript())? "Yes" : "No"; var has_flash = (beef.browser.hasFlash())? "Yes" : "No"; - var screen_params = JSON.stringify(beef.browser.getScreenParams()); - var window_size = JSON.stringify(beef.browser.getWindowSize()); - + var screen_params = serialize(beef.browser.getScreenParams()); + var window_size = serialize(beef.browser.getWindowSize()); beef.net.sendback('<%= @command_url %>', <%= @command_id %>, 'plugins='+plugins+'&java_enabled='+java_enabled+'&vbscript_enabled='+vbscript_enabled+'&has_flash='+has_flash+'&browser_type='+browser_type+'&screen_params='+screen_params+'&window_size='+window_size); }); \ No newline at end of file