void t_Tick(Timer e) { if (_async) return; _async = true; try { r = new IXMLHttpRequest(); r.open(HTTPMethodEnum.HEAD, Url); r.send(); } catch { Native.window.alert(" send error "); } r.InvokeOnComplete( delegate(IXMLHttpRequest rr) { if (RequestComplete != null) RequestComplete(this); if (rr.status == IXMLHttpRequest.HTTPStatusCodes.OK) { string z = rr.ETag; bool b = (z != ETag) && (ETag != null) && (z != null); ETag = z; if (b) { if (ETagChanged != null) ETagChanged(this); this.Enabled = false; return; } } else { this.Enabled = false; return; } _async = false; } ); }
/// <summary> /// sends data with POST method /// </summary> /// <param name="url"></param> /// <param name="data"></param> /// <param name="handler"></param> /// <param name="async"></param> /// <returns></returns> private static IXMLHttpRequest InternalConstructor(string url, IXMLDocument data, Action <IXMLHttpRequest> handler, bool @async) { IXMLHttpRequest req = new IXMLHttpRequest(HTTPMethodEnum.POST, url, @async); req.send(data); req.InvokeOnComplete(handler, @async); return(req); }
/// <summary> /// sends http request, with no data /// </summary> /// <param name="method"></param> /// <param name="url"></param> /// <param name="handler"></param> /// <returns></returns> private static IXMLHttpRequest InternalConstructor(HTTPMethodEnum method, string url, Action <IXMLHttpRequest> handler) { IXMLHttpRequest req = new IXMLHttpRequest(method, url, true); req.send(); req.InvokeOnComplete(handler); return(req); }
/// <summary> /// sends no data, with head method /// </summary> /// <param name="url"></param> /// <param name="handler"></param> /// <param name="async"></param> /// <returns></returns> private static IXMLHttpRequest InternalConstructor(string url, Action <IXMLHttpRequest> handler, bool @async) { IXMLHttpRequest req = InternalConstructor(HTTPMethodEnum.HEAD, url, @async); req.send(); req.InvokeOnComplete(handler, @async); return(req); }
public ApplicationContent( IApp page = null, IApplicationWebServiceX service = null) { // need absolute path when docked.. page.style1.href = page.style1.href; // first order of business. // enable drop zone. var dz = new DropZone(); dz.Container.AttachToDocument(); dz.Container.Hide(); var StayAlertTimer = default(Timer); var DoRefresh = default(Action); #region StayAlert Action<string> StayAlert = transaction_id => { StayAlertTimer = new Timer( delegate { service.GetTransactionKeyAsync( id => { if (id == transaction_id) return; // shot down during flight? if (!StayAlertTimer.IsAlive) return; Console.WriteLine("StayAlert " + new { id, transaction_id }); DoRefresh(); } ); } ); StayAlertTimer.StartInterval(5000); }; #endregion DoRefresh = delegate { if (StayAlertTimer != null) StayAlertTimer.Stop(); page.output.Clear(); new FileLoading().Container.AttachTo(page.output); service.EnumerateFilesAsync( y: ( long ContentKey, string ContentValue, string ContentType, long ContentBytesLength ) => { var e = new FileEntry(); #region ContentValue e.ContentValue.value = ContentValue.TakeUntilLastIfAny("."); e.ContentValue.onchange += delegate { var ext = ContentValue.SkipUntilLastOrEmpty("."); if (ext != "") ext = "." + ext; ContentValue = e.ContentValue.value + ext; Console.WriteLine("before update!"); service.UpdateAsync( ContentKey, ContentValue, // null does not really work? delegate { Console.WriteLine("update done!"); } ); e.open.href = Native.Document.location.href.TakeUntilLastIfAny("/") + "/io/" + ContentKey + "/" + ContentValue; }; e.open.href = Native.Document.location.href.TakeUntilLastIfAny("/") + "/io/" + ContentKey + "/" + ContentValue; e.open.target = Target; #endregion e.ContentType.innerText = ContentBytesLength + " bytes " + ContentType; #region Delete e.Delete.WhenClicked( delegate { //e.ContentValue.style.textDecoration = "" if (StayAlertTimer != null) StayAlertTimer.Stop(); e.Container.style.backgroundColor = "red"; service.DeleteAsync( ContentKey, delegate { DoRefresh(); } ); } ); #endregion e.Container.AttachTo(page.output); Console.WriteLine( new { ContentKey, ContentValue, ContentType, ContentBytesLength } ); }, done: transaction_id => { Console.WriteLine(new { transaction_id }); new FileLoadingDone().Container.AttachTo(page.output); StayAlert(transaction_id); } ); }; #region ondrop var TimerHide = new Timer( delegate { dz.Container.Hide(); } ); Action<DragEvent> ondragover = evt => { //Console.WriteLine("ondragover"); evt.stopPropagation(); evt.preventDefault(); // ondragover { type = Files } //foreach (var type in evt.dataTransfer.types) //{ // Console.WriteLine("ondragover " + new { type }); //} if (evt.dataTransfer.types.Contains("Files")) { evt.dataTransfer.dropEffect = "copy"; // Explicitly show this is a copy. dz.Container.Show(); TimerHide.Stop(); } //} //Console.WriteLine(" Native.Document.body.ondragover"); }; Native.Document.body.ondragover += ondragover; dz.Container.ondragover += ondragover; //dz.Container.ondragstart += // evt => // { // Console.WriteLine("ondragstart"); // evt.stopPropagation(); // evt.preventDefault(); // }; dz.Container.ondragleave += evt => { //Console.WriteLine("ondragleave"); //Console.WriteLine(" dz.Container.ondragleave"); evt.stopPropagation(); evt.preventDefault(); TimerHide.StartTimeout(90); }; dz.Container.ondrop += evt => { //Console.WriteLine("ondrop"); TimerHide.StartTimeout(90); evt.stopPropagation(); evt.stopImmediatePropagation(); evt.preventDefault(); // can we use a webClient yet? var xhr = new IXMLHttpRequest(); // does not work for chrome? //xhr.setRequestHeader("WebServiceMethod", "FileStorageUpload"); // which server? xhr.open(ScriptCoreLib.Shared.HTTPMethodEnum.POST, "/FileStorageUpload"); // http://stackoverflow.com/questions/13870853/how-to-upload-files-in-web-workers-when-formdata-is-not-defined //var c = new WebClient(); ////c.UploadData( //c.UploadProgressChanged += // (sender, args) => // { // }; //c.UploadFileAsync( #region send var d = new FormData(); evt.dataTransfer.files.AsEnumerable().WithEachIndex( (f, index) => { d.append("file" + index, f, f.name); } ); xhr.InvokeOnComplete( delegate { Console.WriteLine("upload complete!"); DoRefresh(); } ); var upload = new Uploading(); upload.Container.AttachTo(page.output); // http://www.matlus.com/html5-file-upload-with-progress/ xhr.upload.onprogress += e => { var p = (int)(e.loaded * 100 / e.total) + "%"; upload.status = p; Console.WriteLine("upload.onprogress " + new { e.total, e.loaded }); }; xhr.send(d); #endregion if (StayAlertTimer != null) StayAlertTimer.Stop(); }; #endregion DoRefresh(); }
/// <summary> /// This is a javascript application. /// </summary> /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param> public Application(IApp page) { FormStyler.AtFormCreated = FormStylerLikeFloat.LikeFloat; // http://html5doctor.com/drag-and-drop-to-server/ #region ondrop Native.document.body.ondragover += evt => { evt.stopPropagation(); evt.preventDefault(); evt.dataTransfer.dropEffect = "copy"; // Explicitly show this is a copy. page.Header.style.color = JSColor.Green; var types = evt.dataTransfer.types == null ? 0 : evt.dataTransfer.types.Length; if (evt.dataTransfer.types != null) foreach (var type in evt.dataTransfer.types.AsEnumerable()) { Console.WriteLine( new { type } ); } var items = evt.dataTransfer.items == null ? 0u : evt.dataTransfer.items.length; var files = evt.dataTransfer.files == null ? 0u : evt.dataTransfer.files.length; Console.WriteLine("ondragover: " + new { types, items, files } ); }; Native.document.body.ondragleave += delegate { page.Header.style.color = JSColor.None; }; #region DetectCanvasFromBytesExperiment Action<Form, WebBrowser, string, string, long> DetectCanvasFromBytesExperiment = (ff, web, ContentValue, src, ContentBytesLength) => { web.Navigated += async delegate { if (ContentValue != "png.png") return; // X:\jsc.svn\examples\javascript\canvas\CanvasFromBytes\CanvasFromBytes\Application.cs //Console.WriteLine("interesting, is it one of ours? " + new { ContentValue }); ff.Text = "interesting, is it one of ours? " + new { ContentValue }; var csrci = new IHTMLImage { src = src }; //await csrci.async.onlo await csrci; if (csrci.width != csrci.height) return; var w = csrci.width; // do the reverse var z = new CanvasRenderingContext2D(w, w); z.drawImage(csrci, 0, 0, w, w); //z.canvas.AttachToDocument(); // whats the bytes? var zbytes = z.bytes; ff.Text = "will decode " + new { zbytes.Length, ContentBytesLength }.ToString(); #region decode var decodebytes = await Task.Factory.StartNew( new { zbytes }, scope => { // Native.Console.WriteLine += ? // { Length = 2053956, u4 = 3c68746d } Console.WriteLine( new { scope.zbytes.Length, u4 = new[] { scope.zbytes[0 * 4 + 0], scope.zbytes[0 * 4 +1], scope.zbytes[0 * 4 +2], scope.zbytes[0 * 4 +3] }.ToHexString() } ); // Uncaught Error: InvalidOperationException: { MethodToken = dAAABv_a4OTKgLfLC20SaJA } function is not available at { href = var wwbytes = new byte[scope.zbytes.Length / 4]; var wi = 0; for (int i = 0; i < scope.zbytes.Length; i += 4) { // that be the red //wwbytes[wi] = scope.zbytes[i]; // bet we need alpha wwbytes[wi] = scope.zbytes[i + 3]; wi++; } return wwbytes; } ); #endregion var html = Encoding.UTF8.GetString(decodebytes); ff.Text = "decoded " + new { html.Length, ContentBytesLength }.ToString(); //Console.WriteLine(new { html }); // um hide old data. web.Hide(); var xweb = new WebBrowser { Dock = DockStyle.Fill }; xweb.AttachTo(ff); xweb.DocumentText = html; ff.Text = "!decoded " + new { html.Length, ContentBytesLength }.ToString(); }; }; #endregion Native.document.body.ondrop += evt => { //if (evt.dataTransfer == null) // return; var types = evt.dataTransfer.types == null ? 0 : evt.dataTransfer.types.Length; var items = evt.dataTransfer.items == null ? 0u : evt.dataTransfer.items.length; var files = evt.dataTransfer.files == null ? 0u : evt.dataTransfer.files.length; Console.WriteLine("ondrop: " + new { types, items, files } ); page.Header.style.color = JSColor.None; //var xfiles = evt.dataTransfer.files.AsEnumerable().Concat( // from x in evt.dataTransfer.items.AsEnumerable() // let f = x.getAsFile() // where f != null // select f //); #region DataTable if (evt.dataTransfer.items != null) { // X:\jsc.svn\examples\javascript\DragDataTableIntoCSVFile\DragDataTableIntoCSVFile\Application.cs evt.dataTransfer.items.AsEnumerable().Where( x => x.type.ToLower() == // let jsc type system sort it out? // how much reflection does jsc give us nowadays? typeof(DataTable).Name.ToLower() ).WithEach( async x => { // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dfnReturnLink-0 var DataTable_xml = await x.getAsString(); var DataTable = StringConversionsForDataTable.ConvertFromString(DataTable_xml); var ff = new Form { Text = new { typeof(DataTable).Name }.ToString() }; var g = new DataGridView { DataSource = DataTable, Dock = DockStyle.Fill }; ff.Controls.Add(g); ff.Show(); } ); } #endregion #region files evt.dataTransfer.files.AsEnumerable().WithEachIndex( (f, index) => { Console.WriteLine( new { f.name, f.size, f.lastModifiedDate } ); var ff = new Form(); ff.PopupInsteadOfClosing(HandleFormClosing: false); ff.Text = new { f.type, f.name, f.size }.ToString(); ff.Show(); ff.MoveTo( evt.CursorX + 32 * index, evt.CursorY + 24 * index ); var fc = ff.GetHTMLTargetContainer(); fc.title = ff.Text; #region image var i = default(IHTMLImage); if (f.type.StartsWith("image/")) { // um would we have a timing issue here? f.ToDataURLAsync( src => { i = new IHTMLImage { src = src }.AttachTo(fc); i.style.width = "100%"; i.InvokeOnComplete( delegate { ff.ClientSize = new System.Drawing.Size( // keep it reasonable! i.width.Min(600), i.height.Min(400) ); } ); } ); } #endregion // http://html5doctor.com/drag-and-drop-to-server/ #if FUTURE service.XUpload(f, delegate { }); #endif var d = new FormData(); d.append("foo", f, f.name); var xhr = new IXMLHttpRequest(); xhr.open(ScriptCoreLib.Shared.HTTPMethodEnum.POST, "/upload"); #region InvokeOnComplete xhr.InvokeOnComplete( delegate { Console.WriteLine("upload complete!"); SystemSounds.Beep.Play(); //Console.Beep(); XElement.Parse(xhr.responseText).Elements("ContentKey").WithEach( ContentKey => { var __ContentKey = (Table1_ContentKey)int.Parse(ContentKey.Value); var web = new WebBrowser { Dock = DockStyle.Fill }; web.Hide(); web.AttachTo(ff); var src = "/io/" + ContentKey.Value; if (i == null) { web.Show(); } else { web.Navigated += delegate { i.Orphanize(); web.Show(); }; } // "X:\jsc.svn\examples\javascript\canvas\CanvasFromBytes\png.png" DetectCanvasFromBytesExperiment( ff, web, f.name, src, (long)f.size ); web.Navigate(src); //if (i != null) //{ // i.src = src; //} __ContentKey.SetLeft(ff.Left); __ContentKey.SetTop(ff.Top); ff.LocationChanged += delegate { __ContentKey.SetLeft(ff.Left); __ContentKey.SetTop(ff.Top); }; ff.SizeChanged += delegate { __ContentKey.SetWidth(ff.Width); __ContentKey.SetHeight(ff.Height); }; ff.FormClosing += delegate { __ContentKey .Delete(); }; #region onmousewheel ff.GetHTMLTarget().With( ffh => { dynamic ffhs = ffh.style; // http://css-infos.net/property/-webkit-transition //ffhs.webkitTransition = "webkitTransform 0.3s linear"; ffh.onmousewheel += e => { e.preventDefault(); e.stopPropagation(); if (e.WheelDirection > 0) { ff.Width = (int)(ff.Width * 1.1); ff.Height = (int)(ff.Height * 1.1); } else { ff.Width = (int)(ff.Width * 0.9); ff.Height = (int)(ff.Height * 0.9); } }; } ); #endregion } ); } ); #endregion //------WebKitFormBoundaryDmGHAZzeMBbcD5mu //Content-Disposition: form-data; name="foo"; filename="FlashHeatZeeker.UnitPedControl.ApplicationSprite.swf" //Content-Type: application/x-shockwave-flash //------WebKitFormBoundaryDmGHAZzeMBbcD5mu-- Console.WriteLine("before upload..."); xhr.send(d); } ); #endregion // let's disable other handlers //evt.dataTransfer = null; evt.stopPropagation(); evt.stopImmediatePropagation(); evt.preventDefault(); }; #endregion #region restore { var index = 0; default(Table1_ContentKey).WithEach( (__ContentKey, ContentBytesLength, ContentValue, Left, Top, Width, Height) => { var ff = new Form(); ff.PopupInsteadOfClosing(HandleFormClosing: false); ff.Text = new { __ContentKey, ContentValue, ContentBytesLength }.ToString(); ff.Show(); if (Left > 0) ff.MoveTo( Left, Top ); else ff.MoveBy( 32 * index, 24 * index ); index++; #region onmousewheel ff.GetHTMLTarget().With( ffh => { dynamic ffhs = ffh.style; // http://css-infos.net/property/-webkit-transition //ffhs.webkitTransition = "webkitTransform 0.3s linear"; ffh.onmousewheel += e => { e.preventDefault(); e.stopPropagation(); if (e.WheelDirection > 0) { ff.Width = (int)(ff.Width * 1.1); ff.Height = (int)(ff.Height * 1.1); } else { ff.Width = (int)(ff.Width * 0.9); ff.Height = (int)(ff.Height * 0.9); } }; } ); #endregion //var fc = ff.GetHTMLTargetContainer(); var src = "/io/" + __ContentKey; //var i = new IHTMLImage { src = src }.AttachTo(fc); //i.style.width = "100%"; var web = new WebBrowser { Dock = DockStyle.Fill }; web.AttachTo(ff); //script: error JSC1000: No implementation found for this native method, please implement [System.Windows.Forms.WebBrowser.add_DocumentCompleted(System.Windows.Forms.WebBrowserDocumentCompletedEventHandler)] //script: warning JSC1000: Did you reference ScriptCoreLib via IAssemblyReferenceToken? //script: error JSC1000: error at DropFileIntoSQLite.Application+<>c__DisplayClass2e.<.ctor>b__15, // assembly: V:\DropFileIntoSQLite.Application.exe // type: DropFileIntoSQLite.Application+<>c__DisplayClass2e, DropFileIntoSQLite.Application, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null //web.DocumentCompleted += // delegate // { //}; DetectCanvasFromBytesExperiment( ff, web, ContentValue, src, ContentBytesLength ); web.Navigate(src); if (Width > 0) ff.SizeTo( Width, Height ); //else // i.InvokeOnComplete( // delegate // { // ff.ClientSize = new System.Drawing.Size(i.width, i.height); // } // ); ff.LocationChanged += delegate { __ContentKey.SetLeft(ff.Left); __ContentKey.SetTop(ff.Top); }; ff.SizeChanged += delegate { __ContentKey.SetWidth(ff.Width); __ContentKey.SetHeight(ff.Height); }; ff.FormClosing += delegate { __ContentKey.Delete(); }; } ); } #endregion // can we write about this? #region bookmark launcher var href = @"javascript: ((function(h,i) { var a=-1, b='onreadystatechange', c=document.getElementsByTagName('HEAD')[0], d, e, f, g=c.childNodes, d; e=document.createElement('base'); e.href='%%'; c.appendChild(e); d = function () { next: while (1) { a++; if (a ==h.length) { i(); return; } /* for (f=0;f<g.length;f++) { var v =g[f]; var w =h[a]; if (v.nodeName =='SCRIPT') if (v.src ==w || v.src.substr(v.src.length - w.length - 1,w.length + 1) =='/' + w) continue next; } */ e=document.createElement('SCRIPT'); e.src='%%' + h[a]; e[b in e?b:'onload']= function() { var f=e.readyState; if(f==null||f=='loaded'||f=='complete') d(); }; c.appendChild(e); return; } }; d(); } )(['view-source'],function(){}))".Replace("%%", Native.Document.location + ""); page.Header.draggable = true; page.Header.ondragstart += e => { e.dataTransfer.setData("text/uri-list", href); }; IStyleSheet.Default["#Header:hover"].style.color = "red"; IStyleSheet.Default["#Header:hover"].style.cursor = IStyle.CursorEnum.pointer; #endregion new About().Show(); }
/// <summary> /// This is a javascript application. /// </summary> /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param> public Application(IApp page) { Native.document.body.ondragover += evt => { evt.stopPropagation(); evt.preventDefault(); evt.dataTransfer.dropEffect = "copy"; // Explicitly show this is a copy. page.Header.innerText = new { files = evt.dataTransfer.items.length }.ToString(); }; Native.document.body.ondragleave += delegate { page.Header.innerText = "..."; }; Native.document.body.ondrop += evt => { evt.stopPropagation(); evt.stopImmediatePropagation(); evt.preventDefault(); var s = Stopwatch.StartNew(); page.Header.innerText = "uploading..."; // defined at/ // X:\jsc.svn\core\ScriptCoreLib.Extensions\ScriptCoreLib.Extensions\JavaScript\DOM\FileExtensions.cs evt.dataTransfer.files.AsEnumerable().WithEach( async f => { // { name = Chrome.Web.Server.1.0.0.0.nupkg, type = , size = 22940 } page.Header.innerText += new { f.size, f.name, }.ToString(); // signature check // like code contracts? var bytes = await f.readAsBytes(); // { size = 47079, name = Abstractatech.JavaScript.ApplicationPerformance.1.0.0.0.nupkg }80 // { size = 31572, name = GIFEncoder.1.0.0.0.nupkg }0x504b page.Header.innerText += "0x"; page.Header.innerText += bytes[0].ToString("x2"); page.Header.innerText += bytes[1].ToString("x2"); var d = new FormData(); d.append("foo", f, f.name); var xhr = new IXMLHttpRequest(); xhr.open(ScriptCoreLib.Shared.HTTPMethodEnum.POST, "/upload"); xhr.InvokeOnComplete( delegate { // upload complete... { ElapsedMilliseconds = 705 } page.Header.innerText = "upload complete... " + new { s.ElapsedMilliseconds }; } ); xhr.send(d); } ); }; }
/// <summary> /// This is a javascript application. /// </summary> /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param> public Application(IApp page) { new IHTMLButton { "check" }.AttachToDocument().onclick += async delegate { var lastupload = await base.getlastupload(); lastupload.WithEachIndex( (x, index) => { foreach (var header in x.Headers) { //Console.WriteLine(new { index, header }); new IHTMLPre { new { index, header } }.AttachToDocument(); } //Console.WriteLine(new { index, x.Content }); new IHTMLPre { new { index, x.Content } }.AttachToDocument(); } ); }; new { }.With( async delegate { // http://footle.org/2007/07/31/binary-multipart-posts-in-javascript/ // https://msdn.microsoft.com/en-us/library/ms527355(v=exchg.10).aspx var send = new IHTMLButton { "send" }.AttachToDocument(); while (await send.async.onclick) { // is it useful? //var f = new FormData(); //f.append("hello", "world"); //f.append("foo", "bar"); // http://stackoverflow.com/questions/5165337/xmlhttprequest-overridemimetype-for-outgoing-data var x = new IXMLHttpRequest(ScriptCoreLib.Shared.HTTPMethodEnum.POST, "/upload", true); var doubleDash = "--"; var boundary = "12345678901234567890"; var wRequestPayload = new StringBuilder(); wRequestPayload.Append(@"--12345678901234567890 Content-Type: text/xml; charset=UTF-8 <xml1>hello</xml1> --12345678901234567890 Content-type: text/xml e-x: 34 e-y: pp <xml1>world</xml1> --12345678901234567890--" ); var data = wRequestPayload.ToString(); x.setRequestHeader("Content-Type", "multipart/related; boundary=" + boundary); // java stream hangs if we try to read past data? //x.setRequestHeader("Content-Length", "" + data.Length); x.send(data); } //x.overrideMimeType() } ); }
// called by // X:\jsc.svn\core\ScriptCoreLib.Ultra\ScriptCoreLib.Ultra\JavaScript\Remoting\InternalWebMethodRequest.cs public Task<byte[]> UploadValuesTaskAsync(Uri address, NameValueCollection data) { //Console.WriteLine("enter WebClient.UploadValuesTaskAsync! " + new { address }); // Z:\jsc.svn\examples\javascript\Test\TestAfterInvokeResponseHeaders\ApplicationWebService.cs // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2015/201511/20151123/uploadvaluestaskasync // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2015/201511/20151123/ubuntumidexperiment var r = new TaskCompletionSource<byte[]> { }; // Z:\jsc.svn\examples\javascript\ubuntu\Test\UbuntuTestUploadValues\Application.cs // "Z:\jsc.svn\examples\javascript\ubuntu\Test\UbuntuTestUserHostAddress\UbuntuTestUserHostAddress.sln" // http://stackoverflow.com/questions/9713058/sending-post-data-with-a-xmlhttprequest // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201401/20140119 // http://stackoverflow.com/questions/8286934/post-formdata-via-xmlhttprequest-object-in-js-cross-browser // http://stackoverflow.com/questions/16917772/ie-lags-on-sending-post-data // http://robertnyman.com/2013/02/11/using-formdata-to-send-forms-with-xhr-as-keyvalue-pairs/ // https://blog.yorkxin.org/posts/2014/02/06/ajax-with-formdata-is-broken-on-ie10-ie11/ var x = new IXMLHttpRequest(); // InvalidStateException //x.withCredentials = true; x.open(Shared.HTTPMethodEnum.POST, address.ToString(), async: true); x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); var xFormDataString = ToFormDataString(data); //Uncaught InvalidStateError: Failed to execute 'send' on 'XMLHttpRequest': the object's state must be OPENED. // X:\jsc.svn\examples\javascript\Test\TestUploadValuesAsync\TestUploadValuesAsync\Application.cs // UploadValuesAsync { responseType = , response = <document><TaskComplete><TaskResult>13</TaskResult></TaskComplete></document> } x.InvokeOnComplete( delegate { //Console.WriteLine("after WebClient.UploadValuesTaskAsync! " + new { address }); #region complete var response = new byte[0]; // UploadValuesAsync { status = 204, responseType = arraybuffer, response = [object Uint8ClampedArray] } //if (x.status == 204) // 304? //if (x.status == IXMLHttpRequest.HTTPStatusCodes.NoContent) //{ // // android webview wants us to do this // response = new byte[0]; //} //Uncaught InvalidStateError: Failed to read the 'responseText' property from 'XMLHttpRequest': // The value is only accessible if the object's 'responseType' is '' or 'text' (was 'arraybuffer'). // X:\jsc.svn\examples\javascript\android\com.abstractatech.battery\com.abstractatech.battery\ApplicationWebService.cs //Console.WriteLine("UploadValuesAsync " + new { x.status, x.responseType }); //I/chromium(10616): [INFO:CONSOLE(36216)] "%c0:576ms UploadValuesAsync { status = 204, responseType = arraybuffer }", source: http://192.168.1.103:10129/view-source (36216) //I/chromium(10616): [INFO:CONSOLE(49940)] "Uncaught InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable.", source: http://192.168.1.103:10129/view-source (49940) // what about android webview? if (x.response == null) { //Console.WriteLine("UploadValuesAsync " + new { x.status, x.responseType, x.response, x.responseText }); //I/Web Console( 5012): %c0:198484ms UploadValuesAsync { status = 200, responseType = arraybuffer } at http://192.168.43.1:9417/view-source:37081 //I/Web Console( 5012): %c0:198500ms UploadValuesAsync { status = 200, responseType = arraybuffer, response = , responseText = <document><avatar><obj>aHR0cDovL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyLzhlNmQzZGUw //I/Web Console( 5012): %c0:198524ms InternalWebMethodRequest.Complete { Name = Gravatar, Length = 0 } at http://192.168.43.1:9417/view-source:37081 // did we not fix it already? // android 2.3 only seems to have responseText // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201404/20140413 try { response = Encoding.UTF8.GetBytes(x.responseText); } catch { //I/chromium(30556): [INFO:CONSOLE(37861)] "%c92:28288ms UploadValuesAsync { status = 204, responseType = arraybuffer }", source: http://192.168.43.7:4394/view-source (37861) //I/chromium(30556): [INFO:CONSOLE(37861)] "%c92:28290ms responseText failed. thanks webview devs. { status = 204 }", source: http://192.168.43.7:4394/view-source (37861) // X:\jsc.svn\examples\javascript\p2p\SharedBrowserSessionExperiment\SharedBrowserSessionExperiment\ApplicationWebService.cs Console.WriteLine("responseText failed? " + new { x.status }); } } else { // http://stackoverflow.com/questions/8022425/getting-blob-data-from-xhr-request var a = (ArrayBuffer)x.response; //Console.WriteLine("UploadValuesAsync " + new { x.status, x.responseType, a.byteLength }); // IE? //var u8 = new Uint8Array(array: a); // X:\jsc.svn\core\ScriptCoreLib.Async\ScriptCoreLib.Async\JavaScript\DOM\FileEntryAsyncExtensions.cs var u8c = new Uint8ClampedArray(array: a); response = u8c; } //Console.WriteLine("UploadValuesAsync " + new { x.status, x.responseType, response }); #region ResponseHeaders this.ResponseHeaders = new WebHeaderCollection(); //this.ResponseHeaders.Clear(); var ResponseHeaders = x.getAllResponseHeaders(); // Z:\jsc.svn\examples\javascript\Test\TestAfterInvokeResponseHeaders\ApplicationWebService.cs //Console.WriteLine("after WebClient.UploadValuesTaskAsync! " + new { ResponseHeaders }); //0:8209ms { ResponseHeaders = Date: Sat, 15 Mar 2014 12:25:45 GMT //Server: ASP.NET Development Server/11.0.0.0 //X-AspNet-Version: 4.0.30319 //ETag: BqShORsRkdny750pWBdVyQ== //X-ElapsedMilliseconds: 10 //Content-Type: text/xml; charset=utf-8 //Access-Control-Allow-Origin: * //Cache-Control: private //Connection: Close //Content-Length: 239 foreach (var item in ResponseHeaders.Split('\n')) { var u = item.IndexOf(":"); if (u > 0) { var ukey = item.Substring(0, u); var uvalue = item.Substring(u + 1).Trim(); //Console.WriteLine(new { ukey, uvalue }); this.ResponseHeaders[ukey] = uvalue; } } #endregion //Console.WriteLine(new { ResponseHeaders }); r.SetResult(response); #endregion } ); x.responseType = "arraybuffer"; // Z:\jsc.svn\examples\javascript\ubuntu\UbuntuSSLWebApplication\UbuntuSSLWebApplication\Application.cs // allow basejump? // breaks Task<> call? //x.responseType = "text"; // is IE actually sending it? or is our server decoding it wrong? //Console.WriteLine("WebClient.UploadValuesAsync IXMLHttpRequest " + new { xFormDataString }); x.send(xFormDataString); return r.Task; }
public Task<string> DownloadStringTaskAsync(string address) { var z = new TaskCompletionSource<string>(); var x = new IXMLHttpRequest(); x.open(Shared.HTTPMethodEnum.GET, address); x.InvokeOnComplete( r => { z.SetResult(r.responseText); } ); //Console.WriteLine("DownloadStringAsync"); x.send(); return z.Task; }
// used by? public void DownloadStringAsync(Uri address) { var x = new IXMLHttpRequest(); x.open(Shared.HTTPMethodEnum.GET, address.ToString()); x.InvokeOnComplete( r => { //var e = new __DownloadStringCompletedEventArgs { Error = new Exception("Not implemented. (__WebClient.DownloadStringAsync)") }; var e = new __DownloadStringCompletedEventArgs { Result = r.responseText }; if (DownloadStringCompleted != null) DownloadStringCompleted(null, (DownloadStringCompletedEventArgs)(object)e); } ); //Console.WriteLine("DownloadStringAsync"); x.send(); }
public string DownloadString(string address) { // X:\jsc.svn\examples\javascript\Test\TestDownloadStringAsync\TestDownloadStringAsync\Application.cs var x = new IXMLHttpRequest(); x.open(Shared.HTTPMethodEnum.GET, address.ToString(), async: false); //Console.WriteLine("DownloadStringAsync"); x.send(); return x.responseText; }
/// <summary> /// This is a javascript application. /// </summary> /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param> public Application(IApp page) { // http://html5doctor.com/drag-and-drop-to-server/ Native.Document.body.ondragover += evt => { evt.stopPropagation(); evt.preventDefault(); evt.dataTransfer.dropEffect = "copy"; // Explicitly show this is a copy. page.Header.style.color = JSColor.Green; Console.WriteLine("ondragover: " + new { types = evt.dataTransfer.types.Length, files = evt.dataTransfer.files.length } ); }; Native.Document.body.ondragleave += delegate { page.Header.style.color = JSColor.None; }; Native.Document.body.ondrop += async evt => { //if (evt.dataTransfer == null) // return; // let's disable other handlers //evt.dataTransfer = null; evt.stopPropagation(); evt.stopImmediatePropagation(); evt.preventDefault(); page.Header.style.color = JSColor.None; #region files // http://html5doctor.com/drag-and-drop-to-server/ #if FUTURE service.XUpload(f, delegate { }); #endif var d = new FormData(); evt.dataTransfer.files.AsEnumerable().WithEachIndex( (f, index) => { d.append( "foo" + index, f, f.name ); } ); var xhr = new IXMLHttpRequest(); xhr.open(ScriptCoreLib.Shared.HTTPMethodEnum.POST, "/upload"); //xhr.InvokeOnComplete( // delegate // { // SystemSounds.Beep.Play(); // } //); xhr.send(d); await xhr; SystemSounds.Beep.Play(); #endregion }; }