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.Styling;
using System;
using System.Linq;
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 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 = _document.Context.CreateService<INavigator>());
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;
}
public IMediaQueryList MatchMedia(string mediaText)
{
IConfiguration options = _document.Options;
StyleOptions options2 = new StyleOptions(_document.Context);
IMediaList media = options.GetCssStyleEngine().ParseMedia(mediaText, options2);
return new CssMediaQueryList(this, media);
}
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(_document.NewContext(name, Sandboxes.None)) {
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(DoTimeoutAsync, handler, timeout);
}
void IWindowTimers.ClearTimeout(int handle)
{
Clear(handle);
}
void IWindowTimers.ClearInterval(int handle)
{
Clear(handle);
}
int IWindowTimers.SetInterval(Action<IWindow> handler, int timeout)
{
return QueueTask(DoIntervalAsync, handler, timeout);
}
private async Task DoTimeoutAsync(Action<IWindow> callback, int timeout, CancellationTokenSource cts)
{
CancellationToken token = cts.Token;
await TaskEx.Delay(timeout, token).ConfigureAwait(false);
if (!token.IsCancellationRequested)
_document.QueueTask(delegate {
callback(this);
});
}
private async Task DoIntervalAsync(Action<IWindow> callback, int timeout, CancellationTokenSource cts)
{
CancellationToken token = cts.Token;
while (!token.IsCancellationRequested) {
await DoTimeoutAsync(callback, timeout, cts).ConfigureAwait(false);
}
}
private int QueueTask(Func<Action<IWindow>, int, CancellationTokenSource, Task> taskCreator, Action<IWindow> callback, int timeout)
{
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
taskCreator(callback, timeout, cancellationTokenSource);
_document.AttachReference(cancellationTokenSource);
return cancellationTokenSource.GetHashCode();
}
private void Clear(int handle)
{
CancellationTokenSource cancellationTokenSource = (from m in _document.GetAttachedReferences<CancellationTokenSource>()
where m.GetHashCode() == handle
select m).FirstOrDefault();
if (cancellationTokenSource != null && !cancellationTokenSource.IsCancellationRequested)
cancellationTokenSource.Cancel();
}
}
}