WebAPI/WebMMS: Difference between revisions

no edit summary
No edit summary
 
(12 intermediate revisions by one other user not shown)
Line 3: Line 3:
On the surface, MMS messages are very similar to multipart HTML emails. One part is responsible for the layout of the message, though MMS uses SMIL rather than HTML. The other parts are attachments, such as text, picture, video, and sound files. Much like in multipart emails, the attachments have "file names" and are referred to by those from the presentation part.
On the surface, MMS messages are very similar to multipart HTML emails. One part is responsible for the layout of the message, though MMS uses SMIL rather than HTML. The other parts are attachments, such as text, picture, video, and sound files. Much like in multipart emails, the attachments have "file names" and are referred to by those from the presentation part.


The API proposal below tries to reuse as many existing Web technologies as applicable. The SMIL document is exposed as a <a href="https://developer.mozilla.org/en/DOM:document">DOM tree</a> and the attachments as <a href="https://developer.mozilla.org/en/DOM/Blob">Blob</a> objects (or, rather, an extension thereof, akin to how <a href="https://developer.mozilla.org/en/DOM/File">File</a> is an extension of Blob). On a User Agent capable of rendering SMIL, the web application may simply render the DOM right away. On other User Agents, it may use XSLT or some other method to convert SMIL to HTML.
The API proposal below tries to reuse as many existing Web technologies as applicable. The SMIL document is exposed as a [https://developer.mozilla.org/en/DOM:document DOM document] and the attachments as [https://developer.mozilla.org/en/DOM/Blob Blob] objects. On a User Agent capable of rendering SMIL, the web application may simply render the DOM right away. On other User Agents, it may use XSLT or some other method to convert SMIL to HTML.


To read the attachments, the web application may use the <a href="https://developer.mozilla.org/en/DOM/FileReader">FileReader</a> API. However, it's not that useful or efficient to have image/audio/video data in memory (e.g. as a typed array). For display purposes the web application just needs a URI that resolves to the data, so that it can point to it in a &lt;video>, &lt;audio>, &lt;img> element. In the simplest case this could be a data: URI, but for large data it might just want to stream the data directly from a file on the disk. (This would be a generally useful feature to provide for all blobs, e.g. when storing multimedia data in IndexedDB.)
To read the attachments, the web application may use the [https://developer.mozilla.org/en/DOM/FileReader FileReader] API. However, it's not that useful or efficient to have image/audio/video data in memory (e.g. as a typed array). For display purposes the web application just needs a URI that resolves to the data, so that it can point to it in a &lt;video>, &lt;audio>, &lt;img> element. This is possible with the [https://developer.mozilla.org/en/DOM/window.URL.createObjectURL window.URL] API.


= API =
= API =
Line 51: Line 51:
     DOMString receiver,
     DOMString receiver,
     Document document
     Document document
   )
   );
    
    
   [Constructor]
   [Constructor]
Line 92: Line 92:
   }
   }


== MmsAttachment ==
== MmsAttachmentStorage ==
    
    
   /**
   /**
   * This object implements a mapping to look up attachments by their name.
   * This object implements a mapping to look up attachments (blobs) by their name.
   *
   *
   *  var text = message.attachments["text.txt"];
   *  var text = message.attachments["text.txt"];
   *  message.attachments["movie.mov"] = new MmsAttachment([data], {type: "application/video"});
   *  message.attachments["movie.mov"] = new Blob([data], {type: "application/video"});
   *  delete message.attachments["picture.png"];
   *  delete message.attachments["picture.png"];
   */
   */
   interface MmsAttachmentStorage
   interface MmsAttachmentStorage
   {
   {
     getter MmsAttachment getAttachment(DOMString name);
     getter Blob getAttachment(DOMString name);
     setter creator void setAttachment(DOMString name, MmsAttachment attachment);
     setter creator void setAttachment(DOMString name, Blob attachment);
     deleter void deleteAttachment(DOMString name);
     deleter void deleteAttachment(DOMString name);
  }
 
  /**
  * MmsAttachment constructor (cf. Blob constructor)
  */
  MmsAttachment MmsAttachment(
    [optional] Array parts,
    [optional] BlobPropertyBag properties
  );
 
  /**
  * MMS attachments extend the DOM Blob type, akin to how File extends Blob.
  */
  [Constructor]
  interface MmsAttachment : Blob
  {
    /**
    * Name of the attachment as it is referenced within the SMIL document (cf. File::name)
    */
    readonly attribute DOMString name;
   
    /**
    * An absolute URI under which User Agent makes the attachment available for download.
    * This is provided so that the data does not have to be loaded into memory first, but
    * can directly be linked to from an &lt;img>, &lt;video>, or &lt;audio> element.
    */
    readonly attribute DOMString uri;
   
    /**
    * Inherited from Blob. See https://developer.mozilla.org/en/DOM/Blob
    */
    readonly attribute unsigned long long size;
    readonly attribute DOMString type;
   }
   }


Line 163: Line 130:
     var mediaEl = firstPar.querySelectorAll("img|audio|video")[0];
     var mediaEl = firstPar.querySelectorAll("img|audio|video")[0];
     var importedEl = document.importNode(mediaEl);
     var importedEl = document.importNode(mediaEl);
     importedEl.src = message.attachments[importedEl.src].uri;
     var mediaUrl = window.URL.createObjectURL(message.attachments[importedEl.src]);
    importedEl.src = mediaUrl;
     messageDisplayContainer.appendChild(importedEl);
     messageDisplayContainer.appendChild(importedEl);
    window.URL.revokeObjectURL(mediaUrl);
   }
   }


== Sending an MMS ==
== Sending an MMS ==


   var smil = "&lt;smil>&lt;body>&lt;par>&lt;video src="lolcat.mov"/>&lt;/par>&lt;/body>&lt;/smil>";
   &lt;html>
  var parser = (new DOMParser()).parseFromString(smil, "application/smil");
  &lt;body>
 
    &lt;input type="file" id="picture" accept="image/*">
  var message = new MmsMessage(recipient, doc);
    &lt;div>
  message.attachments["lolcat.mov"] = new MmsAttachment([videoData], {name: "lolcat.mov", type: "application/video"});
      &lt;input type="text" id="number">
 
      &lt;button onclick="sendMMS();">Send</button>
  navigator.mms.send(message);
    &lt;/div>
    &lt;script>
      function sendMMS() {
        var smil = "&lt;smil>&lt;body>&lt;par>&lt;video src="lolcat.mov"/>&lt;/par>&lt;/body>&lt;/smil>";
        var doc = (new DOMParser()).parseFromString(smil, "application/smil");
        var number = document.getElementById("number").value;
        var message = new MmsMessage(number, doc);
       
        var pictureEl = document.getElementById("picture");
        var pictureBlob = pictureEl.files[0];
        message.attachments["picture.jpg"] = pictureBlob;
       
        navigator.mms.send(message);
      }
    &lt;/script>
  &lt;/body>
  &lt;/html>
 
[[Category:Web APIs]]
Confirmed users
1,340

edits