The changes I made to HTML5 made me realize that HTML was incomplete.

I added the same Video and Audio capabilities from HTML5 to HTML. I also made 
the event handling lower overhead. There’s no event listeners attached by 
default so it should be lighter-weight than the HTML5 versions.

FWIW, we should likely deprecate the entire HTML5 project.

I tested that it compiled correctly. I didn’t test that it works, but I’m 
pretty sure that it does… (I hope…)

If someone is inclined to confirm, I’ll fix if not…

(I don’t have the time right now to spend more time testing, but I wanted to 
get this in for completeness sake.)

Harbs

> On Feb 19, 2026, at 6:46 PM, [email protected] wrote:
> 
> This is an automated email from the ASF dual-hosted git repository.
> 
> harbs pushed a commit to branch develop
> in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
> 
> 
> The following commit(s) were added to refs/heads/develop by this push:
>     new 6df9ede515 Expanded Video and added Audio in HTML
> 6df9ede515 is described below
> 
> commit 6df9ede515502f8b005a6b34a4c374a35186a69b
> Author: Harbs <[email protected]>
> AuthorDate: Thu Feb 19 18:46:11 2026 +0200
> 
>    Expanded Video and added Audio in HTML
> ---
> .../HTML/src/main/resources/html-manifest.xml      |    1 +
> .../org/apache/royale/html/MediaElementBase.as     | 1125 ++++++++++++++++++++
> .../org/apache/royale/html/elements/Audio.as       |   41 +
> .../org/apache/royale/html/elements/Video.as       |  177 +--
> 4 files changed, 1188 insertions(+), 156 deletions(-)
> 
> diff --git a/frameworks/projects/HTML/src/main/resources/html-manifest.xml 
> b/frameworks/projects/HTML/src/main/resources/html-manifest.xml
> index 19ff9174f9..b40f0d7f17 100644
> --- a/frameworks/projects/HTML/src/main/resources/html-manifest.xml
> +++ b/frameworks/projects/HTML/src/main/resources/html-manifest.xml
> @@ -22,6 +22,7 @@
> <componentPackage>
> 
>     <component id="A" class="org.apache.royale.html.elements.A" />
> +    <component id="Audio" class="org.apache.royale.html.elements.Audio" />
>     <component id="B" class="org.apache.royale.html.elements.B" />
>     <component id="Br" class="org.apache.royale.html.elements.Br" />
>     <component id="Button" class="org.apache.royale.html.elements.Button" />
> diff --git 
> a/frameworks/projects/HTML/src/main/royale/org/apache/royale/html/MediaElementBase.as
>  
> b/frameworks/projects/HTML/src/main/royale/org/apache/royale/html/MediaElementBase.as
> new file mode 100644
> index 0000000000..bff32593be
> --- /dev/null
> +++ 
> b/frameworks/projects/HTML/src/main/royale/org/apache/royale/html/MediaElementBase.as
> @@ -0,0 +1,1125 @@
> +////////////////////////////////////////////////////////////////////////////////
> +//
> +//  Licensed to the Apache Software Foundation (ASF) under one or more
> +//  contributor license agreements.  See the NOTICE file distributed with
> +//  this work for additional information regarding copyright ownership.
> +//  The ASF licenses this file to You under the Apache License, Version 2.0
> +//  (the "License"); you may not use this file except in compliance with
> +//  the License.  You may obtain a copy of the License at
> +//
> +//      http://www.apache.org/licenses/LICENSE-2.0
> +//
> +//  Unless required by applicable law or agreed to in writing, software
> +//  distributed under the License is distributed on an "AS IS" BASIS,
> +//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> +//  See the License for the specific language governing permissions and
> +//  limitations under the License.
> +//
> +////////////////////////////////////////////////////////////////////////////////
> +package org.apache.royale.html
> +{
> +     COMPILE::JS
> +     {
> +             import goog.events;
> +             import org.apache.royale.events.utils.EventUtils;
> +             import org.apache.royale.events.Event;
> +     }
> +     public class MediaElementBase extends NodeElementBase
> +     {
> +
> +             /**
> +              *  Dispatched when the resource was not fully loaded,
> +              *  but not as the result of an error.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="abort", type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when the user agent can play the media, but
> +              *  estimates that not enough data has been loaded
> +              *  to play the media up to its end without having to stop
> +              *  for further buffering of content
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="canplay", type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when the user agent can play the media, and 
> estimates
> +              *  that enough data has been loaded to play the media up to 
> its end
> +              *  without having to stop for further buffering of content.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="canplaythrough", 
> type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when the duration property has been updated.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="durationchange", 
> type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when the media has become empty; for example, 
> when the
> +              *  media has already been loaded (or partially loaded), and the
> +              *  MediaElement.load() method is called to reload it
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="emptied", type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when playback stops when end of the media 
> (<audio> or <video>)
> +              *  is reached or because no further data is available.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="ended", type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when the resource could not be loaded due to an 
> error.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="error", type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when the metadata has been loaded
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="loadeddata", 
> type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when the metadata has been loaded
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="loadedmetadata", 
> type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when the browser has started to load a resource.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="loadstart", type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when a request to pause play is handled and the 
> activity
> +              *  has entered its paused state, most commonly occurring when 
> the media's
> +              *  pause() method is called.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="pause", type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when the paused property is changed from true to 
> false,
> +              *  as a result of the play() method, or the autoplay attribute
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="play", type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when playback is ready to start after having been
> +              *  paused or delayed due to lack of data
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="playing", type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched periodically as the browser loads a resource.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="progress", type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when the playback rate has changed.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="ratechange", 
> type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when a seek operation completes
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="seeked", type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when a seek operation begins.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="seeking", type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when the user agent is trying to fetch media 
> data,
> +              *  but data is unexpectedly not forthcoming.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="stalled", type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when the media data loading has been suspended.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="suspend", type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when the time indicated by the currentTime 
> property has been updated.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="timeupdate", 
> type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when the volume has changed.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="volumechange", 
> type="org.apache.royale.events.Event")]
> +
> +             /**
> +              *  Dispatched when playback has stopped because of a temporary 
> lack of data.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             [Event(name="waiting", type="org.apache.royale.events.Event")]
> +
> +             public function MediaElementBase()
> +             {
> +                     super();
> +             }
> +
> +             COMPILE::SWF
> +        private var _autoplay:Boolean;
> +
> +             /**
> +              *  indicate whether playback should automatically begin as
> +              *  soon as enough media is available to do so without 
> interruption.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function get autoplay():Boolean
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as HTMLMediaElement).autoplay;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return _autoplay;
> +                     }
> +             }
> +
> +             /**
> +              *  A boolean value which is true if the media element will 
> begin playback as
> +              *  soon as enough content has loaded to allow it to do so 
> without interruption.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function set autoplay(value:Boolean):void
> +             {
> +                     COMPILE::JS
> +                     {
> +                             (element as HTMLMediaElement).autoplay = value;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             _autoplay = value;
> +                     }
> +             }
> +
> +             /**
> +              *  return a TimeRanges object that represents the ranges of 
> the media resource,
> +              *  if any, that the user agent has buffered at the moment the 
> buffered property is accessed.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             COMPILE::JS
> +             public function get buffered():TimeRanges
> +             {
> +                     return (element as HTMLMediaElement).buffered;
> +             }
> +
> +             /**
> +              *  eflects the controls attribute, which controls whether user 
> interface
> +              *  controls for playing the media item will be displayed.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function get controls():Boolean
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as HTMLMediaElement).controls;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return false;
> +                     }
> +             }
> +
> +             /**
> +              *  A value of true means controls will be displayed.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function set controls(value:Boolean):void
> +             {
> +                     COMPILE::JS
> +                     {
> +                             (element as HTMLMediaElement).controls = value;
> +                     }
> +             }
> +
> +             /*
> +             public function get controlsList():DOMTokenList
> +             {
> +                     return (element as HTMLMediaElement).controlsList;
> +             }
> +*/
> +
> +             /*COMPILE::JS
> +             public function get crossOrigin():String
> +             {
> +                     return (element as HTMLMediaElement).crossOrigin;
> +             }
> +
> +     COMPILE::JS
> +             public function set crossOrigin(value:String):void
> +             {
> +                     (element as HTMLMediaElement).controls = crossOrigin;
> +             }*/
> +
> +             /**
> +              *  return the current source
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function get currentSrc():String
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as HTMLMediaElement).currentSrc;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return null;
> +                     }
> +             }
> +
> +             /**
> +              *  specifies the current playback time in seconds.
> +              *  If the media is not yet playing, the value of currentTime
> +              *  indicates the time position within the media at which 
> playback
> +              *  will begin once the play() method is called
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function get currentTime():Number
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as 
> HTMLMediaElement).currentTime;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return 0;
> +                     }
> +             }
> +
> +             /**
> +              *  Changing the value of currentTime seeks the media to the 
> new time.
> +              *  value indicate the current playback time in seconds.
> +              *  Setting currentTime to a new value seeks the media to the 
> given time, if the media is available.
> +              *  The length of the media in seconds can be determined using 
> the duration property.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function set currentTime(value:Number):void
> +             {
> +                     COMPILE::JS
> +                     {
> +                             (element as HTMLMediaElement).currentTime = 
> value;
> +                     }
> +             }
> +
> +             /*COMPILE::JS
> +             public function get defaultMuted():Boolean
> +             {
> +                     return (element as HTMLMediaElement).defaultMuted;
> +             }
> +
> +     COMPILE::JS
> +             public function set defaultMuted(value:Boolean):void
> +             {
> +                     (element as HTMLMediaElement).defaultMuted = value;
> +             }*/
> +
> +             /**
> +              *  indicates the default playback rate for the media.
> +              *  1.0 is "normal speed,"
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function get defaultPlaybackRate():Number
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as 
> HTMLMediaElement).defaultPlaybackRate;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return 0;
> +                     }
> +             }
> +
> +             /*COMPILE::JS
> +             public function set defaultPlaybackRate(value:Number):void
> +             {
> +                     (element as HTMLMediaElement).defaultPlaybackRate = 
> value;
> +             }
> +
> +        COMPILE::JS
> +             public function get disableRemotePlayback():Boolean
> +             {
> +                     return (element as 
> HTMLMediaElement).disableRemotePlayback;
> +             }
> +
> +     COMPILE::JS
> +             public function set disableRemotePlayback(value:Boolean):void
> +             {
> +                     (element as HTMLMediaElement).disableRemotePlayback = 
> value;
> +             }*/
> +
> +             /**
> +              *  indicates the length of the element's media in seconds.
> +              *  If no media data is available, the value NaN is returned.
> +              *  If the element's media doesn't have a known duration—such
> +              *  as for live media streams—the value of duration is +Infinity
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function get duration():Number
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as HTMLMediaElement).duration;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return 0;
> +                     }
> +             }
> +
> +             /**
> +              *  indicates whether the media element has ended playback.
> +              *  return true if the media contained in the element has 
> finished playing.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function get ended():Boolean
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as HTMLMediaElement).ended;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return false;
> +                     }
> +             }
> +
> +             /**
> +              *  MediaError object for the most recent error, or null if 
> there has not been an error.
> +              *  When an error event is received by the element, you can 
> determine details about
> +              *  what happened by examining this object.
> +              *
> +              *  A MediaError object describing the most recent error to 
> occur
> +              *  on the media element or null if no errors have occurred.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             COMPILE::JS
> +             public function get error():MediaError
> +             {
> +                     return (element as HTMLMediaElement).error;
> +             }
> +
> +             /**
> +              *  return whether the media element should start over when it 
> reaches the end
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function get loop():Boolean
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as HTMLMediaElement).loop;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return false;
> +                     }
> +             }
> +
> +             /**
> +              *  controls whether the media element should start over when 
> it reaches the end
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function set loop(value:Boolean):void
> +             {
> +                     COMPILE::JS
> +                     {
> +                             (element as HTMLMediaElement).loop = value;
> +                     }
> +             }
> +
> +             /**
> +              *  indicates whether the media element muted.
> +              *  true means muted and false means not muted
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function get muted():Boolean
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as HTMLMediaElement).muted;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return false;
> +                     }
> +             }
> +
> +             /**
> +              *  set or unset mute
> +              *  true means mute and false means not mute
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function set muted(value:Boolean):void
> +             {
> +                     COMPILE::JS
> +                     {
> +                             (element as HTMLMediaElement).muted = value;
> +                     }
> +             }
> +
> +             /**
> +              *  indicates the current state of the fetching of media over 
> the network.
> +              *  Possible values are:
> +              *
> +              *  0: NETWORK_EMPTY. There is no data yet. Also, readyState is 
> HAVE_NOTHING.
> +              *      1: NETWORK_IDLE. MediaElement is active and has 
> selected a resource, but is not using the network.
> +              *      2: NETWORK_LOADING. downloading MediaElement data is 
> downloading.
> +              *      3: NETWORK_NO_SOURCE. No MediaElement src found.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             static public const NETWORK_EMPTY:int = 0;
> +             static public const NETWORK_IDLE:int = 1;
> +             static public const NETWORK_LOADING:int = 2;
> +             static public const NETWORK_NO_SOURCE:int = 3;
> +
> +             public function get networkState():uint
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as 
> HTMLMediaElement).networkState;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return 0;
> +                     }
> +             }
> +
> +             /**
> +     *  Whether the video is paused
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function get paused():Boolean
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as HTMLMediaElement).paused;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return false;
> +                     }
> +             }
> +
> +             /**
> +              *  1.0 is "normal speed," values lower than 1.0 make the media 
> play slower than
> +              *  normal, higher values make it play faster.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function get playbackRate():Number
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as 
> HTMLMediaElement).playbackRate;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return 0;
> +                     }
> +             }
> +
> +             /**
> +              *  sets the rate at which the media is being played back. This 
> is used
> +              *  to implement user controls for fast forward, slow motion, 
> and so forth.
> +              *  The normal playback rate is multiplied by this value to 
> obtain the current
> +              *  rate, so a value of 1.0 indicates normal speed.
> +              *
> +              *  If playbackRate is negative, the media is not played 
> backwards.
> +              *
> +              *  The audio is muted when the fast forward or slow motion is 
> outside
> +              *  a useful range (for example, Gecko mutes the sound outside 
> the range 0.25 to 4.0)
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function set playbackRate(value:Number):void
> +             {
> +                     COMPILE::JS
> +                     {
> +                             (element as HTMLMediaElement).playbackRate = 
> value;
> +                     }
> +             }
> +
> +             /*COMPILE::JS
> +             public function get preservesPitch():Boolean
> +             {
> +                     return (element as HTMLMediaElement).preservesPitch;
> +             }
> +        
> +        COMPILE::JS
> +             public function set preservesPitch(value:Boolean):void
> +             {
> +                     (element as HTMLMediaElement).preservesPitch = value;
> +             }*/
> +
> +             /**
> +              *  indicates the readiness state of the media.
> +              *  Possible values are:
> +              *
> +              *  0 -> HAVE_NOTHING (No information is available about the 
> media resource.)
> +              *  1 -> HAVE_METADATA (Enough of the media resource has been 
> retrieved that the metadata attributes are initialized. Seeking will no 
> longer raise an exception. )
> +              *  2 -> HAVE_CURRENT_DATA (Data is available for the current 
> playback position, but not enough to actually play more than one frame.)
> +              *  3 -> HAVE_FUTURE_DATA (Data for the current playback 
> position as well as for at least a little bit of time into the future is 
> available (in other words, at least two frames of video, for example).)
> +              *  4 -> HAVE_ENOUGH_DATA (Enough data is available—and the 
> download rate is high enough—that the media can be played through to the end 
> without interruption. )
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function get readyState():uint
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as HTMLMediaElement).readyState;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return 0;
> +                     }
> +             }
> +
> +             /**
> +              *  returns a TimeRanges object that represents the ranges of 
> the media resource,
> +              *  if any, that the user agent is able to seek to at the time 
> seekable property is accessed.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             COMPILE::JS
> +             public function get seekable():TimeRanges
> +             {
> +                     return (element as HTMLMediaElement).seekable;
> +             }
> +
> +             /**
> +              *  returns a DOMString that is the unique ID of the audio 
> device delivering output.
> +              *  If it is using the user agent default, it returns an empty 
> string.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function get sinkId():String
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as HTMLMediaElement).sinkId;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return null;
> +                     }
> +             }
> +
> +             /**
> +              *  reflects the value of the media element's src attribute, 
> which indicates the URL of a media resource to use in the element.
> +              *  The best way to know the URL of the media resource 
> currently in active use in this element is to look at the value
> +              *  of the currentSrc attribute, which also takes into account 
> selection of a best or preferred media resource from
> +              *  a list provided in an HTMLSourceElement (which represents a 
> <source> element).
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function get src():String
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as HTMLMediaElement).src;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return null;
> +                     }
> +             }
> +
> +             /**
> +              *  set source.  TODO see use of <sources>
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function set src(value:String):void
> +             {
> +                     COMPILE::JS
> +                     {
> +                             (element as HTMLMediaElement).src = value;
> +                     }
> +             }
> +
> +             COMPILE::SWF
> +
> +             private var _source:Object;
> +
> +             /**
> +              *  Stream object for Video
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 10.2
> +              *  @playerversion AIR 2.6
> +              *  @productversion Royale 0.9.8
> +              */
> +             public function get source():Object
> +             {
> +                     COMPILE::SWF
> +                     {
> +                             return _source;
> +                     }
> +
> +                     COMPILE::JS
> +                     {
> +                             return element["srcObject"];
> +                     }
> +             }
> +
> +             public function set source(value:Object):void
> +             {
> +                     COMPILE::SWF
> +                     {
> +                             _source = value;
> +                     }
> +                     COMPILE::JS
> +                     {
> +                             element["srcObject"] = value;
> +                     }
> +             }
> +
> +             /**
> +              *  returns a TextTrackList object listing all of the TextTrack 
> objects representing
> +              *  the media element's text tracks, in the same order as in 
> the list of text tracks.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             COMPILE::JS
> +
> +             public function get textTracks():TextTrackList
> +             {
> +                     return (element as HTMLMediaElement).textTracks;
> +             }
> +
> +             /*COMPILE::JS
> +             public function get videoTracks():VideoTrackList
> +             { 
> +                     return (element as HTMLMediaElement).videoTracks;
> +             }*/
> +
> +             /**
> +              *  value between 0 and 1, where 0 is effectively muted and
> +              *  1 is the loudest possible value.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function get volume():Number
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as HTMLMediaElement).volume;
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return 0;
> +                     }
> +             }
> +
> +             /**
> +              *  value must fall between 0 and 1, where 0 is effectively 
> muted and
> +              *  1 is the loudest possible value.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function set volume(value:Number):void
> +             {
> +                     COMPILE::JS
> +                     {
> +                             (element as HTMLMediaElement).volume = value;
> +                     }
> +             }
> +
> +             /**
> +              *  reports how likely it is that the current browser will be 
> able
> +              *  to play media of a given MIME type
> +              *
> +              *  Return value :
> +              *      A string indicating how likely it is that the media can 
> be played.
> +              *
> +              *  The string will be one of the following values:
> +              *
> +              *  probably
> +              *  Media of the type indicated by the mediaType parameter is 
> probably
> +              *  playable on this device.
> +              *
> +              *  maybe
> +              *  Not enough information is available to determine for sure 
> whether or not
> +              *  the media will play until playback is actually attempted.
> +              *
> +              *  "" (empty string)
> +              *  Media of the given type definitely can't be played on the 
> current device.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function canPlayType(mediaType:String):String
> +             {
> +                     COMPILE::JS
> +                     {
> +                             return (element as 
> HTMLMediaElement).canPlayType(mediaType);
> +                     }
> +
> +                     COMPILE::SWF
> +                     {
> +                             return null;
> +                     }
> +             }
> +
> +             /**
> +              *  resets the media element to its initial state and begins 
> the process
> +              *  of selecting a media source and loading the media in 
> preparation for
> +              *  playback to begin at the beginning.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function load():void
> +             {
> +                     COMPILE::JS
> +                     {
> +                             (element as HTMLMediaElement).load();
> +                     }
> +             }
> +
> +             /**
> +              *  pause playback of the media, if the media is already in a 
> paused state this method will have no effect.
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function pause():void
> +             {
> +                     COMPILE::JS
> +                     {
> +                             (element as HTMLMediaElement).pause();
> +                     }
> +             }
> +
> +             /**
> +              *  attempts to begin playback of the media. May be block by 
> browser policy if not called in a user gesture event
> +              *
> +              *  @langversion 3.0
> +              *  @playerversion Flash 0.0
> +              *  @playerversion AIR 0.0
> +              *  @productversion Royale 0.0
> +              */
> +             public function play():void
> +             {
> +                     /*TODO check for return value*/
> +                     COMPILE::JS
> +                     {
> +                             (element as HTMLMediaElement).play();
> +                     }
> +             }
> +             private static const MEDIA_EVENTS:Object = {
> +                             "abort": true,
> +                             "canplay": true,
> +                             "canplaythrough": true,
> +                             "durationchange": true,
> +                             "emptied": true,
> +                             "ended": true,
> +                             "error": true,
> +                             "loadeddata": true,
> +                             "loadedmetadata": true,
> +                             "loadstart": true,
> +                             "pause": true,
> +                             "play": true,
> +                             "playing": true,
> +                             "progress": true,
> +                             "ratechange": true,
> +                             "seeked": true,
> +                             "seeking": true,
> +                             "stalled": true,
> +                             "suspend": true,
> +                             "timeupdate": true,
> +                             "volumechange": true,
> +                             "waiting": true
> +                     };
> +             
> +             COMPILE::JS
> +             override public function addEventListener(type:String, 
> handler:Function, opt_capture:Boolean = false, opt_handlerScope:Object = 
> null):void
> +             {
> +                     if (MEDIA_EVENTS[type])
> +                     {
> +                             goog.events.listen(element, type, handler, 
> opt_capture ? {capture : true}: null);
> +                             return;
> +                     }
> +                     super.addEventListener(type, handler, opt_capture, 
> opt_handlerScope);
> +             }
> +             
> +             COMPILE::JS
> +             override public function removeEventListener(type:String, 
> handler:Function, opt_capture:Boolean = false, opt_handlerScope:Object = 
> null):void
> +             {
> +                     if (MEDIA_EVENTS[type])
> +                     {
> +                             goog.events.unlisten(element, type, handler, 
> opt_capture ? {capture : true}: null);
> +                             return;
> +                     }
> +                     super.removeEventListener(type, handler, opt_capture, 
> opt_handlerScope);
> +             }
> +             
> +             COMPILE::JS
> +             override public function hasEventListener(type:String):Boolean
> +             {
> +                     if (MEDIA_EVENTS[type])
> +                     {
> +                             return goog.events.hasListener(source, type);
> +                     }
> +                     return super.hasEventListener(type);
> +             }
> +             COMPILE::JS
> +             /**
> +              * @royaleignorecoercion String
> +              */
> +             override public function dispatchEvent(e:Object):Boolean
> +             {
> +                     var isString:Boolean = e is String;
> +                     var type:String = isString ? e as String : e.type;
> +                     if (MEDIA_EVENTS[type])
> +                     {
> +                             if (isString)
> +                                     e = new Event(type);
> +
> +                             var orig:Object = e;
> +                             e = 
> EventUtils.tagNativeEvent(EventUtils.createEvent(type, e["bubbles"]), orig);
> +                             orig.target = orig.currentTarget = this;
> +                             return (element as Object).dispatchEvent(e);
> +                     }
> +                     return super.dispatchEvent(e);
> +             }
> +
> +     }
> +}
> \ No newline at end of file
> diff --git 
> a/frameworks/projects/HTML/src/main/royale/org/apache/royale/html/elements/Audio.as
>  
> b/frameworks/projects/HTML/src/main/royale/org/apache/royale/html/elements/Audio.as
> new file mode 100644
> index 0000000000..691eeedbff
> --- /dev/null
> +++ 
> b/frameworks/projects/HTML/src/main/royale/org/apache/royale/html/elements/Audio.as
> @@ -0,0 +1,41 @@
> +// 
> //////////////////////////////////////////////////////////////////////////////
> +// 
> +// Licensed to the Apache Software Foundation (ASF) under one or more
> +// contributor license agreements.  See the NOTICE file distributed with
> +// this work for additional information regarding copyright ownership.
> +// The ASF licenses this file to You under the Apache License, Version 2.0
> +// (the "License"); you may not use this file except in compliance with
> +// the License.  You may obtain a copy of the License at
> +// 
> +// http://www.apache.org/licenses/LICENSE-2.0
> +// 
> +// Unless required by applicable law or agreed to in writing, software
> +// distributed under the License is distributed on an "AS IS" BASIS,
> +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> +// See the License for the specific language governing permissions and
> +// limitations under the License.
> +// 
> +// 
> //////////////////////////////////////////////////////////////////////////////
> +package org.apache.royale.html.elements
> +{
> +     COMPILE::JS
> +     {
> +             import org.apache.royale.core.WrappedHTMLElement;
> +             import org.apache.royale.html.util.addElementToWrapper;
> +     }
> +     import org.apache.royale.html.MediaElementBase;
> +
> +     public class Audio extends MediaElementBase
> +     {
> +             public function Audio()
> +             {
> +                     super();
> +             }
> +             COMPILE::JS
> +             override protected function createElement():WrappedHTMLElement
> +             {
> +                     return addElementToWrapper(this, 'audio');
> +             }
> +
> +     }
> +}
> \ No newline at end of file
> diff --git 
> a/frameworks/projects/HTML/src/main/royale/org/apache/royale/html/elements/Video.as
>  
> b/frameworks/projects/HTML/src/main/royale/org/apache/royale/html/elements/Video.as
> index 459c4a6438..2a770243b9 100644
> --- 
> a/frameworks/projects/HTML/src/main/royale/org/apache/royale/html/elements/Video.as
> +++ 
> b/frameworks/projects/HTML/src/main/royale/org/apache/royale/html/elements/Video.as
> @@ -21,187 +21,52 @@ package org.apache.royale.html.elements
>     COMPILE::JS
>     {
>         import org.apache.royale.core.WrappedHTMLElement;
> -             import org.apache.royale.html.util.addElementToWrapper;
> +        import org.apache.royale.html.util.addElementToWrapper;
>     }
> -    import org.apache.royale.html.NodeElementBase;
> +    import org.apache.royale.html.MediaElementBase;
> 
> -     /**
> -      *  The Video class represents an HTML <video> element
> -     *  
> -      *  
> +    /**
> +     *  The Video class represents an HTML <video> element
> +     *
> +     *
>      *  @toplevel
> -      *  @langversion 3.0
> -      *  @playerversion Flash 10.2
> -      *  @playerversion AIR 2.6
> -      *  @productversion Royale 0.9.8
> -      */
> -     public class Video extends NodeElementBase
> -     {
> -             /**
> -              *  constructor.
> -              *
> -              *  @langversion 3.0
> -              *  @playerversion Flash 10.2
> -              *  @playerversion AIR 2.6
> -              *  @productversion Royale 0.9.8
> -              */
> -             public function Video()
> -             {
> -                     super();
> -             }
> -
> -        COMPILE::SWF
> -        private var _source:Object;
> -
> -        /**
> -         *  Stream object for Video
> -         *
> -         *  @langversion 3.0
> -         *  @playerversion Flash 10.2
> -         *  @playerversion AIR 2.6
> -         *  @productversion Royale 0.9.8
> -         */
> -        public function get source():Object
> -        {
> -            COMPILE::SWF
> -            {
> -                return _source;
> -            }
> -
> -            COMPILE::JS
> -            {
> -                return element["srcObject"];
> -            }
> -        }
> -
> -        public function set source(value:Object):void
> -        {
> -            COMPILE::SWF
> -            {
> -                _source = value;
> -            }
> -            COMPILE::JS
> -            {
> -                element["srcObject"] = value;
> -            }
> -        }
> -
> -             COMPILE::SWF
> -        private var _autoplay:Boolean;
> -
> -        /**
> -         *  Whether the video is autoplay
> -         *
> -         *  @langversion 3.0
> -         *  @playerversion Flash 10.2
> -         *  @playerversion AIR 2.6
> -         *  @productversion Royale 0.9.8
> -         */
> -        public function get autoplay():Boolean
> -        {
> -            COMPILE::SWF
> -            {
> -                return _autoplay;
> -            }
> -
> -            COMPILE::JS
> -            {
> -                return (element as HTMLVideoElement).autoplay;
> -            }
> -        }
> -
> -        public function set autoplay(value:Boolean):void
> -        {
> -            COMPILE::SWF
> -            {
> -                _autoplay = value;
> -            }
> -            COMPILE::JS
> -            {
> -                (element as HTMLVideoElement).autoplay = value;
> -            }
> -        }
> -
> -        COMPILE::SWF
> -        private var _paused:Boolean;
> -
> +     *  @langversion 3.0
> +     *  @playerversion Flash 10.2
> +     *  @playerversion AIR 2.6
> +     *  @productversion Royale 0.9.8
> +     */
> +    public class Video extends MediaElementBase
> +    {
>         /**
> -         *  Whether the video is paused
> +         *  constructor.
>          *
>          *  @langversion 3.0
>          *  @playerversion Flash 10.2
>          *  @playerversion AIR 2.6
>          *  @productversion Royale 0.9.8
>          */
> -        public function get paused():Boolean
> +        public function Video()
>         {
> -            COMPILE::SWF
> -            {
> -                return _paused;
> -            }
> -
> -            COMPILE::JS
> -            {
> -                return (element as HTMLVideoElement).paused;
> -            }
> +            super();
>         }
> 
>         COMPILE::JS
> -        /**
> -         *  Start video
> -         *
> -         *  @langversion 3.0
> -         *  @playerversion Flash 10.2
> -         *  @playerversion AIR 2.6
> -         *  @productversion Royale 0.9.8
> -         */
> -        public function play():void
> +        public function get videoHeight():uint
>         {
> -            COMPILE::JS
> -            {
> -                (element as HTMLMediaElement).play();
> -            }
> +            return (element as HTMLVideoElement).videoHeight;
>         }
> 
>         COMPILE::JS
> -        /**
> -         *  Pause video
> -         *
> -         *  @langversion 3.0
> -         *  @playerversion Flash 10.2
> -         *  @playerversion AIR 2.6
> -         *  @productversion Royale 0.9.8
> -         */
> -        public function pause():void
> -        {
> -            COMPILE::JS
> -            {
> -                (element as HTMLMediaElement).pause();
> -            }
> -        }
> 
> -        COMPILE::JS
> -        /**
> -         *  Resets the media element to its initial state and begins the 
> process of selecting
> -         *  a media source and loading the media in preparation for playback 
> to begin at the beginning.
> -         *
> -         *  @langversion 3.0
> -         *  @playerversion Flash 10.2
> -         *  @playerversion AIR 2.6
> -         *  @productversion Royale 0.9.8
> -         */
> -        public function load():void
> +        public function get videoWidth():uint
>         {
> -            COMPILE::JS
> -            {
> -                (element as HTMLMediaElement).load();
> -            }
> +            return (element as HTMLVideoElement).videoWidth;
>         }
> 
>         COMPILE::JS
>         override protected function createElement():WrappedHTMLElement
>         {
> -                     return addElementToWrapper(this,'video');
> +            return addElementToWrapper(this, 'video');
>         }
>     }
> }
> 


Reply via email to