GWT: текущий URL кадра(ов)

У меня есть приложение GWT с двумя фреймами (com.google.gwt.user.client.ui.Frame). Через Frame.setUrl(...) я могу без проблем загружать произвольные веб-страницы. Конечно, тогда пользователь может нажимать на ссылки на загруженных страницах, которые, в свою очередь, загружают соответствующие страницы? Как я могу отслеживать загруженные в данный момент страницы в обоих фреймах?

Ниже моя текущая попытка использовать два типа слушателей; Я нашел фрагменты кода в Интернете. Оба события срабатывают, но я все же не знаю, как получить текущий загруженный URL-адрес

import com.google.gwt.event.dom.client.LoadEvent;
import com.google.gwt.event.dom.client.LoadHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.EventListener;
import com.google.gwt.user.client.ui.Frame;

public class BrowserTabFrame extends Frame implements EventListener {

 public BrowserTabFrame() {
    super();
    sinkEvents(Event.ONLOAD);

    addLoadHandler(new LoadHandler() {      
        @Override
        public void onLoad(LoadEvent event) {
            System.out.println(event.getSource());
            // <iframe style="visibility: visible;" id="ext-gen17" src="http://..." class="gwt-Frame"></iframe>
            // however, the src attribute never changes
        }
    });
  }

  @Override
  public void onBrowserEvent(Event event) {
    super.onBrowserEvent(event);
    if (DOM.eventGetType(event) == Event.ONLOAD) 
        System.out.println(event.getCurrentEventTarget());
        // [object HTMLIFrameElement]
        // no idea what to do with it   
  }
}

Спасибо за любые подсказки!

христианин


person Christian    schedule 17.10.2011    source источник


Ответы (2)


Атрибут src объекта iframe никогда не изменится, но изменится свойство URL содержащегося document. Вы можете получить это значение, используя JSNI:

private native String getIframeUrl(IFrameElement frame) /*-{
  if (frame.contentDocument !== undefined) {
    return frame.contentDocument.URL;
  } else if (frame.contentWindow !== undefined &&
             frame.contentWindow.document !== undefined)
  {
    return frame.contentWindow.document;
  } else {
    return null;
  }
}-*/;

...

Window.alert(getIframeUrl(myFrame.getElement()));

Однако обратите внимание, что если контекст безопасности (любой из протоколов, доменов или номеров портов) iframe изменится, браузер не позволит содержащему приложению получить доступ к document во фрейме.

person Jason Terk    schedule 17.10.2011
comment
Привет, Джейсон! Спасибо за ваш ответ! Это была именно та информация, которую я искал. И, как и ожидалось, я столкнулся с этой проблемой безопасности. Существует ли какой-либо альтернативный/передовой метод реализации некоторых минимальных возможностей веб-браузера в приложении GWT? Если бы я мог отслеживать ссылки, нажатые внутри IFrame, этого было бы достаточно. Спасибо еще раз! христианин - person Christian; 18.10.2011
comment
Нет, это ограничение невозможно обойти, используя только Javascript. - person Jason Terk; 18.10.2011

Это расширение решения Джейсона выше. Когда я попробовал код Джейсона, оказалось, что в возвращенных URI отсутствуют хэши (также известные как фрагменты, суффиксы URI, начинающиеся с «#»), и мне они были нужны. После некоторого изучения спецификации DOM сработало следующее:

public static native String getIframeUri(IFrameElement iframe) /*-{
    if (iframe.contentDocument !== undefined) {
        if (iframe.contentDocument.defaultView !== undefined
                && iframe.contentDocument.defaultView.location !== undefined) {
            return iframe.contentDocument.defaultView.location.href;
        } else {
            return iframe.contentDocument.URL;
        }
    } else if (iframe.contentWindow !== undefined
            && iframe.contentWindow.document !== undefined) {
        return iframe.contentWindow.document;
    } else {
        return null;
    }
}-*/;

Где единственным дополнением к коду Джейсона является вложенное условие:

if (iframe.contentDocument.defaultView !== undefined
        && iframe.contentDocument.defaultView.location !== undefined) {
    return iframe.contentDocument.defaultView.location.href;
person Boris Brudnoy    schedule 19.10.2011