Я создаю приложение 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 за один раз.