Skip to content

Commit

Permalink
#682@minor: Adds support for HTMLIframeElement, MessageEvent and Wind…
Browse files Browse the repository at this point in the history
…ow.postMessage().
  • Loading branch information
capricorn86 committed Feb 21, 2023
1 parent 71b3286 commit 285f41c
Show file tree
Hide file tree
Showing 18 changed files with 752 additions and 13 deletions.
8 changes: 7 additions & 1 deletion packages/happy-dom/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,7 @@ const window = new Window({
disableJavaScriptFileLoading: true,
disableJavaScriptEvaluation: true,
disableCSSFileLoading: true,
disableIframePageLoading: true,
enableFileSystemHttpRequests: true
}
});
Expand All @@ -270,6 +271,7 @@ const window = new Window();
window.happyDOM.settings.disableJavaScriptFileLoading = true;
window.happyDOM.settings.disableJavaScriptEvaluation = true;
window.happyDOM.settings.disableCSSFileLoading = true;
window.happyDOM.settings.disableIframePageLoading = true;
window.happyDOM.settings.enableFileSystemHttpRequests = true;
```

Expand All @@ -283,7 +285,11 @@ Set it to "true" to completely disable JavaScript evaluation. Defaults to "false

**disableCSSFileLoading**

Set it to "true" to disable CSS file loading using the HTMLLinkElement. Defaults to "false".
Set it to "true" to disable CSS file loading in HTMLLinkElement. Defaults to "false".

**disableIframePageLoading**

Set it to "true" to disable page loading in HTMLIframeElement. Defaults to "false".

**enableFileSystemHttpRequests**

Expand Down
3 changes: 2 additions & 1 deletion packages/happy-dom/src/config/ElementTag.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import HTMLButtonElement from '../nodes/html-button-element/HTMLButtonElement';
import HTMLAudioElement from '../nodes/html-audio-element/HTMLAudioElement';
import HTMLVideoElement from '../nodes/html-video-element/HTMLVideoElement';
import HTMLAnchorElement from '../nodes/html-anchor-element/HTMLAnchorElement';
import HTMLIframeElement from '../nodes/html-iframe-element/HTMLIframeElement';

export default {
A: HTMLAnchorElement,
Expand Down Expand Up @@ -94,7 +95,7 @@ export default {
HR: HTMLElement,
HTML: HTMLElement,
I: HTMLElement,
IFRAME: HTMLElement,
IFRAME: HTMLIframeElement,
INS: HTMLElement,
KBD: HTMLElement,
LEGEND: HTMLElement,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ export default [
'HTMLTableSectionElement',
'HTMLFrameElement',
'HTMLFrameSetElement',
'HTMLIFrameElement',
'HTMLEmbedElement',
'HTMLObjectElement',
'HTMLParamElement',
Expand Down
26 changes: 26 additions & 0 deletions packages/happy-dom/src/event/IMessagePort.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import IEventTarget from './IEventTarget';

/**
* Message port.
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/MessagePort
*/
export default interface IMessagePort extends IEventTarget {
/**
* Sends a message from the port, and optionally, transfers ownership of objects to other browsing contexts.
*
* @param type Event type.
* @param listener Listener.
*/
postMessage(message: unknown, transerList: unknown[]): void;

/**
* Starts the sending of messages queued on the port.
*/
start(): void;

/**
* Disconnects the port, so it is no longer active. This stops the flow of messages to that port.
*/
close(): void;
}
33 changes: 33 additions & 0 deletions packages/happy-dom/src/event/MessagePort.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import EventTarget from './EventTarget';
import IMessagePort from './IMessagePort';

/**
* Message port.
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/MessagePort
*/
export default abstract class MessagePort extends EventTarget implements IMessagePort {
/**
* Sends a message from the port, and optionally, transfers ownership of objects to other browsing contexts.
*
* @param _message Message.
* @param _transerList Transfer list.
*/
public postMessage(_message: unknown, _transerList: unknown[]): void {
// TODO: Implement
}

/**
* Starts the sending of messages queued on the port.
*/
public start(): void {
// TODO: Implement
}

/**
* Disconnects the port, so it is no longer active. This stops the flow of messages to that port.
*/
public close(): void {
// TODO: Implement
}
}
11 changes: 11 additions & 0 deletions packages/happy-dom/src/event/events/IMessageEventInit.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import IEventInit from '../IEventInit';
import IWindow from '../../window/IWindow';
import IMessagePort from '../IMessagePort';

export default interface IMessageEventInit extends IEventInit {
data?: unknown | null;
origin?: string;
lastEventId?: string;
source?: IWindow | null;
ports?: IMessagePort[];
}
32 changes: 32 additions & 0 deletions packages/happy-dom/src/event/events/MessageEvent.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import IWindow from '../../window/IWindow';
import Event from '../Event';
import IMessagePort from '../IMessagePort';
import IMessageEventInit from './IMessageEventInit';

/**
* Message event.
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent
*/
export default class MessageEvent extends Event {
public data?: unknown | null = null;
public origin?: string = '';
public lastEventId?: string = '';
public source?: IWindow | null = null;
public ports?: IMessagePort[] = [];

/**
* Constructor.
*
* @param type Event type.
* @param [eventInit] Event init.
*/
constructor(type: string, eventInit?: IMessageEventInit) {
super(type, eventInit);
this.data = eventInit?.data !== undefined ? eventInit.data : null;
this.origin = eventInit?.origin || '';
this.lastEventId = eventInit?.lastEventId || '';
this.source = eventInit?.source || null;
this.ports = eventInit?.ports || [];
}
}
Loading

0 comments on commit 285f41c

Please sign in to comment.