diff options
author | rvelices <rv-github@modusoptimus.com> | 2007-02-23 13:18:34 +0000 |
---|---|---|
committer | rvelices <rv-github@modusoptimus.com> | 2007-02-23 13:18:34 +0000 |
commit | cb2408a82c9bc93bef177dc33a8981bc36800839 (patch) | |
tree | 85728267a379dd1b39ac089ab2021f000e6cb668 /tools/ws.htm | |
parent | 6f03e29735ea395f31d09bbfd15a4e15eaf961e3 (diff) |
Plugins:
- display author and and author url (if present) on plugin admin page
- uniformized versions/authors... for all plugins in svn
- security fix (html escape name, version, uri, author... to avoid javascript injection which could automatically simulate click on Install)
- added confirmation for install/uninstall plugins
Web services:
- web service explorer now caches method details in order to avoid unnecessary web calls
- web service explorer can now send parameters as arrays
- web service explorer uses now prototype.js version 1.5
- small improvements
- added and use function bad_request (sends http status code 400)
git-svn-id: http://piwigo.org/svn/trunk@1852 68402e56-0260-453c-a942-63ccdbb3a9ee
Diffstat (limited to '')
-rw-r--r-- | tools/ws.htm | 141 |
1 files changed, 78 insertions, 63 deletions
diff --git a/tools/ws.htm b/tools/ws.htm index ac525ab1d..fe2b5840b 100644 --- a/tools/ws.htm +++ b/tools/ws.htm @@ -5,22 +5,10 @@ <script type="text/javascript" src="prototype.js" ></script> <script type="text/javascript"> -function setElementText(id, text) -{ - if (!text) text=""; - var elt = document.getElementById(id); - if (!elt) alert('setElementText '+id); - elt.innerHTML = text; -} function setVisibility(id, vis) { - document.getElementById(id).style.visibility = vis; -} - -function clearError() -{ - setElementText("error", ""); + $(id).style.visibility = vis; } function dumpError(err) @@ -37,11 +25,11 @@ function dumpError(err) s += '<br/><small><pre>'+ err.stack + '</pre></small>'; } } - setElementText("error", s); + $("error").update(s); } var gServiceUrl; -var gCurrentMethodParams; +var gCachedMethods; Ajax.Responders.register({ @@ -100,13 +88,14 @@ function pwgGetJsonResult(transport) function pwgChangeUrl() { - clearError(); + $("error").update(""); setVisibility("methodListWrapper", "hidden"); - setElementText("methodList", ""); + $("methodList").update(""); setVisibility("methodWrapper", "hidden"); + setVisibility("methodDetailWrapper", "hidden"); gServiceUrl = $F('ws_url'); - gCurrentMethodParams = null; + gCachedMethods = new Hash(); try { var ajaxReq = new Ajax.Request( @@ -130,29 +119,32 @@ function onSuccess_getMethodList(transport) { ml += '<li><a href="#" onclick="return pwgSelectMethod(this.innerHTML)">'+ result.methods[i]+'</a></li>'; } - setElementText("methodList", ml); + $("methodList").update(ml); setVisibility("methodListWrapper", "visible"); } -function pwgSelectMethod(method) +function pwgSelectMethod(methodName) { - clearError(); - setElementText("methodName", method); + $("error").update(""); + $("methodName").update(methodName); setVisibility("methodDetailWrapper", "hidden"); setVisibility("methodWrapper", "visible"); - gCurrentMethodParams = null; - try { - - var ajaxReq = new Ajax.Request( - gServiceUrl, - {method:'get', parameters:'format=json&method=reflection.getMethodDetails&methodName='+method, - onSuccess: function (r) { onSuccess_getMethodDetails(r); } - } - ) - }catch (e) + if ( gCachedMethods[methodName] ) + fillNewMethod( gCachedMethods[methodName] ); + else { - dumpError( e ); + try { + var ajaxReq = new Ajax.Request( + gServiceUrl, + {method:'get', parameters:'format=json&method=reflection.getMethodDetails&methodName='+methodName, + onSuccess: function (r) { onSuccess_getMethodDetails(r); } + } + ) + }catch (e) + { + dumpError( e ); + } } return false; } @@ -160,67 +152,90 @@ function pwgSelectMethod(method) function onSuccess_getMethodDetails(transport) { var result = pwgGetJsonResult(transport); + fillNewMethod( gCachedMethods[result.name] = $H(result) ); +} + +function fillNewMethod(method) +{ var methodParamsElt = $("methodParams"); while (methodParamsElt.tBodies[0].rows.length) methodParamsElt.tBodies[0].deleteRow(methodParamsElt.tBodies[0].rows.length-1); - if (result.params) - { - gCurrentMethodParams = result.params; - if (result.params.length>0) - { - for (var i=0; i<result.params.length; i++) + if (method.params && method.params.length>0) + { + for (var i=0; i<method.params.length; i++) { var row = methodParamsElt.tBodies[0].insertRow(-1); - var isOptional = result.params[i].optional; - var defaultValue = result.params[i].defaultValue == null ? '' : result.params[i].defaultValue; + var isOptional = method.params[i].optional; + var acceptArray = method.params[i].acceptArray; + var defaultValue = method.params[i].defaultValue == null ? '' : method.params[i].defaultValue; - row.insertCell(0).innerHTML = result.params[i].name; - row.insertCell(1).innerHTML = (isOptional ? 'optional':'required'); + row.insertCell(0).innerHTML = method.params[i].name; + row.insertCell(1).innerHTML = '<span title="parameter is '+(isOptional ? 'optional':'required') +'">'+(isOptional ? '?':'*')+'</span>' + + (method.params[i].acceptArray ? ' <span title="parameter can be an array; use | (pipe) character to split values">[ ]</span>':''); row.insertCell(2).innerHTML = '<input id="methodParameterSend_'+i+'" type="checkbox" '+(isOptional ? '':'checked="checked"')+'/>'; row.insertCell(3).innerHTML = '<input id="methodParameterValue_'+i+'"" value="'+defaultValue+'" style="width:99%" onchange="$(\'methodParameterSend_'+i+'\').checked=true;"/>'; } - } - } - setElementText("methodDescription", result.description); + } + $("methodDescription").update(method.description); setVisibility("methodDetailWrapper", "visible"); } function pwgInvokeMethod( newWindow ) { - var method = document.getElementById('methodName').innerHTML; + var methodName = $('methodName').innerHTML; + var method = gCachedMethods[methodName]; var reqUrl = gServiceUrl; reqUrl += "?format="+$F('responseFormat'); - if (document.getElementById('requestFormat').value == 'get') + if ($('requestFormat').value == 'get') { - reqUrl += "&method="+method; - for ( var i=0; i<gCurrentMethodParams.length; i++) + reqUrl += "&method="+methodName; + for ( var i=0; i<method.params.length; i++) { - if (document.getElementById('methodParameterSend_'+i).checked) - reqUrl += '&'+gCurrentMethodParams[i].name+'='+$F('methodParameterValue_'+i); + if (! $('methodParameterSend_'+i).checked) + continue; + + if ( method.params[i].acceptArray && $F('methodParameterValue_'+i).split('|').length > 1 ) + { + $F('methodParameterValue_'+i).split('|').each( + function(v) { + reqUrl += '&'+method.params[i].name+'[]='+v; + } + ); + } + else + reqUrl += '&'+method.params[i].name+'='+$F('methodParameterValue_'+i); } if ( !newWindow ) - document.getElementById("invokeFrame").src = reqUrl; + $("invokeFrame").src = reqUrl; else window.open(reqUrl); } else { - var form = document.getElementById("invokeForm"); + var form = $("invokeForm"); form.action = reqUrl; - var t = '<input type="hidden" name="'+'method'+'" value="'+method+'"/>'; - for ( var i=0; i<gCurrentMethodParams.length; i++) + var t = '<input type="hidden" name="'+'method'+'" value="'+methodName+'"/>'; + for ( var i=0; i<method.params.length; i++) { - if (document.getElementById('methodParameterSend_'+i).checked) - t += '<input type="hidden" name="'+gCurrentMethodParams[i].name+'" value="'+$F('methodParameterValue_'+i)+'"/>'; + if (! $('methodParameterSend_'+i).checked) + continue; + + if ( method.params[i].acceptArray && $F('methodParameterValue_'+i).split('|').length > 1 ) + { + $F('methodParameterValue_'+i).split('|').each( + function(v) { + t += '<input type="hidden" name="'+method.params[i].name+'[]" value="'+v+'"/>'; + } + ); + } + else + t += '<input type="hidden" name="'+method.params[i].name+'" value="'+$F('methodParameterValue_'+i)+'"/>'; } form.innerHTML = t; - if ( !newWindow ) - form.target = "invokeFrame"; - else - form.target = "_blank"; + form.target = newWindow ? "_blank" : "invokeFrame"; form.submit(); } return false; @@ -356,7 +371,7 @@ a:hover { <thead> <tr> <td style="width:150px">Parameter</td> - <td>Optional</td> + <td>Extra</td> <td>Send</td> <td style="width:160px">Value</td> </tr> |