content/media/TextTrackCue.cpp

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #include "mozilla/dom/HTMLTrackElement.h"
     7 #include "mozilla/dom/TextTrackCue.h"
     8 #include "mozilla/dom/TextTrackRegion.h"
     9 #include "nsComponentManagerUtils.h"
    10 #include "mozilla/ClearOnShutdown.h"
    12 namespace mozilla {
    13 namespace dom {
    15 NS_IMPL_CYCLE_COLLECTION_INHERITED(TextTrackCue,
    16                                    DOMEventTargetHelper,
    17                                    mDocument,
    18                                    mTrack,
    19                                    mTrackElement,
    20                                    mDisplayState,
    21                                    mRegion)
    23 NS_IMPL_ADDREF_INHERITED(TextTrackCue, DOMEventTargetHelper)
    24 NS_IMPL_RELEASE_INHERITED(TextTrackCue, DOMEventTargetHelper)
    25 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TextTrackCue)
    26 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
    28 StaticRefPtr<nsIWebVTTParserWrapper> TextTrackCue::sParserWrapper;
    30 // Set cue setting defaults based on step 19 & seq.
    31 // in http://dev.w3.org/html5/webvtt/#parsing
    32 void
    33 TextTrackCue::SetDefaultCueSettings()
    34 {
    35   mPosition = 50;
    36   mPositionAlign = AlignSetting::Middle;
    37   mSize = 100;
    38   mPauseOnExit = false;
    39   mSnapToLines = true;
    40   mLineIsAutoKeyword = true;
    41   mAlign = AlignSetting::Middle;
    42   mLineAlign = AlignSetting::Start;
    43   mVertical = DirectionSetting::_empty;
    44 }
    46 TextTrackCue::TextTrackCue(nsPIDOMWindow* aOwnerWindow,
    47                            double aStartTime,
    48                            double aEndTime,
    49                            const nsAString& aText,
    50                            ErrorResult& aRv)
    51   : DOMEventTargetHelper(aOwnerWindow)
    52   , mText(aText)
    53   , mStartTime(aStartTime)
    54   , mEndTime(aEndTime)
    55   , mReset(false)
    56 {
    57   SetDefaultCueSettings();
    58   MOZ_ASSERT(aOwnerWindow);
    59   if (NS_FAILED(StashDocument())) {
    60     aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
    61   }
    62 }
    64 TextTrackCue::TextTrackCue(nsPIDOMWindow* aOwnerWindow,
    65                            double aStartTime,
    66                            double aEndTime,
    67                            const nsAString& aText,
    68                            HTMLTrackElement* aTrackElement,
    69                            ErrorResult& aRv)
    70   : DOMEventTargetHelper(aOwnerWindow)
    71   , mText(aText)
    72   , mStartTime(aStartTime)
    73   , mEndTime(aEndTime)
    74   , mTrackElement(aTrackElement)
    75   , mReset(false)
    76 {
    77   SetDefaultCueSettings();
    78   MOZ_ASSERT(aOwnerWindow);
    79   if (NS_FAILED(StashDocument())) {
    80     aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
    81   }
    82 }
    84 /** Save a reference to our creating document so we don't have to
    85  *  keep getting it from our window.
    86  */
    87 nsresult
    88 TextTrackCue::StashDocument()
    89 {
    90   nsPIDOMWindow* window = GetOwner();
    91   if (!window) {
    92     return NS_ERROR_NO_INTERFACE;
    93   }
    94   mDocument = window->GetDoc();
    95   if (!mDocument) {
    96     return NS_ERROR_NOT_AVAILABLE;
    97   }
    98   return NS_OK;
    99 }
   101 already_AddRefed<DocumentFragment>
   102 TextTrackCue::GetCueAsHTML()
   103 {
   104   // mDocument may be null during cycle collector shutdown.
   105   // See bug 941701.
   106   if (!mDocument) {
   107     return nullptr;
   108   }
   110   if (!sParserWrapper) {
   111     nsresult rv;
   112     nsCOMPtr<nsIWebVTTParserWrapper> parserWrapper =
   113       do_CreateInstance(NS_WEBVTTPARSERWRAPPER_CONTRACTID, &rv);
   114     if (NS_FAILED(rv)) {
   115       return mDocument->CreateDocumentFragment();
   116     }
   117     sParserWrapper = parserWrapper;
   118     ClearOnShutdown(&sParserWrapper);
   119   }
   121   nsPIDOMWindow* window = mDocument->GetWindow();
   122   if (!window) {
   123     return mDocument->CreateDocumentFragment();
   124   }
   126   nsCOMPtr<nsIDOMHTMLElement> div;
   127   sParserWrapper->ConvertCueToDOMTree(window, this,
   128                                       getter_AddRefs(div));
   129   if (!div) {
   130     return mDocument->CreateDocumentFragment();
   131   }
   132   nsRefPtr<DocumentFragment> docFrag = mDocument->CreateDocumentFragment();
   133   nsCOMPtr<nsIDOMNode> throwAway;
   134   docFrag->AppendChild(div, getter_AddRefs(throwAway));
   136   return docFrag.forget();
   137 }
   139 void
   140 TextTrackCue::SetTrackElement(HTMLTrackElement* aTrackElement)
   141 {
   142   mTrackElement = aTrackElement;
   143 }
   145 JSObject*
   146 TextTrackCue::WrapObject(JSContext* aCx)
   147 {
   148   return VTTCueBinding::Wrap(aCx, this);
   149 }
   151 TextTrackRegion*
   152 TextTrackCue::GetRegion()
   153 {
   154   return mRegion;
   155 }
   157 void
   158 TextTrackCue::SetRegion(TextTrackRegion* aRegion)
   159 {
   160   if (mRegion == aRegion) {
   161     return;
   162   }
   163   mRegion = aRegion;
   164   mReset = true;
   165 }
   167 } // namespace dom
   168 } // namespace mozilla

mercurial