| /* |
| * 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}. |
| */ |
| public class Xhr { |
| /** |
| * Interface for getting notified when an XHR successfully completes, or |
| * errors out. |
| */ |
| 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(); |
| } |
| } |
| } |