Javascript / Silverlight прокси с двойной загрузкой - PullRequest
1 голос
/ 27 апреля 2009

Я создаю приложение Silverlight, которое будет подвергнуто сильной javascript-атаке.

Чтобы включить взаимодействие JS, я создал следующий класс SL:

[ScriptableType]
public class JavaScriptProxy
{
    private string _version;

    // provided for testing SL-JS integration
    [ScriptableMember]
    public void SmokeTest() { HtmlPage.Window.Alert("Hello world!"); }
}

И загрузил его на конструктор основного приложения SL:

public App()
{
    this.Startup += this.onStartup;
    this.Exit += this.Application_Exit;
    this.UnhandledException += this.Application_UnhandledException;

    InitializeComponent();

    // register javascript bridge proxy
    // (must register in constructor so proxy is available immediatly)
    HtmlPage.RegisterScriptableObject("JsProxy", new JavaScriptProxy());
}

Однако, так как это приложение с большим количеством Javascript, оно должно загружаться через сам Javascript.

т.е. что-то сопутствует:

// called on body.onLoad
function init() {

    var proxy;

    var el = document.getElementById("target_canvas");

    Silverlight.createObject(..., el, "agApp" ..., {

        onLoad: function() {
            proxy = agApp.Content.JsProxy;

            // ***this line is ok***
            proxy.SmokeTest();
        }

    });        

    // ***this line fails (of course)***
    proxy.SmokeTest();

}

Однако это вызывает ошибку, поскольку agApp.Content.JsProxy недоступен полностью до тех пор, пока не сработает событие onLoad Silverlight, поэтому поле JsProxy недоступно.

Как я могу разрешить доступ к классу JsProxy немедленно при создании экземпляра Silverlight? Некоторое время от времени (_mutex); вероятно, плохая идея.

Мне пришлось это сделать, потому что при создании экземпляров приложения Silverlight будет создан еще один уровень абстракции, поэтому функция должна синхронно загружать все содержимое SL за один раз.

1 Ответ

1 голос
/ 02 мая 2009

Это связано с тем, что Silverlight и JavaScript работают в отдельных потоках. Даже если вы запросили браузер загрузить указанный элемент управления Silverlight, он не ждет, пока Silverlight завершит загрузку, прежде чем перейти к следующей строке.

Доступ к прокси-серверу JS можно получить только после того, как Silverlight его инстанцировал, поэтому вы можете подождать, пока не сработает событие OnLoad (но оно сработает только после полной загрузки всего Silverlight.xap), или после того, как RegisterScriptableObject запустит JavaScript метод onYourJSProxyNameLoaded (), который вернет вас обратно в рабочий процесс, который вы хотите.

НТН.

- Скотт Барнс / Менеджер по продуктам Rich Platforms / Microsoft.

...