blob: 050cc6164559a683e00e41e99074a1bb1e54ae8d [file] [log] [blame]
/*
* Copyright 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package elemental.js.util;
import com.google.gwt.core.client.JavaScriptException;
import com.google.gwt.xhr.client.ReadyStateChangeHandler;
import com.google.gwt.xhr.client.XMLHttpRequest;
import elemental.client.Browser;
import elemental.html.Window;
/**
* A Simpler way to use {@link XMLHttpRequest}.
*/
@Deprecated
public class Xhr {
/**
* Interface for getting notified when an XHR successfully completes, or
* errors out.
*/
@Deprecated
public interface Callback {
void onFail(XMLHttpRequest xhr);
void onSuccess(XMLHttpRequest xhr);
}
private static class Handler implements ReadyStateChangeHandler {
private final Callback callback;
private Handler(Callback callback) {
this.callback = callback;
}
public void onReadyStateChange(XMLHttpRequest xhr) {
if (xhr.getReadyState() == XMLHttpRequest.DONE) {
if (xhr.getStatus() == 200) {
callback.onSuccess(xhr);
xhr.clearOnReadyStateChange();
return;
}
callback.onFail(xhr);
xhr.clearOnReadyStateChange();
}
}
}
/**
* Send a GET request to the <code>url</code> and dispatch updates to the
* <code>callback</code>.
*
* @param url
* @param callback
*/
public static void get(String url, Callback callback) {
request(create(), "GET", url, callback);
}
/**
* Send a GET request to the <code>url</code> and dispatch updates to the
* <code>callback</code>.
*
* @param window the window object used to access the XMLHttpRequest
* constructor
* @param url
* @param callback
*/
public static void get(Window window, String url, Callback callback) {
request(create(window), "GET", url, callback);
}
/**
* Send a HEAD request to the <code>url</code> and dispatch updates to the
* <code>callback</code>.
*
* @param url
* @param callback
*/
public static void head(String url, Callback callback) {
request(create(), "HEAD", url, callback);
}
/**
* Send a HEAD request to the <code>url</code> and dispatch updates to the
* <code>callback</code>.
*
* @param window the window object used to access the XMLHttpRequest
* constructor
* @param url
* @param callback
*/
public static void head(Window window, String url, Callback callback) {
request(create(window), "HEAD", url, callback);
}
/**
* Send a POST request to the <code>url</code> and dispatch updates to the
* <code>callback</code>.
*
* @param url
* @param requestData the data to be passed to XMLHttpRequest.send
* @param contentType a value for the Content-Type HTTP header
* @param callback
*/
public static void post(String url, String requestData, String contentType, Callback callback) {
request(create(), "POST", url, requestData, contentType, callback);
}
/**
* Send a POST request to the <code>url</code> and dispatch updates to the
* <code>callback</code>.
*
* @param window the window object used to access the XMLHttpRequest
* constructor
* @param url
* @param requestData the data to be passed to XMLHttpRequest.send
* @param contentType a value for the Content-Type HTTP header
* @param callback
*/
public static void post(
Window window, String url, String requestData, String contentType, Callback callback) {
request(create(window), "POST", url, requestData, contentType, callback);
}
private static XMLHttpRequest create() {
return create(Browser.getWindow());
}
/**
* Replacement for {@link XMLHttpRequest#create()} that allows better control
* of which window object is used to access the XMLHttpRequest constructor.
*/
private static native XMLHttpRequest create(Window window) /*-{
return new window.XMLHttpRequest();
}-*/;
private static void request(XMLHttpRequest xhr,
String method,
String url,
String requestData,
String contentType,
Callback callback) {
try {
xhr.setOnReadyStateChange(new Handler(callback));
xhr.open(method, url);
xhr.setRequestHeader("Content-type", contentType);
xhr.send(requestData);
} catch (JavaScriptException e) {
// Just fail.
callback.onFail(xhr);
xhr.clearOnReadyStateChange();
}
}
private static void request(XMLHttpRequest xhr,
String method,
String url,
final Callback callback) {
try {
xhr.setOnReadyStateChange(new Handler(callback));
xhr.open(method, url);
xhr.send();
} catch (JavaScriptException e) {
// Just fail.
callback.onFail(xhr);
xhr.clearOnReadyStateChange();
}
}
}