Window
sealed class Window : EventTarget, IWindow, IEventTarget, IGlobalEventHandlers, IWindowEventHandlers, IWindowTimers
Represents a sample browsing Window implementation for automated tests,
analysis and as a useful playground.
using AngleSharp.Dom.Css;
using AngleSharp.Dom.Events;
using AngleSharp.Dom.Html;
using AngleSharp.Dom.Navigator;
using AngleSharp.Extensions;
using AngleSharp.Html;
using AngleSharp.Services;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace AngleSharp.Dom
{
internal sealed class Window : EventTarget, IWindow, IEventTarget, IGlobalEventHandlers, IWindowEventHandlers, IWindowTimers
{
private readonly Document _document;
private readonly List<CancellationTokenSource> _tasks;
private string _name;
private int _outerHeight;
private int _outerWidth;
private int _screenX;
private int _screenY;
private string _status;
private bool _closed;
private INavigator ;
public IWindow Proxy => _document.Context.Current;
public INavigator => _navigator ?? (_navigator = CreateNavigator());
public IDocument Document => _document;
public string Name {
get {
return _name;
}
set {
_name = value;
}
}
public int OuterHeight {
get {
return _outerHeight;
}
set {
_outerHeight = value;
}
}
public int OuterWidth {
get {
return _outerWidth;
}
set {
_outerWidth = value;
}
}
public int ScreenX {
get {
return _screenX;
}
set {
_screenX = value;
}
}
public int ScreenY {
get {
return _screenY;
}
set {
_screenY = value;
}
}
public ILocation Location => Document.Location;
public string Status {
get {
return _status;
}
set {
_status = value;
}
}
public bool IsClosed => _closed;
IHistory IWindow.History {
get {
return _document.Context.SessionHistory;
}
}
event DomEventHandler IGlobalEventHandlers.Aborted {
add {
AddEventListener(EventNames.Abort, value, false);
}
remove {
RemoveEventListener(EventNames.Abort, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Blurred {
add {
AddEventListener(EventNames.Blur, value, false);
}
remove {
RemoveEventListener(EventNames.Blur, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Cancelled {
add {
AddEventListener(EventNames.Cancel, value, false);
}
remove {
RemoveEventListener(EventNames.Cancel, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.CanPlay {
add {
AddEventListener(EventNames.CanPlay, value, false);
}
remove {
RemoveEventListener(EventNames.CanPlay, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.CanPlayThrough {
add {
AddEventListener(EventNames.CanPlayThrough, value, false);
}
remove {
RemoveEventListener(EventNames.CanPlayThrough, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Changed {
add {
AddEventListener(EventNames.Change, value, false);
}
remove {
RemoveEventListener(EventNames.Change, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Clicked {
add {
AddEventListener(EventNames.Click, value, false);
}
remove {
RemoveEventListener(EventNames.Click, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.CueChanged {
add {
AddEventListener(EventNames.CueChange, value, false);
}
remove {
RemoveEventListener(EventNames.CueChange, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.DoubleClick {
add {
AddEventListener(EventNames.DblClick, value, false);
}
remove {
RemoveEventListener(EventNames.DblClick, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Drag {
add {
AddEventListener(EventNames.Drag, value, false);
}
remove {
RemoveEventListener(EventNames.Drag, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.DragEnd {
add {
AddEventListener(EventNames.DragEnd, value, false);
}
remove {
RemoveEventListener(EventNames.DragEnd, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.DragEnter {
add {
AddEventListener(EventNames.DragEnter, value, false);
}
remove {
RemoveEventListener(EventNames.DragEnter, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.DragExit {
add {
AddEventListener(EventNames.DragExit, value, false);
}
remove {
RemoveEventListener(EventNames.DragExit, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.DragLeave {
add {
AddEventListener(EventNames.DragLeave, value, false);
}
remove {
RemoveEventListener(EventNames.DragLeave, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.DragOver {
add {
AddEventListener(EventNames.DragOver, value, false);
}
remove {
RemoveEventListener(EventNames.DragOver, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.DragStart {
add {
AddEventListener(EventNames.DragStart, value, false);
}
remove {
RemoveEventListener(EventNames.DragStart, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Dropped {
add {
AddEventListener(EventNames.Drop, value, false);
}
remove {
RemoveEventListener(EventNames.Drop, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.DurationChanged {
add {
AddEventListener(EventNames.DurationChange, value, false);
}
remove {
RemoveEventListener(EventNames.DurationChange, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Emptied {
add {
AddEventListener(EventNames.Emptied, value, false);
}
remove {
RemoveEventListener(EventNames.Emptied, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Ended {
add {
AddEventListener(EventNames.Ended, value, false);
}
remove {
RemoveEventListener(EventNames.Ended, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Error {
add {
AddEventListener(EventNames.Error, value, false);
}
remove {
RemoveEventListener(EventNames.Error, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Focused {
add {
AddEventListener(EventNames.Focus, value, false);
}
remove {
RemoveEventListener(EventNames.Focus, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Input {
add {
AddEventListener(EventNames.Input, value, false);
}
remove {
RemoveEventListener(EventNames.Input, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Invalid {
add {
AddEventListener(EventNames.Invalid, value, false);
}
remove {
RemoveEventListener(EventNames.Invalid, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.KeyDown {
add {
AddEventListener(EventNames.Keydown, value, false);
}
remove {
RemoveEventListener(EventNames.Keydown, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.KeyPress {
add {
AddEventListener(EventNames.Keypress, value, false);
}
remove {
RemoveEventListener(EventNames.Keypress, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.KeyUp {
add {
AddEventListener(EventNames.Keyup, value, false);
}
remove {
RemoveEventListener(EventNames.Keyup, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Loaded {
add {
AddEventListener(EventNames.Load, value, false);
}
remove {
RemoveEventListener(EventNames.Load, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.LoadedData {
add {
AddEventListener(EventNames.LoadedData, value, false);
}
remove {
RemoveEventListener(EventNames.LoadedData, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.LoadedMetadata {
add {
AddEventListener(EventNames.LoadedMetaData, value, false);
}
remove {
RemoveEventListener(EventNames.LoadedMetaData, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Loading {
add {
AddEventListener(EventNames.LoadStart, value, false);
}
remove {
RemoveEventListener(EventNames.LoadStart, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.MouseDown {
add {
AddEventListener(EventNames.Mousedown, value, false);
}
remove {
RemoveEventListener(EventNames.Mousedown, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.MouseEnter {
add {
AddEventListener(EventNames.Mouseenter, value, false);
}
remove {
RemoveEventListener(EventNames.Mouseenter, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.MouseLeave {
add {
AddEventListener(EventNames.Mouseleave, value, false);
}
remove {
RemoveEventListener(EventNames.Mouseleave, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.MouseMove {
add {
AddEventListener(EventNames.Mousemove, value, false);
}
remove {
RemoveEventListener(EventNames.Mousemove, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.MouseOut {
add {
AddEventListener(EventNames.Mouseout, value, false);
}
remove {
RemoveEventListener(EventNames.Mouseout, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.MouseOver {
add {
AddEventListener(EventNames.Mouseover, value, false);
}
remove {
RemoveEventListener(EventNames.Mouseover, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.MouseUp {
add {
AddEventListener(EventNames.Mouseup, value, false);
}
remove {
RemoveEventListener(EventNames.Mouseup, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.MouseWheel {
add {
AddEventListener(EventNames.Wheel, value, false);
}
remove {
RemoveEventListener(EventNames.Wheel, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Paused {
add {
AddEventListener(EventNames.Pause, value, false);
}
remove {
RemoveEventListener(EventNames.Pause, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Played {
add {
AddEventListener(EventNames.Play, value, false);
}
remove {
RemoveEventListener(EventNames.Play, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Playing {
add {
AddEventListener(EventNames.Playing, value, false);
}
remove {
RemoveEventListener(EventNames.Playing, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Progress {
add {
AddEventListener(EventNames.Progress, value, false);
}
remove {
RemoveEventListener(EventNames.Progress, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.RateChanged {
add {
AddEventListener(EventNames.RateChange, value, false);
}
remove {
RemoveEventListener(EventNames.RateChange, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Resetted {
add {
AddEventListener(EventNames.Reset, value, false);
}
remove {
RemoveEventListener(EventNames.Reset, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Resized {
add {
AddEventListener(EventNames.Resize, value, false);
}
remove {
RemoveEventListener(EventNames.Resize, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Scrolled {
add {
AddEventListener(EventNames.Scroll, value, false);
}
remove {
RemoveEventListener(EventNames.Scroll, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Seeked {
add {
AddEventListener(EventNames.Seeked, value, false);
}
remove {
RemoveEventListener(EventNames.Seeked, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Seeking {
add {
AddEventListener(EventNames.Seeking, value, false);
}
remove {
RemoveEventListener(EventNames.Seeking, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Selected {
add {
AddEventListener(EventNames.Select, value, false);
}
remove {
RemoveEventListener(EventNames.Select, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Shown {
add {
AddEventListener(EventNames.Show, value, false);
}
remove {
RemoveEventListener(EventNames.Show, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Stalled {
add {
AddEventListener(EventNames.Stalled, value, false);
}
remove {
RemoveEventListener(EventNames.Stalled, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Submitted {
add {
AddEventListener(EventNames.Submit, value, false);
}
remove {
RemoveEventListener(EventNames.Submit, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Suspended {
add {
AddEventListener(EventNames.Suspend, value, false);
}
remove {
RemoveEventListener(EventNames.Suspend, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.TimeUpdated {
add {
AddEventListener(EventNames.TimeUpdate, value, false);
}
remove {
RemoveEventListener(EventNames.TimeUpdate, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Toggled {
add {
AddEventListener(EventNames.Toggle, value, false);
}
remove {
RemoveEventListener(EventNames.Toggle, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.VolumeChanged {
add {
AddEventListener(EventNames.VolumeChange, value, false);
}
remove {
RemoveEventListener(EventNames.VolumeChange, value, false);
}
}
event DomEventHandler IGlobalEventHandlers.Waiting {
add {
AddEventListener(EventNames.Waiting, value, false);
}
remove {
RemoveEventListener(EventNames.Waiting, value, false);
}
}
event DomEventHandler IWindowEventHandlers.Printed {
add {
AddEventListener(EventNames.AfterPrint, value, false);
}
remove {
RemoveEventListener(EventNames.AfterPrint, value, false);
}
}
event DomEventHandler IWindowEventHandlers.Printing {
add {
AddEventListener(EventNames.BeforePrint, value, false);
}
remove {
RemoveEventListener(EventNames.BeforePrint, value, false);
}
}
event DomEventHandler IWindowEventHandlers.Unloading {
add {
AddEventListener(EventNames.Unloading, value, false);
}
remove {
RemoveEventListener(EventNames.Unloading, value, false);
}
}
event DomEventHandler IWindowEventHandlers.HashChanged {
add {
AddEventListener(EventNames.HashChange, value, false);
}
remove {
RemoveEventListener(EventNames.HashChange, value, false);
}
}
event DomEventHandler IWindowEventHandlers.MessageReceived {
add {
AddEventListener(EventNames.Message, value, false);
}
remove {
RemoveEventListener(EventNames.Message, value, false);
}
}
event DomEventHandler IWindowEventHandlers.WentOffline {
add {
AddEventListener(EventNames.Offline, value, false);
}
remove {
RemoveEventListener(EventNames.Offline, value, false);
}
}
event DomEventHandler IWindowEventHandlers.WentOnline {
add {
AddEventListener(EventNames.Online, value, false);
}
remove {
RemoveEventListener(EventNames.Online, value, false);
}
}
event DomEventHandler IWindowEventHandlers.PageHidden {
add {
AddEventListener(EventNames.PageHide, value, false);
}
remove {
RemoveEventListener(EventNames.PageHide, value, false);
}
}
event DomEventHandler IWindowEventHandlers.PageShown {
add {
AddEventListener(EventNames.PageShow, value, false);
}
remove {
RemoveEventListener(EventNames.PageShow, value, false);
}
}
event DomEventHandler IWindowEventHandlers.PopState {
add {
AddEventListener(EventNames.PopState, value, false);
}
remove {
RemoveEventListener(EventNames.PopState, value, false);
}
}
event DomEventHandler IWindowEventHandlers.Storage {
add {
AddEventListener(EventNames.Storage, value, false);
}
remove {
RemoveEventListener(EventNames.Storage, value, false);
}
}
event DomEventHandler IWindowEventHandlers.Unloaded {
add {
AddEventListener(EventNames.Unload, value, false);
}
remove {
RemoveEventListener(EventNames.Unload, value, false);
}
}
public Window(Document document)
{
_document = document;
_tasks = new List<CancellationTokenSource>();
}
public ICssStyleDeclaration GetComputedStyle(IElement element, string pseudo = null)
{
return this.GetStyleCollection().ComputeDeclarations(element, pseudo);
}
IWindow IWindow.Open(string url, string name, string features, string replace)
{
return new Window(new HtmlDocument(null) {
Location = {
Href = url
}
}) {
Name = name
};
}
void IWindow.Close()
{
_closed = true;
}
void IWindow.Stop()
{
}
void IWindow.Focus()
{
}
void IWindow.Blur()
{
}
void IWindow.Alert(string message)
{
}
bool IWindow.Confirm(string message)
{
return false;
}
void IWindow.Print()
{
}
int IWindowTimers.SetTimeout(Action<IWindow> handler, int timeout)
{
return QueueTask(DoTimeout, handler, timeout);
}
void IWindowTimers.ClearTimeout(int handle)
{
Clear(handle);
}
int IWindowTimers.SetInterval(Action<IWindow> handler, int timeout)
{
return QueueTask(DoInterval, handler, timeout);
}
void IWindowTimers.ClearInterval(int handle)
{
Clear(handle);
}
private async Task DoTimeout(Action<IWindow> callback, int timeout, CancellationToken token)
{
await AwaitExtensions.ConfigureAwait(token.Delay(timeout), false);
if (!token.IsCancellationRequested)
callback(this);
}
private async Task DoInterval(Action<IWindow> callback, int timeout, CancellationToken token)
{
await AwaitExtensions.ConfigureAwait(token.Delay(timeout), false);
if (!token.IsCancellationRequested) {
_document.QueueTask(DoInterval(callback, timeout, token));
callback(this);
}
}
private int QueueTask(Func<Action<IWindow>, int, CancellationToken, Task> taskCreator, Action<IWindow> callback, int timeout)
{
int count = _tasks.Count;
CancellationTokenSource cts = new CancellationTokenSource();
_document.QueueTask(delegate {
_document.QueueTask(taskCreator(callback, timeout, cts.Token));
});
_tasks.Add(cts);
return count;
}
private void Clear(int handle)
{
if (_tasks.Count > handle && !_tasks[handle].IsCancellationRequested)
_tasks[handle].Cancel();
}
private INavigator ()
{
return _document.Options.GetService<INavigatorService>()?.Create(this);
}
}
}