// Copyright 2012 Google Inc. All Rights Reserved. // // 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 com.google.collide.client.util; import elemental.events.Event; import elemental.html.Window.BeforeUnloadEventListener; import elemental.js.JsBrowser; import java.util.ArrayList; import java.util.List; /** * A controller used to manage messages displayed when the user attempts to * close the browser or navigate to another page. * */ public class WindowUnloadingController { /** * A message displayed to the user when the user tries to navigate away from * the page. * */ public static interface Message { /** * Returns the message to display to the user in an attempt to prevent the * user from navigating away from the application. * * @return the message, or null if it is safe to close the app */ String getMessage(); } private final List<Message> messages = new ArrayList<Message>(); public WindowUnloadingController() { JsBrowser.getWindow().setOnBeforeUnload(new BeforeUnloadEventListener() { @Override public String handleEvent(Event event) { return handleBeforeUnloadEvent(); } }); } public void addMessage(Message message) { messages.add(message); } public void removeMessage(Message message) { messages.remove(message); } private String handleBeforeUnloadEvent() { // Look for an active message in any of the ClosingMessages. String toRet = null; for (Message message : messages) { String m = message.getMessage(); if (m != null) { if (toRet != null) { // Chrome does not support newlines in alert boxes, so use spaces // instead. toRet += " "; } toRet = (toRet == null) ? m : (toRet + m); } } return toRet; } }