Bug 981691 - perform automatic text track selection step 4. r=rillian
MozReview-Commit-ID: C0xbj7OaaTM
--- 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;
}
}
}