Merge inbound and m-c.

This commit is contained in:
Ryan VanderMeulen 2013-06-15 21:34:21 -04:00
commit d4115d34f7
214 changed files with 2326 additions and 942 deletions

View File

@ -20,8 +20,6 @@ GARBAGE += $(MIDL_GENERATED_FILES)
FORCE_SHARED_LIB = 1
SRCS_IN_OBJDIR = 1
# Please keep this list in sync with the moz.build file until the rest of this
# Makefile is ported over.
MIDL_INTERFACES = \

View File

@ -18,8 +18,6 @@ GARBAGE += $(MIDL_GENERATED_FILES) done_gen dlldata.c
FORCE_SHARED_LIB = 1
SRCS_IN_OBJDIR = 1
CSRCS = \
dlldata.c \
ISimpleDOMNode_p.c \

View File

@ -3612,6 +3612,7 @@ function mimeTypeIsTextBased(aMimeType)
aMimeType.endsWith("+xml") ||
aMimeType == "application/x-javascript" ||
aMimeType == "application/javascript" ||
aMimeType == "application/json" ||
aMimeType == "application/xml" ||
aMimeType == "mozilla.application/cached-xul";
}

View File

@ -22,6 +22,7 @@
this.popup._input = this;
]]>
</constructor>
<method name="openPopup">
<body>
<![CDATA[
@ -37,6 +38,21 @@
]]>
</body>
</method>
<method name="formatValue">
<body>
<![CDATA[
BrowserUI.formatURI();
]]>
</body>
</method>
<method name="trimValue">
<parameter name="aURL"/>
<body><![CDATA[
return BrowserUI.trimURL(aURL);
]]></body>
</method>
</implementation>
<handlers>

View File

@ -97,7 +97,11 @@ var BrowserUI = {
window.addEventListener("MozImprecisePointer", this, true);
Services.prefs.addObserver("browser.cache.disk_cache_ssl", this, false);
Services.prefs.addObserver("browser.urlbar.formatting.enabled", this, false);
Services.prefs.addObserver("browser.urlbar.trimURLs", this, false);
Services.obs.addObserver(this, "metro_viewstate_changed", false);
this._edit.inputField.controllers.insertControllerAt(0, this._copyCutURIController);
// Init core UI modules
ContextUI.init();
@ -239,11 +243,20 @@ var BrowserUI = {
getDisplayURI: function(browser) {
let uri = browser.currentURI;
let spec = uri.spec;
try {
uri = gURIFixup.createExposableURI(uri);
spec = gURIFixup.createExposableURI(uri).spec;
} catch (ex) {}
return uri.spec;
try {
let charset = browser.characterSet;
let textToSubURI = Cc["@mozilla.org/intl/texttosuburi;1"].
getService(Ci.nsITextToSubURI);
spec = textToSubURI.unEscapeNonAsciiURI(charset, spec);
} catch (ex) {}
return spec;
},
/**
@ -560,6 +573,12 @@ var BrowserUI = {
case "browser.cache.disk_cache_ssl":
this._sslDiskCacheEnabled = Services.prefs.getBoolPref(aData);
break;
case "browser.urlbar.formatting.enabled":
this._formattingEnabled = Services.prefs.getBookPref(aData);
break;
case "browser.urlbar.trimURLs":
this._mayTrimURLs = Services.prefs.getBoolPref(aData);
break;
}
break;
case "metro_viewstate_changed":
@ -650,11 +669,120 @@ var BrowserUI = {
Elements.urlbarState.setAttribute("mode", "view");
},
_trimURL: function _trimURL(aURL) {
// This function must not modify the given URL such that calling
// nsIURIFixup::createFixupURI with the result will produce a different URI.
return aURL /* remove single trailing slash for http/https/ftp URLs */
.replace(/^((?:http|https|ftp):\/\/[^/]+)\/$/, "$1")
/* remove http:// unless the host starts with "ftp\d*\." or contains "@" */
.replace(/^http:\/\/((?!ftp\d*\.)[^\/@]+(?:\/|$))/, "$1");
},
trimURL: function trimURL(aURL) {
return this.mayTrimURLs ? this._trimURL(aURL) : aURL;
},
_setURI: function _setURI(aURL) {
this._edit.value = aURL;
this.lastKnownGoodURL = aURL;
},
_getSelectedURIForClipboard: function _getSelectedURIForClipboard() {
// Grab the actual input field's value, not our value, which could include moz-action:
let inputVal = this._edit.inputField.value;
let selectedVal = inputVal.substring(this._edit.selectionStart, this._edit.electionEnd);
// If the selection doesn't start at the beginning or doesn't span the full domain or
// the URL bar is modified, nothing else to do here.
if (this._edit.selectionStart > 0 || this._edit.valueIsTyped)
return selectedVal;
// The selection doesn't span the full domain if it doesn't contain a slash and is
// followed by some character other than a slash.
if (!selectedVal.contains("/")) {
let remainder = inputVal.replace(selectedVal, "");
if (remainder != "" && remainder[0] != "/")
return selectedVal;
}
let uriFixup = Cc["@mozilla.org/docshell/urifixup;1"].getService(Ci.nsIURIFixup);
let uri;
try {
uri = uriFixup.createFixupURI(inputVal, Ci.nsIURIFixup.FIXUP_FLAG_USE_UTF8);
} catch (e) {}
if (!uri)
return selectedVal;
// Only copy exposable URIs
try {
uri = uriFixup.createExposableURI(uri);
} catch (ex) {}
// If the entire URL is selected, just use the actual loaded URI.
if (inputVal == selectedVal) {
// ... but only if isn't a javascript: or data: URI, since those
// are hard to read when encoded
if (!uri.schemeIs("javascript") && !uri.schemeIs("data")) {
// Parentheses are known to confuse third-party applications (bug 458565).
selectedVal = uri.spec.replace(/[()]/g, function (c) escape(c));
}
return selectedVal;
}
// Just the beginning of the URL is selected, check for a trimmed value
let spec = uri.spec;
let trimmedSpec = this.trimURL(spec);
if (spec != trimmedSpec) {
// Prepend the portion that trimURL removed from the beginning.
// This assumes trimURL will only truncate the URL at
// the beginning or end (or both).
let trimmedSegments = spec.split(trimmedSpec);
selectedVal = trimmedSegments[0] + selectedVal;
}
return selectedVal;
},
_copyCutURIController: {
doCommand: function(aCommand) {
let urlbar = BrowserUI._edit;
let val = BrowserUI._getSelectedURIForClipboard();
if (!val)
return;
if (aCommand == "cmd_cut" && this.isCommandEnabled(aCommand)) {
let start = urlbar.selectionStart;
let end = urlbar.selectionEnd;
urlbar.inputField.value = urlbar.inputField.value.substring(0, start) +
urlbar.inputField.value.substring(end);
urlbar.selectionStart = urlbar.selectionEnd = start;
}
Cc["@mozilla.org/widget/clipboardhelper;1"]
.getService(Ci.nsIClipboardHelper)
.copyString(val, document);
},
supportsCommand: function(aCommand) {
switch (aCommand) {
case "cmd_copy":
case "cmd_cut":
return true;
}
return false;
},
isCommandEnabled: function(aCommand) {
let urlbar = BrowserUI._edit;
return this.supportsCommand(aCommand) &&
(aCommand != "cmd_cut" || !urlbar.readOnly) &&
urlbar.selectionStart < urlbar.selectionEnd;
},
onEvent: function(aEventName) {}
},
_urlbarClicked: function _urlbarClicked() {
// If the urlbar is not already focused, focus it and select the contents.
if (Elements.urlbarState.getAttribute("mode") != "edit")
@ -662,6 +790,7 @@ var BrowserUI = {
},
_editURI: function _editURI(aShouldDismiss) {
this._clearURIFormatting();
this._edit.focus();
this._edit.select();
@ -671,11 +800,77 @@ var BrowserUI = {
ContextUI.dismissTabs();
},
formatURI: function formatURI() {
if (!this.formattingEnabled ||
Elements.urlbarState.getAttribute("mode") == "edit")
return;
let controller = this._edit.editor.selectionController;
let selection = controller.getSelection(controller.SELECTION_URLSECONDARY);
selection.removeAllRanges();
let textNode = this._edit.editor.rootElement.firstChild;
let value = textNode.textContent;
let protocol = value.match(/^[a-z\d.+\-]+:(?=[^\d])/);
if (protocol &&
["http:", "https:", "ftp:"].indexOf(protocol[0]) == -1)
return;
let matchedURL = value.match(/^((?:[a-z]+:\/\/)?(?:[^\/]+@)?)(.+?)(?::\d+)?(?:\/|$)/);
if (!matchedURL)
return;
let [, preDomain, domain] = matchedURL;
let baseDomain = domain;
let subDomain = "";
// getBaseDomainFromHost doesn't recognize IPv6 literals in brackets as IPs (bug 667159)
if (domain[0] != "[") {
try {
baseDomain = Services.eTLD.getBaseDomainFromHost(domain);
if (!domain.endsWith(baseDomain)) {
// getBaseDomainFromHost converts its resultant to ACE.
let IDNService = Cc["@mozilla.org/network/idn-service;1"]
.getService(Ci.nsIIDNService);
baseDomain = IDNService.convertACEtoUTF8(baseDomain);
}
} catch (e) {}
}
if (baseDomain != domain) {
subDomain = domain.slice(0, -baseDomain.length);
}
let rangeLength = preDomain.length + subDomain.length;
if (rangeLength) {
let range = document.createRange();
range.setStart(textNode, 0);
range.setEnd(textNode, rangeLength);
selection.addRange(range);
}
let startRest = preDomain.length + domain.length;
if (startRest < value.length) {
let range = document.createRange();
range.setStart(textNode, startRest);
range.setEnd(textNode, value.length);
selection.addRange(range);
}
},
_clearURIFormatting: function _clearURIFormatting() {
if (!this.formattingEnabled)
return;
let controller = this._edit.editor.selectionController;
let selection = controller.getSelection(controller.SELECTION_URLSECONDARY);
selection.removeAllRanges();
},
_urlbarBlurred: function _urlbarBlurred() {
let state = Elements.urlbarState;
if (state.getAttribute("mode") == "edit")
state.removeAttribute("mode");
this._updateToolbar();
this.formatURI();
},
_closeOrQuit: function _closeOrQuit() {
@ -959,6 +1154,24 @@ var BrowserUI = {
return this._sslDiskCacheEnabled;
},
_formattingEnabled: null,
get formattingEnabled() {
if (this._formattingEnabled === null) {
this._formattingEnabled = Services.prefs.getBoolPref("browser.urlbar.formatting.enabled");
}
return this._formattingEnabled;
},
_mayTrimURLs: null,
get mayTrimURLs() {
if (this._mayTrimURLs === null) {
this._mayTrimURLs = Services.prefs.getBoolPref("browser.urlbar.trimURLs");
}
return this._mayTrimURLs;
},
supportsCommand : function(cmd) {
var isSupported = false;
switch (cmd) {

View File

@ -261,6 +261,8 @@ pref("places.favicons.optimizeToDimension", 25);
// various and sundry awesomebar prefs (should remove/re-evaluate
// these once bug 447900 is fixed)
pref("browser.urlbar.trimURLs", true);
pref("browser.urlbar.formatting.enabled", true);
pref("browser.urlbar.clickSelectsAll", true);
pref("browser.urlbar.doubleClickSelectsAll", true);
pref("browser.urlbar.autoFill", false);

View File

@ -308,6 +308,12 @@ documenttab[selected] .documenttab-selection {
padding: 0 !important;
}
#urlbar-edit > hbox > .textbox-input-box > .textbox-input:invalid {
/* Hide error glow around the address bar that shows by default
* when URLs are made invalid by trmming. */
box-shadow: none !important;
}
/* Combined stop-reload button */
#tool-reload {
list-style-image: url("chrome://browser/skin/images/reload.png");

View File

@ -47,15 +47,15 @@
border-radius: 5px;
position: absolute;
background: #0095dd;
left:0px;
top:0px;
left: 0;
top: 0;
}
@keyframes orbit {
0% {
opacity: 1;
z-index:99;
z-index: 99;
transform: rotate(180deg);
animation-timing-function: ease-out;
}
@ -64,39 +64,34 @@
opacity: 1;
transform: rotate(300deg);
animation-timing-function: linear;
origin:0%;
}
30% {
opacity: 1;
transform:rotate(410deg);
transform: rotate(410deg);
animation-timing-function: ease-in-out;
origin:7%;
}
39% {
opacity: 1;
transform: rotate(645deg);
animation-timing-function: linear;
origin:30%;
}
70% {
opacity: 1;
transform: rotate(770deg);
animation-timing-function: ease-out;
origin:39%;
}
75% {
opacity: 1;
transform: rotate(900deg);
animation-timing-function: ease-out;
origin:70%;
}
76%, 100% {
opacity: 0;
transform:rotate(900deg);
transform: rotate(900deg);
}
}

View File

@ -120,7 +120,7 @@ function prompt(aWindowID, aCallID, aAudioRequested, aVideoRequested, aDevices)
}
let contentWindow = Services.wm.getOuterWindowWithId(aWindowID);
let host = contentWindow.document.documentURIObject.asciiHost;
let host = contentWindow.document.documentURIObject.host;
let browser = getBrowserForWindow(contentWindow);
let chromeDoc = browser.ownerDocument;
let chromeWin = chromeDoc.defaultView;

View File

@ -17,18 +17,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=777467
SpecialPowers.addPermission("browser", true, document);
SpecialPowers.addPermission("embed-apps", true, document);
var previousPrefs = {
mozBrowserFramesEnabled: undefined,
oop_by_default: undefined,
};
try {
previousPrefs.mozBrowserFramesEnabled = SpecialPowers.getBoolPref('dom.mozBrowserFramesEnabled');
} catch(e) {}
try {
previousPrefs.oop_by_default = SpecialPowers.getBoolPref('dom.ipc.browser_frames.oop_by_default');
} catch(e) {}
SpecialPowers.setBoolPref('dom.mozBrowserFramesEnabled', true);
SpecialPowers.setBoolPref("dom.ipc.browser_frames.oop_by_default", false);
</script>
@ -66,13 +54,8 @@ addLoadEvent(function() {
}
// Cleanup.
if (previousPrefs.mozBrowserFramesEnabled !== undefined) {
SpecialPowers.setBoolPref('dom.mozBrowserFramesEnabled', previousPrefs.mozBrowserFramesEnabled);
}
if (previousPrefs.oop_by_default !== undefined) {
SpecialPowers.setBoolPref("dom.ipc.browser_frames.oop_by_default", previousPrefs.oop_by_default);
}
SpecialPowers.clearUserPref('dom.mozBrowserFramesEnabled');
SpecialPowers.clearUserPref('dom.ipc.browser_frames.oop_by_default');
SpecialPowers.removePermission("browser", window.document);
SpecialPowers.removePermission("embed-apps", window.document);

View File

@ -44,19 +44,6 @@ using namespace mozilla;
using namespace mozilla::dom;
using namespace mozilla::dom::ipc;
static bool
IsChromeProcess()
{
nsCOMPtr<nsIXULRuntime> rt = do_GetService("@mozilla.org/xre/runtime;1");
if (!rt)
return true;
uint32_t type;
rt->GetProcessType(&type);
return type == nsIXULRuntime::PROCESS_TYPE_DEFAULT;
}
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsFrameMessageManager)
uint32_t count = tmp->mListeners.Length();
for (uint32_t i = 0; i < count; i++) {
@ -836,7 +823,8 @@ nsFrameMessageManager::Disconnect(bool aRemoveFromParent)
nsresult
NS_NewGlobalMessageManager(nsIMessageBroadcaster** aResult)
{
NS_ENSURE_TRUE(IsChromeProcess(), NS_ERROR_NOT_AVAILABLE);
NS_ENSURE_TRUE(XRE_GetProcessType() == GeckoProcessType_Default,
NS_ERROR_NOT_AVAILABLE);
nsFrameMessageManager* mm = new nsFrameMessageManager(nullptr,
nullptr,
nullptr,
@ -1387,7 +1375,8 @@ NS_NewParentProcessMessageManager(nsIMessageBroadcaster** aResult)
{
NS_ASSERTION(!nsFrameMessageManager::sParentProcessManager,
"Re-creating sParentProcessManager");
NS_ENSURE_TRUE(IsChromeProcess(), NS_ERROR_NOT_AVAILABLE);
NS_ENSURE_TRUE(XRE_GetProcessType() == GeckoProcessType_Default,
NS_ERROR_NOT_AVAILABLE);
nsRefPtr<nsFrameMessageManager> mm = new nsFrameMessageManager(nullptr,
nullptr,
nullptr,
@ -1432,7 +1421,7 @@ NS_NewChildProcessMessageManager(nsISyncMessageSender** aResult)
"Re-creating sChildProcessManager");
MessageManagerCallback* cb;
if (IsChromeProcess()) {
if (XRE_GetProcessType() == GeckoProcessType_Default) {
cb = new SameChildProcessMessageManagerCallback();
} else {
cb = new ChildProcessMessageManagerCallback();

View File

@ -32,9 +32,9 @@ function testHTMLDocuments(ids, isXHTML) {
is(docType1.ownerDocument, doc1, "docType should have ownerDocument!");
ok(!doc1.documentElement, "Document shouldn't have document element!");
is(doc1.body, null, "Shouldn't have .body!");
ok(doc1 instanceof SpecialPowers.Ci.nsIDOMHTMLDocument,
ok(doc1 instanceof HTMLDocument,
"Document should be an HTML document!");
ok(!(doc1 instanceof SpecialPowers.Ci.nsIDOMSVGDocument),
ok(!(doc1 instanceof SVGDocument),
"Document shouldn't be an SVG document!");
var docType2 =
@ -68,9 +68,9 @@ function testSVGDocument() {
var doc1 = document.implementation.createDocument(null, null, docType1);
is(docType1.ownerDocument, doc1, "docType should have ownerDocument!");
ok(!doc1.documentElement, "Document shouldn't have document element!");
ok(!(doc1 instanceof SpecialPowers.Ci.nsIDOMHTMLDocument),
ok(!(doc1 instanceof HTMLDocument),
"Document shouldn't be an HTML document!");
ok(doc1 instanceof SpecialPowers.Ci.nsIDOMSVGDocument,
ok(doc1 instanceof SVGDocument,
"Document should be an SVG document!");
// SVG documents have .rootElement.
@ -95,9 +95,9 @@ function testFooBarDocument() {
var doc1 = document.implementation.createDocument(null, null, docType1);
is(docType1.ownerDocument, doc1, "docType should have ownerDocument!");
ok(!doc1.documentElement, "Document shouldn't have document element!");
ok(!(doc1 instanceof SpecialPowers.Ci.nsIDOMHTMLDocument),
ok(!(doc1 instanceof HTMLDocument),
"Document shouldn't be an HTML document!");
ok(!(doc1 instanceof SpecialPowers.Ci.nsIDOMSVGDocument),
ok(!(doc1 instanceof SVGDocument),
"Document shouldn't be an SVG document!");
var docType2 =
@ -112,9 +112,9 @@ function testFooBarDocument() {
function testNullDocTypeDocument() {
var doc1 = document.implementation.createDocument(null, null, null);
ok(!doc1.documentElement, "Document shouldn't have document element!");
ok(!(doc1 instanceof SpecialPowers.Ci.nsIDOMHTMLDocument),
ok(!(doc1 instanceof HTMLDocument),
"Document shouldn't be an HTML document!");
ok(!(doc1 instanceof SpecialPowers.Ci.nsIDOMSVGDocument),
ok(!(doc1 instanceof SVGDocument),
"Document shouldn't be an SVG document!");
var doc2 = document.implementation.createDocument("FooBarNS",

View File

@ -777,8 +777,6 @@ function test22()
waitTest22 = true;
const pref_open = "network.websocket.timeout.open";
var oldpref_open_value = 20;
oldpref_open_value = SpecialPowers.getIntPref(pref_open);
SpecialPowers.setIntPref(pref_open, 5);
var ws = CreateTestWS("ws://sub2.test2.example.org/tests/content/base/test/file_websocket", "test-22");
@ -791,7 +789,7 @@ function test22()
maybeFinished();
};
SpecialPowers.setIntPref(pref_open, oldpref_open_value);
SpecialPowers.clearUserPref(pref_open);
doTest(23);
}

View File

@ -7,7 +7,6 @@
#include "mozilla/dom/HTMLIFrameElement.h"
#include "mozilla/dom/HTMLIFrameElementBinding.h"
#include "nsIDOMSVGDocument.h"
#include "nsMappedAttributes.h"
#include "nsAttrValueInlines.h"
#include "nsError.h"

View File

@ -28,7 +28,7 @@ HTMLLabelElement::WrapNode(JSContext *aCx, JS::Handle<JSObject*> aScope)
return HTMLLabelElementBinding::Wrap(aCx, aScope, this);
}
// nsISupports
// nsISupports
NS_IMPL_ADDREF_INHERITED(HTMLLabelElement, Element)
@ -171,27 +171,26 @@ HTMLLabelElement::PostHandleEvent(nsEventChainPostVisitor& aVisitor)
dragDistance.y > CLICK_DISTANCE ||
dragDistance.y < -CLICK_DISTANCE;
}
// Don't click the for-content if we did drag-select text or if we
// have a kbd modifier (which adjusts a selection), or if it's a
// double click (we already forwarded the first click event).
if (dragSelect || event->clickCount > 1 ||
event->IsShift() || event->IsControl() || event->IsAlt() ||
event->IsMeta()) {
// have a kbd modifier (which adjusts a selection).
if (dragSelect || event->IsShift() || event->IsControl() ||
event->IsAlt() || event->IsMeta()) {
break;
}
nsIFocusManager* fm = nsFocusManager::GetFocusManager();
if (fm) {
// Use FLAG_BYMOVEFOCUS here so that the label is scrolled to.
// Also, within HTMLInputElement::PostHandleEvent, inputs will
// be selected only when focused via a key or when the navigation
// flag is used and we want to select the text on label clicks as
// well.
nsCOMPtr<nsIDOMElement> elem = do_QueryInterface(content);
fm->SetFocus(elem, nsIFocusManager::FLAG_BYMOVEFOCUS);
// Only set focus on the first click of multiple clicks to prevent
// to prevent immediate de-focus.
if (event->clickCount <= 1) {
nsIFocusManager* fm = nsFocusManager::GetFocusManager();
if (fm) {
// Use FLAG_BYMOVEFOCUS here so that the label is scrolled to.
// Also, within HTMLInputElement::PostHandleEvent, inputs will
// be selected only when focused via a key or when the navigation
// flag is used and we want to select the text on label clicks as
// well.
nsCOMPtr<nsIDOMElement> elem = do_QueryInterface(content);
fm->SetFocus(elem, nsIFocusManager::FLAG_BYMOVEFOCUS);
}
}
// Dispatch a new click event to |content|
// (For compatibility with IE, we do only left click. If
// we wanted to interpret the HTML spec very narrowly, we

View File

@ -13,7 +13,6 @@
#include "nsIPluginDocument.h"
#include "nsIDOMDocument.h"
#include "nsThreadUtils.h"
#include "nsIDOMSVGDocument.h"
#include "nsIScriptError.h"
#include "nsIWidget.h"
#include "nsContentUtils.h"

View File

@ -19,6 +19,7 @@ namespace mozilla {
* for regular audio contexts, and the rate requested by the web content
* for offline audio contexts.
* Each chunk in the track is a single block of WEBAUDIO_BLOCK_SIZE samples.
* Note: This must be a different value than MEDIA_STREAM_DEST_TRACK_ID
*/
static const int AUDIO_NODE_STREAM_TRACK_ID = 1;
@ -235,23 +236,6 @@ AudioNodeStream::SetChannelMixingParametersImpl(uint32_t aNumberOfChannels,
mChannelInterpretation = aChannelInterpretation;
}
StreamBuffer::Track*
AudioNodeStream::EnsureTrack()
{
StreamBuffer::Track* track = mBuffer.FindTrack(AUDIO_NODE_STREAM_TRACK_ID);
if (!track) {
nsAutoPtr<MediaSegment> segment(new AudioSegment());
for (uint32_t j = 0; j < mListeners.Length(); ++j) {
MediaStreamListener* l = mListeners[j];
l->NotifyQueuedTrackChanges(Graph(), AUDIO_NODE_STREAM_TRACK_ID, mSampleRate, 0,
MediaStreamListener::TRACK_EVENT_CREATED,
*segment);
}
track = &mBuffer.AddTrack(AUDIO_NODE_STREAM_TRACK_ID, mSampleRate, 0, segment.forget());
}
return track;
}
bool
AudioNodeStream::AllInputsFinished() const
{
@ -399,7 +383,7 @@ AudioNodeStream::ProduceOutput(GraphTime aFrom, GraphTime aTo)
FinishOutput();
}
StreamBuffer::Track* track = EnsureTrack();
StreamBuffer::Track* track = EnsureTrack(AUDIO_NODE_STREAM_TRACK_ID, mSampleRate);
AudioSegment* segment = track->Get<AudioSegment>();
@ -460,7 +444,7 @@ AudioNodeStream::ProduceOutput(GraphTime aFrom, GraphTime aTo)
TrackTicks
AudioNodeStream::GetCurrentPosition()
{
return EnsureTrack()->Get<AudioSegment>()->GetDuration();
return EnsureTrack(AUDIO_NODE_STREAM_TRACK_ID, mSampleRate)->Get<AudioSegment>()->GetDuration();
}
void
@ -470,7 +454,7 @@ AudioNodeStream::FinishOutput()
return;
}
StreamBuffer::Track* track = EnsureTrack();
StreamBuffer::Track* track = EnsureTrack(AUDIO_NODE_STREAM_TRACK_ID, mSampleRate);
track->SetEnded();
FinishOnGraphThread();

View File

@ -116,7 +116,6 @@ public:
protected:
void FinishOutput();
StreamBuffer::Track* EnsureTrack();
void ObtainInputBlock(AudioChunk& aTmpChunk, uint32_t aPortIndex);
// The engine that will generate output for this node.

View File

@ -8,6 +8,7 @@
#include "nsContentUtils.h"
#include "mozilla/dom/MediaStreamBinding.h"
#include "mozilla/dom/LocalMediaStreamBinding.h"
#include "mozilla/dom/AudioNode.h"
#include "MediaStreamGraph.h"
#include "AudioStreamTrack.h"
#include "VideoStreamTrack.h"
@ -39,6 +40,15 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(DOMMediaStream)
NS_IMPL_ISUPPORTS_INHERITED1(DOMLocalMediaStream, DOMMediaStream,
nsIDOMLocalMediaStream)
NS_IMPL_CYCLE_COLLECTION_INHERITED_1(DOMAudioNodeMediaStream, DOMMediaStream,
mStreamNode)
NS_IMPL_ADDREF_INHERITED(DOMAudioNodeMediaStream, DOMMediaStream)
NS_IMPL_RELEASE_INHERITED(DOMAudioNodeMediaStream, DOMMediaStream)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DOMAudioNodeMediaStream)
NS_INTERFACE_MAP_END_INHERITING(DOMMediaStream)
class DOMMediaStream::StreamListener : public MediaStreamListener {
public:
StreamListener(DOMMediaStream* aStream)
@ -346,3 +356,18 @@ DOMLocalMediaStream::CreateTrackUnionStream(nsIDOMWindow* aWindow,
stream->InitTrackUnionStream(aWindow, aHintContents);
return stream.forget();
}
DOMAudioNodeMediaStream::DOMAudioNodeMediaStream(AudioNode* aNode)
: mStreamNode(aNode)
{
}
already_AddRefed<DOMAudioNodeMediaStream>
DOMAudioNodeMediaStream::CreateTrackUnionStream(nsIDOMWindow* aWindow,
AudioNode* aNode,
TrackTypeHints aHintContents)
{
nsRefPtr<DOMAudioNodeMediaStream> stream = new DOMAudioNodeMediaStream(aNode);
stream->InitTrackUnionStream(aWindow, aHintContents);
return stream.forget();
}

View File

@ -33,6 +33,7 @@ namespace mozilla {
class MediaStream;
namespace dom {
class AudioNode;
class MediaStreamTrack;
class AudioStreamTrack;
class VideoStreamTrack;
@ -206,6 +207,29 @@ public:
CreateTrackUnionStream(nsIDOMWindow* aWindow, TrackTypeHints aHintContents = 0);
};
class DOMAudioNodeMediaStream : public DOMMediaStream
{
typedef dom::AudioNode AudioNode;
public:
DOMAudioNodeMediaStream(AudioNode* aNode);
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(DOMAudioNodeMediaStream, DOMMediaStream)
/**
* Create a DOMAudioNodeMediaStream whose underlying stream is a TrackUnionStream.
*/
static already_AddRefed<DOMAudioNodeMediaStream>
CreateTrackUnionStream(nsIDOMWindow* aWindow,
AudioNode* aNode,
TrackTypeHints aHintContents = 0);
private:
// If this object wraps a stream owned by an AudioNode, we need to ensure that
// the node isn't cycle-collected too early.
nsRefPtr<AudioNode> mStreamNode;
};
}
#endif /* NSDOMMEDIASTREAM_H_ */

View File

@ -1525,6 +1525,23 @@ MediaStream::FinishOnGraphThread()
GraphImpl()->FinishStream(this);
}
StreamBuffer::Track*
MediaStream::EnsureTrack(TrackID aTrackId, TrackRate aSampleRate)
{
StreamBuffer::Track* track = mBuffer.FindTrack(aTrackId);
if (!track) {
nsAutoPtr<MediaSegment> segment(new AudioSegment());
for (uint32_t j = 0; j < mListeners.Length(); ++j) {
MediaStreamListener* l = mListeners[j];
l->NotifyQueuedTrackChanges(Graph(), aTrackId, aSampleRate, 0,
MediaStreamListener::TRACK_EVENT_CREATED,
*segment);
}
track = &mBuffer.AddTrack(aTrackId, aSampleRate, 0, segment.forget());
}
return track;
}
void
MediaStream::RemoveAllListenersImpl()
{

View File

@ -277,9 +277,11 @@ public:
, mMainThreadDestroyed(false)
, mGraph(nullptr)
{
MOZ_COUNT_CTOR(MediaStream);
}
virtual ~MediaStream()
{
MOZ_COUNT_DTOR(MediaStream);
NS_ASSERTION(mMainThreadDestroyed, "Should have been destroyed already");
NS_ASSERTION(mMainThreadListeners.IsEmpty(),
"All main thread listeners should have been removed");
@ -431,6 +433,8 @@ public:
bool HasCurrentData() { return mHasCurrentData; }
StreamBuffer::Track* EnsureTrack(TrackID aTrack, TrackRate aSampleRate);
void ApplyTrackDisabling(TrackID aTrackID, MediaSegment* aSegment);
DOMMediaStream* GetWrapper()

View File

@ -26,6 +26,7 @@ class TrackUnionStream : public ProcessedMediaStream {
public:
TrackUnionStream(DOMMediaStream* aWrapper) :
ProcessedMediaStream(aWrapper),
mFilterCallback(nullptr),
mMaxTrackID(0) {}
virtual void RemoveInput(MediaInputPort* aPort)
@ -75,7 +76,7 @@ public:
break;
}
}
if (!found) {
if (!found && (!mFilterCallback || mFilterCallback(tracks.get()))) {
bool trackFinished = false;
uint32_t mapIndex = AddTrack(mInputs[i], tracks.get(), aFrom);
CopyTrackData(tracks.get(), mapIndex, aFrom, aTo, &trackFinished);
@ -107,7 +108,16 @@ public:
}
}
// Consumers may specify a filtering callback to apply to every input track.
// Returns true to allow the track to act as an input; false to reject it entirely.
typedef bool (*TrackIDFilterCallback)(StreamBuffer::Track*);
void SetTrackIDFilter(TrackIDFilterCallback aCallback) {
mFilterCallback = aCallback;
}
protected:
TrackIDFilterCallback mFilterCallback;
// Only non-ended tracks are allowed to persist in this map.
struct TrackMapEntry {
MediaInputPort* mInputPort;

View File

@ -71,6 +71,7 @@ EXPORTS += [
'SharedBuffer.h',
'StreamBuffer.h',
'TimeVarying.h',
'TrackUnionStream.h',
'VideoFrameContainer.h',
'VideoSegment.h',
'VideoUtils.h',

View File

@ -17,6 +17,8 @@
#include "MPAPI.h"
#define MAX_DROPPED_FRAMES 25
// Try not to spend more than this much time in a single call to DecodeVideoFrame.
#define MAX_VIDEO_DECODE_SECONDS 3.0
using namespace android;
@ -156,8 +158,10 @@ bool MediaOmxReader::DecodeVideoFrame(bool &aKeyframeSkip,
aTimeThreshold = mVideoSeekTimeUs;
}
// Read next frame
while (true) {
TimeStamp start = TimeStamp::Now();
// Read next frame. Don't let this loop run for too long.
while ((TimeStamp::Now() - start) < TimeDuration::FromSeconds(MAX_VIDEO_DECODE_SECONDS)) {
MPAPI::VideoFrame frame;
frame.mGraphicBuffer = nullptr;
frame.mShouldSkip = false;
@ -165,22 +169,23 @@ bool MediaOmxReader::DecodeVideoFrame(bool &aKeyframeSkip,
mVideoQueue.Finish();
return false;
}
doSeek = false;
// Ignore empty buffer which stagefright media read will sporadically return
if (frame.mSize == 0 && !frame.mGraphicBuffer) {
return true;
continue;
}
parsed++;
if (frame.mShouldSkip && mSkipCount < MAX_DROPPED_FRAMES) {
mSkipCount++;
return true;
continue;
}
mSkipCount = 0;
mVideoSeekTimeUs = -1;
doSeek = aKeyframeSkip = false;
aKeyframeSkip = false;
nsIntRect picture = mPicture;
if (frame.Y.mWidth != mInitialFrame.width ||

View File

@ -117,7 +117,6 @@ MOCHITEST_FILES = \
test_too_many_elements.html \
test_volume.html \
test_video_to_canvas.html \
use_large_cache.js \
test_audiowrite.html \
test_mozHasAudio.html \
test_source_media.html \

View File

@ -8,7 +8,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=462957
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script type="text/javascript" src="manifest.js"></script>
<script type="application/javascript" src="use_large_cache.js"></script>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=462957">Mozilla Bug 462957</a>
@ -85,8 +84,11 @@ function startTest(test, token) {
document.body.appendChild(v);
}
manager.runTests(gSeekTests, startTest);
SimpleTest.waitForExplicitFinish();
SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]}, beginTest);
function beginTest() {
manager.runTests(gSeekTests, startTest);
}
</script>
</pre>
</body>

View File

@ -8,7 +8,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=493187
<title>Bug 493187 - enter HAVE_FUTURE_DATA when seeking within buffered data even if new data isn't arriving</title>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
<script type="text/javascript" src="use_large_cache.js"></script>
<script type="text/javascript" src="manifest.js"></script>
</head>
<body>
@ -62,8 +61,11 @@ function startTest(test, token) {
document.body.appendChild(v);
}
manager.runTests(gSeekTests, startTest);
SimpleTest.waitForExplicitFinish();
SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]}, beginTest);
function beginTest() {
manager.runTests(gSeekTests, startTest);
}
</script>
</pre>
</body>

View File

@ -33,24 +33,17 @@ function IsWindows7() {
}
function getMediaPref(name) {
// Can't use SpecialPowers.getBoolPref because it throws when pref isn't
// present, and for example on non-Windows systems the WMF prefs won't be
// present.
var pref = false;
var prefService = SpecialPowers.wrap(SpecialPowers.Components)
.classes["@mozilla.org/preferences-service;1"]
.getService(SpecialPowers.Ci.nsIPrefService);
var branch = prefService.getBranch("media.");
try {
pref = branch.getBoolPref(name);
pref = SpecialPowers.getBoolPref(name);
} catch(ex) { }
return pref;
}
var haveMp4 = (getMediaPref("windows-media-foundation.enabled") && IsWindowsVistaOrLater()) ||
getMediaPref("omx.enabled") ||
getMediaPref("gstreamer.enabled");
// TODO: Add "getMediaPref("plugins.enabled")" once MP4 works on Gingerbread.
var haveMp4 = (getMediaPref("media.windows-media-foundation.enabled") && IsWindowsVistaOrLater()) ||
getMediaPref("media.omx.enabled") ||
getMediaPref("media.gstreamer.enabled");
// TODO: Add "getMediaPref("media.plugins.enabled")" once MP4 works on Gingerbread.
check_mp4(document.getElementById('v'), haveMp4);

View File

@ -1,4 +1,4 @@
<!DOCTYPE HTML>
hg diff<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=479863
@ -32,17 +32,20 @@ window.onload = function() {
we've got the first frame.
*/
var resource = getPlayableVideo(gSeekTests);
if (resource != null) {
for (var i=0; i<20; ++i) {
var v = document.createElement("video");
v.src = resource.name;
document.body.appendChild(v);
SimpleTest.waitForExplicitFinish();
SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]}, beginTest);
function beginTest() {
if (resource != null) {
for (var i=0; i<20; ++i) {
var v = document.createElement("video");
v.src = resource.name;
document.body.appendChild(v);
}
} else {
todo(false, "No types supported");
}
SimpleTest.waitForExplicitFinish();
} else {
todo(false, "No types supported");
}
</script>

View File

@ -4,7 +4,6 @@
<title>Media test: unknown/invalid formats raise decode error</title>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
<script type="text/javascript" src="use_large_cache.js"></script>
<script type="text/javascript" src="manifest.js"></script>
</head>
<body>
@ -44,8 +43,11 @@ function startTest(test, token) {
v.src = test.name; // implicitly starts a load.
}
manager.runTests(gDecodeErrorTests, startTest);
SimpleTest.waitForExplicitFinish();
SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]}, beginTest);
function beginTest() {
manager.runTests(gDecodeErrorTests, startTest);
}
</script>
</pre>
</body>

View File

@ -8,7 +8,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=548523
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script type="text/javascript" src="manifest.js"></script>
<script type="text/javascript" src="use_large_cache.js"></script>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=548523">Mozilla Bug 548523</a>
@ -568,8 +567,11 @@ function startTest(test, token) {
}
var twiceTests = tests.concat(tests);
manager.runTests(twiceTests, startTest);
SimpleTest.waitForExplicitFinish();
SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]}, beginTest);
function beginTest() {
manager.runTests(twiceTests, startTest);
}
</script>
</pre>
</body>

View File

@ -7,7 +7,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=479863
<title>Test for Bug 479863</title>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script type="application/javascript" src="use_large_cache.js"></script>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=479863">Mozilla Bug 479863</a>
@ -70,17 +69,21 @@ function suspended(event) {
}
var key = Math.random();
for (var i = 1; i <= 6; ++i) {
var id = "v" + i;
var v = document.getElementById(id);
suspendCount[id] = 0;
v.addEventListener("suspend", suspended, false);
// Treat "load" as "suspend" for now, it means the same thing: we
// stopped the download.
v.addEventListener("load", suspended, false);
v.src = "seek.ogv?key=" + key + "&id=" + id;
}
SimpleTest.waitForExplicitFinish();
SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]}, beginTest);
function beginTest() {
for (var i = 1; i <= 6; ++i) {
var id = "v" + i;
var v = document.getElementById(id);
suspendCount[id] = 0;
v.addEventListener("suspend", suspended, false);
// Treat "load" as "suspend" for now, it means the same thing: we
// stopped the download.
v.addEventListener("load", suspended, false);
v.src = "seek.ogv?key=" + key + "&id=" + id;
}
}
</script>
</pre>
</body>

View File

@ -8,7 +8,6 @@
</head>
<body>
<pre id="test">
<script src="use_large_cache.js"></script>
<script class="testbody" type="text/javascript">
var manager = new MediaTestManager;
@ -40,8 +39,11 @@ function startTest(test, token) {
document.body.appendChild(v);
}
manager.runTests(gProgressTests, startTest);
SimpleTest.waitForExplicitFinish();
SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]}, beginTest);
function beginTest() {
manager.runTests(gProgressTests, startTest);
}
</script>
</pre>
</body>

View File

@ -9,7 +9,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=486646
<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
<script type="text/javascript" src="use_large_cache.js"></script>
<script type="text/javascript" src="manifest.js"></script>
</head>
<body>
@ -56,8 +55,11 @@ function startTest(test, token) {
document.body.appendChild(v);
}
manager.runTests(gSmallTests, startTest);
SimpleTest.waitForExplicitFinish();
SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]}, beginTest);
function beginTest() {
manager.runTests(gSmallTests, startTest);
}
</script>
</pre>

View File

@ -1,14 +0,0 @@
(function() {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
// Set cache size to something large
var prefService = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService);
var branch = prefService.getBranch("media.");
var oldSize = branch.getIntPref("cache_size");
branch.setIntPref("cache_size", 40000);
window.addEventListener("unload", function() {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
branch.setIntPref("cache_size", oldSize);
}, false);
})();

View File

@ -24,6 +24,7 @@
#include "ScriptProcessorNode.h"
#include "ChannelMergerNode.h"
#include "ChannelSplitterNode.h"
#include "MediaStreamAudioDestinationNode.h"
#include "WaveShaperNode.h"
#include "WaveTable.h"
#include "ConvolverNode.h"
@ -204,6 +205,14 @@ bool IsValidBufferSize(uint32_t aBufferSize) {
}
already_AddRefed<MediaStreamAudioDestinationNode>
AudioContext::CreateMediaStreamDestination()
{
nsRefPtr<MediaStreamAudioDestinationNode> node =
new MediaStreamAudioDestinationNode(this);
return node.forget();
}
already_AddRefed<ScriptProcessorNode>
AudioContext::CreateScriptProcessor(uint32_t aBufferSize,
uint32_t aNumberOfInputChannels,

View File

@ -51,6 +51,7 @@ class DelayNode;
class DynamicsCompressorNode;
class GainNode;
class GlobalObject;
class MediaStreamAudioDestinationNode;
class OfflineRenderSuccessCallback;
class PannerNode;
class ScriptProcessorNode;
@ -125,6 +126,9 @@ public:
CreateBuffer(JSContext* aJSContext, ArrayBuffer& aBuffer,
bool aMixToMono, ErrorResult& aRv);
already_AddRefed<MediaStreamAudioDestinationNode>
CreateMediaStreamDestination();
already_AddRefed<ScriptProcessorNode>
CreateScriptProcessor(uint32_t aBufferSize,
uint32_t aNumberOfInputChannels,

View File

@ -0,0 +1,95 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "MediaStreamAudioDestinationNode.h"
#include "mozilla/dom/AudioStreamTrack.h"
#include "mozilla/dom/MediaStreamAudioDestinationNodeBinding.h"
#include "AudioNodeEngine.h"
#include "AudioNodeStream.h"
#include "DOMMediaStream.h"
#include "TrackUnionStream.h"
namespace mozilla {
namespace dom {
NS_IMPL_CYCLE_COLLECTION_INHERITED_1(MediaStreamAudioDestinationNode, AudioNode, mDOMStream)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaStreamAudioDestinationNode)
NS_INTERFACE_MAP_END_INHERITING(AudioNode)
NS_IMPL_ADDREF_INHERITED(MediaStreamAudioDestinationNode, AudioNode)
NS_IMPL_RELEASE_INHERITED(MediaStreamAudioDestinationNode, AudioNode)
// This must be a different value than AUDIO_NODE_STREAM_TRACK_ID
static const int MEDIA_STREAM_DEST_TRACK_ID = 2;
class MediaStreamDestinationEngine : public AudioNodeEngine {
public:
MediaStreamDestinationEngine(AudioNode* aNode, ProcessedMediaStream* aOutputStream)
: AudioNodeEngine(aNode)
, mOutputStream(aOutputStream)
{
MOZ_ASSERT(mOutputStream);
}
virtual void ProduceAudioBlock(AudioNodeStream* aStream,
const AudioChunk& aInput,
AudioChunk* aOutput,
bool* aFinished) MOZ_OVERRIDE
{
*aOutput = aInput;
StreamBuffer::Track* track = mOutputStream->EnsureTrack(MEDIA_STREAM_DEST_TRACK_ID,
aStream->SampleRate());
AudioSegment* segment = track->Get<AudioSegment>();
segment->AppendAndConsumeChunk(aOutput);
}
private:
ProcessedMediaStream* mOutputStream;
};
// This callback is used to ensure that only the audio data for this track is audible
static bool FilterAudioNodeStreamTrack(StreamBuffer::Track* aTrack)
{
return aTrack->GetID() == MEDIA_STREAM_DEST_TRACK_ID;
}
MediaStreamAudioDestinationNode::MediaStreamAudioDestinationNode(AudioContext* aContext)
: AudioNode(aContext,
2,
ChannelCountMode::Explicit,
ChannelInterpretation::Speakers)
, mDOMStream(DOMAudioNodeMediaStream::CreateTrackUnionStream(GetOwner(),
this,
DOMMediaStream::HINT_CONTENTS_AUDIO))
{
TrackUnionStream* tus = static_cast<TrackUnionStream*>(mDOMStream->GetStream());
MOZ_ASSERT(tus == mDOMStream->GetStream()->AsProcessedStream());
tus->SetTrackIDFilter(FilterAudioNodeStreamTrack);
MediaStreamDestinationEngine* engine = new MediaStreamDestinationEngine(this, tus);
mStream = aContext->Graph()->CreateAudioNodeStream(engine, MediaStreamGraph::INTERNAL_STREAM);
mPort = tus->AllocateInputPort(mStream, 0);
}
void
MediaStreamAudioDestinationNode::DestroyMediaStream()
{
AudioNode::DestroyMediaStream();
if (mPort) {
mPort->Destroy();
mPort = nullptr;
}
}
JSObject*
MediaStreamAudioDestinationNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope)
{
return MediaStreamAudioDestinationNodeBinding::Wrap(aCx, aScope, this);
}
}
}

View File

@ -0,0 +1,48 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef MediaStreamAudioDestinationNode_h_
#define MediaStreamAudioDestinationNode_h_
#include "AudioNode.h"
namespace mozilla {
class DOMMediaStream;
namespace dom {
class MediaStreamAudioDestinationNode : public AudioNode
{
public:
explicit MediaStreamAudioDestinationNode(AudioContext* aContext);
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaStreamAudioDestinationNode, AudioNode)
virtual JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aScope) MOZ_OVERRIDE;
virtual uint16_t NumberOfOutputs() const MOZ_FINAL MOZ_OVERRIDE
{
return 0;
}
virtual void DestroyMediaStream() MOZ_OVERRIDE;
DOMMediaStream* DOMStream() const
{
return mDOMStream;
}
private:
nsRefPtr<DOMMediaStream> mDOMStream;
nsRefPtr<MediaInputPort> mPort;
};
}
}
#endif

View File

@ -39,6 +39,7 @@ EXPORTS.mozilla.dom += [
'DynamicsCompressorNode.h',
'EnableWebAudioCheck.h',
'GainNode.h',
'MediaStreamAudioDestinationNode.h',
'OfflineAudioCompletionEvent.h',
'PannerNode.h',
'ScriptProcessorNode.h',
@ -65,6 +66,7 @@ CPP_SOURCES += [
'EnableWebAudioCheck.cpp',
'GainNode.cpp',
'MediaBufferDecoder.cpp',
'MediaStreamAudioDestinationNode.cpp',
'OfflineAudioCompletionEvent.cpp',
'PannerNode.cpp',
'ScriptProcessorNode.cpp',

View File

@ -62,6 +62,7 @@ MOCHITEST_FILES := \
test_gainNodeInLoop.html \
test_maxChannelCount.html \
test_mediaDecoding.html \
test_mediaStreamAudioDestinationNode.html \
test_mixingRules.html \
test_nodeToParamConnection.html \
test_OfflineAudioContext.html \

View File

@ -0,0 +1,46 @@
<!DOCTYPE HTML>
<html>
<head>
<title>Test MediaStreamAudioDestinationNode</title>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="webaudio.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<pre id="test">
<audio id="audioelem"></audio>
<script class="testbody" type="text/javascript">
SimpleTest.waitForExplicitFinish();
addLoadEvent(function() {
SpecialPowers.setBoolPref("media.webaudio.enabled", true);
var context = new AudioContext();
var buffer = context.createBuffer(1, 2048, context.sampleRate);
for (var i = 0; i < 2048; ++i) {
buffer.getChannelData(0)[i] = Math.sin(440 * 2 * Math.PI * i / context.sampleRate);
}
var source = context.createBufferSource();
source.buffer = buffer;
var dest = context.createMediaStreamDestination();
source.connect(dest);
var elem = document.getElementById('audioelem');
elem.mozSrcObject = dest.stream;
elem.onloadedmetadata = function() {
ok(true, "got metadata event");
setTimeout(function() {
is(elem.played.length, 1, "should have a played interval");
is(elem.played.start(0), 0, "should have played immediately");
isnot(elem.played.end(0), 0, "should have played for a non-zero interval");
SpecialPowers.clearUserPref("media.webaudio.enabled");
SimpleTest.finish();
}, 2000);
};
source.start(0);
elem.play();
});
</script>

View File

@ -170,6 +170,7 @@ function synthCleanup() {
.getService(SpecialPowers.Ci.nsISyncMessageSender);
mm.sendSyncMessage('test:SpeechSynthesis:ipcSynthCleanup');
}
SpecialPowers.clearUserPref("media.webspeech.synth.enabled");
}
function synthTestQueue(aTestArgs, aEndFunc) {

View File

@ -10,7 +10,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=525444
<script type="application/javascript" src="common.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body onunload="synthCleanup();">
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=650295">Mozilla Bug 650295</a>
<p id="display"></p>
<div id="content" style="display: none">

View File

@ -10,7 +10,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=525444
<script type="application/javascript" src="common.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body onunload="synthCleanup();">
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=525444">Mozilla Bug 525444</a>
<p id="display"></p>
<div id="content" style="display: none">

View File

@ -10,7 +10,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=650295
<script type="application/javascript" src="common.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body onunload="synthCleanup();">
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=650295">Mozilla Bug 650295</a>
<p id="display"></p>
<div id="content" style="display: none">

View File

@ -50,7 +50,7 @@ SVGAElement::SVGAElement(already_AddRefed<nsINodeInfo> aNodeInfo)
{
}
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGAElement::Href()
{
return mStringAttributes[HREF].ToDOMAnimatedString(this);
@ -79,7 +79,7 @@ NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGAElement)
//----------------------------------------------------------------------
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGAElement::Target()
{
return mStringAttributes[TARGET].ToDOMAnimatedString(this);

View File

@ -66,8 +66,8 @@ public:
bool aNotify) MOZ_OVERRIDE;
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> Href();
already_AddRefed<nsIDOMSVGAnimatedString> Target();
already_AddRefed<SVGAnimatedString> Href();
already_AddRefed<SVGAnimatedString> Target();
void GetDownload(nsAString & aDownload);
void SetDownload(const nsAString & aDownload, ErrorResult& rv);

View File

@ -36,7 +36,7 @@ SVGAltGlyphElement::SVGAltGlyphElement(already_AddRefed<nsINodeInfo> aNodeInfo)
NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGAltGlyphElement)
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGAltGlyphElement::Href()
{
return mStringAttributes[HREF].ToDOMAnimatedString(this);

View File

@ -33,7 +33,7 @@ public:
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> Href();
already_AddRefed<SVGAnimatedString> Href();
void GetGlyphRef(nsAString & aGlyphRef);
void SetGlyphRef(const nsAString & aGlyphRef, ErrorResult& rv);
void GetFormat(nsAString & aFormat);

View File

@ -0,0 +1,20 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/SVGAnimatedString.h"
#include "mozilla/dom/SVGAnimatedStringBinding.h"
namespace mozilla {
namespace dom {
JSObject*
SVGAnimatedString::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aScope)
{
return SVGAnimatedStringBinding::Wrap(aCx, aScope, this);
}
} // namespace dom
} // namespace mozilla

View File

@ -0,0 +1,43 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_SVGAnimatedString_h
#define mozilla_dom_SVGAnimatedString_h
#include "nsSVGElement.h"
namespace mozilla {
namespace dom {
class SVGAnimatedString : public nsISupports,
public nsWrapperCache
{
public:
SVGAnimatedString(nsSVGElement* aSVGElement)
: mSVGElement(aSVGElement)
{
SetIsDOMBinding();
}
virtual JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aScope) MOZ_OVERRIDE;
// WebIDL
nsSVGElement* GetParentObject() const
{
return mSVGElement;
}
virtual void GetBaseVal(nsAString& aResult) = 0;
virtual void SetBaseVal(const nsAString& aValue) = 0;
virtual void GetAnimVal(nsAString& aResult) = 0;
nsRefPtr<nsSVGElement> mSVGElement;
};
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_SVGAnimatedString_h

View File

@ -50,13 +50,13 @@ NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFEBlendElement)
//----------------------------------------------------------------------
// nsIDOMSVGFEBlendElement methods
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFEBlendElement::In1()
{
return mStringAttributes[IN1].ToDOMAnimatedString(this);
}
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFEBlendElement::In2()
{
return mStringAttributes[IN2].ToDOMAnimatedString(this);

View File

@ -48,8 +48,8 @@ public:
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> In1();
already_AddRefed<nsIDOMSVGAnimatedString> In2();
already_AddRefed<SVGAnimatedString> In1();
already_AddRefed<SVGAnimatedString> In2();
already_AddRefed<nsIDOMSVGAnimatedEnumeration> Mode();
protected:

View File

@ -57,7 +57,7 @@ NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFEColorMatrixElement)
//----------------------------------------------------------------------
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFEColorMatrixElement::In1()
{
return mStringAttributes[IN1].ToDOMAnimatedString(this);

View File

@ -49,7 +49,7 @@ public:
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> In1();
already_AddRefed<SVGAnimatedString> In1();
already_AddRefed<nsIDOMSVGAnimatedEnumeration> Type();
already_AddRefed<DOMSVGAnimatedNumberList> Values();

View File

@ -30,7 +30,7 @@ nsSVGElement::StringInfo SVGFEComponentTransferElement::sStringInfo[2] =
NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFEComponentTransferElement)
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFEComponentTransferElement::In1()
{
return mStringAttributes[IN1].ToDOMAnimatedString(this);

View File

@ -42,7 +42,7 @@ public:
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> In1();
already_AddRefed<SVGAnimatedString> In1();
protected:
virtual bool OperatesOnPremultipledAlpha(int32_t) MOZ_OVERRIDE { return false; }

View File

@ -55,13 +55,13 @@ nsSVGElement::StringInfo SVGFECompositeElement::sStringInfo[3] =
NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFECompositeElement)
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFECompositeElement::In1()
{
return mStringAttributes[IN1].ToDOMAnimatedString(this);
}
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFECompositeElement::In2()
{
return mStringAttributes[IN2].ToDOMAnimatedString(this);

View File

@ -55,8 +55,8 @@ public:
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> In1();
already_AddRefed<nsIDOMSVGAnimatedString> In2();
already_AddRefed<SVGAnimatedString> In1();
already_AddRefed<SVGAnimatedString> In2();
already_AddRefed<nsIDOMSVGAnimatedEnumeration> Operator();
already_AddRefed<nsIDOMSVGAnimatedNumber> K1();
already_AddRefed<nsIDOMSVGAnimatedNumber> K2();

View File

@ -85,7 +85,7 @@ NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFEConvolveMatrixElement)
//----------------------------------------------------------------------
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFEConvolveMatrixElement::In1()
{
return mStringAttributes[IN1].ToDOMAnimatedString(this);

View File

@ -58,7 +58,7 @@ public:
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> In1();
already_AddRefed<SVGAnimatedString> In1();
already_AddRefed<nsIDOMSVGAnimatedInteger> OrderX();
already_AddRefed<nsIDOMSVGAnimatedInteger> OrderY();
already_AddRefed<DOMSVGAnimatedNumberList> KernelMatrix();

View File

@ -25,7 +25,7 @@ NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFEDiffuseLightingElement)
//----------------------------------------------------------------------
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFEDiffuseLightingElement::In1()
{
return mStringAttributes[IN1].ToDOMAnimatedString(this);

View File

@ -35,7 +35,7 @@ public:
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> In1();
already_AddRefed<SVGAnimatedString> In1();
already_AddRefed<nsIDOMSVGAnimatedNumber> SurfaceScale();
already_AddRefed<nsIDOMSVGAnimatedNumber> DiffuseConstant();
already_AddRefed<nsIDOMSVGAnimatedNumber> KernelUnitLengthX();

View File

@ -65,13 +65,13 @@ NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFEDisplacementMapElement)
//----------------------------------------------------------------------
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFEDisplacementMapElement::In1()
{
return mStringAttributes[IN1].ToDOMAnimatedString(this);
}
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFEDisplacementMapElement::In2()
{
return mStringAttributes[IN2].ToDOMAnimatedString(this);

View File

@ -49,8 +49,8 @@ public:
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> In1();
already_AddRefed<nsIDOMSVGAnimatedString> In2();
already_AddRefed<SVGAnimatedString> In1();
already_AddRefed<SVGAnimatedString> In2();
already_AddRefed<nsIDOMSVGAnimatedNumber> Scale();
already_AddRefed<nsIDOMSVGAnimatedEnumeration> XChannelSelector();
already_AddRefed<nsIDOMSVGAnimatedEnumeration> YChannelSelector();

View File

@ -37,7 +37,7 @@ NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFEGaussianBlurElement)
//----------------------------------------------------------------------
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFEGaussianBlurElement::In1()
{
return mStringAttributes[IN1].ToDOMAnimatedString(this);

View File

@ -50,7 +50,7 @@ public:
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> In1();
already_AddRefed<SVGAnimatedString> In1();
already_AddRefed<nsIDOMSVGAnimatedNumber> StdDeviationX();
already_AddRefed<nsIDOMSVGAnimatedNumber> StdDeviationY();
void SetStdDeviation(float stdDeviationX, float stdDeviationY);

View File

@ -175,7 +175,7 @@ SVGFEImageElement::IntrinsicState() const
NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFEImageElement)
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFEImageElement::Href()
{
return mStringAttributes[HREF].ToDOMAnimatedString(this);

View File

@ -65,7 +65,7 @@ public:
void MaybeLoadSVGImage();
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> Href();
already_AddRefed<SVGAnimatedString> Href();
already_AddRefed<DOMSVGAnimatedPreserveAspectRatio> PreserveAspectRatio();
private:

View File

@ -37,7 +37,7 @@ SVGFEMergeNodeElement::AttributeAffectsRendering(int32_t aNameSpaceID,
return aNameSpaceID == kNameSpaceID_None && aAttribute == nsGkAtoms::in;
}
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFEMergeNodeElement::In1()
{
return mStringAttributes[IN1].ToDOMAnimatedString(this);

View File

@ -37,7 +37,7 @@ public:
const nsSVGString* GetIn1() { return &mStringAttributes[IN1]; }
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> In1();
already_AddRefed<SVGAnimatedString> In1();
protected:
virtual StringAttributesInfo GetStringInfo() MOZ_OVERRIDE;

View File

@ -58,7 +58,7 @@ NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFEMorphologyElement)
//----------------------------------------------------------------------
// SVGFEMorphologyElement methods
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFEMorphologyElement::In1()
{
return mStringAttributes[IN1].ToDOMAnimatedString(this);

View File

@ -50,7 +50,7 @@ public:
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> In1();
already_AddRefed<SVGAnimatedString> In1();
already_AddRefed<nsIDOMSVGAnimatedEnumeration> Operator();
already_AddRefed<nsIDOMSVGAnimatedNumber> RadiusX();
already_AddRefed<nsIDOMSVGAnimatedNumber> RadiusY();

View File

@ -39,7 +39,7 @@ NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFEOffsetElement)
//----------------------------------------------------------------------
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFEOffsetElement::In1()
{
return mStringAttributes[IN1].ToDOMAnimatedString(this);

View File

@ -49,7 +49,7 @@ public:
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> In1();
already_AddRefed<SVGAnimatedString> In1();
already_AddRefed<nsIDOMSVGAnimatedNumber> Dx();
already_AddRefed<nsIDOMSVGAnimatedNumber> Dy();

View File

@ -23,7 +23,7 @@ SVGFESpecularLightingElement::WrapNode(JSContext* aCx, JS::Handle<JSObject*> aSc
NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFESpecularLightingElement)
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFESpecularLightingElement::In1()
{
return mStringAttributes[IN1].ToDOMAnimatedString(this);

View File

@ -41,7 +41,7 @@ public:
int32_t aNameSpaceID, nsIAtom* aAttribute) const;
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> In1();
already_AddRefed<SVGAnimatedString> In1();
already_AddRefed<nsIDOMSVGAnimatedNumber> SurfaceScale();
already_AddRefed<nsIDOMSVGAnimatedNumber> SpecularConstant();
already_AddRefed<nsIDOMSVGAnimatedNumber> SpecularExponent();

View File

@ -31,7 +31,7 @@ nsSVGElement::StringInfo SVGFETileElement::sStringInfo[2] =
NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFETileElement)
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFETileElement::In1()
{
return mStringAttributes[IN1].ToDOMAnimatedString(this);

View File

@ -49,7 +49,7 @@ public:
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> In1();
already_AddRefed<SVGAnimatedString> In1();
protected:
virtual StringAttributesInfo GetStringInfo() MOZ_OVERRIDE;

View File

@ -125,7 +125,7 @@ SVGFilterElement::SetFilterRes(uint32_t filterResX, uint32_t filterResY)
mIntegerPairAttributes[FILTERRES].SetBaseValues(filterResX, filterResY, this);
}
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGFilterElement::Href()
{
return mStringAttributes[HREF].ToDOMAnimatedString(this);

View File

@ -57,7 +57,7 @@ public:
already_AddRefed<nsIDOMSVGAnimatedInteger> FilterResX();
already_AddRefed<nsIDOMSVGAnimatedInteger> FilterResY();
void SetFilterRes(uint32_t filterResX, uint32_t filterResY);
already_AddRefed<nsIDOMSVGAnimatedString> Href();
already_AddRefed<SVGAnimatedString> Href();
protected:

View File

@ -93,7 +93,7 @@ SVGGradientElement::SpreadMethod()
return mEnumAttributes[SPREADMETHOD].ToDOMAnimatedEnum(this);
}
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGGradientElement::Href()
{
return mStringAttributes[HREF].ToDOMAnimatedString(this);

View File

@ -62,7 +62,7 @@ public:
already_AddRefed<nsIDOMSVGAnimatedEnumeration> GradientUnits();
already_AddRefed<SVGAnimatedTransformList> GradientTransform();
already_AddRefed<nsIDOMSVGAnimatedEnumeration> SpreadMethod();
already_AddRefed<nsIDOMSVGAnimatedString> Href();
already_AddRefed<SVGAnimatedString> Href();
protected:
virtual EnumAttributesInfo GetEnumInfo() MOZ_OVERRIDE;

View File

@ -103,7 +103,7 @@ SVGImageElement::PreserveAspectRatio()
return ratio.forget();
}
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGImageElement::Href()
{
return mStringAttributes[HREF].ToDOMAnimatedString(this);

View File

@ -73,7 +73,7 @@ public:
already_AddRefed<SVGAnimatedLength> Width();
already_AddRefed<SVGAnimatedLength> Height();
already_AddRefed<DOMSVGAnimatedPreserveAspectRatio> PreserveAspectRatio();
already_AddRefed<nsIDOMSVGAnimatedString> Href();
already_AddRefed<SVGAnimatedString> Href();
protected:
nsresult LoadSVGImage(bool aForce, bool aNotify);

View File

@ -78,7 +78,7 @@ SVGMPathElement::~SVGMPathElement()
NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGMPathElement)
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGMPathElement::Href()
{
return mStringAttributes[HREF].ToDOMAnimatedString(this);

View File

@ -62,7 +62,7 @@ public:
SVGPathElement* GetReferencedPath();
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> Href();
already_AddRefed<SVGAnimatedString> Href();
protected:
class PathReference : public nsReferencedElement {

View File

@ -125,7 +125,7 @@ SVGPatternElement::Height()
return mLengthAttributes[ATTR_HEIGHT].ToDOMAnimatedLength(this);
}
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGPatternElement::Href()
{
return mStringAttributes[HREF].ToDOMAnimatedString(this);

View File

@ -63,7 +63,7 @@ public:
already_AddRefed<SVGAnimatedLength> Y();
already_AddRefed<SVGAnimatedLength> Width();
already_AddRefed<SVGAnimatedLength> Height();
already_AddRefed<nsIDOMSVGAnimatedString> Href();
already_AddRefed<SVGAnimatedString> Href();
protected:

View File

@ -98,7 +98,7 @@ SVGScriptElement::SetCrossOrigin(const nsAString & aOrigin, ErrorResult& rv)
rv = SetAttr(kNameSpaceID_None, nsGkAtoms::crossorigin, aOrigin, true);
}
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGScriptElement::Href()
{
return mStringAttributes[HREF].ToDOMAnimatedString(this);

View File

@ -69,7 +69,7 @@ public:
void SetType(const nsAString & aType, ErrorResult& rv);
void GetCrossOrigin(nsAString & aOrigin);
void SetCrossOrigin(const nsAString & aOrigin, ErrorResult& rv);
already_AddRefed<nsIDOMSVGAnimatedString> Href();
already_AddRefed<SVGAnimatedString> Href();
protected:
virtual StringAttributesInfo GetStringInfo() MOZ_OVERRIDE;

View File

@ -70,7 +70,7 @@ SVGTextPathElement::SVGTextPathElement(already_AddRefed<nsINodeInfo> aNodeInfo)
NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGTextPathElement)
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGTextPathElement::Href()
{
return mStringAttributes[HREF].ToDOMAnimatedString(this);

View File

@ -55,7 +55,7 @@ public:
already_AddRefed<SVGAnimatedLength> StartOffset();
already_AddRefed<nsIDOMSVGAnimatedEnumeration> Method();
already_AddRefed<nsIDOMSVGAnimatedEnumeration> Spacing();
already_AddRefed<nsIDOMSVGAnimatedString> Href();
already_AddRefed<SVGAnimatedString> Href();
protected:

View File

@ -115,12 +115,10 @@ SVGUseElement::Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const
return NS_FAILED(rv1) ? rv1 : rv2;
}
already_AddRefed<nsIDOMSVGAnimatedString>
already_AddRefed<SVGAnimatedString>
SVGUseElement::Href()
{
nsCOMPtr<nsIDOMSVGAnimatedString> href;
mStringAttributes[HREF].ToDOMAnimatedString(getter_AddRefs(href), this);
return href.forget();
return mStringAttributes[HREF].ToDOMAnimatedString(this);
}
//----------------------------------------------------------------------

View File

@ -70,7 +70,7 @@ public:
NS_IMETHOD_(bool) IsAttributeMapped(const nsIAtom* aAttribute) const MOZ_OVERRIDE;
// WebIDL
already_AddRefed<nsIDOMSVGAnimatedString> Href();
already_AddRefed<SVGAnimatedString> Href();
already_AddRefed<SVGAnimatedLength> X();
already_AddRefed<SVGAnimatedLength> Y();
already_AddRefed<SVGAnimatedLength> Width();

View File

@ -25,6 +25,7 @@ EXPORTS.mozilla.dom += [
'SVGAnimatedBoolean.h',
'SVGAnimatedLength.h',
'SVGAnimatedRect.h',
'SVGAnimatedString.h',
'SVGAnimatedTransformList.h',
'SVGAnimationElement.h',
'SVGCircleElement.h',
@ -122,6 +123,7 @@ CPP_SOURCES += [
'SVGAnimatedPointList.cpp',
'SVGAnimatedPreserveAspectRatio.cpp',
'SVGAnimatedRect.cpp',
'SVGAnimatedString.cpp',
'SVGAnimatedTransformList.cpp',
'SVGAnimationElement.cpp',
'SVGAttrValueWrapper.cpp',

View File

@ -7,22 +7,54 @@
#include "nsSVGElement.h"
#include "nsSMILValue.h"
#include "SMILStringType.h"
#include "mozilla/dom/SVGAnimatedString.h"
using namespace mozilla;
using namespace mozilla::dom;
NS_SVG_VAL_IMPL_CYCLE_COLLECTION(nsSVGClass::DOMAnimatedString, mSVGElement)
struct DOMAnimatedString MOZ_FINAL : public SVGAnimatedString
{
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(DOMAnimatedString)
NS_IMPL_CYCLE_COLLECTING_ADDREF(nsSVGClass::DOMAnimatedString)
NS_IMPL_CYCLE_COLLECTING_RELEASE(nsSVGClass::DOMAnimatedString)
DOMAnimatedString(nsSVGClass* aVal, nsSVGElement* aSVGElement)
: SVGAnimatedString(aSVGElement)
, mVal(aVal)
{}
DOMCI_DATA(SVGAnimatedClass, nsSVGClass::DOMAnimatedString)
nsSVGClass* mVal; // kept alive because it belongs to content
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsSVGClass::DOMAnimatedString)
NS_INTERFACE_MAP_ENTRY(nsIDOMSVGAnimatedString)
void GetBaseVal(nsAString& aResult) MOZ_OVERRIDE
{
mVal->GetBaseValue(aResult, mSVGElement);
}
void SetBaseVal(const nsAString& aValue) MOZ_OVERRIDE
{
mVal->SetBaseValue(aValue, mSVGElement, true);
}
void GetAnimVal(nsAString& aResult) MOZ_OVERRIDE;
};
NS_SVG_VAL_IMPL_CYCLE_COLLECTION_WRAPPERCACHED(DOMAnimatedString, mSVGElement)
NS_IMPL_CYCLE_COLLECTING_ADDREF(DOMAnimatedString)
NS_IMPL_CYCLE_COLLECTING_RELEASE(DOMAnimatedString)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(DOMAnimatedString)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(SVGAnimatedString)
NS_INTERFACE_MAP_END
already_AddRefed<SVGAnimatedString>
nsSVGClass::ToDOMAnimatedString(nsSVGElement* aSVGElement)
{
nsRefPtr<DOMAnimatedString> result = new DOMAnimatedString(this, aSVGElement);
return result.forget();
}
/* Implementation */
void
@ -72,12 +104,11 @@ nsSVGClass::SetAnimValue(const nsAString& aValue, nsSVGElement *aSVGElement)
aSVGElement->DidAnimateClass();
}
NS_IMETHODIMP
nsSVGClass::DOMAnimatedString::GetAnimVal(nsAString& aResult)
{
void
DOMAnimatedString::GetAnimVal(nsAString& aResult)
{
mSVGElement->FlushAnimations();
mVal->GetAnimValue(aResult, mSVGElement);
return NS_OK;
}
nsISMILAttr*

View File

@ -9,13 +9,18 @@
#include "nsAutoPtr.h"
#include "nsCycleCollectionParticipant.h"
#include "nsError.h"
#include "nsIDOMSVGAnimatedString.h"
#include "nsISMILAttr.h"
#include "nsString.h"
#include "mozilla/Attributes.h"
class nsSVGElement;
namespace mozilla {
namespace dom {
class SVGAnimatedString;
}
}
class nsSVGClass
{
@ -34,18 +39,8 @@ public:
bool IsAnimated() const
{ return !!mAnimVal; }
already_AddRefed<nsIDOMSVGAnimatedString>
ToDOMAnimatedString(nsSVGElement* aSVGElement)
{
nsRefPtr<DOMAnimatedString> result = new DOMAnimatedString(this, aSVGElement);
return result.forget();
}
nsresult ToDOMAnimatedString(nsIDOMSVGAnimatedString **aResult,
nsSVGElement *aSVGElement)
{
*aResult = ToDOMAnimatedString(aSVGElement).get();
return NS_OK;
}
already_AddRefed<mozilla::dom::SVGAnimatedString>
ToDOMAnimatedString(nsSVGElement* aSVGElement);
// Returns a new nsISMILAttr object that the caller must delete
nsISMILAttr* ToSMILAttr(nsSVGElement *aSVGElement);
@ -55,24 +50,6 @@ private:
nsAutoPtr<nsString> mAnimVal;
public:
struct DOMAnimatedString MOZ_FINAL : public nsIDOMSVGAnimatedString
{
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_CLASS(DOMAnimatedString)
DOMAnimatedString(nsSVGClass *aVal, nsSVGElement *aSVGElement)
: mVal(aVal), mSVGElement(aSVGElement) {}
nsSVGClass* mVal; // kept alive because it belongs to content
nsRefPtr<nsSVGElement> mSVGElement;
NS_IMETHOD GetBaseVal(nsAString& aResult) MOZ_OVERRIDE
{ mVal->GetBaseValue(aResult, mSVGElement); return NS_OK; }
NS_IMETHOD SetBaseVal(const nsAString& aValue) MOZ_OVERRIDE
{ mVal->SetBaseValue(aValue, mSVGElement, true); return NS_OK; }
NS_IMETHOD GetAnimVal(nsAString& aResult) MOZ_OVERRIDE;
};
struct SMILString : public nsISMILAttr
{
public:

Some files were not shown because too many files have changed in this diff Show More