Bug 981691 - perform automatic text track selection step 4. r=rillian draft
authorbechen <bechen@mozilla.com>
Thu, 26 May 2016 15:41:31 +0800
changeset 371209 a958497285c81302d98e03bf7cf3c57eedae21a4
parent 371169 b3a1b567d1730818258a09c0a1d77ce9d74697a1
child 521950 fb7132b8ebaca421bc83cb04012ad15ba7090ea6
push id19282
push userbechen@mozilla.com
push dateThu, 26 May 2016 07:44:14 +0000
reviewersrillian
bugs981691
milestone49.0a1
Bug 981691 - perform automatic text track selection step 4. r=rillian MozReview-Commit-ID: C0xbj7OaaTM
dom/html/TextTrackManager.cpp
--- a/dom/html/TextTrackManager.cpp
+++ b/dom/html/TextTrackManager.cpp
@@ -13,16 +13,17 @@
 #include "mozilla/dom/Event.h"
 #include "mozilla/ClearOnShutdown.h"
 #include "nsComponentManagerUtils.h"
 #include "nsVariant.h"
 #include "nsVideoFrame.h"
 #include "nsIFrame.h"
 #include "nsTArrayHelpers.h"
 #include "nsIWebVTTParserWrapper.h"
+#include "Navigator.h"
 
 namespace mozilla {
 namespace dom {
 
 CompareTextTracks::CompareTextTracks(HTMLMediaElement* aMediaElement)
 {
   mMediaElement = aMediaElement;
 }
@@ -356,16 +357,46 @@ TextTrackManager::PerformTrackSelection(
     if (candidates[i]->Mode() == TextTrackMode::Showing) {
       return;
     }
   }
 
   // Step 4: Honor user preferences for track selection, otherwise, set the
   // first TextTrack in candidates with a default attribute to showing.
   // TODO: Bug 981691 - Honor user preferences for text track selection.
+  // TODO: Commentary?
+  // Compare language.
+  nsTArray<nsString> acceptLanguages;
+  nsTArray<TextTrack*> possibleCandidates;
+  Navigator::GetAcceptLanguages(acceptLanguages);
+  for (uint32_t i = 0; i < acceptLanguages.Length(); i++) {
+    for (uint32_t j = 0; j < candidates.Length(); j++) {
+      if (TrackIsDefault(candidates[j])) {
+        nsString tl;
+        candidates[j]->GetLanguage(tl);
+        // Exactly the same
+        if (tl == acceptLanguages[i]) {
+          candidates[j]->SetMode(TextTrackMode::Showing);
+          return;
+        }
+        // Compare loosely, en-UK en-CA.
+        if (tl.Length() >= 2
+            && acceptLanguages[i].Length() >= 2
+            && tl.CharAt(0) == acceptLanguages[i].CharAt(0)
+            && tl.CharAt(1) == acceptLanguages[i].CharAt(1)) {
+          possibleCandidates.AppendElement(candidates[j]);
+        }
+      }
+    }
+  }
+  if (possibleCandidates.Length() > 0) {
+    possibleCandidates[0]->SetMode(TextTrackMode::Showing);
+    return;
+  }
+
   for (uint32_t i = 0; i < candidates.Length(); i++) {
     if (TrackIsDefault(candidates[i]) &&
         candidates[i]->Mode() == TextTrackMode::Disabled) {
       candidates[i]->SetMode(TextTrackMode::Showing);
       return;
     }
   }
 }