mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-25 05:41:12 +00:00
Merge m-c to s-c.
This commit is contained in:
commit
3984f31f93
@ -352,6 +352,9 @@ void
|
||||
DocManager::RemoveListeners(nsIDocument* aDocument)
|
||||
{
|
||||
nsPIDOMWindow* window = aDocument->GetWindow();
|
||||
if (!window)
|
||||
return;
|
||||
|
||||
nsIDOMEventTarget* target = window->GetChromeEventHandler();
|
||||
nsEventListenerManager* elm = target->GetListenerManager(true);
|
||||
elm->RemoveEventListenerByType(this, NS_LITERAL_STRING("pagehide"),
|
||||
|
@ -356,7 +356,7 @@ ARIAGridAccessible::SelectRow(uint32_t aRowIdx)
|
||||
|
||||
Accessible* row = nullptr;
|
||||
for (int32_t rowIdx = 0; (row = rowIter.Next()); rowIdx++) {
|
||||
nsresult rv = SetARIASelected(row, rowIdx == aRowIdx);
|
||||
DebugOnly<nsresult> rv = SetARIASelected(row, rowIdx == aRowIdx);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "SetARIASelected() Shouldn't fail!");
|
||||
}
|
||||
}
|
||||
@ -369,7 +369,7 @@ ARIAGridAccessible::SelectCol(uint32_t aColIdx)
|
||||
Accessible* row = nullptr;
|
||||
while ((row = rowIter.Next())) {
|
||||
// Unselect all cells in the row.
|
||||
nsresult rv = SetARIASelected(row, false);
|
||||
DebugOnly<nsresult> rv = SetARIASelected(row, false);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "SetARIASelected() Shouldn't fail!");
|
||||
|
||||
// Select cell at the column index.
|
||||
|
@ -713,7 +713,7 @@ HTMLTableAccessible::IsCellSelected(uint32_t aRowIdx, uint32_t aColIdx)
|
||||
void
|
||||
HTMLTableAccessible::SelectRow(uint32_t aRowIdx)
|
||||
{
|
||||
nsresult rv =
|
||||
DebugOnly<nsresult> rv =
|
||||
RemoveRowsOrColumnsFromSelection(aRowIdx,
|
||||
nsISelectionPrivate::TABLESELECTION_ROW,
|
||||
true);
|
||||
@ -726,7 +726,7 @@ HTMLTableAccessible::SelectRow(uint32_t aRowIdx)
|
||||
void
|
||||
HTMLTableAccessible::SelectCol(uint32_t aColIdx)
|
||||
{
|
||||
nsresult rv =
|
||||
DebugOnly<nsresult> rv =
|
||||
RemoveRowsOrColumnsFromSelection(aColIdx,
|
||||
nsISelectionPrivate::TABLESELECTION_COLUMN,
|
||||
true);
|
||||
|
@ -369,7 +369,7 @@ XULListboxAccessible::SelectedCells(nsTArray<Accessible*>* aCells)
|
||||
return;
|
||||
|
||||
uint32_t selectedItemsCount = 0;
|
||||
nsresult rv = selectedItems->GetLength(&selectedItemsCount);
|
||||
DebugOnly<nsresult> rv = selectedItems->GetLength(&selectedItemsCount);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "GetLength() Shouldn't fail!");
|
||||
|
||||
for (uint32_t index = 0; index < selectedItemsCount; index++) {
|
||||
@ -403,7 +403,7 @@ XULListboxAccessible::SelectedCellIndices(nsTArray<uint32_t>* aCells)
|
||||
return;
|
||||
|
||||
uint32_t selectedItemsCount = 0;
|
||||
nsresult rv = selectedItems->GetLength(&selectedItemsCount);
|
||||
DebugOnly<nsresult> rv = selectedItems->GetLength(&selectedItemsCount);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "GetLength() Shouldn't fail!");
|
||||
|
||||
uint32_t colCount = ColCount();
|
||||
@ -452,7 +452,7 @@ XULListboxAccessible::SelectedRowIndices(nsTArray<uint32_t>* aRows)
|
||||
return;
|
||||
|
||||
uint32_t rowCount = 0;
|
||||
nsresult rv = selectedItems->GetLength(&rowCount);
|
||||
DebugOnly<nsresult> rv = selectedItems->GetLength(&rowCount);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "GetLength() Shouldn't fail!");
|
||||
|
||||
if (!rowCount)
|
||||
|
@ -57,10 +57,12 @@
|
||||
|
||||
function doTest()
|
||||
{
|
||||
enableLogging("focus");
|
||||
gQueue = new eventQueue();
|
||||
|
||||
gQueue.push(new openWnd());
|
||||
|
||||
gQueue.onFinish = function() { disableLogging(); }
|
||||
gQueue.invoke(); // Will call SimpleTest.finish();
|
||||
}
|
||||
|
||||
|
@ -47,6 +47,7 @@
|
||||
var gQueue = null;
|
||||
function doTest()
|
||||
{
|
||||
disableLogging(); // from test_focusedChild
|
||||
gQueue = new eventQueue();
|
||||
|
||||
gQueue.push(new takeFocusInvoker("aria-link"));
|
||||
|
@ -16,6 +16,7 @@ MOCHITEST_A11Y_FILES = \
|
||||
test_doc.html \
|
||||
test_hypertext.html \
|
||||
test_label.xul \
|
||||
test_multiline.html \
|
||||
test_passwords.html \
|
||||
test_selection.html \
|
||||
test_singleline.html \
|
||||
|
564
accessible/tests/mochitest/text/test_multiline.html
Normal file
564
accessible/tests/mochitest/text/test_multiline.html
Normal file
@ -0,0 +1,564 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>nsIAccessibleText getText related function in multiline text</title>
|
||||
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />
|
||||
|
||||
<script type="application/javascript"
|
||||
src="chrome://mochikit/content/MochiKit/packed.js"></script>
|
||||
<script type="application/javascript"
|
||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<script type="application/javascript"
|
||||
src="../common.js"></script>
|
||||
<script type="application/javascript"
|
||||
src="../text.js"></script>
|
||||
<script type="application/javascript">
|
||||
|
||||
function doTest()
|
||||
{
|
||||
SimpleTest.expectAssertions(60);
|
||||
|
||||
// __o__n__e__w__o__r__d__\n
|
||||
// 0 1 2 3 4 5 6 7
|
||||
// __\n
|
||||
// 8
|
||||
// __t__w__o__ __w__o__r__d__s__\n
|
||||
// 9 10 11 12 13 14 15 16 17 18
|
||||
|
||||
// Note: HTML textarea adds an extra "\n" at the end of the text at
|
||||
// the layount/content level.
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// getText
|
||||
|
||||
var IDs = ["div", "divbr", "editable", "editablebr", "textarea"];
|
||||
testText(IDs, 0, 19, "oneword\n\ntwo words\n");
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// getTextAfterOffset
|
||||
|
||||
// BOUNDARY_CHAR
|
||||
testTextAfterOffset(6, BOUNDARY_CHAR, "\n", 7, 8,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextAfterOffset(7, BOUNDARY_CHAR, "\n", 8, 9,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextAfterOffset(8, BOUNDARY_CHAR, "t", 9, 10,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
|
||||
// BOUNDARY_WORD_START
|
||||
testTextAfterOffset(0, BOUNDARY_WORD_START, "two ", 9, 13,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextAfterOffset(8, BOUNDARY_WORD_START, "two ", 9, 13,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextAfterOffset(9, BOUNDARY_WORD_START, "words\n", 13, 19,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
|
||||
// BOUNDARY_WORD_END
|
||||
testTextAfterOffset(0, BOUNDARY_WORD_END, "\n\ntwo", 7, 12,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextAfterOffset(6, BOUNDARY_WORD_END, "\n\ntwo", 7, 12,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextAfterOffset(7, BOUNDARY_WORD_END, "\n\ntwo", 7, 12,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextAfterOffset(8, BOUNDARY_WORD_END, " words", 12, 18,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
|
||||
// BOUNDARY_LINE_START
|
||||
testTextAfterOffset(0, BOUNDARY_LINE_START, "\n", 8, 9,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextAfterOffset(7, BOUNDARY_LINE_START, "\n", 8, 9,
|
||||
"div", kOk, kTodo, kTodo,
|
||||
"divbr", kOk, kTodo, kTodo,
|
||||
"editable", kOk, kTodo, kTodo,
|
||||
"editablebr", kOk, kTodo, kTodo,
|
||||
"textarea", kOk, kTodo, kTodo);
|
||||
testTextAfterOffset(8, BOUNDARY_LINE_START, "two words\n", 9, 19,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextAfterOffset(9, BOUNDARY_LINE_START, "", 19, 19,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kOk,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kOk,
|
||||
"textarea", kTodo, kTodo, kOk);
|
||||
testTextAfterOffset(19, BOUNDARY_LINE_START, "", 19, 19,
|
||||
"div", undefined, undefined, undefined,
|
||||
"divbr", undefined, undefined, undefined,
|
||||
"editable", undefined, undefined, undefined,
|
||||
"editablebr", undefined, undefined, undefined,
|
||||
"textarea", kTodo, undefined, kTodo);
|
||||
|
||||
// BOUNDARY_LINE_END
|
||||
testTextAfterOffset(0, BOUNDARY_LINE_END, "\n", 7, 8,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextAfterOffset(7, BOUNDARY_LINE_END, "\n", 7, 8,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextAfterOffset(8, BOUNDARY_LINE_END, "\ntwo words", 8, 18,
|
||||
"div", kTodo, kOk, kTodo,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kTodo, kOk, kTodo,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextAfterOffset(9, BOUNDARY_LINE_END, "\n", 18, 19,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextAfterOffset(18, BOUNDARY_LINE_END, "\n", 18, 19,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextAfterOffset(19, BOUNDARY_LINE_END, "", 19, 19,
|
||||
"div", kOk, kTodo, kTodo,
|
||||
"divbr", kOk, kTodo, kTodo,
|
||||
"editable", kOk, kTodo, kTodo,
|
||||
"editablebr", kOk, kTodo, kTodo,
|
||||
"textarea", kOk, kTodo, kTodo);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// getTextBeforeOffset
|
||||
|
||||
// BOUNDARY_CHAR
|
||||
testTextBeforeOffset(8, BOUNDARY_CHAR, "\n", 7, 8,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextBeforeOffset(9, BOUNDARY_CHAR, "\n", 8, 9,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextBeforeOffset(10, BOUNDARY_CHAR, "t", 9, 10,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
|
||||
// BOUNDARY_WORD_START
|
||||
testTextBeforeOffset(0, BOUNDARY_WORD_START, "", 0, 0,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextBeforeOffset(7, BOUNDARY_WORD_START, "", 0, 0,
|
||||
"div", kTodo, kOk, kTodo,
|
||||
"divbr", kTodo, kOk, kTodo,
|
||||
"editable", kTodo, kOk, kTodo,
|
||||
"editablebr", kTodo, kOk, kTodo,
|
||||
"textarea", kTodo, kOk, kTodo);
|
||||
testTextBeforeOffset(8, BOUNDARY_WORD_START, "", 0, 0,
|
||||
"div", kTodo, kOk, kTodo,
|
||||
"divbr", kTodo, kOk, kTodo,
|
||||
"editable", kTodo, kOk, kTodo,
|
||||
"editablebr", kTodo, kOk, kTodo,
|
||||
"textarea", kTodo, kOk, kTodo);
|
||||
testTextBeforeOffset(9, BOUNDARY_WORD_START, "oneword\n\n", 0, 9,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextBeforeOffset(13, BOUNDARY_WORD_START, "two ", 9, 13,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextBeforeOffset(18, BOUNDARY_WORD_START, "two ", 9, 13,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextBeforeOffset(19, BOUNDARY_WORD_START, "two ", 9, 13,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
|
||||
// BOUNDARY_WORD_END
|
||||
testTextBeforeOffset(0, BOUNDARY_WORD_END, "", 0, 0,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextBeforeOffset(7, BOUNDARY_WORD_END, "", 0, 0,
|
||||
"div", kTodo, kOk, kTodo,
|
||||
"divbr", kTodo, kOk, kTodo,
|
||||
"editable", kTodo, kOk, kTodo,
|
||||
"editablebr", kTodo, kOk, kTodo,
|
||||
"textarea", kTodo, kOk, kTodo);
|
||||
testTextBeforeOffset(8, BOUNDARY_WORD_END, "oneword", 0, 7,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kOk, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kOk, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextBeforeOffset(9, BOUNDARY_WORD_END, "oneword", 0, 7,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kOk, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kOk, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextBeforeOffset(12, BOUNDARY_WORD_END, "oneword", 0, 7,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextBeforeOffset(13, BOUNDARY_WORD_END, "\n\ntwo", 7, 12,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextBeforeOffset(18, BOUNDARY_WORD_END, "\n\ntwo", 7, 12,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextBeforeOffset(19, BOUNDARY_WORD_END, " words", 13, 18,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
|
||||
// BOUNDARY_LINE_START
|
||||
testTextBeforeOffset(0, BOUNDARY_LINE_START, "", 0, 0,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextBeforeOffset(8, BOUNDARY_LINE_START, "oneword\n", 0, 8,
|
||||
"div", kTodo, kTodo, kOk,
|
||||
"divbr", kTodo, kTodo, kOk,
|
||||
"editable", kTodo, kTodo, kOk,
|
||||
"editablebr", kTodo, kTodo, kOk,
|
||||
"textarea", kTodo, kTodo, kOk);
|
||||
testTextBeforeOffset(9, BOUNDARY_LINE_START, "\n", 8, 9,
|
||||
"div", kTodo, kTodo, kOk,
|
||||
"divbr", kTodo, kTodo, kOk,
|
||||
"editable", kTodo, kTodo, kOk,
|
||||
"editablebr", kTodo, kTodo, kOk,
|
||||
"textarea", kTodo, kTodo, kOk);
|
||||
testTextBeforeOffset(18, BOUNDARY_LINE_START, "\n", 8, 9,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextBeforeOffset(19, BOUNDARY_LINE_START, "two words \n", 9, 19,
|
||||
"div", kTodo, kOk, kOk,
|
||||
"divbr", kTodo, kOk, kOk,
|
||||
"editable", kTodo, kOk, kOk,
|
||||
"editablebr", kTodo, kOk, kOk,
|
||||
"textarea", kTodo, kOk, kOk);
|
||||
|
||||
// BOUNDARY_LINE_END
|
||||
testTextBeforeOffset(0, BOUNDARY_LINE_END, "", 0, 0,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextBeforeOffset(7, BOUNDARY_LINE_END, "", 0, 0,
|
||||
"div", kOk, kTodo, kTodo,
|
||||
"divbr", kOk, kTodo, kTodo,
|
||||
"editable", kOk, kTodo, kTodo,
|
||||
"editablebr", kOk, kTodo, kTodo,
|
||||
"textarea", kOk, kTodo, kTodo);
|
||||
testTextBeforeOffset(8, BOUNDARY_LINE_END, "oneword", 0, 7,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextBeforeOffset(9, BOUNDARY_LINE_END, "\n", 7, 8,
|
||||
"div", kOk, kTodo, kTodo,
|
||||
"divbr", kOk, kTodo, kTodo,
|
||||
"editable", kOk, kTodo, kTodo,
|
||||
"editablebr", kOk, kTodo, kTodo,
|
||||
"textarea", kOk, kTodo, kTodo);
|
||||
testTextBeforeOffset(18, BOUNDARY_LINE_END, "\n", 7, 8,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextBeforeOffset(19, BOUNDARY_LINE_END, "\ntwo words", 8, 18,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// getTextAtOffset
|
||||
|
||||
// BOUNDARY_CHAR
|
||||
testTextAtOffset(7, BOUNDARY_CHAR, "\n", 7, 8,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextAtOffset(8, BOUNDARY_CHAR, "\n", 8, 9,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextAtOffset(9, BOUNDARY_CHAR, "t", 9, 10,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
|
||||
// BOUNDARY_WORD_START
|
||||
testTextAtOffset(0, BOUNDARY_WORD_START, "oneword\n\n", 0, 9,
|
||||
"div", kTodo, kOk, kTodo,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kTodo, kOk, kTodo,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kTodo, kOk, kTodo);
|
||||
testTextAtOffset(8, BOUNDARY_WORD_START, "oneword\n\n", 0, 9,
|
||||
"div", kTodo, kTodo, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kTodo, kTodo, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kTodo, kTodo, kOk);
|
||||
testTextAtOffset(9, BOUNDARY_WORD_START, "two ", 9, 13,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextAtOffset(13, BOUNDARY_WORD_START, "words\n", 13, 19,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
|
||||
// BOUNDARY_WORD_END
|
||||
testTextAtOffset(0, BOUNDARY_WORD_END, "oneword", 0, 7,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextAtOffset(8, BOUNDARY_WORD_END, "\n\ntwo", 7, 12,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextAtOffset(9, BOUNDARY_WORD_END, "\n\ntwo", 7, 12,
|
||||
"div", kTodo, kTodo, kOk,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kOk,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kOk);
|
||||
testTextAtOffset(12, BOUNDARY_WORD_END, "\n\ntwo", 7, 12,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextAtOffset(13, BOUNDARY_WORD_END, " words", 12, 18,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
|
||||
// BOUNDARY_LINE_START
|
||||
testTextAtOffset(0, BOUNDARY_LINE_START, "oneword\n", 0, 8,
|
||||
"div", kTodo, kOk, kTodo,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kTodo, kOk, kTodo,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kTodo, kOk, kTodo);
|
||||
testTextAtOffset(7, BOUNDARY_LINE_START, "oneword\n", 0, 8,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextAtOffset(8, BOUNDARY_LINE_START, "\n", 8, 9,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextAtOffset(9, BOUNDARY_LINE_START, "two words\n", 9, 19,
|
||||
"div", kTodo, kOk, kTodo,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kTodo, kOk, kTodo,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextAtOffset(13, BOUNDARY_LINE_START, "two words\n", 9, 19,
|
||||
"div", kTodo, kOk, kTodo,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kTodo, kOk, kTodo,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextAtOffset(18, BOUNDARY_LINE_START, "two words\n", 9, 19,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextAtOffset(19, BOUNDARY_LINE_START, "", 19, 19,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kOk,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kOk,
|
||||
"textarea", kTodo, kTodo, kOk);
|
||||
|
||||
// BOUNDARY_LINE_END
|
||||
testTextAtOffset(0, BOUNDARY_LINE_END, "oneword", 0, 7,
|
||||
"div", kTodo, kOk, kTodo,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kTodo, kOk, kTodo,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kTodo, kOk, kTodo);
|
||||
testTextAtOffset(7, BOUNDARY_LINE_END, "oneword", 0, 7,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextAtOffset(8, BOUNDARY_LINE_END, "\n", 7, 8,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextAtOffset(9, BOUNDARY_LINE_END, "\ntwo words", 8, 18,
|
||||
"div", kTodo, kOk, kTodo,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kTodo, kOk, kTodo,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextAtOffset(17, BOUNDARY_LINE_END, "\ntwo words", 8, 18,
|
||||
"div", kOk, kOk, kOk,
|
||||
"divbr", kOk, kOk, kOk,
|
||||
"editable", kOk, kOk, kOk,
|
||||
"editablebr", kOk, kOk, kOk,
|
||||
"textarea", kOk, kOk, kOk);
|
||||
testTextAtOffset(18, BOUNDARY_LINE_END, "\ntwo words", 8, 18,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
testTextAtOffset(19, BOUNDARY_LINE_END, "\n", 18, 19,
|
||||
"div", kTodo, kTodo, kTodo,
|
||||
"divbr", kTodo, kTodo, kTodo,
|
||||
"editable", kTodo, kTodo, kTodo,
|
||||
"editablebr", kTodo, kTodo, kTodo,
|
||||
"textarea", kTodo, kTodo, kTodo);
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
addA11yLoadEvent(doTest);
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<a target="_blank"
|
||||
title="nsIAccessibleText getText related functions test in multiline text"
|
||||
href="https://bugzilla.mozilla.org/show_bug.cgi?id=612331">
|
||||
Bug 612331
|
||||
</a>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none"></div>
|
||||
<pre id="test">
|
||||
<div id="div">oneword
|
||||
|
||||
two words
|
||||
</div>
|
||||
<div id="divbr">oneword<br/><br/>two words<br/></div>
|
||||
<div id="editable" contenteditable="true">oneword
|
||||
|
||||
two words
|
||||
</div>
|
||||
<div id="editablebr" contenteditable="true">oneword<br/><br/>two words<br/></div>
|
||||
<textarea id="textarea" cols="300">oneword
|
||||
|
||||
two words</textarea>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
@ -659,3 +659,6 @@ pref("dom.disable_input_file", true);
|
||||
pref("general.useragent.enable_overrides", true);
|
||||
|
||||
pref("b2g.version", @MOZ_B2G_VERSION@);
|
||||
|
||||
// Disable console buffering to save memory.
|
||||
pref("consoleservice.buffered", false);
|
||||
|
@ -92,7 +92,7 @@ addMessageListener("Payment:LoadShim", function receiveMessage(aMessage) {
|
||||
requestId = aMessage.json.requestId;
|
||||
});
|
||||
|
||||
addEventListener("DOMContentLoaded", function(e) {
|
||||
addEventListener("DOMWindowCreated", function(e) {
|
||||
content.wrappedJSObject.paymentSuccess = paymentSuccess;
|
||||
content.wrappedJSObject.paymentFailed = paymentFailed;
|
||||
});
|
||||
|
@ -1,7 +1,7 @@
|
||||
[
|
||||
{
|
||||
"size": 896095824,
|
||||
"digest": "c19f6ab2af72a3156c60daf061c6845ab1ae2071cf04fadcfaa9dddb15f9f58d4a67022f8ec8a978ddf7f6f08e1bb86fdc35d5b5a935bb90dec983280d2878e2",
|
||||
"size": 896434664,
|
||||
"digest": "bce8b7264948f1c97749a1c678b7635a9fc13c73ab6c2cf4557737b12cc523c0c51a52efbc73854f8d63d35667e8853345172f7c61a6d4f200fd3c295e483e3e",
|
||||
"algorithm": "sha512",
|
||||
"filename": "gonk.tar.xz"
|
||||
},
|
||||
|
@ -7,22 +7,21 @@
|
||||
<remote fetch="git://github.com/mozilla-b2g/" name="b2ggithub"/>
|
||||
<remote fetch="git://github.com/mozilla/" name="mozilla"/>
|
||||
<remote fetch="git://codeaurora.org/" name="caf"/>
|
||||
<remote fetch="git://android.git.linaro.org/" name="linaro"/>
|
||||
<remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
|
||||
<default remote="caf" revision="ics_chocolate_rb4.2" sync-j="4"/>
|
||||
|
||||
<!-- Gonk specific things and forks -->
|
||||
<project name="platform_build" path="build" remote="b2g" revision="43434d6cdbf702e6197e0791f19406860284edf6">
|
||||
<project name="platform_build" path="build" remote="b2g" revision="777bee02feb43f8f29644f9d09ea7fe01d03f127">
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<!-- Information: fake-dalvik is tagged with B2G_1_0_0_20130125190500 --><project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="8e68d41728675fc72502dc572dec523c2c8abb8a"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="f634b3d50effdd42828cc757c01fdbf74e562a36"/>
|
||||
<!-- Information: librecovery is tagged with B2G_1_0_0_20130125190500 --><project name="librecovery" path="librecovery" remote="b2g" revision="601fc18b28c9d7cf6954b281ddd3b705c74a9215"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="62f94a26d34c1f1e1846efd58d34363c051e8c66"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="e1569feeb10891a55193e36b4a3939742151b05f"/>
|
||||
|
||||
<!-- Stock Android things -->
|
||||
<!-- Information: platform/abi/cpp is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
|
||||
<!-- Information: platform/abi/cpp is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
|
||||
<!-- Information: platform/bionic is tagged with M8960AAAAANLYA100715A --><project name="platform/bionic" path="bionic" revision="cd5dfce80bc3f0139a56b58aca633202ccaee7f8"/>
|
||||
<!-- Information: platform/bootable/recovery is tagged with M8960AAAAANLYA100715A --><project name="platform/bootable/recovery" path="bootable/recovery" revision="e0a9ac010df3afaa47ba107192c05ac8b5516435"/>
|
||||
<!-- Information: platform/development is tagged with M8960AAAAANLYA100715A --><project name="platform/development" path="development" revision="a384622f5fcb1d2bebb9102591ff7ae91fe8ed2d"/>
|
||||
@ -30,62 +29,62 @@
|
||||
<!-- Information: device/sample is tagged with M8960AAAAANLYA100715A --><project name="device/sample" path="device/sample" revision="c328f3d4409db801628861baa8d279fb8855892f"/>
|
||||
<project name="platform_external_apriori" path="external/apriori" remote="b2ggithub" revision="2c3a7113299eb789a076be23449d868b3bfa07fd"/>
|
||||
<!-- Information: platform/external/bluetooth/bluez is tagged with M76XXUSNEKNLYA2040 --><project name="platform/external/bluetooth/bluez" path="external/bluetooth/bluez" revision="1023c91c66e9c3bd1132480051993bf7827770f6"/>
|
||||
<!-- Information: platform/external/bluetooth/glib is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/bluetooth/glib" path="external/bluetooth/glib" revision="c6b49241cc1a8950723a5f74f8f4b4f4c3fa970e"/>
|
||||
<!-- Information: platform/external/bluetooth/glib is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/bluetooth/glib" path="external/bluetooth/glib" revision="c6b49241cc1a8950723a5f74f8f4b4f4c3fa970e"/>
|
||||
<!-- Information: platform/external/bluetooth/hcidump is tagged with AU_LINUX_ANDROID_ICS_CHOCOLATE.04.00.04.05.324 --><project name="platform/external/bluetooth/hcidump" path="external/bluetooth/hcidump" revision="02b1eb24fbb3d0135a81edb4a2175b1397308d7d"/>
|
||||
<!-- Information: platform/external/bsdiff is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/bsdiff" path="external/bsdiff" revision="81872540236d9bb15cccf963d05b9de48baa5375"/>
|
||||
<!-- Information: platform/external/bzip2 is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/bzip2" path="external/bzip2" revision="048dacdca43eed1534689ececcf2781c63e1e4ba"/>
|
||||
<!-- Information: platform/external/bsdiff is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/bsdiff" path="external/bsdiff" revision="81872540236d9bb15cccf963d05b9de48baa5375"/>
|
||||
<!-- Information: platform/external/bzip2 is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/bzip2" path="external/bzip2" revision="048dacdca43eed1534689ececcf2781c63e1e4ba"/>
|
||||
<!-- Information: platform/external/dbus is tagged with M8960AAAAANLYA100715A --><project name="platform/external/dbus" path="external/dbus" revision="c7517b6195dc6926728352113e6cc335da3f9c9e"/>
|
||||
<!-- Information: platform/external/dhcpcd is tagged with M8960AAAAANLYA100715A --><project name="platform/external/dhcpcd" path="external/dhcpcd" revision="1e00fb67022d0921af0fead263f81762781b9ffa"/>
|
||||
<!-- Information: platform/external/dnsmasq is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/dnsmasq" path="external/dnsmasq" revision="f621afad94df46204c25fc2593a19d704d2637f5"/>
|
||||
<!-- Information: platform/external/dnsmasq is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/dnsmasq" path="external/dnsmasq" revision="f621afad94df46204c25fc2593a19d704d2637f5"/>
|
||||
<project name="platform_external_elfcopy" path="external/elfcopy" remote="b2ggithub" revision="62c1bed1c4505369cac2e72fbe30452a598fb690"/>
|
||||
<project name="platform_external_elfutils" path="external/elfutils" remote="b2ggithub" revision="72940dec691fa3255e13df01f8c53b620e446066"/>
|
||||
<!-- Information: platform/external/e2fsprogs is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/e2fsprogs" path="external/e2fsprogs" revision="d5f550bb2f556c5d287f7c8d2b77223654bcec37"/>
|
||||
<!-- Information: platform/external/expat is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/expat" path="external/expat" revision="6df134250feab71edb5915ecaa6268210bca76c5"/>
|
||||
<!-- Information: platform/external/fdlibm is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/fdlibm" path="external/fdlibm" revision="988ffeb12a6e044ae3504838ef1fee3fe0716934"/>
|
||||
<!-- Information: platform/external/flac is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/flac" path="external/flac" revision="5893fbe890f5dab8e4146d2baa4bd2691c0739e0"/>
|
||||
<!-- Information: platform/external/freetype is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/freetype" path="external/freetype" revision="aeb407daf3711a10a27f3bc2223c5eb05158076e"/>
|
||||
<!-- Information: platform/external/giflib is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/giflib" path="external/giflib" revision="b2597268aef084202a8c349d1cc072c03c6e22eb"/>
|
||||
<project name="platform/external/gtest" path="external/gtest" remote="linaro" revision="8c212ebe53bb2baab3575f03069016f1fb11e449"/>
|
||||
<!-- Information: platform/external/harfbuzz is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/harfbuzz" path="external/harfbuzz" revision="116610d63a859521dacf00fb6818ee9ab2e666f6"/>
|
||||
<!-- Information: platform/external/icu4c is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/icu4c" path="external/icu4c" revision="0fa67b93b831c6636ca18b152a1b1b14cc99b034"/>
|
||||
<!-- Information: platform/external/iptables is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/iptables" path="external/iptables" revision="3b2deb17f065c5664bb25e1a28489e5792eb63ff"/>
|
||||
<!-- Information: platform/external/e2fsprogs is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/e2fsprogs" path="external/e2fsprogs" revision="d5f550bb2f556c5d287f7c8d2b77223654bcec37"/>
|
||||
<!-- Information: platform/external/expat is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/expat" path="external/expat" revision="6df134250feab71edb5915ecaa6268210bca76c5"/>
|
||||
<!-- Information: platform/external/fdlibm is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/fdlibm" path="external/fdlibm" revision="988ffeb12a6e044ae3504838ef1fee3fe0716934"/>
|
||||
<!-- Information: platform/external/flac is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/flac" path="external/flac" revision="5893fbe890f5dab8e4146d2baa4bd2691c0739e0"/>
|
||||
<!-- Information: platform/external/freetype is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/freetype" path="external/freetype" revision="aeb407daf3711a10a27f3bc2223c5eb05158076e"/>
|
||||
<!-- Information: platform/external/giflib is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/giflib" path="external/giflib" revision="b2597268aef084202a8c349d1cc072c03c6e22eb"/>
|
||||
<project name="platform/external/gtest" path="external/gtest" revision="8c212ebe53bb2baab3575f03069016f1fb11e449"/>
|
||||
<!-- Information: platform/external/harfbuzz is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/harfbuzz" path="external/harfbuzz" revision="116610d63a859521dacf00fb6818ee9ab2e666f6"/>
|
||||
<!-- Information: platform/external/icu4c is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/icu4c" path="external/icu4c" revision="0fa67b93b831c6636ca18b152a1b1b14cc99b034"/>
|
||||
<!-- Information: platform/external/iptables is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/iptables" path="external/iptables" revision="3b2deb17f065c5664bb25e1a28489e5792eb63ff"/>
|
||||
<!-- Information: platform/external/jpeg is tagged with AU_LINUX_ANDROID_ICS_CHOCOLATE.04.00.04.05.324 --><project name="platform/external/jpeg" path="external/jpeg" revision="a62e464d672a4623233180e4023034bf825f066e"/>
|
||||
<!-- Information: platform/external/libgsm is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/libgsm" path="external/libgsm" revision="5e4516958690b9a1b2c98f88eeecba3edd2dbda4"/>
|
||||
<!-- Information: platform/external/liblzf is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/liblzf" path="external/liblzf" revision="6946aa575b0949d045722794850896099d937cbb"/>
|
||||
<!-- Information: platform/external/libnfc-nxp is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/libnfc-nxp" path="external/libnfc-nxp" revision="3a912b065a31a72c63ad56ac224cfeaa933423b6"/>
|
||||
<!-- Information: platform/external/libnl-headers is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/libnl-headers" path="external/libnl-headers" revision="6ccf7349d61f73ac26a0675d735d903ab919c658"/>
|
||||
<!-- Information: platform/external/libgsm is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/libgsm" path="external/libgsm" revision="5e4516958690b9a1b2c98f88eeecba3edd2dbda4"/>
|
||||
<!-- Information: platform/external/liblzf is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/liblzf" path="external/liblzf" revision="6946aa575b0949d045722794850896099d937cbb"/>
|
||||
<!-- Information: platform/external/libnfc-nxp is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.028 --><project name="platform/external/libnfc-nxp" path="external/libnfc-nxp" revision="3a912b065a31a72c63ad56ac224cfeaa933423b6"/>
|
||||
<!-- Information: platform/external/libnl-headers is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/libnl-headers" path="external/libnl-headers" revision="6ccf7349d61f73ac26a0675d735d903ab919c658"/>
|
||||
<!-- Information: platform/external/libpng is tagged with M8960AAAAANLYA100715A --><project name="platform/external/libpng" path="external/libpng" revision="9c3730f0efa69f580f03463c237cd928f3196404"/>
|
||||
<!-- Information: platform/external/libvpx is tagged with M8960AAAAANLYA1519349 --><project name="platform/external/libvpx" path="external/libvpx" revision="3a40da0d96da5c520e7707aa14f48a80956e20d7"/>
|
||||
<!-- Information: platform/external/llvm is tagged with AU_LINUX_ANDROID_ICS_CHOCOLATE.04.00.04.05.324 --><project name="platform/external/llvm" path="external/llvm" revision="bff5923831940309f7d8ddbff5826ca6ed2dc050"/>
|
||||
<!-- Information: platform/external/mksh is tagged with AU_LINUX_ANDROID_ICS_CHOCOLATE.04.00.04.05.324 --><project name="platform/external/mksh" path="external/mksh" revision="ec646e8f5e7dac9a77d1de549c6ed92c04d0cd4b"/>
|
||||
<!-- Information: platform_external_opensans is tagged with B2G_1_0_0_20130125190500 --><project name="platform_external_opensans" path="external/opensans" remote="b2g" revision="b5b4c226ca1d71e936153cf679dda6d3d60e2354"/>
|
||||
<!-- Information: platform/external/openssl is tagged with AU_LINUX_ANDROID_ICS.04.00.04.00.110 --><project name="platform/external/openssl" path="external/openssl" revision="27d333cce9a31c806b4bfa042925f045c727aecd"/>
|
||||
<!-- Information: platform/external/protobuf is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/protobuf" path="external/protobuf" revision="e217977611c52bccde7f7c78e1d3c790c6357431"/>
|
||||
<!-- Information: platform/external/safe-iop is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/safe-iop" path="external/safe-iop" revision="07073634e2e3aa4f518e36ed5dec3aabc549d5fb"/>
|
||||
<!-- Information: platform/external/protobuf is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/protobuf" path="external/protobuf" revision="e217977611c52bccde7f7c78e1d3c790c6357431"/>
|
||||
<!-- Information: platform/external/safe-iop is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/safe-iop" path="external/safe-iop" revision="07073634e2e3aa4f518e36ed5dec3aabc549d5fb"/>
|
||||
<!-- Information: screencap-gonk is tagged with B2G_1_0_0_20130125190500 --><project name="screencap-gonk" path="external/screencap-gonk" remote="b2g" revision="e6403c71e9eca8cb943739d5a0a192deac60fc51"/>
|
||||
<!-- Information: platform/external/skia is tagged with M8960AAAAANLYA100715A --><project name="platform/external/skia" path="external/skia" revision="7d90c85f2c0e3b747f7c7eff8bc9253b0063b439"/>
|
||||
<!-- Information: platform/external/sonivox is tagged with AU_LINUX_ANDROID_ICS_CHOCOLATE.04.00.04.05.324 --><project name="platform/external/sonivox" path="external/sonivox" revision="7c967779dfc61ac1f346e972de91d4bfce7dccbb"/>
|
||||
<!-- Information: platform/external/speex is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/speex" path="external/speex" revision="ebe6230a7f7c69f5a4389f2b09b7b19ef9e94f32"/>
|
||||
<!-- Information: platform/external/speex is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/speex" path="external/speex" revision="ebe6230a7f7c69f5a4389f2b09b7b19ef9e94f32"/>
|
||||
<project name="platform/external/sqlite" path="external/sqlite" revision="fb30e613139b8836fdc8e81e166cf3a76e5fa17f"/>
|
||||
<!-- Information: platform/external/stlport is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/stlport" path="external/stlport" revision="a6734e0645fce81c9610de0488b729207bfa576e"/>
|
||||
<!-- Information: platform/external/strace is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/strace" path="external/strace" revision="c9fd2e5ef7d002e12e7cf2512506c84a9414b0fd"/>
|
||||
<!-- Information: platform/external/tagsoup is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/tagsoup" path="external/tagsoup" revision="68c2ec9e0acdb3214b7fb91dbab8c9fab8736817"/>
|
||||
<!-- Information: platform/external/stlport is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/stlport" path="external/stlport" revision="a6734e0645fce81c9610de0488b729207bfa576e"/>
|
||||
<!-- Information: platform/external/strace is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/strace" path="external/strace" revision="c9fd2e5ef7d002e12e7cf2512506c84a9414b0fd"/>
|
||||
<!-- Information: platform/external/tagsoup is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/tagsoup" path="external/tagsoup" revision="68c2ec9e0acdb3214b7fb91dbab8c9fab8736817"/>
|
||||
<!-- Information: platform/external/tinyalsa is tagged with AU_LINUX_ANDROID_ICS_CHOCOLATE.04.00.04.05.324 --><project name="platform/external/tinyalsa" path="external/tinyalsa" revision="06cc244ee512c1352215e543615738bc8ac82814"/>
|
||||
<!-- Information: platform/external/tremolo is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/tremolo" path="external/tremolo" revision="25bd78d2392dbdc879ae53382cde9d019f79cf6f"/>
|
||||
<!-- Information: platform/external/tremolo is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/tremolo" path="external/tremolo" revision="25bd78d2392dbdc879ae53382cde9d019f79cf6f"/>
|
||||
<!-- Information: unbootimg is tagged with B2G_1_0_0_20130125190500 --><project name="unbootimg" path="external/unbootimg" remote="b2g" revision="9464623d92eb8668544916dc5a8f4f6337d0bc08"/>
|
||||
<!-- Information: platform/external/webp is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/webp" path="external/webp" revision="88fe2b83c4b9232cd08729556fd0485d6a6a92cd"/>
|
||||
<!-- Information: platform/external/webrtc is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/webrtc" path="external/webrtc" revision="137024dc8a2e9251a471e20518a9c3ae06f81f23"/>
|
||||
<!-- Information: platform/external/wpa_supplicant is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/wpa_supplicant" path="external/wpa_supplicant" revision="a01d37870bbf9892d43e792e5de0683ca41c5497"/>
|
||||
<!-- Information: platform/external/webp is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/webp" path="external/webp" revision="88fe2b83c4b9232cd08729556fd0485d6a6a92cd"/>
|
||||
<!-- Information: platform/external/webrtc is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/webrtc" path="external/webrtc" revision="137024dc8a2e9251a471e20518a9c3ae06f81f23"/>
|
||||
<!-- Information: platform/external/wpa_supplicant is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/wpa_supplicant" path="external/wpa_supplicant" revision="a01d37870bbf9892d43e792e5de0683ca41c5497"/>
|
||||
<!-- Information: platform/external/hostap is tagged with M8960AAAAANLYA1047 --><project name="platform/external/hostap" path="external/hostap" revision="bf04b0faadbdeb4b7943f2e2c4c5aa59df872bb1"/>
|
||||
<!-- Information: platform/external/zlib is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.00.01.19.008 --><project name="platform/external/zlib" path="external/zlib" revision="f96a1d1ebfdf1cd582210fd09c23d8f59e0ae094"/>
|
||||
<!-- Information: platform/external/yaffs2 is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/yaffs2" path="external/yaffs2" revision="0afa916204c664b3114429637b63af1321a0aeca"/>
|
||||
<!-- Information: platform/external/yaffs2 is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/yaffs2" path="external/yaffs2" revision="0afa916204c664b3114429637b63af1321a0aeca"/>
|
||||
<!-- Information: platform/frameworks/base is tagged with M76XXUSNEKNLYA2040 --><project name="platform/frameworks/base" path="frameworks/base" revision="eb2bc75803ca179353c24c364a9c8a8ce23e8b78"/>
|
||||
<!-- Information: platform/frameworks/opt/emoji is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/frameworks/opt/emoji" path="frameworks/opt/emoji" revision="a95d8db002770469d72dfaf59ff37ac96db29a87"/>
|
||||
<!-- Information: platform/frameworks/opt/emoji is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/frameworks/opt/emoji" path="frameworks/opt/emoji" revision="a95d8db002770469d72dfaf59ff37ac96db29a87"/>
|
||||
<!-- Information: platform/frameworks/support is tagged with AU_LINUX_ANDROID_ICS_CHOCOLATE.04.00.04.05.324 --><project name="platform/frameworks/support" path="frameworks/support" revision="27208692b001981f1806f4f396434f4eac78b909"/>
|
||||
<!-- Information: platform/hardware/libhardware is tagged with M8960AAAAANLYA1049B --><project name="platform/hardware/libhardware" path="hardware/libhardware" revision="4a619901847621f8a7305edf42dd07347a140484"/>
|
||||
<!-- Information: platform/hardware/libhardware_legacy is tagged with M8960AAAAANLYA153611 --><project name="platform/hardware/libhardware_legacy" path="hardware/libhardware_legacy" revision="87b4d7afa8f854b445e2d0d95091f6f6069f2b30"/>
|
||||
<!-- Information: platform/libcore is tagged with M8960AAAAANLYA100715A --><project name="platform/libcore" path="libcore" revision="30841f9fba9ccd5c54f4f079f495994db97f283e"/>
|
||||
<!-- Information: platform/ndk is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/ndk" path="ndk" revision="9f555971e1481854d5b4dc11b3e6af9fff4f241f"/>
|
||||
<!-- Information: platform/ndk is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/ndk" path="ndk" revision="9f555971e1481854d5b4dc11b3e6af9fff4f241f"/>
|
||||
<!-- Information: platform/prebuilt is tagged with AU_LINUX_ANDROID_ICS_CHOCOLATE.04.00.04.05.324 --><project name="platform/prebuilt" path="prebuilt" revision="447ea790fcc957dde59730ecc2a65ca263bdc733"/>
|
||||
<!-- Information: platform/system/bluetooth is tagged with M8960AAAAANLYA100703 --><project name="platform/system/bluetooth" path="system/bluetooth" revision="7772cad4823f1f427ce1d4df84a55982386d6d18"/>
|
||||
<!-- Information: platform/system/core is tagged with M76XXUSNEKNLYA2040 --><project name="platform/system/core" path="system/core" revision="bf1970408676ce570b8f4dc3efa038e47552137f"/>
|
||||
|
@ -1,7 +1,7 @@
|
||||
[
|
||||
{
|
||||
"size": 677418796,
|
||||
"digest": "34f8e675382cbd6acc8803a540c9ecd51641f24679b3803ff585176c1ba5b869989bed070ee6db79f70d4875d16ad6b4cb2e676e24caca4012874574d3899d2c",
|
||||
"size": 677817512,
|
||||
"digest": "746a6acd08be2065a077ba860df4be8ca53bca16ea868911407b8d3dc4fc2becd8cee2c88d51e8bfce4f07caa37184b91ba4d6afba937a25b424142a6e605fdc",
|
||||
"algorithm": "sha512",
|
||||
"filename": "gonk.tar.xz"
|
||||
},
|
||||
|
@ -4,78 +4,79 @@
|
||||
|
||||
<remote fetch="https://android.googlesource.com/" name="aosp"/>
|
||||
<remote fetch="git://github.com/mozilla-b2g/" name="b2g"/>
|
||||
<remote fetch="git://android.git.linaro.org/" name="linaro"/>
|
||||
<remote fetch="http://android.git.linaro.org/git-ro/" name="linaro"/>
|
||||
<remote fetch="git://codeaurora.org/" name="caf"/>
|
||||
<remote fetch="git://github.com/mozilla/" name="mozilla"/>
|
||||
<remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
|
||||
<default remote="linaro" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/>
|
||||
<default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/>
|
||||
|
||||
<!-- Gonk specific things and forks -->
|
||||
<project name="platform_build" path="build" remote="b2g" revision="43434d6cdbf702e6197e0791f19406860284edf6">
|
||||
<project name="platform_build" path="build" remote="b2g" revision="777bee02feb43f8f29644f9d09ea7fe01d03f127">
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<!-- Information: fake-dalvik is tagged with B2G_1_0_0_20130125190500 --><project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c6fc2e70b2586fe45db4b676567be2aa94cf420e"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="8e68d41728675fc72502dc572dec523c2c8abb8a"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="f634b3d50effdd42828cc757c01fdbf74e562a36"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="62f94a26d34c1f1e1846efd58d34363c051e8c66"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="e1569feeb10891a55193e36b4a3939742151b05f"/>
|
||||
|
||||
<!-- Stock Android things -->
|
||||
<!-- Information: platform/abi/cpp is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
|
||||
<!-- Information: platform/abi/cpp is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
|
||||
<project name="platform/bionic" path="bionic" revision="c7bab8cb8483e7869eabdbd4add7c9e5beeecc80"/>
|
||||
<!-- Information: platform/bootable/recovery is tagged with android-4.0.4_r2.1 --><project name="platform/bootable/recovery" path="bootable/recovery" revision="fadc5ac81d6400ebdd041f7d4ea64021596d6b7d"/>
|
||||
<!-- Information: device/common is tagged with android-sdk-adt_r20 --><project name="device/common" path="device/common" revision="7d4526582f88808a3194e1a3b304abb369d2745c"/>
|
||||
<!-- Information: device/sample is tagged with android-4.0.4_r2.1 --><project name="device/sample" path="device/sample" revision="ef228b8b377a9663e94be4b1aeb6c2bf7a07d098"/>
|
||||
<project name="platform_external_apriori" path="external/apriori" remote="b2g" revision="2c3a7113299eb789a076be23449d868b3bfa07fd"/>
|
||||
<!-- Information: platform/external/bluetooth/bluez is tagged with android-4.0.4_r2.1 --><project name="platform/external/bluetooth/bluez" path="external/bluetooth/bluez" revision="966afbd88f0bfc325bf80274ad2723c238883fa1"/>
|
||||
<!-- Information: platform/external/bluetooth/glib is tagged with android-4.1.1_r6.1 --><project name="platform/external/bluetooth/glib" path="external/bluetooth/glib" revision="1143b9918eab068401b604eb11c3f651f4e38b25"/>
|
||||
<!-- Information: platform/external/bluetooth/hcidump is tagged with android-4.1.1_r6.1 --><project name="platform/external/bluetooth/hcidump" path="external/bluetooth/hcidump" revision="7322661808c2006b7848e79e6bb72b37fbcf6710"/>
|
||||
<!-- Information: platform/external/bsdiff is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/bsdiff" path="external/bsdiff" revision="81872540236d9bb15cccf963d05b9de48baa5375"/>
|
||||
<!-- Information: platform/external/bluetooth/glib is tagged with android-cts-4.1_r2 --><project name="platform/external/bluetooth/glib" path="external/bluetooth/glib" revision="1143b9918eab068401b604eb11c3f651f4e38b25"/>
|
||||
<!-- Information: platform/external/bluetooth/hcidump is tagged with android-cts-4.1_r2 --><project name="platform/external/bluetooth/hcidump" path="external/bluetooth/hcidump" revision="7322661808c2006b7848e79e6bb72b37fbcf6710"/>
|
||||
<!-- Information: platform/external/bsdiff is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/bsdiff" path="external/bsdiff" revision="81872540236d9bb15cccf963d05b9de48baa5375"/>
|
||||
<project name="platform/external/busybox" path="external/busybox" remote="linaro" revision="2e461c8029a50d986dfe4ab07ae5a1834b5c40f0"/>
|
||||
<!-- Information: platform/external/bzip2 is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/bzip2" path="external/bzip2" revision="048dacdca43eed1534689ececcf2781c63e1e4ba"/>
|
||||
<!-- Information: platform/external/dbus is tagged with android-4.1.1_r6.1 --><project name="platform/external/dbus" path="external/dbus" revision="537eaff5de9aace3348436166d4cde7adc1e488e"/>
|
||||
<!-- Information: platform/external/bzip2 is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/bzip2" path="external/bzip2" revision="048dacdca43eed1534689ececcf2781c63e1e4ba"/>
|
||||
<!-- Information: platform/external/dbus is tagged with android-cts-4.1_r2 --><project name="platform/external/dbus" path="external/dbus" revision="537eaff5de9aace3348436166d4cde7adc1e488e"/>
|
||||
<!-- Information: platform/external/dhcpcd is tagged with android-sdk-adt_r20 --><project name="platform/external/dhcpcd" path="external/dhcpcd" revision="ddaa48f57b54b2862b3e6dcf18a44c9647f3baaa"/>
|
||||
<!-- Information: platform/external/dnsmasq is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/dnsmasq" path="external/dnsmasq" revision="f621afad94df46204c25fc2593a19d704d2637f5"/>
|
||||
<!-- Information: platform/external/dnsmasq is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/dnsmasq" path="external/dnsmasq" revision="f621afad94df46204c25fc2593a19d704d2637f5"/>
|
||||
<project name="platform_external_elfcopy" path="external/elfcopy" remote="b2g" revision="62c1bed1c4505369cac2e72fbe30452a598fb690"/>
|
||||
<project name="platform_external_elfutils" path="external/elfutils" remote="b2g" revision="72940dec691fa3255e13df01f8c53b620e446066"/>
|
||||
<!-- Information: platform/external/expat is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/expat" path="external/expat" revision="6df134250feab71edb5915ecaa6268210bca76c5"/>
|
||||
<!-- Information: platform/external/fdlibm is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/fdlibm" path="external/fdlibm" revision="988ffeb12a6e044ae3504838ef1fee3fe0716934"/>
|
||||
<!-- Information: platform/external/flac is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/flac" path="external/flac" revision="5893fbe890f5dab8e4146d2baa4bd2691c0739e0"/>
|
||||
<!-- Information: platform/external/freetype is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/freetype" path="external/freetype" revision="aeb407daf3711a10a27f3bc2223c5eb05158076e"/>
|
||||
<!-- Information: platform/external/giflib is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/giflib" path="external/giflib" revision="b2597268aef084202a8c349d1cc072c03c6e22eb"/>
|
||||
<project name="platform/external/gtest" path="external/gtest" remote="linaro" revision="8c212ebe53bb2baab3575f03069016f1fb11e449"/>
|
||||
<!-- Information: platform/external/expat is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/expat" path="external/expat" revision="6df134250feab71edb5915ecaa6268210bca76c5"/>
|
||||
<!-- Information: platform/external/fdlibm is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/fdlibm" path="external/fdlibm" revision="988ffeb12a6e044ae3504838ef1fee3fe0716934"/>
|
||||
<!-- Information: platform/external/flac is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/flac" path="external/flac" revision="5893fbe890f5dab8e4146d2baa4bd2691c0739e0"/>
|
||||
<!-- Information: platform/external/freetype is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/freetype" path="external/freetype" revision="aeb407daf3711a10a27f3bc2223c5eb05158076e"/>
|
||||
<!-- Information: platform/external/giflib is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/giflib" path="external/giflib" revision="b2597268aef084202a8c349d1cc072c03c6e22eb"/>
|
||||
<project name="platform/external/gtest" path="external/gtest" revision="8c212ebe53bb2baab3575f03069016f1fb11e449"/>
|
||||
<!-- Information: platform/external/harfbuzz is tagged with android-sdk-adt_r20 --><project name="platform/external/harfbuzz" path="external/harfbuzz" revision="bae491c03a00757d83ede8d855b7d85d246bde3d"/>
|
||||
<!-- Information: platform/external/icu4c is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/icu4c" path="external/icu4c" revision="0fa67b93b831c6636ca18b152a1b1b14cc99b034"/>
|
||||
<!-- Information: platform/external/iptables is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/iptables" path="external/iptables" revision="3b2deb17f065c5664bb25e1a28489e5792eb63ff"/>
|
||||
<!-- Information: platform/external/jhead is tagged with android-4.0.4_r2.1 --><project name="platform/external/jhead" path="external/jhead" revision="754078052c687f6721536009c816644c73e4f145"/>
|
||||
<!-- Information: platform/external/jpeg is tagged with android-4.1.1_r6.1 --><project name="platform/external/jpeg" path="external/jpeg" revision="d4fad7f50f79626455d88523207e05b868819cd8"/>
|
||||
<!-- Information: platform/external/libgsm is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/libgsm" path="external/libgsm" revision="5e4516958690b9a1b2c98f88eeecba3edd2dbda4"/>
|
||||
<!-- Information: platform/external/liblzf is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/liblzf" path="external/liblzf" revision="6946aa575b0949d045722794850896099d937cbb"/>
|
||||
<!-- Information: platform/external/icu4c is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/icu4c" path="external/icu4c" revision="0fa67b93b831c6636ca18b152a1b1b14cc99b034"/>
|
||||
<!-- Information: platform/external/iptables is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/iptables" path="external/iptables" revision="3b2deb17f065c5664bb25e1a28489e5792eb63ff"/>
|
||||
<!-- Information: platform/external/jhead is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/jhead" path="external/jhead" revision="754078052c687f6721536009c816644c73e4f145"/>
|
||||
<!-- Information: platform/external/jpeg is tagged with android-cts-4.1_r2 --><project name="platform/external/jpeg" path="external/jpeg" revision="d4fad7f50f79626455d88523207e05b868819cd8"/>
|
||||
<!-- Information: platform/external/libgsm is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/libgsm" path="external/libgsm" revision="5e4516958690b9a1b2c98f88eeecba3edd2dbda4"/>
|
||||
<!-- Information: platform/external/liblzf is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/liblzf" path="external/liblzf" revision="6946aa575b0949d045722794850896099d937cbb"/>
|
||||
<!-- Information: platform/external/libnfc-nxp is tagged with android-4.0.4_r2.1 --><project name="platform/external/libnfc-nxp" path="external/libnfc-nxp" revision="533c14450e6239cce8acb74f4e4dea2c89f8f219"/>
|
||||
<!-- Information: platform/external/libnl-headers is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/libnl-headers" path="external/libnl-headers" revision="6ccf7349d61f73ac26a0675d735d903ab919c658"/>
|
||||
<!-- Information: platform/external/libnl-headers is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/libnl-headers" path="external/libnl-headers" revision="6ccf7349d61f73ac26a0675d735d903ab919c658"/>
|
||||
<!-- Information: platform/external/libpng is tagged with android-4.0.4_r2.1 --><project name="platform/external/libpng" path="external/libpng" revision="84d92c718ab9f48faec0f640747c4b6f7a995607"/>
|
||||
<!-- Information: platform/external/libvpx is tagged with M8960AAAAANLYA1519349 --><project name="platform/external/libvpx" path="external/libvpx" revision="3a40da0d96da5c520e7707aa14f48a80956e20d7"/>
|
||||
<!-- Information: platform/external/mksh is tagged with M8960AAAAANLYA1099D --><project name="platform/external/mksh" path="external/mksh" revision="5155f1c7438ef540d7b25eb70aa1639579795b07"/>
|
||||
<!-- Information: platform_external_opensans is tagged with B2G_1_0_0_20130125190500 --><project name="platform_external_opensans" path="external/opensans" remote="b2g" revision="b5b4c226ca1d71e936153cf679dda6d3d60e2354"/>
|
||||
<!-- Information: platform/external/openssl is tagged with android-4.0.4_r2.1 --><project name="platform/external/openssl" path="external/openssl" revision="ce96fb211b9a44bbd7fb5ef7ed0e6c1244045c2e"/>
|
||||
<!-- Information: platform/external/protobuf is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/protobuf" path="external/protobuf" revision="e217977611c52bccde7f7c78e1d3c790c6357431"/>
|
||||
<!-- Information: platform/external/safe-iop is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/safe-iop" path="external/safe-iop" revision="07073634e2e3aa4f518e36ed5dec3aabc549d5fb"/>
|
||||
<!-- Information: platform/external/protobuf is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/protobuf" path="external/protobuf" revision="e217977611c52bccde7f7c78e1d3c790c6357431"/>
|
||||
<!-- Information: platform/external/safe-iop is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/safe-iop" path="external/safe-iop" revision="07073634e2e3aa4f518e36ed5dec3aabc549d5fb"/>
|
||||
<!-- Information: screencap-gonk is tagged with B2G_1_0_0_20130125190500 --><project name="screencap-gonk" path="external/screencap-gonk" remote="b2g" revision="e6403c71e9eca8cb943739d5a0a192deac60fc51"/>
|
||||
<!-- Information: platform/external/skia is tagged with android-4.0.4_r2.1 --><project name="platform/external/skia" path="external/skia" revision="5c67a309e16bffe7013defda8f1217b3ce2420b4"/>
|
||||
<!-- Information: platform/external/sonivox is tagged with android-sdk-adt_r20 --><project name="platform/external/sonivox" path="external/sonivox" revision="5f9600971859fe072f31b38a51c38157f5f9b381"/>
|
||||
<!-- Information: platform/external/speex is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/speex" path="external/speex" revision="ebe6230a7f7c69f5a4389f2b09b7b19ef9e94f32"/>
|
||||
<!-- Information: platform/external/speex is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/speex" path="external/speex" revision="ebe6230a7f7c69f5a4389f2b09b7b19ef9e94f32"/>
|
||||
<!-- Information: platform/external/sqlite is tagged with android-4.0.4_r2.1 --><project name="platform/external/sqlite" path="external/sqlite" revision="c999ff8c12a4cf81cb9ad628f47b2720effba5e5"/>
|
||||
<!-- Information: platform/external/stlport is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/stlport" path="external/stlport" revision="a6734e0645fce81c9610de0488b729207bfa576e"/>
|
||||
<!-- Information: platform/external/strace is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/strace" path="external/strace" revision="c9fd2e5ef7d002e12e7cf2512506c84a9414b0fd"/>
|
||||
<!-- Information: platform/external/tagsoup is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/tagsoup" path="external/tagsoup" revision="68c2ec9e0acdb3214b7fb91dbab8c9fab8736817"/>
|
||||
<!-- Information: platform/external/stlport is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/stlport" path="external/stlport" revision="a6734e0645fce81c9610de0488b729207bfa576e"/>
|
||||
<!-- Information: platform/external/strace is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/strace" path="external/strace" revision="c9fd2e5ef7d002e12e7cf2512506c84a9414b0fd"/>
|
||||
<!-- Information: platform/external/tagsoup is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/tagsoup" path="external/tagsoup" revision="68c2ec9e0acdb3214b7fb91dbab8c9fab8736817"/>
|
||||
<!-- Information: platform/external/tinyalsa is tagged with android-4.0.4_r2.1 --><project name="platform/external/tinyalsa" path="external/tinyalsa" revision="495239e683a728957c890c124b239f9b7b8ef5a8"/>
|
||||
<!-- Information: platform/external/tremolo is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/tremolo" path="external/tremolo" revision="25bd78d2392dbdc879ae53382cde9d019f79cf6f"/>
|
||||
<!-- Information: platform/external/webp is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/webp" path="external/webp" revision="88fe2b83c4b9232cd08729556fd0485d6a6a92cd"/>
|
||||
<!-- Information: platform/external/tremolo is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/tremolo" path="external/tremolo" revision="25bd78d2392dbdc879ae53382cde9d019f79cf6f"/>
|
||||
<!-- Information: platform/external/webp is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/webp" path="external/webp" revision="88fe2b83c4b9232cd08729556fd0485d6a6a92cd"/>
|
||||
<!-- Information: platform/external/webrtc is tagged with android-sdk-adt_r20 --><project name="platform/external/webrtc" path="external/webrtc" revision="4b6dc1ec58105d17dc8c2f550124cc0621dc93b7"/>
|
||||
<!-- Information: platform/external/wpa_supplicant is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/external/wpa_supplicant" path="external/wpa_supplicant" revision="a01d37870bbf9892d43e792e5de0683ca41c5497"/>
|
||||
<!-- Information: platform/external/wpa_supplicant is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/wpa_supplicant" path="external/wpa_supplicant" revision="a01d37870bbf9892d43e792e5de0683ca41c5497"/>
|
||||
<project name="platform/external/wpa_supplicant_8" path="external/wpa_supplicant_8" revision="6dd24fc3792d71edccef9b09140f9a44b063a553"/>
|
||||
<!-- Information: platform/external/zlib is tagged with android-4.0.4_r2.1 --><project name="platform/external/zlib" path="external/zlib" revision="69e5801bd16a495e1c1666669fe827b1ddb8d56b"/>
|
||||
<!-- Information: platform/external/yaffs2 is tagged with android-4.0.4-aah_r1 --><project name="platform/external/yaffs2" path="external/yaffs2" revision="6232e2d5ab34a40d710e4b05ab0ec6e3727804e7"/>
|
||||
<!-- Information: platform/frameworks/base is tagged with android-4.0.4_r2.1 --><project name="platform/frameworks/base" path="frameworks/base" revision="df331873c8576e0ae34ae1ee3cc258beed373535"/>
|
||||
<!-- Information: platform/frameworks/opt/emoji is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.013 --><project name="platform/frameworks/opt/emoji" path="frameworks/opt/emoji" revision="a95d8db002770469d72dfaf59ff37ac96db29a87"/>
|
||||
<!-- Information: platform/frameworks/opt/emoji is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/frameworks/opt/emoji" path="frameworks/opt/emoji" revision="a95d8db002770469d72dfaf59ff37ac96db29a87"/>
|
||||
<!-- Information: platform/frameworks/support is tagged with android-4.0.4_r2.1 --><project name="platform/frameworks/support" path="frameworks/support" revision="bfc8e01b7b0d5ea70ce89d0409b72b7f7d540f43"/>
|
||||
<!-- Information: platform/hardware/libhardware is tagged with android-4.0.4_r2.1 --><project name="platform/hardware/libhardware" path="hardware/libhardware" revision="a9b677fce432b29ab8f61e13796f34880dc0fe0f"/>
|
||||
<!-- Information: platform/hardware/libhardware_legacy is tagged with android-4.0.4_r2.1 --><project name="platform/hardware/libhardware_legacy" path="hardware/libhardware_legacy" revision="153d0f1a27e0a157cabb6ca9d0d88248630f5695"/>
|
||||
@ -91,7 +92,7 @@
|
||||
<!-- Information: platform/system/vold is tagged with android-4.0.4_r2.1 --><project name="platform/system/vold" path="system/vold" revision="3ad9072a5d6f6bda32123b367545649364e3c11d"/>
|
||||
|
||||
<!-- Pandaboard specific things -->
|
||||
<project name="android-device-panda" path="device/ti/panda" remote="b2g" revision="eec93d3e9eb7765f63415e2ad42003a00b5996b4"/>
|
||||
<project name="android-device-panda" path="device/ti/panda" remote="b2g" revision="b0cde710220dc884fbf92934a4d54456ecc0c693"/>
|
||||
<!-- Information: platform/hardware/ti/omap4xxx is tagged with android-4.0.4_r2.1 --><project name="platform/hardware/ti/omap4xxx" path="hardware/ti/omap4xxx" revision="8be8e9a68c96b6cf43c08a58e7ecd7708737c599"/>
|
||||
<project name="platform/hardware/ti/wlan" path="hardware/ti/wlan" revision="60dfeb6e4448bfed707946ebca6612980f525e69"/>
|
||||
<project name="platform/hardware/ti/wpan" path="hardware/ti/wpan" revision="3ece7d9e08052989401e008bc397dbcd2557cfd0"/>
|
||||
|
@ -1,7 +1,7 @@
|
||||
[
|
||||
{
|
||||
"size": 832974796,
|
||||
"digest": "0d400c33d769af9573299628c8cc33516ffd21558e4625b4e4d4ce79c23293ea10a62dbd5a6056d2df3ca059bb5950309a667a64d08f35f896c2f30ae63285f6",
|
||||
"size": 833575768,
|
||||
"digest": "c8362a7cbfa1aa99eb0931fe9b6432496918e362b9ac675107c4177ea1a7ae0cc094970580c804213fb4cbe7ca4c40c30c92e2031482a425dff0a17bea3c94da",
|
||||
"algorithm": "sha512",
|
||||
"filename": "gonk.tar.xz"
|
||||
},
|
||||
|
@ -7,22 +7,21 @@
|
||||
<remote fetch="git://github.com/mozilla-b2g/" name="b2ggithub"/>
|
||||
<remote fetch="git://github.com/mozilla/" name="mozilla"/>
|
||||
<remote fetch="git://codeaurora.org/" name="caf"/>
|
||||
<remote fetch="git://android.git.linaro.org/" name="linaro"/>
|
||||
<remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
|
||||
<default remote="caf" revision="ics_chocolate_rb4.2" sync-j="4"/>
|
||||
|
||||
<!-- Gonk specific things and forks -->
|
||||
<project name="platform_build" path="build" remote="b2g" revision="43434d6cdbf702e6197e0791f19406860284edf6">
|
||||
<project name="platform_build" path="build" remote="b2g" revision="777bee02feb43f8f29644f9d09ea7fe01d03f127">
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<!-- Information: fake-dalvik is tagged with B2G_1_0_0_20130125190500 --><project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="8e68d41728675fc72502dc572dec523c2c8abb8a"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="f634b3d50effdd42828cc757c01fdbf74e562a36"/>
|
||||
<!-- Information: librecovery is tagged with B2G_1_0_0_20130125190500 --><project name="librecovery" path="librecovery" remote="b2g" revision="601fc18b28c9d7cf6954b281ddd3b705c74a9215"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="62f94a26d34c1f1e1846efd58d34363c051e8c66"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="e1569feeb10891a55193e36b4a3939742151b05f"/>
|
||||
|
||||
<!-- Stock Android things -->
|
||||
<!-- Information: platform/abi/cpp is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
|
||||
<!-- Information: platform/abi/cpp is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.028 --><project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
|
||||
<!-- Information: platform/bionic is tagged with M8960AAAAANLYA100715A --><project name="platform/bionic" path="bionic" revision="cd5dfce80bc3f0139a56b58aca633202ccaee7f8"/>
|
||||
<!-- Information: platform/bootable/recovery is tagged with M8960AAAAANLYA100715A --><project name="platform/bootable/recovery" path="bootable/recovery" revision="e0a9ac010df3afaa47ba107192c05ac8b5516435"/>
|
||||
<!-- Information: platform/development is tagged with M8960AAAAANLYA100715A --><project name="platform/development" path="development" revision="a384622f5fcb1d2bebb9102591ff7ae91fe8ed2d"/>
|
||||
@ -30,62 +29,62 @@
|
||||
<!-- Information: device/sample is tagged with M8960AAAAANLYA100715A --><project name="device/sample" path="device/sample" revision="c328f3d4409db801628861baa8d279fb8855892f"/>
|
||||
<project name="platform_external_apriori" path="external/apriori" remote="b2ggithub" revision="2c3a7113299eb789a076be23449d868b3bfa07fd"/>
|
||||
<!-- Information: platform/external/bluetooth/bluez is tagged with M76XXUSNEKNLYA2040 --><project name="platform/external/bluetooth/bluez" path="external/bluetooth/bluez" revision="1023c91c66e9c3bd1132480051993bf7827770f6"/>
|
||||
<!-- Information: platform/external/bluetooth/glib is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/bluetooth/glib" path="external/bluetooth/glib" revision="c6b49241cc1a8950723a5f74f8f4b4f4c3fa970e"/>
|
||||
<!-- Information: platform/external/bluetooth/glib is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/bluetooth/glib" path="external/bluetooth/glib" revision="c6b49241cc1a8950723a5f74f8f4b4f4c3fa970e"/>
|
||||
<!-- Information: platform/external/bluetooth/hcidump is tagged with AU_LINUX_ANDROID_ICS_CHOCOLATE.04.00.04.05.324 --><project name="platform/external/bluetooth/hcidump" path="external/bluetooth/hcidump" revision="02b1eb24fbb3d0135a81edb4a2175b1397308d7d"/>
|
||||
<!-- Information: platform/external/bsdiff is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/bsdiff" path="external/bsdiff" revision="81872540236d9bb15cccf963d05b9de48baa5375"/>
|
||||
<!-- Information: platform/external/bzip2 is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/bzip2" path="external/bzip2" revision="048dacdca43eed1534689ececcf2781c63e1e4ba"/>
|
||||
<!-- Information: platform/external/bsdiff is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/bsdiff" path="external/bsdiff" revision="81872540236d9bb15cccf963d05b9de48baa5375"/>
|
||||
<!-- Information: platform/external/bzip2 is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/bzip2" path="external/bzip2" revision="048dacdca43eed1534689ececcf2781c63e1e4ba"/>
|
||||
<!-- Information: platform/external/dbus is tagged with M8960AAAAANLYA100715A --><project name="platform/external/dbus" path="external/dbus" revision="c7517b6195dc6926728352113e6cc335da3f9c9e"/>
|
||||
<!-- Information: platform/external/dhcpcd is tagged with M8960AAAAANLYA100715A --><project name="platform/external/dhcpcd" path="external/dhcpcd" revision="1e00fb67022d0921af0fead263f81762781b9ffa"/>
|
||||
<!-- Information: platform/external/dnsmasq is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/dnsmasq" path="external/dnsmasq" revision="f621afad94df46204c25fc2593a19d704d2637f5"/>
|
||||
<!-- Information: platform/external/dnsmasq is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.028 --><project name="platform/external/dnsmasq" path="external/dnsmasq" revision="f621afad94df46204c25fc2593a19d704d2637f5"/>
|
||||
<project name="platform_external_elfcopy" path="external/elfcopy" remote="b2ggithub" revision="62c1bed1c4505369cac2e72fbe30452a598fb690"/>
|
||||
<project name="platform_external_elfutils" path="external/elfutils" remote="b2ggithub" revision="72940dec691fa3255e13df01f8c53b620e446066"/>
|
||||
<!-- Information: platform/external/e2fsprogs is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/e2fsprogs" path="external/e2fsprogs" revision="d5f550bb2f556c5d287f7c8d2b77223654bcec37"/>
|
||||
<!-- Information: platform/external/expat is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/expat" path="external/expat" revision="6df134250feab71edb5915ecaa6268210bca76c5"/>
|
||||
<!-- Information: platform/external/fdlibm is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/fdlibm" path="external/fdlibm" revision="988ffeb12a6e044ae3504838ef1fee3fe0716934"/>
|
||||
<!-- Information: platform/external/flac is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/flac" path="external/flac" revision="5893fbe890f5dab8e4146d2baa4bd2691c0739e0"/>
|
||||
<!-- Information: platform/external/freetype is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/freetype" path="external/freetype" revision="aeb407daf3711a10a27f3bc2223c5eb05158076e"/>
|
||||
<!-- Information: platform/external/giflib is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/giflib" path="external/giflib" revision="b2597268aef084202a8c349d1cc072c03c6e22eb"/>
|
||||
<project name="platform/external/gtest" path="external/gtest" remote="linaro" revision="8c212ebe53bb2baab3575f03069016f1fb11e449"/>
|
||||
<!-- Information: platform/external/harfbuzz is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/harfbuzz" path="external/harfbuzz" revision="116610d63a859521dacf00fb6818ee9ab2e666f6"/>
|
||||
<!-- Information: platform/external/icu4c is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/icu4c" path="external/icu4c" revision="0fa67b93b831c6636ca18b152a1b1b14cc99b034"/>
|
||||
<!-- Information: platform/external/iptables is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/iptables" path="external/iptables" revision="3b2deb17f065c5664bb25e1a28489e5792eb63ff"/>
|
||||
<!-- Information: platform/external/e2fsprogs is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/e2fsprogs" path="external/e2fsprogs" revision="d5f550bb2f556c5d287f7c8d2b77223654bcec37"/>
|
||||
<!-- Information: platform/external/expat is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/expat" path="external/expat" revision="6df134250feab71edb5915ecaa6268210bca76c5"/>
|
||||
<!-- Information: platform/external/fdlibm is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/fdlibm" path="external/fdlibm" revision="988ffeb12a6e044ae3504838ef1fee3fe0716934"/>
|
||||
<!-- Information: platform/external/flac is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/flac" path="external/flac" revision="5893fbe890f5dab8e4146d2baa4bd2691c0739e0"/>
|
||||
<!-- Information: platform/external/freetype is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/freetype" path="external/freetype" revision="aeb407daf3711a10a27f3bc2223c5eb05158076e"/>
|
||||
<!-- Information: platform/external/giflib is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.028 --><project name="platform/external/giflib" path="external/giflib" revision="b2597268aef084202a8c349d1cc072c03c6e22eb"/>
|
||||
<project name="platform/external/gtest" path="external/gtest" revision="8c212ebe53bb2baab3575f03069016f1fb11e449"/>
|
||||
<!-- Information: platform/external/harfbuzz is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/harfbuzz" path="external/harfbuzz" revision="116610d63a859521dacf00fb6818ee9ab2e666f6"/>
|
||||
<!-- Information: platform/external/icu4c is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/icu4c" path="external/icu4c" revision="0fa67b93b831c6636ca18b152a1b1b14cc99b034"/>
|
||||
<!-- Information: platform/external/iptables is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/iptables" path="external/iptables" revision="3b2deb17f065c5664bb25e1a28489e5792eb63ff"/>
|
||||
<!-- Information: platform/external/jpeg is tagged with AU_LINUX_ANDROID_ICS_CHOCOLATE.04.00.04.05.324 --><project name="platform/external/jpeg" path="external/jpeg" revision="a62e464d672a4623233180e4023034bf825f066e"/>
|
||||
<!-- Information: platform/external/libgsm is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/libgsm" path="external/libgsm" revision="5e4516958690b9a1b2c98f88eeecba3edd2dbda4"/>
|
||||
<!-- Information: platform/external/liblzf is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/liblzf" path="external/liblzf" revision="6946aa575b0949d045722794850896099d937cbb"/>
|
||||
<!-- Information: platform/external/libnfc-nxp is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/libnfc-nxp" path="external/libnfc-nxp" revision="3a912b065a31a72c63ad56ac224cfeaa933423b6"/>
|
||||
<!-- Information: platform/external/libnl-headers is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/libnl-headers" path="external/libnl-headers" revision="6ccf7349d61f73ac26a0675d735d903ab919c658"/>
|
||||
<!-- Information: platform/external/libgsm is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/libgsm" path="external/libgsm" revision="5e4516958690b9a1b2c98f88eeecba3edd2dbda4"/>
|
||||
<!-- Information: platform/external/liblzf is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/liblzf" path="external/liblzf" revision="6946aa575b0949d045722794850896099d937cbb"/>
|
||||
<!-- Information: platform/external/libnfc-nxp is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.028 --><project name="platform/external/libnfc-nxp" path="external/libnfc-nxp" revision="3a912b065a31a72c63ad56ac224cfeaa933423b6"/>
|
||||
<!-- Information: platform/external/libnl-headers is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/libnl-headers" path="external/libnl-headers" revision="6ccf7349d61f73ac26a0675d735d903ab919c658"/>
|
||||
<!-- Information: platform/external/libpng is tagged with M8960AAAAANLYA100715A --><project name="platform/external/libpng" path="external/libpng" revision="9c3730f0efa69f580f03463c237cd928f3196404"/>
|
||||
<!-- Information: platform/external/libvpx is tagged with M8960AAAAANLYA1519349 --><project name="platform/external/libvpx" path="external/libvpx" revision="3a40da0d96da5c520e7707aa14f48a80956e20d7"/>
|
||||
<!-- Information: platform/external/llvm is tagged with AU_LINUX_ANDROID_ICS_CHOCOLATE.04.00.04.05.324 --><project name="platform/external/llvm" path="external/llvm" revision="bff5923831940309f7d8ddbff5826ca6ed2dc050"/>
|
||||
<!-- Information: platform/external/mksh is tagged with AU_LINUX_ANDROID_ICS_CHOCOLATE.04.00.04.05.324 --><project name="platform/external/mksh" path="external/mksh" revision="ec646e8f5e7dac9a77d1de549c6ed92c04d0cd4b"/>
|
||||
<!-- Information: platform_external_opensans is tagged with B2G_1_0_0_20130125190500 --><project name="platform_external_opensans" path="external/opensans" remote="b2g" revision="b5b4c226ca1d71e936153cf679dda6d3d60e2354"/>
|
||||
<!-- Information: platform/external/openssl is tagged with AU_LINUX_ANDROID_ICS.04.00.04.00.110 --><project name="platform/external/openssl" path="external/openssl" revision="27d333cce9a31c806b4bfa042925f045c727aecd"/>
|
||||
<!-- Information: platform/external/protobuf is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/protobuf" path="external/protobuf" revision="e217977611c52bccde7f7c78e1d3c790c6357431"/>
|
||||
<!-- Information: platform/external/safe-iop is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/safe-iop" path="external/safe-iop" revision="07073634e2e3aa4f518e36ed5dec3aabc549d5fb"/>
|
||||
<!-- Information: platform/external/protobuf is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/protobuf" path="external/protobuf" revision="e217977611c52bccde7f7c78e1d3c790c6357431"/>
|
||||
<!-- Information: platform/external/safe-iop is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/safe-iop" path="external/safe-iop" revision="07073634e2e3aa4f518e36ed5dec3aabc549d5fb"/>
|
||||
<!-- Information: screencap-gonk is tagged with B2G_1_0_0_20130125190500 --><project name="screencap-gonk" path="external/screencap-gonk" remote="b2g" revision="e6403c71e9eca8cb943739d5a0a192deac60fc51"/>
|
||||
<!-- Information: platform/external/skia is tagged with M8960AAAAANLYA100715A --><project name="platform/external/skia" path="external/skia" revision="7d90c85f2c0e3b747f7c7eff8bc9253b0063b439"/>
|
||||
<!-- Information: platform/external/sonivox is tagged with AU_LINUX_ANDROID_ICS_CHOCOLATE.04.00.04.05.324 --><project name="platform/external/sonivox" path="external/sonivox" revision="7c967779dfc61ac1f346e972de91d4bfce7dccbb"/>
|
||||
<!-- Information: platform/external/speex is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/speex" path="external/speex" revision="ebe6230a7f7c69f5a4389f2b09b7b19ef9e94f32"/>
|
||||
<!-- Information: platform/external/speex is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/speex" path="external/speex" revision="ebe6230a7f7c69f5a4389f2b09b7b19ef9e94f32"/>
|
||||
<project name="platform/external/sqlite" path="external/sqlite" revision="fb30e613139b8836fdc8e81e166cf3a76e5fa17f"/>
|
||||
<!-- Information: platform/external/stlport is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/stlport" path="external/stlport" revision="a6734e0645fce81c9610de0488b729207bfa576e"/>
|
||||
<!-- Information: platform/external/strace is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/strace" path="external/strace" revision="c9fd2e5ef7d002e12e7cf2512506c84a9414b0fd"/>
|
||||
<!-- Information: platform/external/tagsoup is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/tagsoup" path="external/tagsoup" revision="68c2ec9e0acdb3214b7fb91dbab8c9fab8736817"/>
|
||||
<!-- Information: platform/external/stlport is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/stlport" path="external/stlport" revision="a6734e0645fce81c9610de0488b729207bfa576e"/>
|
||||
<!-- Information: platform/external/strace is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/strace" path="external/strace" revision="c9fd2e5ef7d002e12e7cf2512506c84a9414b0fd"/>
|
||||
<!-- Information: platform/external/tagsoup is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/tagsoup" path="external/tagsoup" revision="68c2ec9e0acdb3214b7fb91dbab8c9fab8736817"/>
|
||||
<!-- Information: platform/external/tinyalsa is tagged with AU_LINUX_ANDROID_ICS_CHOCOLATE.04.00.04.05.324 --><project name="platform/external/tinyalsa" path="external/tinyalsa" revision="06cc244ee512c1352215e543615738bc8ac82814"/>
|
||||
<!-- Information: platform/external/tremolo is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/tremolo" path="external/tremolo" revision="25bd78d2392dbdc879ae53382cde9d019f79cf6f"/>
|
||||
<!-- Information: platform/external/tremolo is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/tremolo" path="external/tremolo" revision="25bd78d2392dbdc879ae53382cde9d019f79cf6f"/>
|
||||
<!-- Information: unbootimg is tagged with B2G_1_0_0_20130125190500 --><project name="unbootimg" path="external/unbootimg" remote="b2g" revision="9464623d92eb8668544916dc5a8f4f6337d0bc08"/>
|
||||
<!-- Information: platform/external/webp is tagged with M8930AAAAANLYA2217182 --><project name="platform/external/webp" path="external/webp" revision="88fe2b83c4b9232cd08729556fd0485d6a6a92cd"/>
|
||||
<!-- Information: platform/external/webrtc is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/webrtc" path="external/webrtc" revision="137024dc8a2e9251a471e20518a9c3ae06f81f23"/>
|
||||
<!-- Information: platform/external/wpa_supplicant is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/wpa_supplicant" path="external/wpa_supplicant" revision="a01d37870bbf9892d43e792e5de0683ca41c5497"/>
|
||||
<!-- Information: platform/external/webp is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.01.00.19.028 --><project name="platform/external/webp" path="external/webp" revision="88fe2b83c4b9232cd08729556fd0485d6a6a92cd"/>
|
||||
<!-- Information: platform/external/webrtc is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/webrtc" path="external/webrtc" revision="137024dc8a2e9251a471e20518a9c3ae06f81f23"/>
|
||||
<!-- Information: platform/external/wpa_supplicant is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/wpa_supplicant" path="external/wpa_supplicant" revision="a01d37870bbf9892d43e792e5de0683ca41c5497"/>
|
||||
<!-- Information: platform/external/hostap is tagged with M8960AAAAANLYA1047 --><project name="platform/external/hostap" path="external/hostap" revision="bf04b0faadbdeb4b7943f2e2c4c5aa59df872bb1"/>
|
||||
<!-- Information: platform/external/zlib is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY.01.00.01.19.008 --><project name="platform/external/zlib" path="external/zlib" revision="f96a1d1ebfdf1cd582210fd09c23d8f59e0ae094"/>
|
||||
<!-- Information: platform/external/yaffs2 is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/external/yaffs2" path="external/yaffs2" revision="0afa916204c664b3114429637b63af1321a0aeca"/>
|
||||
<!-- Information: platform/external/yaffs2 is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/external/yaffs2" path="external/yaffs2" revision="0afa916204c664b3114429637b63af1321a0aeca"/>
|
||||
<!-- Information: platform/frameworks/base is tagged with M76XXUSNEKNLYA2040 --><project name="platform/frameworks/base" path="frameworks/base" revision="eb2bc75803ca179353c24c364a9c8a8ce23e8b78"/>
|
||||
<!-- Information: platform/frameworks/opt/emoji is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/frameworks/opt/emoji" path="frameworks/opt/emoji" revision="a95d8db002770469d72dfaf59ff37ac96db29a87"/>
|
||||
<!-- Information: platform/frameworks/opt/emoji is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/frameworks/opt/emoji" path="frameworks/opt/emoji" revision="a95d8db002770469d72dfaf59ff37ac96db29a87"/>
|
||||
<!-- Information: platform/frameworks/support is tagged with AU_LINUX_ANDROID_ICS_CHOCOLATE.04.00.04.05.324 --><project name="platform/frameworks/support" path="frameworks/support" revision="27208692b001981f1806f4f396434f4eac78b909"/>
|
||||
<!-- Information: platform/hardware/libhardware is tagged with M8960AAAAANLYA1049B --><project name="platform/hardware/libhardware" path="hardware/libhardware" revision="4a619901847621f8a7305edf42dd07347a140484"/>
|
||||
<!-- Information: platform/hardware/libhardware_legacy is tagged with M8960AAAAANLYA153611 --><project name="platform/hardware/libhardware_legacy" path="hardware/libhardware_legacy" revision="87b4d7afa8f854b445e2d0d95091f6f6069f2b30"/>
|
||||
<!-- Information: platform/libcore is tagged with M8960AAAAANLYA100715A --><project name="platform/libcore" path="libcore" revision="30841f9fba9ccd5c54f4f079f495994db97f283e"/>
|
||||
<!-- Information: platform/ndk is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.032 --><project name="platform/ndk" path="ndk" revision="9f555971e1481854d5b4dc11b3e6af9fff4f241f"/>
|
||||
<!-- Information: platform/ndk is tagged with AU_LINUX_GECKO_ICS_STRAWBERRY_V1.01.00.01.19.039 --><project name="platform/ndk" path="ndk" revision="9f555971e1481854d5b4dc11b3e6af9fff4f241f"/>
|
||||
<!-- Information: platform/prebuilt is tagged with AU_LINUX_ANDROID_ICS_CHOCOLATE.04.00.04.05.324 --><project name="platform/prebuilt" path="prebuilt" revision="447ea790fcc957dde59730ecc2a65ca263bdc733"/>
|
||||
<!-- Information: platform/system/bluetooth is tagged with M8960AAAAANLYA100703 --><project name="platform/system/bluetooth" path="system/bluetooth" revision="7772cad4823f1f427ce1d4df84a55982386d6d18"/>
|
||||
<!-- Information: platform/system/core is tagged with M76XXUSNEKNLYA2040 --><project name="platform/system/core" path="system/core" revision="bf1970408676ce570b8f4dc3efa038e47552137f"/>
|
||||
|
@ -1030,7 +1030,11 @@ var SocialToolbar = {
|
||||
let anchor = navBar.getAttribute("mode") == "text" ?
|
||||
document.getAnonymousElementByAttribute(aToolbarButton, "class", "toolbarbutton-text") :
|
||||
document.getAnonymousElementByAttribute(aToolbarButton, "class", "toolbarbutton-icon");
|
||||
panel.openPopup(anchor, "bottomcenter topright", 0, 0, false, false);
|
||||
// Bug 849216 - open the popup in a setTimeout so we avoid the auto-rollup
|
||||
// handling from preventing it being opened in some cases.
|
||||
setTimeout(function() {
|
||||
panel.openPopup(anchor, "bottomcenter topright", 0, 0, false, false);
|
||||
}, 0);
|
||||
},
|
||||
|
||||
setPanelErrorMessage: function SocialToolbar_setPanelErrorMessage(aNotificationFrame) {
|
||||
|
@ -4737,6 +4737,7 @@ var TabsProgressListener = {
|
||||
if (aStateFlags & Ci.nsIWebProgressListener.STATE_STOP &&
|
||||
Components.isSuccessCode(aStatus) &&
|
||||
doc.documentURI.startsWith("about:") &&
|
||||
!doc.documentURI.toLowerCase().startsWith("about:blank") &&
|
||||
!doc.documentElement.hasAttribute("hasBrowserHandlers")) {
|
||||
// STATE_STOP may be received twice for documents, thus store an
|
||||
// attribute to ensure handling it just once.
|
||||
|
@ -237,7 +237,7 @@ let TopSitesStartView = {
|
||||
get _grid() { return document.getElementById("start-topsites-grid"); },
|
||||
|
||||
init: function init() {
|
||||
this._view = new TopSitesView(this._grid, 9, true);
|
||||
this._view = new TopSitesView(this._grid, 8, true);
|
||||
if (this._view.isFirstRun()) {
|
||||
let topsitesVbox = document.getElementById("start-topsites");
|
||||
topsitesVbox.setAttribute("hidden", "true");
|
||||
@ -258,11 +258,11 @@ let TopSitesSnappedView = {
|
||||
get _grid() { return document.getElementById("snapped-topsite-grid"); },
|
||||
|
||||
show: function show() {
|
||||
this._grid.arrangeItems(1, 9);
|
||||
this._grid.arrangeItems(1, 8);
|
||||
},
|
||||
|
||||
init: function() {
|
||||
this._view = new TopSitesView(this._grid, 9);
|
||||
this._view = new TopSitesView(this._grid, 8);
|
||||
if (this._view.isFirstRun()) {
|
||||
let topsitesVbox = document.getElementById("snapped-topsites");
|
||||
topsitesVbox.setAttribute("hidden", "true");
|
||||
|
@ -94,6 +94,7 @@ var BrowserUI = {
|
||||
window.addEventListener("MozImprecisePointer", this, true);
|
||||
|
||||
Services.prefs.addObserver("browser.tabs.tabsOnly", this, false);
|
||||
Services.prefs.addObserver("browser.cache.disk_cache_ssl", this, false);
|
||||
Services.obs.addObserver(this, "metro_viewstate_changed", false);
|
||||
|
||||
// Init core UI modules
|
||||
@ -528,8 +529,14 @@ var BrowserUI = {
|
||||
observe: function BrowserUI_observe(aSubject, aTopic, aData) {
|
||||
switch (aTopic) {
|
||||
case "nsPref:changed":
|
||||
if (aData == "browser.tabs.tabsOnly")
|
||||
this._updateTabsOnly();
|
||||
switch (aData) {
|
||||
case "browser.tabs.tabsOnly":
|
||||
this._updateTabsOnly();
|
||||
break;
|
||||
case "browser.cache.disk_cache_ssl":
|
||||
this._sslDiskCacheEnabled = Services.prefs.getBoolPref(aData);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case "metro_viewstate_changed":
|
||||
this._adjustDOMforViewState();
|
||||
@ -881,9 +888,8 @@ var BrowserUI = {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Desktop has a pref that allows users to override this. We do not
|
||||
// support that pref currently
|
||||
if (uri.schemeIs("https")) {
|
||||
// Don't capture HTTPS pages unless the user enabled it.
|
||||
if (uri.schemeIs("https") && !this.sslDiskCacheEnabled) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -891,6 +897,15 @@ var BrowserUI = {
|
||||
return true;
|
||||
},
|
||||
|
||||
_sslDiskCacheEnabled: null,
|
||||
|
||||
get sslDiskCacheEnabled() {
|
||||
if (this._sslDiskCacheEnabled === null) {
|
||||
this._sslDiskCacheEnabled = Services.prefs.getBoolPref("browser.cache.disk_cache_ssl");
|
||||
}
|
||||
return this._sslDiskCacheEnabled;
|
||||
},
|
||||
|
||||
supportsCommand : function(cmd) {
|
||||
var isSupported = false;
|
||||
switch (cmd) {
|
||||
|
@ -8,11 +8,6 @@
|
||||
@namespace url("http://www.w3.org/1999/xhtml");
|
||||
@namespace xul url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
|
||||
|
||||
/* make clicking on links stand out a bit (bug 532206) */
|
||||
* > *:not(embed):focus, * > *:focus > font {
|
||||
outline: 1px solid #8db8d8 !important;
|
||||
}
|
||||
|
||||
*:-moz-any-link:focus {
|
||||
outline-offset: -2px;
|
||||
}
|
||||
@ -103,24 +98,13 @@ select[size="1"] xul|scrollbarbutton {
|
||||
min-width: 16px;
|
||||
}
|
||||
|
||||
/* Override inverse OS themes */
|
||||
select,
|
||||
button,
|
||||
xul|button,
|
||||
* > input:not([type="image"]) {
|
||||
/* -moz-appearance: none !important; See bug 598421 for fixing the platform */
|
||||
/*border-radius: 3px;*/
|
||||
}
|
||||
|
||||
select[size],
|
||||
select[multiple],
|
||||
select[size][multiple],
|
||||
* > input:not([type="image"]) {
|
||||
|
||||
border-style: solid;
|
||||
border-color: #7d7d7d;
|
||||
color: #414141;
|
||||
/*background: white -moz-linear-gradient(top, rgba(115,115,115,0.5) 0, rgba(215,215,215,0.5) 3px, rgba(255,255,255,0.2) 16px);*/
|
||||
}
|
||||
|
||||
/* For both mouse and touch, single-selects are handled by the SelectHelper popup.
|
||||
@ -144,7 +128,6 @@ button {
|
||||
border-style: solid;
|
||||
border-color: #7d7d7d;
|
||||
color: #414141;
|
||||
/*background: white -moz-linear-gradient(top, rgba(255,255,255,0.2) 0, rgba(215,215,215,0.5) 18px, rgba(115,115,115,0.5) 100%);*/
|
||||
}
|
||||
|
||||
input[type="checkbox"] {
|
||||
@ -171,13 +154,6 @@ select[size="1"] {
|
||||
padding: 1px;
|
||||
}
|
||||
|
||||
textarea {
|
||||
/*
|
||||
resize: none;
|
||||
border-width: 1px;
|
||||
padding: 2px 1px 2px 1px;*/
|
||||
}
|
||||
|
||||
input[type="button"],
|
||||
input[type="submit"],
|
||||
input[type="reset"],
|
||||
@ -200,44 +176,10 @@ select > button {
|
||||
padding: 0px !important;
|
||||
border-radius: 0;
|
||||
color: #414141;
|
||||
/*
|
||||
background-size: 100% 90%;
|
||||
background-color: transparent;
|
||||
background-image: -moz-radial-gradient(bottom left, #bbbbbb 40%, #f5f5f5) !important;
|
||||
background-position: -15px center !important;
|
||||
background-repeat: no-repeat !important;
|
||||
*/
|
||||
/* Use to position an svg arrow on <select> element
|
||||
-moz-binding: url("chrome://browser/content/bindings/bindings.xml#select-button");*/
|
||||
position: relative !important;
|
||||
font-size: inherit;
|
||||
}
|
||||
|
||||
select[size]:focus,
|
||||
select[multiple]:focus,
|
||||
select[size][multiple]:focus,
|
||||
input[type="file"]:focus > input[type="text"],
|
||||
* > input:not([type="image"]):focus {
|
||||
/*
|
||||
outline: 0px !important;
|
||||
border-style: solid;
|
||||
border-color: rgb(94,128,153);
|
||||
background: white -moz-linear-gradient(top, rgba(27,113,177,0.5) 0, rgba(198,225,246,0.2) 3px, rgba(255,255,255,0.2) 16px); */
|
||||
}
|
||||
|
||||
select:not([size]):not([multiple]):focus,
|
||||
select[size="0"]:focus,
|
||||
select[size="1"]:focus,
|
||||
input[type="button"]:focus,
|
||||
input[type="submit"]:focus,
|
||||
input[type="reset"]:focus,
|
||||
button:focus {
|
||||
/*outline: 0px !important;
|
||||
border-style: solid;
|
||||
border-color: rgb(94,128,153);
|
||||
background: white -moz-linear-gradient(top, rgba(255,255,255,0.2) 0, rgba(198,225,256,0.2) 18px, rgba(27,113,177,0.5) 100%); */
|
||||
}
|
||||
|
||||
input[type="checkbox"]:focus,
|
||||
input[type="radio"]:focus {
|
||||
border-color: #99c6e0 !important;
|
||||
@ -303,16 +245,6 @@ audio > xul|videocontrols {
|
||||
-moz-binding: url("chrome://global/content/bindings/videocontrols.xml#touchControls");
|
||||
}
|
||||
|
||||
*:-moz-any-link:active,
|
||||
*[role=button]:active,
|
||||
button:active,
|
||||
input:active,
|
||||
option:active,
|
||||
select:active,
|
||||
label:active {
|
||||
background-color: rgba(141, 184, 216, 0.5) !important;
|
||||
}
|
||||
|
||||
/*
|
||||
* Enforce nearest scaling for video in order not to lose too much performance
|
||||
* after fixing bug 598736 ("Use higher-quality imageinterpolation on mobile")
|
||||
|
@ -75,7 +75,7 @@ function handleRequest(aSubject, aTopic, aData) {
|
||||
|
||||
browser.ownerDocument.defaultView.navigator.mozGetUserMediaDevices(
|
||||
function (devices) {
|
||||
prompt(browser, callID, params.audio, params.video, devices);
|
||||
prompt(browser, callID, params.audio, params.video || params.picture, devices);
|
||||
},
|
||||
function (error) {
|
||||
// bug 827146 -- In the future, the UI should catch NO_DEVICES_FOUND
|
||||
|
@ -309,6 +309,13 @@ toolbarbutton.bookmark-item > menupopup {
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
@media (min-resolution: 2dppx) {
|
||||
.bookmark-item > .toolbarbutton-icon,
|
||||
.bookmark-item > .menu-iconic-left > .menu-iconic-icon {
|
||||
image-rendering: -moz-crisp-edges;
|
||||
}
|
||||
}
|
||||
|
||||
#wrapper-personal-bookmarks[place="palette"] > .toolbarpaletteitem-box {
|
||||
background: url("chrome://browser/skin/places/bookmarksToolbar.png") no-repeat center;
|
||||
}
|
||||
|
@ -1015,7 +1015,7 @@ user_pref("camino.use_system_proxy_settings", false); // Camino-only, harmless t
|
||||
else:
|
||||
logsource = proc.stdout
|
||||
|
||||
if self.IS_DEBUG_BUILD and (self.IS_MAC or self.IS_LINUX) and symbolsPath and os.path.exists(symbolsPath):
|
||||
if self.IS_DEBUG_BUILD and symbolsPath and os.path.exists(symbolsPath):
|
||||
# Run each line through a function in fix_stack_using_bpsyms.py (uses breakpad symbol files)
|
||||
# This method is preferred for Tinderbox builds, since native symbols may have been stripped.
|
||||
sys.path.insert(0, utilityPath)
|
||||
|
@ -132,6 +132,7 @@ public class DoCommand {
|
||||
POWER ("power"),
|
||||
PROCESS ("process"),
|
||||
SUTUSERINFO ("sutuserinfo"),
|
||||
TEMPERATURE ("temperature"),
|
||||
GETAPPROOT ("getapproot"),
|
||||
TESTROOT ("testroot"),
|
||||
ALRT ("alrt"),
|
||||
@ -435,6 +436,8 @@ public class DoCommand {
|
||||
strReturn += "\n";
|
||||
strReturn += GetPowerInfo();
|
||||
strReturn += "\n";
|
||||
strReturn += GetTemperatureInfo();
|
||||
strReturn += "\n";
|
||||
strReturn += GetProcessInfo();
|
||||
strReturn += "\n";
|
||||
strReturn += GetSutUserInfo();
|
||||
@ -488,6 +491,10 @@ public class DoCommand {
|
||||
strReturn += GetSutUserInfo();
|
||||
break;
|
||||
|
||||
case TEMPERATURE:
|
||||
strReturn += GetTemperatureInfo();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -2636,6 +2643,33 @@ private void CancelNotification()
|
||||
return sRet;
|
||||
}
|
||||
|
||||
public String GetTemperatureInfo()
|
||||
{
|
||||
String sTempVal = "unknown";
|
||||
String sDeviceFile = "/sys/bus/platform/devices/temp_sensor_hwmon.0/temp1_input";
|
||||
try {
|
||||
pProc = Runtime.getRuntime().exec(this.getSuArgs("cat " + sDeviceFile));
|
||||
RedirOutputThread outThrd = new RedirOutputThread(pProc, null);
|
||||
outThrd.start();
|
||||
outThrd.joinAndStopRedirect(5000);
|
||||
String output = outThrd.strOutput;
|
||||
// this only works on pandas (with the temperature sensors turned
|
||||
// on), other platforms we just get a file not found error... we'll
|
||||
// just return "unknown" for that case
|
||||
try {
|
||||
sTempVal = String.valueOf(Integer.parseInt(output.trim()) / 1000.0);
|
||||
} catch (NumberFormatException e) {
|
||||
// not parsed! probably not a panda
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return "Temperature: " + sTempVal;
|
||||
}
|
||||
|
||||
// todo
|
||||
public String GetDiskInfo(String sPath)
|
||||
{
|
||||
|
@ -16,9 +16,6 @@ TARGET_CPU="${target_cpu}"
|
||||
TARGET_VENDOR="${target_vendor}"
|
||||
TARGET_OS="${target_os}"
|
||||
|
||||
MOZ_DEB_TIMESTAMP=`date +"%a, %d %b %Y %T %z" 2>&1`
|
||||
AC_SUBST(MOZ_DEB_TIMESTAMP)
|
||||
|
||||
dnl ========================================================
|
||||
dnl =
|
||||
dnl = Don't change the following two lines. Doing so breaks:
|
||||
@ -1422,11 +1419,13 @@ if test "$GNU_CC"; then
|
||||
# -Werror=return-type - catches missing returns, zero false positives
|
||||
# -Wtype-limits - catches overflow bugs, few false positives
|
||||
# -Wempty-body - catches bugs, e.g. "if (c); foo();", few false positives
|
||||
# -Wsign-compare - catches comparison of signed and unsigned types
|
||||
#
|
||||
_WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wall -Wpointer-arith -Wdeclaration-after-statement"
|
||||
MOZ_C_SUPPORTS_WARNING(-W, error=return-type, ac_c_has_werror_return_type)
|
||||
MOZ_C_SUPPORTS_WARNING(-W, type-limits, ac_c_has_wtype_limits)
|
||||
MOZ_C_SUPPORTS_WARNING(-W, empty-body, ac_c_has_wempty_body)
|
||||
MOZ_C_SUPPORTS_WARNING(-W, sign-compare, ac_c_has_sign_compare)
|
||||
|
||||
# Turn off the following warnings that -Wall turns on:
|
||||
# -Wno-unused - lots of violations in third-party code
|
||||
@ -1484,11 +1483,13 @@ if test "$GNU_CXX"; then
|
||||
# -Werror=return-type - catches missing returns, zero false positives
|
||||
# -Wtype-limits - catches overflow bugs, few false positives
|
||||
# -Wempty-body - catches bugs, e.g. "if (c); foo();", few false positives
|
||||
# -Wsign-compare - catches comparison of signed and unsigned types
|
||||
#
|
||||
_WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wall -Wpointer-arith -Woverloaded-virtual"
|
||||
MOZ_CXX_SUPPORTS_WARNING(-W, error=return-type, ac_cxx_has_werror_return_type)
|
||||
MOZ_CXX_SUPPORTS_WARNING(-W, type-limits, ac_cxx_has_wtype_limits)
|
||||
MOZ_CXX_SUPPORTS_WARNING(-W, empty-body, ac_cxx_has_wempty_body)
|
||||
MOZ_CXX_SUPPORTS_WARNING(-W, sign-compare, ac_c_has_sign_compare)
|
||||
|
||||
# Turn off the following warnings that -Wall turns on:
|
||||
# -Wno-invalid-offsetof - we use offsetof on non-POD types frequently
|
||||
|
@ -22,6 +22,11 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=575946
|
||||
|
||||
<pre id="test">
|
||||
<script class="testbody" type="text/javascript">
|
||||
const isOSXMtnLion = navigator.userAgent.indexOf("Mac OS X 10.8") != -1;
|
||||
|
||||
if (isOSXMtnLion) {
|
||||
todo(false, "Mountain Lion doesn't like this test (bug 788999)");
|
||||
} else {
|
||||
var fileNum = 1;
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
@ -131,7 +136,7 @@ var img = new Image;
|
||||
img.src = URL.createObjectURL(imgfile.slice(testBinaryData.length, testBinaryData.length + size + 1000));
|
||||
img.onload = imageLoadHandler;
|
||||
expectedTestCount++;
|
||||
|
||||
}
|
||||
</script>
|
||||
</pre>
|
||||
</body> </html>
|
||||
|
@ -18,6 +18,7 @@ nsDOMCommandEvent::nsDOMCommandEvent(mozilla::dom::EventTarget* aOwner,
|
||||
} else {
|
||||
mEventIsInternal = true;
|
||||
}
|
||||
SetIsDOMBinding();
|
||||
}
|
||||
|
||||
nsDOMCommandEvent::~nsDOMCommandEvent()
|
||||
|
@ -8,6 +8,7 @@
|
||||
|
||||
#include "nsIDOMCommandEvent.h"
|
||||
#include "nsDOMEvent.h"
|
||||
#include "mozilla/dom/CommandEventBinding.h"
|
||||
|
||||
class nsDOMCommandEvent : public nsDOMEvent,
|
||||
public nsIDOMCommandEvent
|
||||
@ -24,6 +25,20 @@ public:
|
||||
|
||||
// Forward to base class
|
||||
NS_FORWARD_TO_NSDOMEVENT
|
||||
|
||||
virtual JSObject* WrapObject(JSContext* aCx, JSObject* aScope)
|
||||
{
|
||||
return mozilla::dom::CommandEventBinding::Wrap(aCx, aScope, this);
|
||||
}
|
||||
|
||||
void InitCommandEvent(const nsAString& aType,
|
||||
bool aCanBubble,
|
||||
bool aCancelable,
|
||||
const nsAString& aCommand,
|
||||
mozilla::ErrorResult& aRv)
|
||||
{
|
||||
aRv = InitCommandEvent(aType, aCanBubble, aCancelable, aCommand);
|
||||
}
|
||||
};
|
||||
|
||||
#endif // nsDOMCommandEvent_h__
|
||||
|
@ -343,6 +343,24 @@ nsDOMEvent::InitFromCtor(const nsAString& aType,
|
||||
return InitEvent(aType, d.bubbles, d.cancelable);
|
||||
}
|
||||
|
||||
bool
|
||||
nsDOMEvent::Init(mozilla::dom::EventTarget* aGlobal)
|
||||
{
|
||||
bool trusted = false;
|
||||
nsCOMPtr<nsPIDOMWindow> w = do_QueryInterface(aGlobal);
|
||||
if (w) {
|
||||
nsCOMPtr<nsIDocument> d = do_QueryInterface(w->GetExtantDocument());
|
||||
if (d) {
|
||||
trusted = nsContentUtils::IsChromeDoc(d);
|
||||
nsIPresShell* s = d->GetShell();
|
||||
if (s) {
|
||||
InitPresContextData(s->GetPresContext());
|
||||
}
|
||||
}
|
||||
}
|
||||
return trusted;
|
||||
}
|
||||
|
||||
//static
|
||||
already_AddRefed<nsDOMEvent>
|
||||
nsDOMEvent::Constructor(const mozilla::dom::GlobalObject& aGlobal,
|
||||
@ -352,19 +370,7 @@ nsDOMEvent::Constructor(const mozilla::dom::GlobalObject& aGlobal,
|
||||
{
|
||||
nsCOMPtr<mozilla::dom::EventTarget> t = do_QueryInterface(aGlobal.Get());
|
||||
nsRefPtr<nsDOMEvent> e = nsDOMEvent::CreateEvent(t, nullptr, nullptr);
|
||||
|
||||
bool trusted = false;
|
||||
nsCOMPtr<nsPIDOMWindow> w = do_QueryInterface(t);
|
||||
if (w) {
|
||||
nsCOMPtr<nsIDocument> d = do_QueryInterface(w->GetExtantDocument());
|
||||
if (d) {
|
||||
trusted = nsContentUtils::IsChromeDoc(d);
|
||||
nsIPresShell* s = d->GetShell();
|
||||
if (s) {
|
||||
e->InitPresContextData(s->GetPresContext());
|
||||
}
|
||||
}
|
||||
}
|
||||
bool trusted = e->Init(t);
|
||||
aRv = e->InitEvent(aType, aParam.mBubbles, aParam.mCancelable);
|
||||
e->SetTrusted(trusted);
|
||||
return e.forget();
|
||||
|
@ -96,6 +96,9 @@ public:
|
||||
|
||||
void InitPresContextData(nsPresContext* aPresContext);
|
||||
|
||||
// Returns true if the event should be trusted.
|
||||
bool Init(mozilla::dom::EventTarget* aGlobal);
|
||||
|
||||
static PopupControlState GetEventPopupControlState(nsEvent *aEvent);
|
||||
|
||||
static void PopupAllowedEventsChanged();
|
||||
|
@ -40,6 +40,7 @@ nsDOMMessageEvent::nsDOMMessageEvent(mozilla::dom::EventTarget* aOwner,
|
||||
mData(JSVAL_VOID),
|
||||
mDataRooted(false)
|
||||
{
|
||||
SetIsDOMBinding();
|
||||
}
|
||||
|
||||
nsDOMMessageEvent::~nsDOMMessageEvent()
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "nsDOMEvent.h"
|
||||
#include "nsCycleCollectionParticipant.h"
|
||||
#include "jsapi.h"
|
||||
#include "mozilla/dom/MessageEventBinding.h"
|
||||
|
||||
/**
|
||||
* Implements the MessageEvent event, used for cross-document messaging and
|
||||
@ -37,6 +38,39 @@ public:
|
||||
|
||||
void RootData();
|
||||
void UnrootData();
|
||||
|
||||
virtual JSObject* WrapObject(JSContext* aCx, JSObject* aScope)
|
||||
{
|
||||
return mozilla::dom::MessageEventBinding::Wrap(aCx, aScope, this);
|
||||
}
|
||||
|
||||
JS::Value GetData(JSContext* aCx, mozilla::ErrorResult& aRv)
|
||||
{
|
||||
JS::Value data;
|
||||
aRv = GetData(aCx, &data);
|
||||
return data;
|
||||
}
|
||||
|
||||
already_AddRefed<nsIDOMWindow> GetSource()
|
||||
{
|
||||
nsCOMPtr<nsIDOMWindow> ret = mSource;
|
||||
return ret.forget();
|
||||
}
|
||||
|
||||
void InitMessageEvent(JSContext* aCx,
|
||||
const nsAString& aType,
|
||||
bool aCanBubble,
|
||||
bool aCancelable,
|
||||
JS::Value& aData,
|
||||
const nsAString& aOrigin,
|
||||
const nsAString& aLastEventId,
|
||||
nsIDOMWindow* aSource,
|
||||
mozilla::ErrorResult& aRv)
|
||||
{
|
||||
aRv = InitMessageEvent(aType, aCanBubble, aCancelable, aData,
|
||||
aOrigin, aLastEventId, aSource);
|
||||
}
|
||||
|
||||
private:
|
||||
jsval mData;
|
||||
bool mDataRooted;
|
||||
|
@ -76,6 +76,23 @@ nsDOMUIEvent::nsDOMUIEvent(mozilla::dom::EventTarget* aOwner,
|
||||
}
|
||||
}
|
||||
|
||||
//static
|
||||
already_AddRefed<nsDOMUIEvent>
|
||||
nsDOMUIEvent::Constructor(const mozilla::dom::GlobalObject& aGlobal,
|
||||
const nsAString& aType,
|
||||
const mozilla::dom::UIEventInit& aParam,
|
||||
mozilla::ErrorResult& aRv)
|
||||
{
|
||||
nsCOMPtr<mozilla::dom::EventTarget> t = do_QueryInterface(aGlobal.Get());
|
||||
nsRefPtr<nsDOMUIEvent> e = new nsDOMUIEvent(t, nullptr, nullptr);
|
||||
e->SetIsDOMBinding();
|
||||
bool trusted = e->Init(t);
|
||||
aRv = e->InitUIEvent(aType, aParam.mBubbles, aParam.mCancelable, aParam.mView,
|
||||
aParam.mDetail);
|
||||
e->SetTrusted(trusted);
|
||||
return e.forget();
|
||||
}
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(nsDOMUIEvent, nsDOMEvent)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mView)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
||||
@ -239,18 +256,15 @@ nsDOMUIEvent::GetWhich(uint32_t* aWhich)
|
||||
return Which(aWhich);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDOMUIEvent::GetRangeParent(nsIDOMNode** aRangeParent)
|
||||
already_AddRefed<nsINode>
|
||||
nsDOMUIEvent::GetRangeParent()
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aRangeParent);
|
||||
nsIFrame* targetFrame = nullptr;
|
||||
|
||||
if (mPresContext) {
|
||||
targetFrame = mPresContext->EventStateManager()->GetEventTarget();
|
||||
}
|
||||
|
||||
*aRangeParent = nullptr;
|
||||
|
||||
if (targetFrame) {
|
||||
nsPoint pt = nsLayoutUtils::GetEventCoordinatesRelativeTo(mEvent,
|
||||
targetFrame);
|
||||
@ -258,12 +272,24 @@ nsDOMUIEvent::GetRangeParent(nsIDOMNode** aRangeParent)
|
||||
if (parent) {
|
||||
if (parent->ChromeOnlyAccess() &&
|
||||
!nsContentUtils::CanAccessNativeAnon()) {
|
||||
return NS_OK;
|
||||
return nullptr;
|
||||
}
|
||||
return CallQueryInterface(parent, aRangeParent);
|
||||
return parent.forget().get();
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDOMUIEvent::GetRangeParent(nsIDOMNode** aRangeParent)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aRangeParent);
|
||||
*aRangeParent = nullptr;
|
||||
nsCOMPtr<nsINode> n = GetRangeParent();
|
||||
if (n) {
|
||||
CallQueryInterface(n, aRangeParent);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -291,7 +317,7 @@ NS_IMETHODIMP
|
||||
nsDOMUIEvent::GetCancelBubble(bool* aCancelBubble)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aCancelBubble);
|
||||
*aCancelBubble = mEvent->mFlags.mPropagationStopped;
|
||||
*aCancelBubble = CancelBubble();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -511,5 +537,6 @@ nsresult NS_NewDOMUIEvent(nsIDOMEvent** aInstancePtrResult,
|
||||
nsGUIEvent *aEvent)
|
||||
{
|
||||
nsDOMUIEvent* it = new nsDOMUIEvent(aOwner, aPresContext, aEvent);
|
||||
it->SetIsDOMBinding();
|
||||
return CallQueryInterface(it, aInstancePtrResult);
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "nsDOMEvent.h"
|
||||
#include "nsLayoutUtils.h"
|
||||
#include "nsEvent.h"
|
||||
#include "mozilla/dom/UIEventBinding.h"
|
||||
|
||||
class nsDOMUIEvent : public nsDOMEvent,
|
||||
public nsIDOMUIEvent
|
||||
@ -86,6 +87,79 @@ public:
|
||||
nsPresContext::AppUnitsToIntCSSPixels(pt.y));
|
||||
}
|
||||
|
||||
static already_AddRefed<nsDOMUIEvent> Constructor(const mozilla::dom::GlobalObject& aGlobal,
|
||||
const nsAString& aType,
|
||||
const mozilla::dom::UIEventInit& aParam,
|
||||
mozilla::ErrorResult& aRv);
|
||||
|
||||
virtual JSObject* WrapObject(JSContext* aCx, JSObject* aScope)
|
||||
{
|
||||
return mozilla::dom::UIEventBinding::Wrap(aCx, aScope, this);
|
||||
}
|
||||
|
||||
already_AddRefed<nsIDOMWindow> GetView()
|
||||
{
|
||||
nsCOMPtr<nsIDOMWindow> view = mView;
|
||||
return mView.forget();
|
||||
}
|
||||
|
||||
int32_t Detail()
|
||||
{
|
||||
return mDetail;
|
||||
}
|
||||
|
||||
int32_t LayerX()
|
||||
{
|
||||
return GetLayerPoint().x;
|
||||
}
|
||||
|
||||
int32_t LayerY()
|
||||
{
|
||||
return GetLayerPoint().y;
|
||||
}
|
||||
|
||||
int32_t PageX()
|
||||
{
|
||||
int32_t x;
|
||||
GetPageX(&x);
|
||||
return x;
|
||||
}
|
||||
|
||||
int32_t PageY()
|
||||
{
|
||||
int32_t y;
|
||||
GetPageY(&y);
|
||||
return y;
|
||||
}
|
||||
|
||||
uint32_t Which()
|
||||
{
|
||||
uint32_t w;
|
||||
GetWhich(&w);
|
||||
return w;
|
||||
}
|
||||
|
||||
already_AddRefed<nsINode> GetRangeParent();
|
||||
|
||||
int32_t RangeOffset()
|
||||
{
|
||||
int32_t offset;
|
||||
GetRangeOffset(&offset);
|
||||
return offset;
|
||||
}
|
||||
|
||||
bool CancelBubble()
|
||||
{
|
||||
return mEvent->mFlags.mPropagationStopped;
|
||||
}
|
||||
|
||||
bool IsChar()
|
||||
{
|
||||
bool isChar;
|
||||
GetIsChar(&isChar);
|
||||
return isChar;
|
||||
}
|
||||
|
||||
protected:
|
||||
// Internal helper functions
|
||||
nsIntPoint GetClientPoint();
|
||||
|
@ -2052,8 +2052,8 @@ nsEventStateManager::GenerateDragGesture(nsPresContext* aPresContext,
|
||||
|
||||
// fire drag gesture if mouse has moved enough
|
||||
nsIntPoint pt = aEvent->refPoint + aEvent->widget->WidgetToScreenOffset();
|
||||
if (Abs(pt.x - mGestureDownPoint.x) > pixelThresholdX ||
|
||||
Abs(pt.y - mGestureDownPoint.y) > pixelThresholdY) {
|
||||
if (DeprecatedAbs(pt.x - mGestureDownPoint.x) > pixelThresholdX ||
|
||||
DeprecatedAbs(pt.y - mGestureDownPoint.y) > pixelThresholdY) {
|
||||
if (mClickHoldContextMenu) {
|
||||
// stop the click-hold before we fire off the drag gesture, in case
|
||||
// it takes a long time
|
||||
@ -2880,14 +2880,14 @@ nsEventStateManager::DoScrollText(nsIScrollableFrame* aScrollableFrame,
|
||||
nsIntSize devPixelPageSize(pc->AppUnitsToDevPixels(pageSize.width),
|
||||
pc->AppUnitsToDevPixels(pageSize.height));
|
||||
if (!WheelPrefs::GetInstance()->IsOverOnePageScrollAllowedX(aEvent) &&
|
||||
Abs(actualDevPixelScrollAmount.x) > devPixelPageSize.width) {
|
||||
DeprecatedAbs(actualDevPixelScrollAmount.x) > devPixelPageSize.width) {
|
||||
actualDevPixelScrollAmount.x =
|
||||
(actualDevPixelScrollAmount.x >= 0) ? devPixelPageSize.width :
|
||||
-devPixelPageSize.width;
|
||||
}
|
||||
|
||||
if (!WheelPrefs::GetInstance()->IsOverOnePageScrollAllowedY(aEvent) &&
|
||||
Abs(actualDevPixelScrollAmount.y) > devPixelPageSize.height) {
|
||||
DeprecatedAbs(actualDevPixelScrollAmount.y) > devPixelPageSize.height) {
|
||||
actualDevPixelScrollAmount.y =
|
||||
(actualDevPixelScrollAmount.y >= 0) ? devPixelPageSize.height :
|
||||
-devPixelPageSize.height;
|
||||
|
@ -964,7 +964,7 @@ NS_IMPL_ENUM_ATTR_DEFAULT_MISSING_INVALID_VALUES(nsHTMLInputElement, FormMethod,
|
||||
"", kFormDefaultMethod->tag)
|
||||
NS_IMPL_BOOL_ATTR(nsHTMLInputElement, FormNoValidate, formnovalidate)
|
||||
NS_IMPL_STRING_ATTR(nsHTMLInputElement, FormTarget, formtarget)
|
||||
NS_IMPL_ENUM_ATTR_DEFAULT_VALUE(nsHTMLInputElement, Inputmode, inputmode,
|
||||
NS_IMPL_ENUM_ATTR_DEFAULT_VALUE(nsHTMLInputElement, InputMode, inputmode,
|
||||
kInputDefaultInputmode->tag)
|
||||
NS_IMPL_BOOL_ATTR(nsHTMLInputElement, Multiple, multiple)
|
||||
NS_IMPL_NON_NEGATIVE_INT_ATTR(nsHTMLInputElement, MaxLength, maxlength)
|
||||
@ -2599,11 +2599,9 @@ nsHTMLInputElement::SetValueOfRangeForUserEvent(double aValue)
|
||||
nsAutoString val;
|
||||
ConvertNumberToString(aValue, val);
|
||||
SetValueInternal(val, true, true);
|
||||
nsIFrame* frame = GetPrimaryFrame();
|
||||
nsRangeFrame* frame = do_QueryFrame(GetPrimaryFrame());
|
||||
if (frame) {
|
||||
// Trigger reflow to update the position of the thumb:
|
||||
frame->PresContext()->GetPresShell()->
|
||||
FrameNeedsReflow(frame, nsIPresShell::eResize, NS_FRAME_IS_DIRTY);
|
||||
frame->UpdateThumbPositionForValueChange();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -112,7 +112,7 @@ reflectUnsignedInt({
|
||||
// .inputmode
|
||||
reflectLimitedEnumerated({
|
||||
element: document.createElement("input"),
|
||||
attribute: "inputmode",
|
||||
attribute: "inputMode",
|
||||
validValues: [ "numeric", "digit", "uppercase", "lowercase", "titlecase", "autocapitalized", "auto" ],
|
||||
invalidValues: [ "", "foo", "tulip" ],
|
||||
defaultValue: "auto"
|
||||
|
@ -175,37 +175,22 @@ IsWebMType(const nsACString& aType)
|
||||
#endif
|
||||
|
||||
#ifdef MOZ_GSTREAMER
|
||||
static const char* const gH264Types[4] = {
|
||||
"video/mp4",
|
||||
"video/3gpp",
|
||||
"video/quicktime",
|
||||
nullptr
|
||||
};
|
||||
|
||||
static bool
|
||||
IsH264Type(const nsACString& aType)
|
||||
{
|
||||
return CodecListContains(gH264Types, aType);
|
||||
}
|
||||
|
||||
static bool
|
||||
IsGStreamerSupportedType(const nsACString& aMimeType)
|
||||
{
|
||||
if (!MediaDecoder::IsGStreamerEnabled())
|
||||
return false;
|
||||
if (IsH264Type(aMimeType))
|
||||
return true;
|
||||
if (!Preferences::GetBool("media.prefer-gstreamer", false))
|
||||
return false;
|
||||
|
||||
#ifdef MOZ_WEBM
|
||||
if (IsWebMType(aMimeType))
|
||||
return true;
|
||||
if (IsWebMType(aMimeType) && !Preferences::GetBool("media.prefer-gstreamer", false))
|
||||
return false;
|
||||
#endif
|
||||
#ifdef MOZ_OGG
|
||||
if (IsOggType(aMimeType))
|
||||
return true;
|
||||
if (IsOggType(aMimeType) && !Preferences::GetBool("media.prefer-gstreamer", false))
|
||||
return false;
|
||||
#endif
|
||||
return false;
|
||||
|
||||
return GStreamerDecoder::CanHandleMediaType(aMimeType, nullptr);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -228,9 +213,7 @@ IsOmxSupportedType(const nsACString& aType)
|
||||
|
||||
return CodecListContains(gOmxTypes, aType);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(MOZ_GSTREAMER) || defined(MOZ_WIDGET_GONK)
|
||||
static char const *const gH264Codecs[9] = {
|
||||
"avc1.42E01E", // H.264 Constrained Baseline Profile Level 3.0
|
||||
"avc1.42001E", // H.264 Baseline Profile Level 3.0
|
||||
@ -341,9 +324,11 @@ DecoderTraits::CanHandleMediaType(const char* aMIMEType,
|
||||
}
|
||||
#endif
|
||||
#ifdef MOZ_GSTREAMER
|
||||
if (IsH264Type(nsDependentCString(aMIMEType))) {
|
||||
codecList = gH264Codecs;
|
||||
result = CANPLAY_MAYBE;
|
||||
if (GStreamerDecoder::CanHandleMediaType(nsDependentCString(aMIMEType),
|
||||
aHaveRequestedCodecs ? &aRequestedCodecs : nullptr)) {
|
||||
if (aHaveRequestedCodecs)
|
||||
return CANPLAY_YES;
|
||||
return CANPLAY_MAYBE;
|
||||
}
|
||||
#endif
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
@ -362,7 +347,7 @@ DecoderTraits::CanHandleMediaType(const char* aMIMEType,
|
||||
GetMediaPluginHost()->FindDecoder(nsDependentCString(aMIMEType), &codecList))
|
||||
result = CANPLAY_MAYBE;
|
||||
#endif
|
||||
if (result == CANPLAY_NO || !aHaveRequestedCodecs) {
|
||||
if (result == CANPLAY_NO || !aHaveRequestedCodecs || !codecList) {
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -142,6 +142,7 @@ VideoData::~VideoData()
|
||||
|
||||
VideoData* VideoData::Create(VideoInfo& aInfo,
|
||||
ImageContainer* aContainer,
|
||||
Image* aImage,
|
||||
int64_t aOffset,
|
||||
int64_t aTime,
|
||||
int64_t aEndTime,
|
||||
@ -150,7 +151,7 @@ VideoData* VideoData::Create(VideoInfo& aInfo,
|
||||
int64_t aTimecode,
|
||||
nsIntRect aPicture)
|
||||
{
|
||||
if (!aContainer) {
|
||||
if (!aImage && !aContainer) {
|
||||
// Create a dummy VideoData with no image. This gives us something to
|
||||
// send to media streams if necessary.
|
||||
nsAutoPtr<VideoData> v(new VideoData(aOffset,
|
||||
@ -204,14 +205,19 @@ VideoData* VideoData::Create(VideoInfo& aInfo,
|
||||
const YCbCrBuffer::Plane &Cb = aBuffer.mPlanes[1];
|
||||
const YCbCrBuffer::Plane &Cr = aBuffer.mPlanes[2];
|
||||
|
||||
// Currently our decoder only knows how to output to PLANAR_YCBCR
|
||||
// format.
|
||||
ImageFormat format[2] = {PLANAR_YCBCR, GRALLOC_PLANAR_YCBCR};
|
||||
if (IsYV12Format(Y, Cb, Cr)) {
|
||||
v->mImage = aContainer->CreateImage(format, 2);
|
||||
if (!aImage) {
|
||||
// Currently our decoder only knows how to output to PLANAR_YCBCR
|
||||
// format.
|
||||
ImageFormat format[2] = {PLANAR_YCBCR, GRALLOC_PLANAR_YCBCR};
|
||||
if (IsYV12Format(Y, Cb, Cr)) {
|
||||
v->mImage = aContainer->CreateImage(format, 2);
|
||||
} else {
|
||||
v->mImage = aContainer->CreateImage(format, 1);
|
||||
}
|
||||
} else {
|
||||
v->mImage = aContainer->CreateImage(format, 1);
|
||||
v->mImage = aImage;
|
||||
}
|
||||
|
||||
if (!v->mImage) {
|
||||
return nullptr;
|
||||
}
|
||||
@ -237,10 +243,43 @@ VideoData* VideoData::Create(VideoInfo& aInfo,
|
||||
data.mStereoMode = aInfo.mStereoMode;
|
||||
|
||||
videoImage->SetDelayedConversion(true);
|
||||
videoImage->SetData(data);
|
||||
if (!aImage) {
|
||||
videoImage->SetData(data);
|
||||
} else {
|
||||
videoImage->SetDataNoCopy(data);
|
||||
}
|
||||
|
||||
return v.forget();
|
||||
}
|
||||
|
||||
VideoData* VideoData::Create(VideoInfo& aInfo,
|
||||
ImageContainer* aContainer,
|
||||
int64_t aOffset,
|
||||
int64_t aTime,
|
||||
int64_t aEndTime,
|
||||
const YCbCrBuffer& aBuffer,
|
||||
bool aKeyframe,
|
||||
int64_t aTimecode,
|
||||
nsIntRect aPicture)
|
||||
{
|
||||
return Create(aInfo, aContainer, nullptr, aOffset, aTime, aEndTime, aBuffer,
|
||||
aKeyframe, aTimecode, aPicture);
|
||||
}
|
||||
|
||||
VideoData* VideoData::Create(VideoInfo& aInfo,
|
||||
Image* aImage,
|
||||
int64_t aOffset,
|
||||
int64_t aTime,
|
||||
int64_t aEndTime,
|
||||
const YCbCrBuffer& aBuffer,
|
||||
bool aKeyframe,
|
||||
int64_t aTimecode,
|
||||
nsIntRect aPicture)
|
||||
{
|
||||
return Create(aInfo, nullptr, aImage, aOffset, aTime, aEndTime, aBuffer,
|
||||
aKeyframe, aTimecode, aPicture);
|
||||
}
|
||||
|
||||
VideoData* VideoData::CreateFromImage(VideoInfo& aInfo,
|
||||
ImageContainer* aContainer,
|
||||
int64_t aOffset,
|
||||
@ -267,7 +306,7 @@ VideoData* VideoData::Create(VideoInfo& aInfo,
|
||||
int64_t aOffset,
|
||||
int64_t aTime,
|
||||
int64_t aEndTime,
|
||||
mozilla::layers::GraphicBufferLocked *aBuffer,
|
||||
mozilla::layers::GraphicBufferLocked* aBuffer,
|
||||
bool aKeyframe,
|
||||
int64_t aTimecode,
|
||||
nsIntRect aPicture)
|
||||
|
@ -132,14 +132,39 @@ public:
|
||||
Plane mPlanes[3];
|
||||
};
|
||||
|
||||
// Constructs a VideoData object. Makes a copy of YCbCr data in aBuffer.
|
||||
// aTimecode is a codec specific number representing the timestamp of
|
||||
// the frame of video data. Returns nullptr if an error occurs. This may
|
||||
// indicate that memory couldn't be allocated to create the VideoData
|
||||
// object, or it may indicate some problem with the input data (e.g.
|
||||
// negative stride).
|
||||
// Constructs a VideoData object. If aImage is NULL, creates a new Image
|
||||
// holding a copy of the YCbCr data passed in aBuffer. If aImage is not NULL,
|
||||
// it's stored as the underlying video image and aBuffer is assumed to point
|
||||
// to memory within aImage so no copy is made. aTimecode is a codec specific
|
||||
// number representing the timestamp of the frame of video data. Returns
|
||||
// nsnull if an error occurs. This may indicate that memory couldn't be
|
||||
// allocated to create the VideoData object, or it may indicate some problem
|
||||
// with the input data (e.g. negative stride).
|
||||
static VideoData* Create(VideoInfo& aInfo,
|
||||
ImageContainer* aContainer,
|
||||
Image* aImage,
|
||||
int64_t aOffset,
|
||||
int64_t aTime,
|
||||
int64_t aEndTime,
|
||||
const YCbCrBuffer &aBuffer,
|
||||
bool aKeyframe,
|
||||
int64_t aTimecode,
|
||||
nsIntRect aPicture);
|
||||
|
||||
// Variant that always makes a copy of aBuffer
|
||||
static VideoData* Create(VideoInfo& aInfo,
|
||||
ImageContainer* aContainer,
|
||||
int64_t aOffset,
|
||||
int64_t aTime,
|
||||
int64_t aEndTime,
|
||||
const YCbCrBuffer &aBuffer,
|
||||
bool aKeyframe,
|
||||
int64_t aTimecode,
|
||||
nsIntRect aPicture);
|
||||
|
||||
// Variant to create a VideoData instance given an existing aImage
|
||||
static VideoData* Create(VideoInfo& aInfo,
|
||||
Image* aImage,
|
||||
int64_t aOffset,
|
||||
int64_t aTime,
|
||||
int64_t aEndTime,
|
||||
@ -153,7 +178,7 @@ public:
|
||||
int64_t aOffset,
|
||||
int64_t aTime,
|
||||
int64_t aEndTime,
|
||||
layers::GraphicBufferLocked *aBuffer,
|
||||
layers::GraphicBufferLocked* aBuffer,
|
||||
bool aKeyframe,
|
||||
int64_t aTimecode,
|
||||
nsIntRect aPicture);
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "MediaDecoderStateMachine.h"
|
||||
#include "GStreamerReader.h"
|
||||
#include "GStreamerDecoder.h"
|
||||
#include "GStreamerFormatHelper.h"
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
@ -15,5 +16,12 @@ MediaDecoderStateMachine* GStreamerDecoder::CreateStateMachine()
|
||||
return new MediaDecoderStateMachine(this, new GStreamerReader(this));
|
||||
}
|
||||
|
||||
bool
|
||||
GStreamerDecoder::CanHandleMediaType(const nsACString& aMIMEType,
|
||||
const nsAString* aCodecs)
|
||||
{
|
||||
return GStreamerFormatHelper::Instance()->CanHandleMediaType(aMIMEType, aCodecs);
|
||||
}
|
||||
|
||||
} // namespace mozilla
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
#define GStreamerDecoder_h_
|
||||
|
||||
#include "MediaDecoder.h"
|
||||
#include "nsXPCOMStrings.h"
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
@ -16,6 +17,7 @@ class GStreamerDecoder : public MediaDecoder
|
||||
public:
|
||||
virtual MediaDecoder* Clone() { return new GStreamerDecoder(); }
|
||||
virtual MediaDecoderStateMachine* CreateStateMachine();
|
||||
static bool CanHandleMediaType(const nsACString& aMIMEType, const nsAString* aCodecs);
|
||||
};
|
||||
|
||||
} // namespace mozilla
|
||||
|
162
content/media/gstreamer/GStreamerFormatHelper.cpp
Normal file
162
content/media/gstreamer/GStreamerFormatHelper.cpp
Normal file
@ -0,0 +1,162 @@
|
||||
/* -*- 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 "GStreamerFormatHelper.h"
|
||||
#include "nsCharSeparatedTokenizer.h"
|
||||
#include "nsXPCOMStrings.h"
|
||||
|
||||
#define ENTRY_FORMAT(entry) entry[0]
|
||||
#define ENTRY_CAPS(entry) entry[1]
|
||||
|
||||
GStreamerFormatHelper* GStreamerFormatHelper::gInstance = nullptr;
|
||||
|
||||
GStreamerFormatHelper* GStreamerFormatHelper::Instance() {
|
||||
if (!gInstance) {
|
||||
gst_init(nullptr, nullptr);
|
||||
gInstance = new GStreamerFormatHelper();
|
||||
}
|
||||
|
||||
return gInstance;
|
||||
}
|
||||
|
||||
void GStreamerFormatHelper::Shutdown() {
|
||||
if (gInstance) {
|
||||
delete gInstance;
|
||||
gInstance = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
char const *const GStreamerFormatHelper::mContainers[6][2] = {
|
||||
{"video/mp4", "video/quicktime"},
|
||||
{"video/quicktime", "video/quicktime"},
|
||||
{"audio/mp4", "audio/mpeg, mpegversion=(int)4"},
|
||||
{"audio/x-m4a", "audio/mpeg, mpegversion=(int)4"},
|
||||
{"audio/mpeg", "audio/mpeg, mpegversion=(int)1"},
|
||||
{"audio/mp3", "audio/mpeg, mpegversion=(int)1"},
|
||||
};
|
||||
|
||||
char const *const GStreamerFormatHelper::mCodecs[9][2] = {
|
||||
{"avc1.42E01E", "video/x-h264"},
|
||||
{"avc1.42001E", "video/x-h264"},
|
||||
{"avc1.58A01E", "video/x-h264"},
|
||||
{"avc1.4D401E", "video/x-h264"},
|
||||
{"avc1.64001E", "video/x-h264"},
|
||||
{"avc1.64001F", "video/x-h264"},
|
||||
{"mp4v.20.3", "video/3gpp"},
|
||||
{"mp4a.40.2", "audio/mpeg, mpegversion=(int)4"},
|
||||
{"mp3", "audio/mpeg, mpegversion=(int)1"},
|
||||
};
|
||||
|
||||
GStreamerFormatHelper::GStreamerFormatHelper()
|
||||
: mFactories(nullptr),
|
||||
mCookie(static_cast<uint32_t>(-1))
|
||||
{
|
||||
}
|
||||
|
||||
GStreamerFormatHelper::~GStreamerFormatHelper() {
|
||||
if (mFactories)
|
||||
g_list_free(mFactories);
|
||||
}
|
||||
|
||||
bool GStreamerFormatHelper::CanHandleMediaType(const nsACString& aMIMEType,
|
||||
const nsAString* aCodecs) {
|
||||
const char *type;
|
||||
NS_CStringGetData(aMIMEType, &type, NULL);
|
||||
|
||||
GstCaps* caps = ConvertFormatsToCaps(type, aCodecs);
|
||||
if (!caps) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ret = HaveElementsToProcessCaps(caps);
|
||||
gst_caps_unref(caps);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
GstCaps* GStreamerFormatHelper::ConvertFormatsToCaps(const char* aMIMEType,
|
||||
const nsAString* aCodecs) {
|
||||
unsigned int i;
|
||||
|
||||
/* convert aMIMEType to gst container caps */
|
||||
const char* capsString = nullptr;
|
||||
for (i = 0; i < G_N_ELEMENTS(mContainers); i++) {
|
||||
if (!strcmp(ENTRY_FORMAT(mContainers[i]), aMIMEType)) {
|
||||
capsString = ENTRY_CAPS(mContainers[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!capsString) {
|
||||
/* we couldn't find any matching caps */
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
GstCaps* caps = gst_caps_from_string(capsString);
|
||||
/* container only */
|
||||
if (!aCodecs) {
|
||||
return caps;
|
||||
}
|
||||
|
||||
nsCharSeparatedTokenizer tokenizer(*aCodecs, ',');
|
||||
while (tokenizer.hasMoreTokens()) {
|
||||
const nsSubstring& codec = tokenizer.nextToken();
|
||||
capsString = nullptr;
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS(mCodecs); i++) {
|
||||
if (codec.EqualsASCII(ENTRY_FORMAT(mCodecs[i]))) {
|
||||
capsString = ENTRY_CAPS(mCodecs[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!capsString) {
|
||||
gst_caps_unref(caps);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
GstCaps* tmp = gst_caps_from_string(capsString);
|
||||
/* appends and frees tmp */
|
||||
gst_caps_append(caps, tmp);
|
||||
}
|
||||
|
||||
return caps;
|
||||
}
|
||||
|
||||
bool GStreamerFormatHelper::HaveElementsToProcessCaps(GstCaps* aCaps) {
|
||||
|
||||
GList* factories = GetFactories();
|
||||
|
||||
GList* list;
|
||||
/* here aCaps contains [containerCaps, [codecCaps1, [codecCaps2, ...]]] so process
|
||||
* caps structures individually as we want one element for _each_
|
||||
* structure */
|
||||
for (unsigned int i = 0; i < gst_caps_get_size(aCaps); i++) {
|
||||
GstStructure* s = gst_caps_get_structure(aCaps, i);
|
||||
GstCaps* caps = gst_caps_new_full(gst_structure_copy(s), nullptr);
|
||||
list = gst_element_factory_list_filter (factories, caps, GST_PAD_SINK, FALSE);
|
||||
gst_caps_unref(caps);
|
||||
if (!list) {
|
||||
return false;
|
||||
}
|
||||
g_list_free(list);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
GList* GStreamerFormatHelper::GetFactories() {
|
||||
uint32_t cookie = gst_default_registry_get_feature_list_cookie ();
|
||||
if (cookie != mCookie) {
|
||||
g_list_free(mFactories);
|
||||
mFactories = gst_element_factory_list_get_elements
|
||||
(GST_ELEMENT_FACTORY_TYPE_DEMUXER | GST_ELEMENT_FACTORY_TYPE_DECODER,
|
||||
GST_RANK_MARGINAL);
|
||||
mCookie = cookie;
|
||||
}
|
||||
|
||||
return mFactories;
|
||||
}
|
60
content/media/gstreamer/GStreamerFormatHelper.h
Normal file
60
content/media/gstreamer/GStreamerFormatHelper.h
Normal file
@ -0,0 +1,60 @@
|
||||
/* -*- 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/. */
|
||||
|
||||
#if !defined(GStreamerFormatHelper_h_)
|
||||
#define GStreamerFormatHelper_h_
|
||||
|
||||
#include <gst/gst.h>
|
||||
#include <mozilla/Types.h>
|
||||
#include "nsXPCOMStrings.h"
|
||||
|
||||
class GStreamerFormatHelper {
|
||||
/* This class can be used to query the GStreamer registry for the required
|
||||
* demuxers/decoders from nsHTMLMediaElement::CanPlayType.
|
||||
* It implements looking at the GstRegistry to check if elements to
|
||||
* demux/decode the formats passed to CanPlayType() are actually installed.
|
||||
*/
|
||||
public:
|
||||
static GStreamerFormatHelper* Instance();
|
||||
~GStreamerFormatHelper();
|
||||
|
||||
bool CanHandleMediaType(const nsACString& aMIMEType,
|
||||
const nsAString* aCodecs);
|
||||
|
||||
static void Shutdown();
|
||||
|
||||
private:
|
||||
GStreamerFormatHelper();
|
||||
GstCaps* ConvertFormatsToCaps(const char* aMIMEType,
|
||||
const nsAString* aCodecs);
|
||||
char* const *CodecListFromCaps(GstCaps* aCaps);
|
||||
bool HaveElementsToProcessCaps(GstCaps* aCaps);
|
||||
GList* GetFactories();
|
||||
|
||||
static GStreamerFormatHelper* gInstance;
|
||||
|
||||
/* table to convert from container MIME types to GStreamer elements */
|
||||
static char const *const mContainers[6][2];
|
||||
|
||||
/* table to convert from codec MIME types to GStreamer elements */
|
||||
static char const *const mCodecs[9][2];
|
||||
|
||||
/* list of GStreamer element factories
|
||||
* Element factories are the basic types retrieved from the GStreamer
|
||||
* registry, they describe all plugins and elements that GStreamer can
|
||||
* create.
|
||||
* This means that element factories are useful for automated element
|
||||
* instancing, such as what autopluggers do,
|
||||
* and for creating lists of available elements. */
|
||||
GList* mFactories;
|
||||
|
||||
/* Storage for the default registrys feature list cookie.
|
||||
* It changes every time a feature is added to or removed from the
|
||||
* GStreamer registry. */
|
||||
uint32_t mCookie;
|
||||
};
|
||||
|
||||
#endif
|
@ -27,12 +27,19 @@ extern PRLogModuleInfo* gMediaDecoderLog;
|
||||
#define LOG(type, msg)
|
||||
#endif
|
||||
|
||||
extern bool
|
||||
IsYV12Format(const VideoData::YCbCrBuffer::Plane& aYPlane,
|
||||
const VideoData::YCbCrBuffer::Plane& aCbPlane,
|
||||
const VideoData::YCbCrBuffer::Plane& aCrPlane);
|
||||
|
||||
static const int MAX_CHANNELS = 4;
|
||||
// Let the demuxer work in pull mode for short files
|
||||
static const int SHORT_FILE_SIZE = 1024 * 1024;
|
||||
// The default resource->Read() size when working in push mode
|
||||
static const int DEFAULT_SOURCE_READ_SIZE = 50 * 1024;
|
||||
|
||||
G_DEFINE_BOXED_TYPE(BufferData, buffer_data, BufferData::Copy, BufferData::Free);
|
||||
|
||||
typedef enum {
|
||||
GST_PLAY_FLAG_VIDEO = (1 << 0),
|
||||
GST_PLAY_FLAG_AUDIO = (1 << 1),
|
||||
@ -49,13 +56,13 @@ typedef enum {
|
||||
|
||||
GStreamerReader::GStreamerReader(AbstractMediaDecoder* aDecoder)
|
||||
: MediaDecoderReader(aDecoder),
|
||||
mPlayBin(NULL),
|
||||
mBus(NULL),
|
||||
mSource(NULL),
|
||||
mVideoSink(NULL),
|
||||
mVideoAppSink(NULL),
|
||||
mAudioSink(NULL),
|
||||
mAudioAppSink(NULL),
|
||||
mPlayBin(nullptr),
|
||||
mBus(nullptr),
|
||||
mSource(nullptr),
|
||||
mVideoSink(nullptr),
|
||||
mVideoAppSink(nullptr),
|
||||
mAudioSink(nullptr),
|
||||
mAudioAppSink(nullptr),
|
||||
mFormat(GST_VIDEO_FORMAT_UNKNOWN),
|
||||
mVideoSinkBufferCount(0),
|
||||
mAudioSinkBufferCount(0),
|
||||
@ -75,7 +82,7 @@ GStreamerReader::GStreamerReader(AbstractMediaDecoder* aDecoder)
|
||||
mSinkCallbacks.eos = GStreamerReader::EosCb;
|
||||
mSinkCallbacks.new_preroll = GStreamerReader::NewPrerollCb;
|
||||
mSinkCallbacks.new_buffer = GStreamerReader::NewBufferCb;
|
||||
mSinkCallbacks.new_buffer_list = NULL;
|
||||
mSinkCallbacks.new_buffer_list = nullptr;
|
||||
|
||||
gst_segment_init(&mVideoSegment, GST_FORMAT_UNDEFINED);
|
||||
gst_segment_init(&mAudioSegment, GST_FORMAT_UNDEFINED);
|
||||
@ -92,116 +99,131 @@ GStreamerReader::~GStreamerReader()
|
||||
gst_object_unref(mSource);
|
||||
gst_element_set_state(mPlayBin, GST_STATE_NULL);
|
||||
gst_object_unref(mPlayBin);
|
||||
mPlayBin = NULL;
|
||||
mVideoSink = NULL;
|
||||
mVideoAppSink = NULL;
|
||||
mAudioSink = NULL;
|
||||
mAudioAppSink = NULL;
|
||||
mPlayBin = nullptr;
|
||||
mVideoSink = nullptr;
|
||||
mVideoAppSink = nullptr;
|
||||
mAudioSink = nullptr;
|
||||
mAudioAppSink = nullptr;
|
||||
gst_object_unref(mBus);
|
||||
mBus = NULL;
|
||||
mBus = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
nsresult GStreamerReader::Init(MediaDecoderReader* aCloneDonor)
|
||||
{
|
||||
GError *error = NULL;
|
||||
GError* error = nullptr;
|
||||
if (!gst_init_check(0, 0, &error)) {
|
||||
LOG(PR_LOG_ERROR, ("gst initialization failed: %s", error->message));
|
||||
g_error_free(error);
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
mPlayBin = gst_element_factory_make("playbin2", NULL);
|
||||
if (mPlayBin == NULL) {
|
||||
mPlayBin = gst_element_factory_make("playbin2", nullptr);
|
||||
if (!mPlayBin) {
|
||||
LOG(PR_LOG_ERROR, ("couldn't create playbin2"));
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
g_object_set(mPlayBin, "buffer-size", 0, NULL);
|
||||
g_object_set(mPlayBin, "buffer-size", 0, nullptr);
|
||||
mBus = gst_pipeline_get_bus(GST_PIPELINE(mPlayBin));
|
||||
|
||||
mVideoSink = gst_parse_bin_from_description("capsfilter name=filter ! "
|
||||
"appsink name=videosink sync=true max-buffers=1 "
|
||||
"caps=video/x-raw-yuv,format=(fourcc)I420"
|
||||
, TRUE, NULL);
|
||||
, TRUE, nullptr);
|
||||
mVideoAppSink = GST_APP_SINK(gst_bin_get_by_name(GST_BIN(mVideoSink),
|
||||
"videosink"));
|
||||
gst_app_sink_set_callbacks(mVideoAppSink, &mSinkCallbacks,
|
||||
(gpointer) this, NULL);
|
||||
GstPad *sinkpad = gst_element_get_pad(GST_ELEMENT(mVideoAppSink), "sink");
|
||||
(gpointer) this, nullptr);
|
||||
GstPad* sinkpad = gst_element_get_pad(GST_ELEMENT(mVideoAppSink), "sink");
|
||||
gst_pad_add_event_probe(sinkpad,
|
||||
G_CALLBACK(&GStreamerReader::EventProbeCb), this);
|
||||
gst_object_unref(sinkpad);
|
||||
#if GST_VERSION_MICRO >= 36
|
||||
gst_pad_set_bufferalloc_function(sinkpad, GStreamerReader::AllocateVideoBufferCb);
|
||||
#endif
|
||||
gst_pad_set_element_private(sinkpad, this);
|
||||
|
||||
mAudioSink = gst_parse_bin_from_description("capsfilter name=filter ! "
|
||||
#ifdef MOZ_SAMPLE_TYPE_FLOAT32
|
||||
"appsink name=audiosink sync=true caps=audio/x-raw-float,"
|
||||
#ifdef IS_LITTLE_ENDIAN
|
||||
"channels={1,2},width=32,endianness=1234", TRUE, NULL);
|
||||
"channels={1,2},width=32,endianness=1234", TRUE, nullptr);
|
||||
#else
|
||||
"channels={1,2},width=32,endianness=4321", TRUE, NULL);
|
||||
"channels={1,2},width=32,endianness=4321", TRUE, nullptr);
|
||||
#endif
|
||||
#else
|
||||
"appsink name=audiosink sync=true caps=audio/x-raw-int,"
|
||||
#ifdef IS_LITTLE_ENDIAN
|
||||
"channels={1,2},width=16,endianness=1234", TRUE, NULL);
|
||||
"channels={1,2},width=16,endianness=1234", TRUE, nullptr);
|
||||
#else
|
||||
"channels={1,2},width=16,endianness=4321", TRUE, NULL);
|
||||
"channels={1,2},width=16,endianness=4321", TRUE, nullptr);
|
||||
#endif
|
||||
#endif
|
||||
mAudioAppSink = GST_APP_SINK(gst_bin_get_by_name(GST_BIN(mAudioSink),
|
||||
"audiosink"));
|
||||
"audiosink"));
|
||||
gst_app_sink_set_callbacks(mAudioAppSink, &mSinkCallbacks,
|
||||
(gpointer) this, NULL);
|
||||
(gpointer) this, nullptr);
|
||||
sinkpad = gst_element_get_pad(GST_ELEMENT(mAudioAppSink), "sink");
|
||||
gst_pad_add_event_probe(sinkpad,
|
||||
G_CALLBACK(&GStreamerReader::EventProbeCb), this);
|
||||
G_CALLBACK(&GStreamerReader::EventProbeCb), this);
|
||||
gst_object_unref(sinkpad);
|
||||
|
||||
g_object_set(mPlayBin, "uri", "appsrc://",
|
||||
"video-sink", mVideoSink,
|
||||
"audio-sink", mAudioSink,
|
||||
NULL);
|
||||
"video-sink", mVideoSink,
|
||||
"audio-sink", mAudioSink,
|
||||
nullptr);
|
||||
|
||||
g_signal_connect(G_OBJECT(mPlayBin), "notify::source",
|
||||
G_CALLBACK(GStreamerReader::PlayBinSourceSetupCb), this);
|
||||
g_object_connect(mPlayBin, "signal::source-setup",
|
||||
GStreamerReader::PlayBinSourceSetupCb, this, nullptr);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void GStreamerReader::PlayBinSourceSetupCb(GstElement *aPlayBin,
|
||||
GParamSpec *pspec,
|
||||
gpointer aUserData)
|
||||
void GStreamerReader::PlayBinSourceSetupCb(GstElement* aPlayBin,
|
||||
GParamSpec* pspec,
|
||||
gpointer aUserData)
|
||||
{
|
||||
GstElement *source;
|
||||
GStreamerReader *reader = reinterpret_cast<GStreamerReader*>(aUserData);
|
||||
GStreamerReader* reader = reinterpret_cast<GStreamerReader*>(aUserData);
|
||||
|
||||
g_object_get(aPlayBin, "source", &source, NULL);
|
||||
reader->PlayBinSourceSetup(GST_APP_SRC(source));
|
||||
}
|
||||
|
||||
void GStreamerReader::PlayBinSourceSetup(GstAppSrc *aSource)
|
||||
void GStreamerReader::PlayBinSourceSetup(GstAppSrc* aSource)
|
||||
{
|
||||
mSource = GST_APP_SRC(aSource);
|
||||
gst_app_src_set_callbacks(mSource, &mSrcCallbacks, (gpointer) this, NULL);
|
||||
gst_app_src_set_callbacks(mSource, &mSrcCallbacks, (gpointer) this, nullptr);
|
||||
MediaResource* resource = mDecoder->GetResource();
|
||||
int64_t len = resource->GetLength();
|
||||
gst_app_src_set_size(mSource, len);
|
||||
|
||||
/* do a short read to trigger a network request so that GetLength() below
|
||||
* returns something meaningful and not -1
|
||||
*/
|
||||
char buf[512];
|
||||
unsigned int size = 0;
|
||||
resource->Read(buf, sizeof(buf), &size);
|
||||
resource->Seek(SEEK_SET, 0);
|
||||
|
||||
/* now we should have a length */
|
||||
int64_t resourceLength = resource->GetLength();
|
||||
gst_app_src_set_size(mSource, resourceLength);
|
||||
if (resource->IsDataCachedToEndOfResource(0) ||
|
||||
(len != -1 && len <= SHORT_FILE_SIZE)) {
|
||||
(resourceLength != -1 && resourceLength <= SHORT_FILE_SIZE)) {
|
||||
/* let the demuxer work in pull mode for local files (or very short files)
|
||||
* so that we get optimal seeking accuracy/performance
|
||||
*/
|
||||
LOG(PR_LOG_ERROR, ("configuring random access"));
|
||||
LOG(PR_LOG_DEBUG, ("configuring random access, len %lld", resourceLength));
|
||||
gst_app_src_set_stream_type(mSource, GST_APP_STREAM_TYPE_RANDOM_ACCESS);
|
||||
} else {
|
||||
/* make the demuxer work in push mode so that seeking is kept to a minimum
|
||||
*/
|
||||
LOG(PR_LOG_DEBUG, ("configuring push mode, len %lld", resourceLength));
|
||||
gst_app_src_set_stream_type(mSource, GST_APP_STREAM_TYPE_SEEKABLE);
|
||||
}
|
||||
}
|
||||
|
||||
nsresult GStreamerReader::ReadMetadata(VideoInfo* aInfo,
|
||||
MetadataTags** aTags)
|
||||
MetadataTags** aTags)
|
||||
{
|
||||
NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread.");
|
||||
nsresult ret = NS_OK;
|
||||
@ -213,24 +235,24 @@ nsresult GStreamerReader::ReadMetadata(VideoInfo* aInfo,
|
||||
guint flags[3] = {GST_PLAY_FLAG_VIDEO|GST_PLAY_FLAG_AUDIO,
|
||||
static_cast<guint>(~GST_PLAY_FLAG_AUDIO), static_cast<guint>(~GST_PLAY_FLAG_VIDEO)};
|
||||
guint default_flags, current_flags;
|
||||
g_object_get(mPlayBin, "flags", &default_flags, NULL);
|
||||
g_object_get(mPlayBin, "flags", &default_flags, nullptr);
|
||||
|
||||
GstMessage *message = NULL;
|
||||
GstMessage* message = nullptr;
|
||||
for (unsigned int i = 0; i < G_N_ELEMENTS(flags); i++) {
|
||||
current_flags = default_flags & flags[i];
|
||||
g_object_set(G_OBJECT(mPlayBin), "flags", current_flags, NULL);
|
||||
g_object_set(G_OBJECT(mPlayBin), "flags", current_flags, nullptr);
|
||||
|
||||
/* reset filter caps to ANY */
|
||||
GstCaps *caps = gst_caps_new_any();
|
||||
GstElement *filter = gst_bin_get_by_name(GST_BIN(mAudioSink), "filter");
|
||||
g_object_set(filter, "caps", caps, NULL);
|
||||
GstCaps* caps = gst_caps_new_any();
|
||||
GstElement* filter = gst_bin_get_by_name(GST_BIN(mAudioSink), "filter");
|
||||
g_object_set(filter, "caps", caps, nullptr);
|
||||
gst_object_unref(filter);
|
||||
|
||||
filter = gst_bin_get_by_name(GST_BIN(mVideoSink), "filter");
|
||||
g_object_set(filter, "caps", caps, NULL);
|
||||
g_object_set(filter, "caps", caps, nullptr);
|
||||
gst_object_unref(filter);
|
||||
gst_caps_unref(caps);
|
||||
filter = NULL;
|
||||
filter = nullptr;
|
||||
|
||||
if (!(current_flags & GST_PLAY_FLAG_AUDIO))
|
||||
filter = gst_bin_get_by_name(GST_BIN(mAudioSink), "filter");
|
||||
@ -241,8 +263,8 @@ nsresult GStreamerReader::ReadMetadata(VideoInfo* aInfo,
|
||||
/* Little trick: set the target caps to "skip" so that playbin2 fails to
|
||||
* find a decoder for the stream we want to skip.
|
||||
*/
|
||||
GstCaps *filterCaps = gst_caps_new_simple ("skip", NULL);
|
||||
g_object_set(filter, "caps", filterCaps, NULL);
|
||||
GstCaps* filterCaps = gst_caps_new_simple ("skip", nullptr);
|
||||
g_object_set(filter, "caps", filterCaps, nullptr);
|
||||
gst_caps_unref(filterCaps);
|
||||
gst_object_unref(filter);
|
||||
}
|
||||
@ -254,14 +276,14 @@ nsresult GStreamerReader::ReadMetadata(VideoInfo* aInfo,
|
||||
* prerolled and ready to play. Also watch for errors.
|
||||
*/
|
||||
message = gst_bus_timed_pop_filtered(mBus, GST_CLOCK_TIME_NONE,
|
||||
(GstMessageType)(GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR));
|
||||
(GstMessageType)(GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR));
|
||||
if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_ERROR) {
|
||||
GError *error;
|
||||
gchar *debug;
|
||||
GError* error;
|
||||
gchar* debug;
|
||||
|
||||
gst_message_parse_error(message, &error, &debug);
|
||||
LOG(PR_LOG_ERROR, ("read metadata error: %s: %s", error->message,
|
||||
debug));
|
||||
debug));
|
||||
g_error_free(error);
|
||||
g_free(debug);
|
||||
gst_element_set_state(mPlayBin, GST_STATE_NULL);
|
||||
@ -305,7 +327,7 @@ nsresult GStreamerReader::ReadMetadata(VideoInfo* aInfo,
|
||||
}
|
||||
|
||||
int n_video = 0, n_audio = 0;
|
||||
g_object_get(mPlayBin, "n-video", &n_video, "n-audio", &n_audio, NULL);
|
||||
g_object_get(mPlayBin, "n-video", &n_video, "n-audio", &n_audio, nullptr);
|
||||
mInfo.mHasVideo = n_video != 0;
|
||||
mInfo.mHasAudio = n_audio != 0;
|
||||
|
||||
@ -348,7 +370,7 @@ void GStreamerReader::NotifyBytesConsumed()
|
||||
mLastReportedByteOffset = mByteOffset;
|
||||
}
|
||||
|
||||
bool GStreamerReader::WaitForDecodedData(int *aCounter)
|
||||
bool GStreamerReader::WaitForDecodedData(int* aCounter)
|
||||
{
|
||||
ReentrantMonitorAutoEnter mon(mGstThreadsMonitor);
|
||||
|
||||
@ -375,7 +397,7 @@ bool GStreamerReader::DecodeAudioData()
|
||||
return false;
|
||||
}
|
||||
|
||||
GstBuffer *buffer = gst_app_sink_pull_buffer(mAudioAppSink);
|
||||
GstBuffer* buffer = gst_app_sink_pull_buffer(mAudioAppSink);
|
||||
int64_t timestamp = GST_BUFFER_TIMESTAMP(buffer);
|
||||
timestamp = gst_segment_to_stream_time(&mAudioSegment,
|
||||
GST_FORMAT_TIME, timestamp);
|
||||
@ -390,7 +412,7 @@ bool GStreamerReader::DecodeAudioData()
|
||||
ssize_t outSize = static_cast<size_t>(size / sizeof(AudioDataValue));
|
||||
nsAutoArrayPtr<AudioDataValue> data(new AudioDataValue[outSize]);
|
||||
memcpy(data, GST_BUFFER_DATA(buffer), GST_BUFFER_SIZE(buffer));
|
||||
AudioData *audio = new AudioData(offset, timestamp, duration,
|
||||
AudioData* audio = new AudioData(offset, timestamp, duration,
|
||||
frames, data.forget(), mInfo.mAudioChannels);
|
||||
|
||||
mAudioQueue.Push(audio);
|
||||
@ -404,7 +426,7 @@ bool GStreamerReader::DecodeVideoFrame(bool &aKeyFrameSkip,
|
||||
{
|
||||
NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread.");
|
||||
|
||||
GstBuffer *buffer = NULL;
|
||||
GstBuffer* buffer = nullptr;
|
||||
int64_t timestamp, nextTimestamp;
|
||||
while (true)
|
||||
{
|
||||
@ -418,7 +440,7 @@ bool GStreamerReader::DecodeVideoFrame(bool &aKeyFrameSkip,
|
||||
bool isKeyframe = !GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DISCONT);
|
||||
if ((aKeyFrameSkip && !isKeyframe)) {
|
||||
gst_buffer_unref(buffer);
|
||||
buffer = NULL;
|
||||
buffer = nullptr;
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -442,18 +464,45 @@ bool GStreamerReader::DecodeVideoFrame(bool &aKeyFrameSkip,
|
||||
" threshold %" GST_TIME_FORMAT,
|
||||
GST_TIME_ARGS(timestamp), GST_TIME_ARGS(aTimeThreshold)));
|
||||
gst_buffer_unref(buffer);
|
||||
buffer = NULL;
|
||||
buffer = nullptr;
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (buffer == NULL)
|
||||
if (!buffer)
|
||||
/* no more frames */
|
||||
return false;
|
||||
|
||||
guint8 *data = GST_BUFFER_DATA(buffer);
|
||||
nsRefPtr<PlanarYCbCrImage> image;
|
||||
#if GST_VERSION_MICRO >= 36
|
||||
const GstStructure* structure = gst_buffer_get_qdata(buffer,
|
||||
g_quark_from_string("moz-reader-data"));
|
||||
const GValue* value = gst_structure_get_value(structure, "image");
|
||||
if (value) {
|
||||
BufferData* data = reinterpret_cast<BufferData*>(g_value_get_boxed(value));
|
||||
image = data->mImage;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!image) {
|
||||
/* Ugh, upstream is not calling gst_pad_alloc_buffer(). Fallback to
|
||||
* allocating a PlanarYCbCrImage backed GstBuffer here and memcpy.
|
||||
*/
|
||||
GstBuffer* tmp = nullptr;
|
||||
AllocateVideoBufferFull(nullptr, GST_BUFFER_OFFSET(buffer),
|
||||
GST_BUFFER_SIZE(buffer), nullptr, &tmp, image);
|
||||
|
||||
/* copy */
|
||||
gst_buffer_copy_metadata(tmp, buffer, GST_BUFFER_COPY_ALL);
|
||||
memcpy(GST_BUFFER_DATA(tmp), GST_BUFFER_DATA(buffer),
|
||||
GST_BUFFER_SIZE(tmp));
|
||||
gst_buffer_unref(buffer);
|
||||
buffer = tmp;
|
||||
}
|
||||
|
||||
guint8* data = GST_BUFFER_DATA(buffer);
|
||||
|
||||
int width = mPicture.width;
|
||||
int height = mPicture.height;
|
||||
@ -476,15 +525,9 @@ bool GStreamerReader::DecodeVideoFrame(bool &aKeyFrameSkip,
|
||||
GST_BUFFER_FLAG_DELTA_UNIT);
|
||||
/* XXX ? */
|
||||
int64_t offset = 0;
|
||||
VideoData *video = VideoData::Create(mInfo,
|
||||
mDecoder->GetImageContainer(),
|
||||
offset,
|
||||
timestamp,
|
||||
nextTimestamp,
|
||||
b,
|
||||
isKeyframe,
|
||||
-1,
|
||||
mPicture);
|
||||
VideoData* video = VideoData::Create(mInfo, image, offset,
|
||||
timestamp, nextTimestamp, b,
|
||||
isKeyframe, -1, mPicture);
|
||||
mVideoQueue.Push(video);
|
||||
gst_buffer_unref(buffer);
|
||||
|
||||
@ -521,7 +564,6 @@ nsresult GStreamerReader::GetBuffered(TimeRanges* aBuffered,
|
||||
|
||||
GstFormat format = GST_FORMAT_TIME;
|
||||
MediaResource* resource = mDecoder->GetResource();
|
||||
gint64 resourceLength = resource->GetLength();
|
||||
nsTArray<MediaByteRange> ranges;
|
||||
resource->GetCachedRanges(ranges);
|
||||
|
||||
@ -538,7 +580,7 @@ nsresult GStreamerReader::GetBuffered(TimeRanges* aBuffered,
|
||||
duration = QueryDuration();
|
||||
double end = (double) duration / GST_MSECOND;
|
||||
LOG(PR_LOG_DEBUG, ("complete range [0, %f] for [0, %li]",
|
||||
end, resourceLength));
|
||||
end, resource->GetLength()));
|
||||
aBuffered->Add(0, end);
|
||||
return NS_OK;
|
||||
}
|
||||
@ -558,7 +600,7 @@ nsresult GStreamerReader::GetBuffered(TimeRanges* aBuffered,
|
||||
double start = (double) GST_TIME_AS_USECONDS (startTime) / GST_MSECOND;
|
||||
double end = (double) GST_TIME_AS_USECONDS (endTime) / GST_MSECOND;
|
||||
LOG(PR_LOG_DEBUG, ("adding range [%f, %f] for [%li %li] size %li",
|
||||
start, end, startOffset, endOffset, resourceLength));
|
||||
start, end, startOffset, endOffset, resource->GetLength()));
|
||||
aBuffered->Add(start, end);
|
||||
}
|
||||
|
||||
@ -571,8 +613,8 @@ void GStreamerReader::ReadAndPushData(guint aLength)
|
||||
NS_ASSERTION(resource, "Decoder has no media resource");
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
GstBuffer *buffer = gst_buffer_new_and_alloc(aLength);
|
||||
guint8 *data = GST_BUFFER_DATA(buffer);
|
||||
GstBuffer* buffer = gst_buffer_new_and_alloc(aLength);
|
||||
guint8* data = GST_BUFFER_DATA(buffer);
|
||||
uint32_t size = 0, bytesRead = 0;
|
||||
while(bytesRead < aLength) {
|
||||
rv = resource->Read(reinterpret_cast<char*>(data + bytesRead),
|
||||
@ -587,12 +629,14 @@ void GStreamerReader::ReadAndPushData(guint aLength)
|
||||
mByteOffset += bytesRead;
|
||||
|
||||
GstFlowReturn ret = gst_app_src_push_buffer(mSource, gst_buffer_ref(buffer));
|
||||
if (ret != GST_FLOW_OK)
|
||||
if (ret != GST_FLOW_OK) {
|
||||
LOG(PR_LOG_ERROR, ("ReadAndPushData push ret %s", gst_flow_get_name(ret)));
|
||||
}
|
||||
|
||||
if (GST_BUFFER_SIZE (buffer) < aLength)
|
||||
if (GST_BUFFER_SIZE (buffer) < aLength) {
|
||||
/* If we read less than what we wanted, we reached the end */
|
||||
gst_app_src_end_of_stream(mSource);
|
||||
}
|
||||
|
||||
gst_buffer_unref(buffer);
|
||||
}
|
||||
@ -621,73 +665,77 @@ int64_t GStreamerReader::QueryDuration()
|
||||
return duration;
|
||||
}
|
||||
|
||||
void GStreamerReader::NeedDataCb(GstAppSrc *aSrc,
|
||||
guint aLength,
|
||||
gpointer aUserData)
|
||||
void GStreamerReader::NeedDataCb(GstAppSrc* aSrc,
|
||||
guint aLength,
|
||||
gpointer aUserData)
|
||||
{
|
||||
GStreamerReader *reader = (GStreamerReader *) aUserData;
|
||||
GStreamerReader* reader = reinterpret_cast<GStreamerReader*>(aUserData);
|
||||
reader->NeedData(aSrc, aLength);
|
||||
}
|
||||
|
||||
void GStreamerReader::NeedData(GstAppSrc *aSrc, guint aLength)
|
||||
void GStreamerReader::NeedData(GstAppSrc* aSrc, guint aLength)
|
||||
{
|
||||
if (aLength == -1)
|
||||
if (aLength == static_cast<guint>(-1))
|
||||
aLength = DEFAULT_SOURCE_READ_SIZE;
|
||||
ReadAndPushData(aLength);
|
||||
}
|
||||
|
||||
void GStreamerReader::EnoughDataCb(GstAppSrc *aSrc, gpointer aUserData)
|
||||
void GStreamerReader::EnoughDataCb(GstAppSrc* aSrc, gpointer aUserData)
|
||||
{
|
||||
GStreamerReader *reader = (GStreamerReader *) aUserData;
|
||||
GStreamerReader* reader = reinterpret_cast<GStreamerReader*>(aUserData);
|
||||
reader->EnoughData(aSrc);
|
||||
}
|
||||
|
||||
void GStreamerReader::EnoughData(GstAppSrc *aSrc)
|
||||
void GStreamerReader::EnoughData(GstAppSrc* aSrc)
|
||||
{
|
||||
}
|
||||
|
||||
gboolean GStreamerReader::SeekDataCb(GstAppSrc *aSrc,
|
||||
guint64 aOffset,
|
||||
gpointer aUserData)
|
||||
gboolean GStreamerReader::SeekDataCb(GstAppSrc* aSrc,
|
||||
guint64 aOffset,
|
||||
gpointer aUserData)
|
||||
{
|
||||
GStreamerReader *reader = (GStreamerReader *) aUserData;
|
||||
GStreamerReader* reader = reinterpret_cast<GStreamerReader*>(aUserData);
|
||||
return reader->SeekData(aSrc, aOffset);
|
||||
}
|
||||
|
||||
gboolean GStreamerReader::SeekData(GstAppSrc *aSrc, guint64 aOffset)
|
||||
gboolean GStreamerReader::SeekData(GstAppSrc* aSrc, guint64 aOffset)
|
||||
{
|
||||
ReentrantMonitorAutoEnter mon(mGstThreadsMonitor);
|
||||
MediaResource* resource = mDecoder->GetResource();
|
||||
int64_t resourceLength = resource->GetLength();
|
||||
|
||||
if (gst_app_src_get_size(mSource) == -1)
|
||||
if (gst_app_src_get_size(mSource) == -1) {
|
||||
/* It's possible that we didn't know the length when we initialized mSource
|
||||
* but maybe we do now
|
||||
*/
|
||||
gst_app_src_set_size(mSource, resource->GetLength());
|
||||
gst_app_src_set_size(mSource, resourceLength);
|
||||
}
|
||||
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
if (aOffset < resource->GetLength())
|
||||
if (aOffset < static_cast<guint64>(resourceLength)) {
|
||||
rv = resource->Seek(SEEK_SET, aOffset);
|
||||
}
|
||||
|
||||
if (NS_SUCCEEDED(rv))
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
mByteOffset = mLastReportedByteOffset = aOffset;
|
||||
else
|
||||
} else {
|
||||
LOG(PR_LOG_ERROR, ("seek at %lu failed", aOffset));
|
||||
}
|
||||
|
||||
return NS_SUCCEEDED(rv);
|
||||
}
|
||||
|
||||
gboolean GStreamerReader::EventProbeCb(GstPad *aPad,
|
||||
GstEvent *aEvent,
|
||||
gboolean GStreamerReader::EventProbeCb(GstPad* aPad,
|
||||
GstEvent* aEvent,
|
||||
gpointer aUserData)
|
||||
{
|
||||
GStreamerReader *reader = (GStreamerReader *) aUserData;
|
||||
GStreamerReader* reader = reinterpret_cast<GStreamerReader*>(aUserData);
|
||||
return reader->EventProbe(aPad, aEvent);
|
||||
}
|
||||
|
||||
gboolean GStreamerReader::EventProbe(GstPad *aPad, GstEvent *aEvent)
|
||||
gboolean GStreamerReader::EventProbe(GstPad* aPad, GstEvent* aEvent)
|
||||
{
|
||||
GstElement *parent = GST_ELEMENT(gst_pad_get_parent(aPad));
|
||||
GstElement* parent = GST_ELEMENT(gst_pad_get_parent(aPad));
|
||||
switch(GST_EVENT_TYPE(aEvent)) {
|
||||
case GST_EVENT_NEWSEGMENT:
|
||||
{
|
||||
@ -695,7 +743,7 @@ gboolean GStreamerReader::EventProbe(GstPad *aPad, GstEvent *aEvent)
|
||||
gdouble rate;
|
||||
GstFormat format;
|
||||
gint64 start, stop, position;
|
||||
GstSegment *segment;
|
||||
GstSegment* segment;
|
||||
|
||||
/* Store the segments so we can convert timestamps to stream time, which
|
||||
* is what the upper layers sync on.
|
||||
@ -723,10 +771,72 @@ gboolean GStreamerReader::EventProbe(GstPad *aPad, GstEvent *aEvent)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
GstFlowReturn GStreamerReader::NewPrerollCb(GstAppSink *aSink,
|
||||
GstFlowReturn GStreamerReader::AllocateVideoBufferFull(GstPad* aPad,
|
||||
guint64 aOffset,
|
||||
guint aSize,
|
||||
GstCaps* aCaps,
|
||||
GstBuffer** aBuf,
|
||||
nsRefPtr<PlanarYCbCrImage>& aImage)
|
||||
{
|
||||
/* allocate an image using the container */
|
||||
ImageContainer* container = mDecoder->GetImageContainer();
|
||||
ImageFormat format = PLANAR_YCBCR;
|
||||
PlanarYCbCrImage* img = reinterpret_cast<PlanarYCbCrImage*>(container->CreateImage(&format, 1).get());
|
||||
nsRefPtr<PlanarYCbCrImage> image = dont_AddRef(img);
|
||||
|
||||
/* prepare a GstBuffer pointing to the underlying PlanarYCbCrImage buffer */
|
||||
GstBuffer* buf = gst_buffer_new();
|
||||
GST_BUFFER_SIZE(buf) = aSize;
|
||||
/* allocate the actual YUV buffer */
|
||||
GST_BUFFER_DATA(buf) = image->AllocateAndGetNewBuffer(aSize);
|
||||
|
||||
aImage = image;
|
||||
|
||||
#if GST_VERSION_MICRO >= 36
|
||||
/* create a GBoxed handle to hold the image */
|
||||
BufferData* data = new BufferData(image);
|
||||
|
||||
/* store it in a GValue so we can put it in a GstStructure */
|
||||
GValue value = {0,};
|
||||
g_value_init(&value, buffer_data_get_type());
|
||||
g_value_take_boxed(&value, data);
|
||||
|
||||
/* store the value in the structure */
|
||||
GstStructure* structure = gst_structure_new("moz-reader-data", nullptr);
|
||||
gst_structure_take_value(structure, "image", &value);
|
||||
|
||||
/* and attach the structure to the buffer */
|
||||
gst_buffer_set_qdata(buf, g_quark_from_string("moz-reader-data"), structure);
|
||||
#endif
|
||||
|
||||
*aBuf = buf;
|
||||
return GST_FLOW_OK;
|
||||
}
|
||||
|
||||
GstFlowReturn GStreamerReader::AllocateVideoBufferCb(GstPad* aPad,
|
||||
guint64 aOffset,
|
||||
guint aSize,
|
||||
GstCaps* aCaps,
|
||||
GstBuffer** aBuf)
|
||||
{
|
||||
GStreamerReader* reader = reinterpret_cast<GStreamerReader*>(gst_pad_get_element_private(aPad));
|
||||
return reader->AllocateVideoBuffer(aPad, aOffset, aSize, aCaps, aBuf);
|
||||
}
|
||||
|
||||
GstFlowReturn GStreamerReader::AllocateVideoBuffer(GstPad* aPad,
|
||||
guint64 aOffset,
|
||||
guint aSize,
|
||||
GstCaps* aCaps,
|
||||
GstBuffer** aBuf)
|
||||
{
|
||||
nsRefPtr<PlanarYCbCrImage> image;
|
||||
return AllocateVideoBufferFull(aPad, aOffset, aSize, aCaps, aBuf, image);
|
||||
}
|
||||
|
||||
GstFlowReturn GStreamerReader::NewPrerollCb(GstAppSink* aSink,
|
||||
gpointer aUserData)
|
||||
{
|
||||
GStreamerReader *reader = (GStreamerReader *) aUserData;
|
||||
GStreamerReader* reader = reinterpret_cast<GStreamerReader*>(aUserData);
|
||||
|
||||
if (aSink == reader->mVideoAppSink)
|
||||
reader->VideoPreroll();
|
||||
@ -739,12 +849,12 @@ void GStreamerReader::AudioPreroll()
|
||||
{
|
||||
/* The first audio buffer has reached the audio sink. Get rate and channels */
|
||||
LOG(PR_LOG_DEBUG, ("Audio preroll"));
|
||||
GstPad *sinkpad = gst_element_get_pad(GST_ELEMENT(mAudioAppSink), "sink");
|
||||
GstCaps *caps = gst_pad_get_negotiated_caps(sinkpad);
|
||||
GstStructure *s = gst_caps_get_structure(caps, 0);
|
||||
GstPad* sinkpad = gst_element_get_pad(GST_ELEMENT(mAudioAppSink), "sink");
|
||||
GstCaps* caps = gst_pad_get_negotiated_caps(sinkpad);
|
||||
GstStructure* s = gst_caps_get_structure(caps, 0);
|
||||
mInfo.mAudioRate = mInfo.mAudioChannels = 0;
|
||||
gst_structure_get_int(s, "rate", (gint *) &mInfo.mAudioRate);
|
||||
gst_structure_get_int(s, "channels", (gint *) &mInfo.mAudioChannels);
|
||||
gst_structure_get_int(s, "rate", (gint*) &mInfo.mAudioRate);
|
||||
gst_structure_get_int(s, "channels", (gint*) &mInfo.mAudioChannels);
|
||||
NS_ASSERTION(mInfo.mAudioRate != 0, ("audio rate is zero"));
|
||||
NS_ASSERTION(mInfo.mAudioChannels != 0, ("audio channels is zero"));
|
||||
NS_ASSERTION(mInfo.mAudioChannels > 0 && mInfo.mAudioChannels <= MAX_CHANNELS,
|
||||
@ -758,10 +868,10 @@ void GStreamerReader::VideoPreroll()
|
||||
{
|
||||
/* The first video buffer has reached the video sink. Get width and height */
|
||||
LOG(PR_LOG_DEBUG, ("Video preroll"));
|
||||
GstPad *sinkpad = gst_element_get_pad(GST_ELEMENT(mVideoAppSink), "sink");
|
||||
GstCaps *caps = gst_pad_get_negotiated_caps(sinkpad);
|
||||
GstPad* sinkpad = gst_element_get_pad(GST_ELEMENT(mVideoAppSink), "sink");
|
||||
GstCaps* caps = gst_pad_get_negotiated_caps(sinkpad);
|
||||
gst_video_format_parse_caps(caps, &mFormat, &mPicture.width, &mPicture.height);
|
||||
GstStructure *structure = gst_caps_get_structure(caps, 0);
|
||||
GstStructure* structure = gst_caps_get_structure(caps, 0);
|
||||
gst_structure_get_fraction(structure, "framerate", &fpsNum, &fpsDen);
|
||||
NS_ASSERTION(mPicture.width && mPicture.height, "invalid video resolution");
|
||||
mInfo.mDisplay = nsIntSize(mPicture.width, mPicture.height);
|
||||
@ -770,10 +880,10 @@ void GStreamerReader::VideoPreroll()
|
||||
gst_object_unref(sinkpad);
|
||||
}
|
||||
|
||||
GstFlowReturn GStreamerReader::NewBufferCb(GstAppSink *aSink,
|
||||
gpointer aUserData)
|
||||
GstFlowReturn GStreamerReader::NewBufferCb(GstAppSink* aSink,
|
||||
gpointer aUserData)
|
||||
{
|
||||
GStreamerReader *reader = (GStreamerReader *) aUserData;
|
||||
GStreamerReader* reader = reinterpret_cast<GStreamerReader*>(aUserData);
|
||||
|
||||
if (aSink == reader->mVideoAppSink)
|
||||
reader->NewVideoBuffer();
|
||||
@ -804,13 +914,13 @@ void GStreamerReader::NewAudioBuffer()
|
||||
mon.NotifyAll();
|
||||
}
|
||||
|
||||
void GStreamerReader::EosCb(GstAppSink *aSink, gpointer aUserData)
|
||||
void GStreamerReader::EosCb(GstAppSink* aSink, gpointer aUserData)
|
||||
{
|
||||
GStreamerReader *reader = (GStreamerReader *) aUserData;
|
||||
GStreamerReader* reader = reinterpret_cast<GStreamerReader*>(aUserData);
|
||||
reader->Eos(aSink);
|
||||
}
|
||||
|
||||
void GStreamerReader::Eos(GstAppSink *aSink)
|
||||
void GStreamerReader::Eos(GstAppSink* aSink)
|
||||
{
|
||||
/* We reached the end of the stream */
|
||||
{
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include <gst/app/gstappsrc.h>
|
||||
#include <gst/app/gstappsink.h>
|
||||
#include <gst/video/video.h>
|
||||
#include <map>
|
||||
#include "MediaDecoderReader.h"
|
||||
|
||||
namespace mozilla {
|
||||
@ -49,7 +50,7 @@ public:
|
||||
private:
|
||||
|
||||
void ReadAndPushData(guint aLength);
|
||||
bool WaitForDecodedData(int *counter);
|
||||
bool WaitForDecodedData(int* counter);
|
||||
void NotifyBytesConsumed();
|
||||
int64_t QueryDuration();
|
||||
|
||||
@ -58,56 +59,68 @@ private:
|
||||
/* Called on the source-setup signal emitted by playbin. Used to
|
||||
* configure appsrc .
|
||||
*/
|
||||
static void PlayBinSourceSetupCb(GstElement *aPlayBin,
|
||||
GParamSpec *pspec,
|
||||
static void PlayBinSourceSetupCb(GstElement* aPlayBin,
|
||||
GParamSpec* pspec,
|
||||
gpointer aUserData);
|
||||
void PlayBinSourceSetup(GstAppSrc *aSource);
|
||||
void PlayBinSourceSetup(GstAppSrc* aSource);
|
||||
|
||||
/* Called from appsrc when we need to read more data from the resource */
|
||||
static void NeedDataCb(GstAppSrc *aSrc, guint aLength, gpointer aUserData);
|
||||
void NeedData(GstAppSrc *aSrc, guint aLength);
|
||||
static void NeedDataCb(GstAppSrc* aSrc, guint aLength, gpointer aUserData);
|
||||
void NeedData(GstAppSrc* aSrc, guint aLength);
|
||||
|
||||
/* Called when appsrc has enough data and we can stop reading */
|
||||
static void EnoughDataCb(GstAppSrc *aSrc, gpointer aUserData);
|
||||
void EnoughData(GstAppSrc *aSrc);
|
||||
static void EnoughDataCb(GstAppSrc* aSrc, gpointer aUserData);
|
||||
void EnoughData(GstAppSrc* aSrc);
|
||||
|
||||
/* Called when a seek is issued on the pipeline */
|
||||
static gboolean SeekDataCb(GstAppSrc *aSrc,
|
||||
static gboolean SeekDataCb(GstAppSrc* aSrc,
|
||||
guint64 aOffset,
|
||||
gpointer aUserData);
|
||||
gboolean SeekData(GstAppSrc *aSrc, guint64 aOffset);
|
||||
gboolean SeekData(GstAppSrc* aSrc, guint64 aOffset);
|
||||
|
||||
/* Called when events reach the sinks. See inline comments */
|
||||
static gboolean EventProbeCb(GstPad *aPad, GstEvent *aEvent, gpointer aUserData);
|
||||
gboolean EventProbe(GstPad *aPad, GstEvent *aEvent);
|
||||
static gboolean EventProbeCb(GstPad* aPad, GstEvent* aEvent, gpointer aUserData);
|
||||
gboolean EventProbe(GstPad* aPad, GstEvent* aEvent);
|
||||
|
||||
/* Called when elements in the video branch of the pipeline call
|
||||
* gst_pad_alloc_buffer(). Used to provide PlanarYCbCrImage backed GstBuffers
|
||||
* to the pipeline so that a memory copy can be avoided when handling YUV
|
||||
* buffers from the pipeline to the gfx side.
|
||||
*/
|
||||
static GstFlowReturn AllocateVideoBufferCb(GstPad* aPad, guint64 aOffset, guint aSize,
|
||||
GstCaps* aCaps, GstBuffer** aBuf);
|
||||
GstFlowReturn AllocateVideoBufferFull(GstPad* aPad, guint64 aOffset, guint aSize,
|
||||
GstCaps* aCaps, GstBuffer** aBuf, nsRefPtr<layers::PlanarYCbCrImage>& aImage);
|
||||
GstFlowReturn AllocateVideoBuffer(GstPad* aPad, guint64 aOffset, guint aSize,
|
||||
GstCaps* aCaps, GstBuffer** aBuf);
|
||||
|
||||
/* Called when the pipeline is prerolled, that is when at start or after a
|
||||
* seek, the first audio and video buffers are queued in the sinks.
|
||||
*/
|
||||
static GstFlowReturn NewPrerollCb(GstAppSink *aSink, gpointer aUserData);
|
||||
static GstFlowReturn NewPrerollCb(GstAppSink* aSink, gpointer aUserData);
|
||||
void VideoPreroll();
|
||||
void AudioPreroll();
|
||||
|
||||
/* Called when buffers reach the sinks */
|
||||
static GstFlowReturn NewBufferCb(GstAppSink *aSink, gpointer aUserData);
|
||||
static GstFlowReturn NewBufferCb(GstAppSink* aSink, gpointer aUserData);
|
||||
void NewVideoBuffer();
|
||||
void NewAudioBuffer();
|
||||
|
||||
/* Called at end of stream, when decoding has finished */
|
||||
static void EosCb(GstAppSink *aSink, gpointer aUserData);
|
||||
void Eos(GstAppSink *aSink);
|
||||
static void EosCb(GstAppSink* aSink, gpointer aUserData);
|
||||
void Eos(GstAppSink* aSink);
|
||||
|
||||
GstElement *mPlayBin;
|
||||
GstBus *mBus;
|
||||
GstAppSrc *mSource;
|
||||
GstElement* mPlayBin;
|
||||
GstBus* mBus;
|
||||
GstAppSrc* mSource;
|
||||
/* video sink bin */
|
||||
GstElement *mVideoSink;
|
||||
GstElement* mVideoSink;
|
||||
/* the actual video app sink */
|
||||
GstAppSink *mVideoAppSink;
|
||||
GstAppSink* mVideoAppSink;
|
||||
/* audio sink bin */
|
||||
GstElement *mAudioSink;
|
||||
GstElement* mAudioSink;
|
||||
/* the actual audio app sink */
|
||||
GstAppSink *mAudioAppSink;
|
||||
GstAppSink* mAudioAppSink;
|
||||
GstVideoFormat mFormat;
|
||||
nsIntRect mPicture;
|
||||
int mVideoSinkBufferCount;
|
||||
@ -135,6 +148,21 @@ private:
|
||||
int fpsDen;
|
||||
};
|
||||
|
||||
class BufferData {
|
||||
public:
|
||||
BufferData(layers::PlanarYCbCrImage* aImage) : mImage(aImage) {}
|
||||
|
||||
static void* Copy(void* aData) {
|
||||
return new BufferData(reinterpret_cast<BufferData*>(aData)->mImage);
|
||||
}
|
||||
|
||||
static void Free(void* aData) {
|
||||
delete reinterpret_cast<BufferData*>(aData);
|
||||
}
|
||||
|
||||
nsRefPtr<layers::PlanarYCbCrImage> mImage;
|
||||
};
|
||||
|
||||
} // namespace mozilla
|
||||
|
||||
#endif
|
||||
|
@ -18,11 +18,13 @@ LIBXUL_LIBRARY = 1
|
||||
EXPORTS += \
|
||||
GStreamerDecoder.h \
|
||||
GStreamerReader.h \
|
||||
GStreamerFormatHelper.h \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = \
|
||||
GStreamerReader.cpp \
|
||||
GStreamerDecoder.cpp \
|
||||
GStreamerFormatHelper.cpp \
|
||||
$(NULL)
|
||||
|
||||
FORCE_STATIC_LIB = 1
|
||||
|
@ -1551,7 +1551,7 @@ bool SkeletonState::DecodeHeader(ogg_packet* aPacket)
|
||||
mDoneReadingHeaders = true;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
@ -93,7 +93,9 @@ public:
|
||||
|
||||
virtual CodecType GetType() { return TYPE_UNKNOWN; }
|
||||
|
||||
// Reads a header packet. Returns true when last header has been read.
|
||||
// Reads a header packet. Returns false if an error was encountered
|
||||
// while reading header packets. Callers should check DoneReadingHeaders()
|
||||
// to determine if the last header has been read.
|
||||
// This function takes ownership of the packet and is responsible for
|
||||
// releasing it or queuing it for later processing.
|
||||
virtual bool DecodeHeader(ogg_packet* aPacket) {
|
||||
|
@ -25,7 +25,10 @@ class AudioBufferSourceNodeEngine : public AudioNodeEngine
|
||||
{
|
||||
public:
|
||||
AudioBufferSourceNodeEngine() :
|
||||
mStart(0), mStop(TRACK_TICKS_MAX), mOffset(0), mDuration(0) {}
|
||||
mStart(0), mStop(TRACK_TICKS_MAX),
|
||||
mOffset(0), mDuration(0),
|
||||
mLoop(false), mLoopStart(0), mLoopEnd(0)
|
||||
{}
|
||||
|
||||
// START, OFFSET and DURATION are always set by start() (along with setting
|
||||
// mBuffer to something non-null).
|
||||
@ -34,7 +37,10 @@ public:
|
||||
START,
|
||||
STOP,
|
||||
OFFSET,
|
||||
DURATION
|
||||
DURATION,
|
||||
LOOP,
|
||||
LOOPSTART,
|
||||
LOOPEND
|
||||
};
|
||||
virtual void SetStreamTimeParameter(uint32_t aIndex, TrackTicks aParam)
|
||||
{
|
||||
@ -50,6 +56,9 @@ public:
|
||||
switch (aIndex) {
|
||||
case OFFSET: mOffset = aParam; break;
|
||||
case DURATION: mDuration = aParam; break;
|
||||
case LOOP: mLoop = !!aParam; break;
|
||||
case LOOPSTART: mLoopStart = aParam; break;
|
||||
case LOOPEND: mLoopEnd = aParam; break;
|
||||
default:
|
||||
NS_ERROR("Bad AudioBufferSourceNodeEngine Int32Parameter");
|
||||
}
|
||||
@ -59,6 +68,96 @@ public:
|
||||
mBuffer = aBuffer;
|
||||
}
|
||||
|
||||
// Borrow a full buffer of size WEBAUDIO_BLOCK_SIZE from the source buffer
|
||||
// at offset aSourceOffset. This avoids copying memory.
|
||||
void BorrowFromInputBuffer(AudioChunk* aOutput,
|
||||
uint32_t aChannels,
|
||||
uintptr_t aSourceOffset)
|
||||
{
|
||||
aOutput->mDuration = WEBAUDIO_BLOCK_SIZE;
|
||||
aOutput->mBuffer = mBuffer;
|
||||
aOutput->mChannelData.SetLength(aChannels);
|
||||
for (uint32_t i = 0; i < aChannels; ++i) {
|
||||
aOutput->mChannelData[i] = mBuffer->GetData(i) + aSourceOffset;
|
||||
}
|
||||
aOutput->mVolume = 1.0f;
|
||||
aOutput->mBufferFormat = AUDIO_FORMAT_FLOAT32;
|
||||
}
|
||||
|
||||
// Copy aNumberOfFrames frames from the source buffer at offset aSourceOffset
|
||||
// and put it at offset aBufferOffset in the destination buffer.
|
||||
void CopyFromInputBuffer(AudioChunk* aOutput,
|
||||
uint32_t aChannels,
|
||||
uintptr_t aSourceOffset,
|
||||
uintptr_t aBufferOffset,
|
||||
uint32_t aNumberOfFrames) {
|
||||
for (uint32_t i = 0; i < aChannels; ++i) {
|
||||
float* baseChannelData = static_cast<float*>(const_cast<void*>(aOutput->mChannelData[i]));
|
||||
memcpy(baseChannelData + aBufferOffset,
|
||||
mBuffer->GetData(i) + aSourceOffset,
|
||||
aNumberOfFrames * sizeof(float));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fill aOutput with as many zero frames as we can, and advance
|
||||
* aOffsetWithinBlock and aCurrentPosition based on how many frames we write.
|
||||
* This will never advance aOffsetWithinBlock past WEBAUDIO_BLOCK_SIZE or
|
||||
* aCurrentPosition past aMaxPos. This function knows when it needs to
|
||||
* allocate the output buffer, and also optimizes the case where it can avoid
|
||||
* memory allocations.
|
||||
*/
|
||||
void FillWithZeroes(AudioChunk* aOutput,
|
||||
uint32_t aChannels,
|
||||
uint32_t* aOffsetWithinBlock,
|
||||
TrackTicks* aCurrentPosition,
|
||||
TrackTicks aMaxPos)
|
||||
{
|
||||
uint32_t numFrames = std::min(WEBAUDIO_BLOCK_SIZE - *aOffsetWithinBlock,
|
||||
uint32_t(aMaxPos - *aCurrentPosition));
|
||||
if (numFrames == WEBAUDIO_BLOCK_SIZE) {
|
||||
aOutput->SetNull(numFrames);
|
||||
} else {
|
||||
if (aOutput->IsNull()) {
|
||||
AllocateAudioBlock(aChannels, aOutput);
|
||||
}
|
||||
WriteZeroesToAudioBlock(aOutput, *aOffsetWithinBlock, numFrames);
|
||||
}
|
||||
*aOffsetWithinBlock += numFrames;
|
||||
*aCurrentPosition += numFrames;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy as many frames as possible from the source buffer to aOutput, and
|
||||
* advance aOffsetWithinBlock and aCurrentPosition based on how many frames
|
||||
* we copy. This will never advance aOffsetWithinBlock past
|
||||
* WEBAUDIO_BLOCK_SIZE, or aCurrentPosition past mStop. It takes data from
|
||||
* the buffer at aBufferOffset, and never takes more data than aBufferMax.
|
||||
* This function knows when it needs to allocate the output buffer, and also
|
||||
* optimizes the case where it can avoid memory allocations.
|
||||
*/
|
||||
void CopyFromBuffer(AudioChunk* aOutput,
|
||||
uint32_t aChannels,
|
||||
uint32_t* aOffsetWithinBlock,
|
||||
TrackTicks* aCurrentPosition,
|
||||
uint32_t aBufferOffset,
|
||||
uint32_t aBufferMax)
|
||||
{
|
||||
uint32_t numFrames = std::min(std::min(WEBAUDIO_BLOCK_SIZE - *aOffsetWithinBlock,
|
||||
aBufferMax - aBufferOffset),
|
||||
uint32_t(mStop - *aCurrentPosition));
|
||||
if (numFrames == WEBAUDIO_BLOCK_SIZE) {
|
||||
BorrowFromInputBuffer(aOutput, aChannels, aBufferOffset);
|
||||
} else {
|
||||
if (aOutput->IsNull()) {
|
||||
AllocateAudioBlock(aChannels, aOutput);
|
||||
}
|
||||
CopyFromInputBuffer(aOutput, aChannels, aBufferOffset, *aOffsetWithinBlock, numFrames);
|
||||
}
|
||||
*aOffsetWithinBlock += numFrames;
|
||||
*aCurrentPosition += numFrames;
|
||||
}
|
||||
|
||||
virtual void ProduceAudioBlock(AudioNodeStream* aStream,
|
||||
const AudioChunk& aInput,
|
||||
AudioChunk* aOutput,
|
||||
@ -66,21 +165,6 @@ public:
|
||||
{
|
||||
if (!mBuffer)
|
||||
return;
|
||||
TrackTicks currentPosition = aStream->GetCurrentPosition();
|
||||
if (currentPosition + WEBAUDIO_BLOCK_SIZE <= mStart) {
|
||||
aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
|
||||
return;
|
||||
}
|
||||
TrackTicks endTime = std::min(mStart + mDuration, mStop);
|
||||
// Don't set *aFinished just because we passed mStop. Maybe someone
|
||||
// will call stop() again with a different value.
|
||||
if (currentPosition + WEBAUDIO_BLOCK_SIZE >= mStart + mDuration) {
|
||||
*aFinished = true;
|
||||
}
|
||||
if (currentPosition >= endTime || mStart >= endTime) {
|
||||
aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t channels = mBuffer->GetChannels();
|
||||
if (!channels) {
|
||||
@ -88,34 +172,41 @@ public:
|
||||
return;
|
||||
}
|
||||
|
||||
if (currentPosition >= mStart &&
|
||||
currentPosition + WEBAUDIO_BLOCK_SIZE <= endTime) {
|
||||
// Data is entirely within the buffer. Avoid copying it.
|
||||
aOutput->mDuration = WEBAUDIO_BLOCK_SIZE;
|
||||
aOutput->mBuffer = mBuffer;
|
||||
aOutput->mChannelData.SetLength(channels);
|
||||
for (uint32_t i = 0; i < channels; ++i) {
|
||||
aOutput->mChannelData[i] =
|
||||
mBuffer->GetData(i) + uintptr_t(currentPosition - mStart + mOffset);
|
||||
uint32_t written = 0;
|
||||
TrackTicks currentPosition = aStream->GetCurrentPosition();
|
||||
while (written < WEBAUDIO_BLOCK_SIZE) {
|
||||
if (mStop != TRACK_TICKS_MAX &&
|
||||
currentPosition >= mStop) {
|
||||
FillWithZeroes(aOutput, channels, &written, ¤tPosition, TRACK_TICKS_MAX);
|
||||
continue;
|
||||
}
|
||||
if (currentPosition < mStart) {
|
||||
FillWithZeroes(aOutput, channels, &written, ¤tPosition, mStart);
|
||||
continue;
|
||||
}
|
||||
TrackTicks t = currentPosition - mStart;
|
||||
if (mLoop) {
|
||||
if (mOffset + t < mLoopEnd) {
|
||||
CopyFromBuffer(aOutput, channels, &written, ¤tPosition, mOffset + t, mLoopEnd);
|
||||
} else {
|
||||
uint32_t offsetInLoop = (mOffset + t - mLoopEnd) % (mLoopEnd - mLoopStart);
|
||||
CopyFromBuffer(aOutput, channels, &written, ¤tPosition, mLoopStart + offsetInLoop, mLoopEnd);
|
||||
}
|
||||
} else {
|
||||
if (mOffset + t < mDuration) {
|
||||
CopyFromBuffer(aOutput, channels, &written, ¤tPosition, mOffset + t, mDuration);
|
||||
} else {
|
||||
FillWithZeroes(aOutput, channels, &written, ¤tPosition, TRACK_TICKS_MAX);
|
||||
}
|
||||
}
|
||||
aOutput->mVolume = 1.0f;
|
||||
aOutput->mBufferFormat = AUDIO_FORMAT_FLOAT32;
|
||||
return;
|
||||
}
|
||||
|
||||
AllocateAudioBlock(channels, aOutput);
|
||||
TrackTicks start = std::max(currentPosition, mStart);
|
||||
TrackTicks end = std::min(currentPosition + WEBAUDIO_BLOCK_SIZE, endTime);
|
||||
WriteZeroesToAudioBlock(aOutput, 0, uint32_t(start - currentPosition));
|
||||
for (uint32_t i = 0; i < channels; ++i) {
|
||||
memcpy(static_cast<float*>(const_cast<void*>(aOutput->mChannelData[i])) +
|
||||
uint32_t(start - currentPosition),
|
||||
mBuffer->GetData(i) +
|
||||
uintptr_t(start - mStart + mOffset),
|
||||
uint32_t(end - start) * sizeof(float));
|
||||
// We've finished if we've gone past mStop, or if we're past mDuration when
|
||||
// looping is disabled.
|
||||
if (currentPosition >= mStop ||
|
||||
(!mLoop && currentPosition - mStart + mOffset > mDuration)) {
|
||||
*aFinished = true;
|
||||
}
|
||||
uint32_t endOffset = uint32_t(end - currentPosition);
|
||||
WriteZeroesToAudioBlock(aOutput, endOffset, WEBAUDIO_BLOCK_SIZE - endOffset);
|
||||
}
|
||||
|
||||
TrackTicks mStart;
|
||||
@ -123,10 +214,16 @@ public:
|
||||
nsRefPtr<ThreadSharedFloatArrayBufferList> mBuffer;
|
||||
int32_t mOffset;
|
||||
int32_t mDuration;
|
||||
bool mLoop;
|
||||
int32_t mLoopStart;
|
||||
int32_t mLoopEnd;
|
||||
};
|
||||
|
||||
AudioBufferSourceNode::AudioBufferSourceNode(AudioContext* aContext)
|
||||
: AudioSourceNode(aContext)
|
||||
, mLoopStart(0.0)
|
||||
, mLoopEnd(0.0)
|
||||
, mLoop(false)
|
||||
, mStartCalled(false)
|
||||
{
|
||||
SetProduceOwnOutput(true);
|
||||
@ -173,6 +270,25 @@ AudioBufferSourceNode::Start(JSContext* aCx, double aWhen, double aOffset,
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't compute and set the loop parameters unnecessarily
|
||||
if (mLoop) {
|
||||
double actualLoopStart, actualLoopEnd;
|
||||
if (((mLoopStart != 0.0) || (mLoopEnd != 0.0)) &&
|
||||
mLoopStart >= 0.0 && mLoopEnd > 0.0 &&
|
||||
mLoopStart < mLoopEnd) {
|
||||
actualLoopStart = (mLoopStart > length) ? 0.0 : mLoopStart;
|
||||
actualLoopEnd = std::min(mLoopEnd, length);
|
||||
} else {
|
||||
actualLoopStart = 0.0;
|
||||
actualLoopEnd = length;
|
||||
}
|
||||
int32_t loopStartTicks = NS_lround(actualLoopStart * rate);
|
||||
int32_t loopEndTicks = NS_lround(actualLoopEnd * rate);
|
||||
ns->SetInt32Parameter(AudioBufferSourceNodeEngine::LOOP, 1);
|
||||
ns->SetInt32Parameter(AudioBufferSourceNodeEngine::LOOPSTART, loopStartTicks);
|
||||
ns->SetInt32Parameter(AudioBufferSourceNodeEngine::LOOPEND, loopEndTicks);
|
||||
}
|
||||
|
||||
ns->SetBuffer(data.forget());
|
||||
// Don't set parameter unnecessarily
|
||||
if (aWhen > 0.0) {
|
||||
|
@ -51,10 +51,38 @@ public:
|
||||
mBuffer = aBuffer;
|
||||
}
|
||||
|
||||
bool Loop() const
|
||||
{
|
||||
return mLoop;
|
||||
}
|
||||
void SetLoop(bool aLoop)
|
||||
{
|
||||
mLoop = aLoop;
|
||||
}
|
||||
double LoopStart() const
|
||||
{
|
||||
return mLoopStart;
|
||||
}
|
||||
void SetLoopStart(double aStart)
|
||||
{
|
||||
mLoopStart = aStart;
|
||||
}
|
||||
double LoopEnd() const
|
||||
{
|
||||
return mLoopEnd;
|
||||
}
|
||||
void SetLoopEnd(double aEnd)
|
||||
{
|
||||
mLoopEnd = aEnd;
|
||||
}
|
||||
|
||||
virtual void NotifyMainThreadStateChanged() MOZ_OVERRIDE;
|
||||
|
||||
private:
|
||||
nsRefPtr<AudioBuffer> mBuffer;
|
||||
double mLoopStart;
|
||||
double mLoopEnd;
|
||||
bool mLoop;
|
||||
bool mStartCalled;
|
||||
};
|
||||
|
||||
|
@ -40,7 +40,7 @@ AudioListener::WrapObject(JSContext* aCx, JSObject* aScope)
|
||||
void
|
||||
AudioListener::RegisterPannerNode(PannerNode* aPannerNode)
|
||||
{
|
||||
mPanners.AppendElement(aPannerNode);
|
||||
mPanners.AppendElement(aPannerNode->asWeakPtr());
|
||||
|
||||
// Let the panner node know about our parameters
|
||||
aPannerNode->SendThreeDPointParameterToStream(PannerNode::LISTENER_POSITION, mPosition);
|
||||
@ -55,7 +55,9 @@ void
|
||||
AudioListener::SendDoubleParameterToStream(uint32_t aIndex, double aValue)
|
||||
{
|
||||
for (uint32_t i = 0; i < mPanners.Length(); ++i) {
|
||||
mPanners[i]->SendDoubleParameterToStream(aIndex, aValue);
|
||||
if (mPanners[i]) {
|
||||
mPanners[i]->SendDoubleParameterToStream(aIndex, aValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -63,7 +65,9 @@ void
|
||||
AudioListener::SendThreeDPointParameterToStream(uint32_t aIndex, const ThreeDPoint& aValue)
|
||||
{
|
||||
for (uint32_t i = 0; i < mPanners.Length(); ++i) {
|
||||
mPanners[i]->SendThreeDPointParameterToStream(aIndex, aValue);
|
||||
if (mPanners[i]) {
|
||||
mPanners[i]->SendThreeDPointParameterToStream(aIndex, aValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -90,10 +90,6 @@ public:
|
||||
}
|
||||
|
||||
void RegisterPannerNode(PannerNode* aPannerNode);
|
||||
void UnregisterPannerNode(PannerNode* aPannerNode)
|
||||
{
|
||||
mPanners.RemoveElement(aPannerNode);
|
||||
}
|
||||
|
||||
private:
|
||||
void SendDoubleParameterToStream(uint32_t aIndex, double aValue);
|
||||
@ -107,7 +103,7 @@ private:
|
||||
ThreeDPoint mVelocity;
|
||||
double mDopplerFactor;
|
||||
double mSpeedOfSound;
|
||||
nsTArray<PannerNode*> mPanners;
|
||||
nsTArray<WeakPtr<PannerNode> > mPanners;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -128,7 +128,6 @@ PannerNode::PannerNode(AudioContext* aContext)
|
||||
|
||||
PannerNode::~PannerNode()
|
||||
{
|
||||
Context()->Listener()->UnregisterPannerNode(this);
|
||||
DestroyMediaStream();
|
||||
}
|
||||
|
||||
|
@ -13,13 +13,15 @@
|
||||
#include "mozilla/TypedEnum.h"
|
||||
#include "mozilla/dom/PannerNodeBinding.h"
|
||||
#include "ThreeDPoint.h"
|
||||
#include "mozilla/WeakPtr.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class AudioContext;
|
||||
|
||||
class PannerNode : public AudioNode
|
||||
class PannerNode : public AudioNode,
|
||||
public SupportsWeakPtr<PannerNode>
|
||||
{
|
||||
public:
|
||||
explicit PannerNode(AudioContext* aContext);
|
||||
|
@ -29,6 +29,9 @@ addLoadEvent(function() {
|
||||
is(source.context, context, "Source node has proper context");
|
||||
is(source.numberOfInputs, 0, "Source node has 0 inputs");
|
||||
is(source.numberOfOutputs, 1, "Source node has 1 outputs");
|
||||
is(source.loop, false, "Source node is not looping");
|
||||
is(source.loopStart, 0, "Correct default value for loopStart");
|
||||
is(source.loopEnd, 0, "Correct default value for loopEnd");
|
||||
ok(!source.buffer, "Source node should not have a buffer when it's created");
|
||||
|
||||
source.buffer = buffer;
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "nsIRunnable.h"
|
||||
|
||||
#include "mozilla/Mutex.h"
|
||||
#include "mozilla/Monitor.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsDOMFile.h"
|
||||
#include "nsThreadUtils.h"
|
||||
@ -139,19 +140,17 @@ private:
|
||||
// from kStarted to kStopped (which are combined with EndTrack() and
|
||||
// image changes). Note that mSources is not accessed from other threads
|
||||
// for video and is not protected.
|
||||
mozilla::ReentrantMonitor mMonitor; // Monitor for processing WebRTC frames.
|
||||
Monitor mMonitor; // Monitor for processing WebRTC frames.
|
||||
nsTArray<SourceMediaStream *> mSources; // When this goes empty, we shut down HW
|
||||
|
||||
bool mInitDone;
|
||||
|
||||
bool mInSnapshotMode;
|
||||
nsString* mSnapshotPath;
|
||||
|
||||
nsRefPtr<layers::Image> mImage;
|
||||
nsRefPtr<layers::ImageContainer> mImageContainer;
|
||||
|
||||
PRLock* mSnapshotLock;
|
||||
PRCondVar* mSnapshotCondVar;
|
||||
|
||||
// These are in UTF-8 but webrtc api uses char arrays
|
||||
char mDeviceName[KMaxDeviceNameLength];
|
||||
char mUniqueId[KMaxUniqueIdLength];
|
||||
@ -224,7 +223,7 @@ private:
|
||||
// mMonitor protects mSources[] access/changes, and transitions of mState
|
||||
// from kStarted to kStopped (which are combined with EndTrack()).
|
||||
// mSources[] is accessed from webrtc threads.
|
||||
mozilla::ReentrantMonitor mMonitor;
|
||||
Monitor mMonitor;
|
||||
nsTArray<SourceMediaStream *> mSources; // When this goes empty, we shut down HW
|
||||
|
||||
int mCapIndex;
|
||||
|
@ -144,7 +144,7 @@ MediaEngineWebRTCAudioSource::Start(SourceMediaStream* aStream, TrackID aID)
|
||||
}
|
||||
|
||||
{
|
||||
ReentrantMonitorAutoEnter enter(mMonitor);
|
||||
MonitorAutoLock lock(mMonitor);
|
||||
mSources.AppendElement(aStream);
|
||||
}
|
||||
|
||||
@ -181,7 +181,7 @@ nsresult
|
||||
MediaEngineWebRTCAudioSource::Stop(SourceMediaStream *aSource, TrackID aID)
|
||||
{
|
||||
{
|
||||
ReentrantMonitorAutoEnter enter(mMonitor);
|
||||
MonitorAutoLock lock(mMonitor);
|
||||
|
||||
if (!mSources.RemoveElement(aSource)) {
|
||||
// Already stopped - this is allowed
|
||||
@ -350,7 +350,7 @@ MediaEngineWebRTCAudioSource::Process(const int channel,
|
||||
const webrtc::ProcessingTypes type, sample* audio10ms,
|
||||
const int length, const int samplingFreq, const bool isStereo)
|
||||
{
|
||||
ReentrantMonitorAutoEnter enter(mMonitor);
|
||||
MonitorAutoLock lock(mMonitor);
|
||||
if (mState != kStarted)
|
||||
return;
|
||||
|
||||
|
@ -40,12 +40,13 @@ int
|
||||
MediaEngineWebRTCVideoSource::DeliverFrame(
|
||||
unsigned char* buffer, int size, uint32_t time_stamp, int64_t render_time)
|
||||
{
|
||||
// mInSnapshotMode can only be set before the camera is turned on and
|
||||
// the renderer is started, so this amounts to a 1-shot
|
||||
if (mInSnapshotMode) {
|
||||
// Set the condition variable to false and notify Snapshot().
|
||||
PR_Lock(mSnapshotLock);
|
||||
MonitorAutoLock lock(mMonitor);
|
||||
mInSnapshotMode = false;
|
||||
PR_NotifyCondVar(mSnapshotCondVar);
|
||||
PR_Unlock(mSnapshotLock);
|
||||
lock.Notify();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -94,7 +95,7 @@ MediaEngineWebRTCVideoSource::DeliverFrame(
|
||||
|
||||
// we don't touch anything in 'this' until here (except for snapshot,
|
||||
// which has it's own lock)
|
||||
ReentrantMonitorAutoEnter enter(mMonitor);
|
||||
MonitorAutoLock lock(mMonitor);
|
||||
|
||||
// implicitly releases last image
|
||||
mImage = image.forget();
|
||||
@ -114,7 +115,7 @@ MediaEngineWebRTCVideoSource::NotifyPull(MediaStreamGraph* aGraph,
|
||||
{
|
||||
VideoSegment segment;
|
||||
|
||||
ReentrantMonitorAutoEnter enter(mMonitor);
|
||||
MonitorAutoLock lock(mMonitor);
|
||||
if (mState != kStarted)
|
||||
return;
|
||||
|
||||
@ -328,7 +329,7 @@ MediaEngineWebRTCVideoSource::Stop(SourceMediaStream *aSource, TrackID aID)
|
||||
}
|
||||
|
||||
{
|
||||
ReentrantMonitorAutoEnter enter(mMonitor);
|
||||
MonitorAutoLock lock(mMonitor);
|
||||
mState = kStopped;
|
||||
aSource->EndTrack(aID);
|
||||
// Drop any cached image so we don't start with a stale image on next
|
||||
@ -367,11 +368,10 @@ MediaEngineWebRTCVideoSource::Snapshot(uint32_t aDuration, nsIDOMFile** aFile)
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
mSnapshotLock = PR_NewLock();
|
||||
mSnapshotCondVar = PR_NewCondVar(mSnapshotLock);
|
||||
|
||||
PR_Lock(mSnapshotLock);
|
||||
mInSnapshotMode = true;
|
||||
{
|
||||
MonitorAutoLock lock(mMonitor);
|
||||
mInSnapshotMode = true;
|
||||
}
|
||||
|
||||
// Start the rendering (equivalent to calling Start(), but without a track).
|
||||
int error = 0;
|
||||
@ -387,18 +387,23 @@ MediaEngineWebRTCVideoSource::Snapshot(uint32_t aDuration, nsIDOMFile** aFile)
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
if (mViECapture->StartCapture(mCaptureIndex, mCapability) < 0) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
// Wait for the condition variable, will be set in DeliverFrame.
|
||||
// We use a while loop, because even if PR_WaitCondVar returns, it's not
|
||||
// We use a while loop, because even if Wait() returns, it's not
|
||||
// guaranteed that the condition variable changed.
|
||||
while (mInSnapshotMode) {
|
||||
PR_WaitCondVar(mSnapshotCondVar, PR_INTERVAL_NO_TIMEOUT);
|
||||
// FIX: we need need a way to cancel this and to bail if it appears to not be working
|
||||
// Perhaps a maximum time, though some cameras can take seconds to start. 10 seconds?
|
||||
{
|
||||
MonitorAutoLock lock(mMonitor);
|
||||
while (mInSnapshotMode) {
|
||||
lock.Wait();
|
||||
}
|
||||
}
|
||||
|
||||
// If we get here, DeliverFrame received at least one frame.
|
||||
PR_Unlock(mSnapshotLock);
|
||||
PR_DestroyCondVar(mSnapshotCondVar);
|
||||
PR_DestroyLock(mSnapshotLock);
|
||||
|
||||
webrtc::ViEFile* vieFile = webrtc::ViEFile::GetInterface(mVideoEngine);
|
||||
if (!vieFile) {
|
||||
return NS_ERROR_FAILURE;
|
||||
|
@ -83,6 +83,7 @@ CPPSRCS = \
|
||||
SVGFEImageElement.cpp \
|
||||
SVGFEMergeElement.cpp \
|
||||
SVGFEMergeNodeElement.cpp \
|
||||
SVGFEPointLightElement.cpp \
|
||||
SVGFETileElement.cpp \
|
||||
SVGFilterElement.cpp \
|
||||
SVGForeignObjectElement.cpp \
|
||||
@ -180,6 +181,7 @@ EXPORTS_mozilla/dom = \
|
||||
SVGFEImageElement.h \
|
||||
SVGFEMergeElement.h \
|
||||
SVGFEMergeNodeElement.h \
|
||||
SVGFEPointLightElement.h \
|
||||
SVGFETileElement.h \
|
||||
SVGFilterElement.h \
|
||||
SVGForeignObjectElement.h \
|
||||
|
@ -31,9 +31,9 @@ nsSVGElement::EnumInfo SVGClipPathElement::sEnumInfo[1] =
|
||||
//----------------------------------------------------------------------
|
||||
// nsISupports methods
|
||||
|
||||
NS_IMPL_ISUPPORTS_INHERITED3(SVGClipPathElement, SVGClipPathElementBase,
|
||||
NS_IMPL_ISUPPORTS_INHERITED4(SVGClipPathElement, SVGClipPathElementBase,
|
||||
nsIDOMNode, nsIDOMElement,
|
||||
nsIDOMSVGElement)
|
||||
nsIDOMSVGElement, nsIDOMSVGUnitTypes)
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Implementation
|
||||
|
@ -6,6 +6,7 @@
|
||||
#ifndef mozilla_dom_SVGClipPathElement_h
|
||||
#define mozilla_dom_SVGClipPathElement_h
|
||||
|
||||
#include "nsIDOMSVGUnitTypes.h"
|
||||
#include "nsSVGEnum.h"
|
||||
#include "mozilla/dom/SVGTransformableElement.h"
|
||||
|
||||
@ -20,7 +21,8 @@ namespace dom {
|
||||
typedef SVGTransformableElement SVGClipPathElementBase;
|
||||
|
||||
class SVGClipPathElement MOZ_FINAL : public SVGClipPathElementBase,
|
||||
public nsIDOMSVGElement
|
||||
public nsIDOMSVGElement,
|
||||
public nsIDOMSVGUnitTypes
|
||||
{
|
||||
friend class ::nsSVGClipPathFrame;
|
||||
|
||||
|
@ -21,7 +21,7 @@ protected:
|
||||
friend nsresult (::NS_NewSVGDefsElement(nsIContent **aResult,
|
||||
already_AddRefed<nsINodeInfo> aNodeInfo));
|
||||
SVGDefsElement(already_AddRefed<nsINodeInfo> aNodeInfo);
|
||||
virtual JSObject* WrapNode(JSContext *cx, JSObject *scope) MOZ_OVERRIDE;
|
||||
virtual JSObject* WrapNode(JSContext* aCx, JSObject* aScope) MOZ_OVERRIDE;
|
||||
|
||||
public:
|
||||
// interfaces:
|
||||
|
@ -12,7 +12,7 @@ namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
JSObject*
|
||||
SVGDescElement::WrapNode(JSContext *aCx, JSObject *aScope)
|
||||
SVGDescElement::WrapNode(JSContext* aCx, JSObject* aScope)
|
||||
{
|
||||
return SVGDescElementBinding::Wrap(aCx, aScope, this);
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ protected:
|
||||
already_AddRefed<nsINodeInfo> aNodeInfo));
|
||||
SVGDescElement(already_AddRefed<nsINodeInfo> aNodeInfo);
|
||||
|
||||
virtual JSObject* WrapNode(JSContext *aCx, JSObject *aScope) MOZ_OVERRIDE;
|
||||
virtual JSObject* WrapNode(JSContext* aCx, JSObject* aScope) MOZ_OVERRIDE;
|
||||
|
||||
public:
|
||||
// interfaces:
|
||||
|
87
content/svg/content/src/SVGFEPointLightElement.cpp
Normal file
87
content/svg/content/src/SVGFEPointLightElement.cpp
Normal file
@ -0,0 +1,87 @@
|
||||
/* -*- 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/SVGFEPointLightElement.h"
|
||||
#include "mozilla/dom/SVGFEPointLightElementBinding.h"
|
||||
|
||||
NS_IMPL_NS_NEW_NAMESPACED_SVG_ELEMENT(FEPointLight)
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
JSObject*
|
||||
SVGFEPointLightElement::WrapNode(JSContext *aCx, JSObject *aScope)
|
||||
{
|
||||
return SVGFEPointLightElementBinding::Wrap(aCx, aScope, this);
|
||||
}
|
||||
|
||||
nsSVGElement::NumberInfo SVGFEPointLightElement::sNumberInfo[3] =
|
||||
{
|
||||
{ &nsGkAtoms::x, 0, false },
|
||||
{ &nsGkAtoms::y, 0, false },
|
||||
{ &nsGkAtoms::z, 0, false }
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISupports methods
|
||||
|
||||
NS_IMPL_ADDREF_INHERITED(SVGFEPointLightElement,SVGFEPointLightElementBase)
|
||||
NS_IMPL_RELEASE_INHERITED(SVGFEPointLightElement,SVGFEPointLightElementBase)
|
||||
|
||||
NS_INTERFACE_TABLE_HEAD(SVGFEPointLightElement)
|
||||
NS_NODE_INTERFACE_TABLE3(SVGFEPointLightElement, nsIDOMNode,
|
||||
nsIDOMElement, nsIDOMSVGElement)
|
||||
NS_INTERFACE_MAP_END_INHERITING(SVGFEPointLightElementBase)
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsIDOMNode methods
|
||||
|
||||
NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFEPointLightElement)
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsFEUnstyledElement methods
|
||||
|
||||
bool
|
||||
SVGFEPointLightElement::AttributeAffectsRendering(int32_t aNameSpaceID,
|
||||
nsIAtom* aAttribute) const
|
||||
{
|
||||
return aNameSpaceID == kNameSpaceID_None &&
|
||||
(aAttribute == nsGkAtoms::x ||
|
||||
aAttribute == nsGkAtoms::y ||
|
||||
aAttribute == nsGkAtoms::z);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
already_AddRefed<nsIDOMSVGAnimatedNumber>
|
||||
SVGFEPointLightElement::X()
|
||||
{
|
||||
return mNumberAttributes[ATTR_X].ToDOMAnimatedNumber(this);
|
||||
}
|
||||
|
||||
already_AddRefed<nsIDOMSVGAnimatedNumber>
|
||||
SVGFEPointLightElement::Y()
|
||||
{
|
||||
return mNumberAttributes[ATTR_Y].ToDOMAnimatedNumber(this);
|
||||
}
|
||||
|
||||
already_AddRefed<nsIDOMSVGAnimatedNumber>
|
||||
SVGFEPointLightElement::Z()
|
||||
{
|
||||
return mNumberAttributes[ATTR_Z].ToDOMAnimatedNumber(this);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsSVGElement methods
|
||||
|
||||
nsSVGElement::NumberAttributesInfo
|
||||
SVGFEPointLightElement::GetNumberInfo()
|
||||
{
|
||||
return NumberAttributesInfo(mNumberAttributes, sNumberInfo,
|
||||
ArrayLength(sNumberInfo));
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
64
content/svg/content/src/SVGFEPointLightElement.h
Normal file
64
content/svg/content/src/SVGFEPointLightElement.h
Normal file
@ -0,0 +1,64 @@
|
||||
/* -*- 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_SVGFEPointLightElement_h
|
||||
#define mozilla_dom_SVGFEPointLightElement_h
|
||||
|
||||
#include "nsSVGFilters.h"
|
||||
#include "nsSVGNumber2.h"
|
||||
|
||||
typedef SVGFEUnstyledElement SVGFEPointLightElementBase;
|
||||
|
||||
nsresult NS_NewSVGFEPointLightElement(nsIContent **aResult,
|
||||
already_AddRefed<nsINodeInfo> aNodeInfo);
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class SVGFEPointLightElement : public SVGFEPointLightElementBase,
|
||||
public nsIDOMSVGElement
|
||||
{
|
||||
friend nsresult (::NS_NewSVGFEPointLightElement(nsIContent **aResult,
|
||||
already_AddRefed<nsINodeInfo> aNodeInfo));
|
||||
protected:
|
||||
SVGFEPointLightElement(already_AddRefed<nsINodeInfo> aNodeInfo)
|
||||
: SVGFEPointLightElementBase(aNodeInfo)
|
||||
{
|
||||
SetIsDOMBinding();
|
||||
}
|
||||
virtual JSObject* WrapNode(JSContext *cx, JSObject *scope) MOZ_OVERRIDE;
|
||||
|
||||
public:
|
||||
// interfaces:
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
|
||||
NS_FORWARD_NSIDOMSVGELEMENT(SVGFEPointLightElementBase::)
|
||||
NS_FORWARD_NSIDOMNODE_TO_NSINODE
|
||||
NS_FORWARD_NSIDOMELEMENT_TO_GENERIC
|
||||
|
||||
virtual bool AttributeAffectsRendering(
|
||||
int32_t aNameSpaceID, nsIAtom* aAttribute) const;
|
||||
|
||||
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
|
||||
|
||||
virtual nsIDOMNode* AsDOMNode() { return this; }
|
||||
|
||||
// WebIDL
|
||||
already_AddRefed<nsIDOMSVGAnimatedNumber> X();
|
||||
already_AddRefed<nsIDOMSVGAnimatedNumber> Y();
|
||||
already_AddRefed<nsIDOMSVGAnimatedNumber> Z();
|
||||
|
||||
protected:
|
||||
virtual NumberAttributesInfo GetNumberInfo();
|
||||
|
||||
enum { ATTR_X, ATTR_Y, ATTR_Z };
|
||||
nsSVGNumber2 mNumberAttributes[3];
|
||||
static NumberInfo sNumberInfo[3];
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // mozilla_dom_SVGFEPointLightElement_h
|
@ -55,9 +55,9 @@ nsSVGElement::StringInfo SVGFilterElement::sStringInfo[1] =
|
||||
//----------------------------------------------------------------------
|
||||
// nsISupports methods
|
||||
|
||||
NS_IMPL_ISUPPORTS_INHERITED3(SVGFilterElement, SVGFilterElementBase,
|
||||
NS_IMPL_ISUPPORTS_INHERITED4(SVGFilterElement, SVGFilterElementBase,
|
||||
nsIDOMNode, nsIDOMElement,
|
||||
nsIDOMSVGElement)
|
||||
nsIDOMSVGElement, nsIDOMSVGUnitTypes)
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Implementation
|
||||
|
@ -6,6 +6,7 @@
|
||||
#ifndef mozilla_dom_SVGFilterElement_h
|
||||
#define mozilla_dom_SVGFilterElement_h
|
||||
|
||||
#include "nsIDOMSVGUnitTypes.h"
|
||||
#include "nsSVGEnum.h"
|
||||
#include "nsSVGElement.h"
|
||||
#include "nsSVGIntegerPair.h"
|
||||
@ -25,7 +26,8 @@ namespace dom {
|
||||
class SVGAnimatedLength;
|
||||
|
||||
class SVGFilterElement : public SVGFilterElementBase,
|
||||
public nsIDOMSVGElement
|
||||
public nsIDOMSVGElement,
|
||||
public nsIDOMSVGUnitTypes
|
||||
{
|
||||
friend class ::nsSVGFilterFrame;
|
||||
friend class ::nsAutoFilterInstance;
|
||||
|
@ -53,6 +53,7 @@ NS_IMPL_ADDREF_INHERITED(SVGGradientElement, SVGGradientElementBase)
|
||||
NS_IMPL_RELEASE_INHERITED(SVGGradientElement, SVGGradientElementBase)
|
||||
|
||||
NS_INTERFACE_MAP_BEGIN(SVGGradientElement)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIDOMSVGUnitTypes)
|
||||
NS_INTERFACE_MAP_END_INHERITING(SVGGradientElementBase)
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
@ -6,6 +6,7 @@
|
||||
#ifndef __NS_SVGGRADIENTELEMENT_H__
|
||||
#define __NS_SVGGRADIENTELEMENT_H__
|
||||
|
||||
#include "nsIDOMSVGUnitTypes.h"
|
||||
#include "nsSVGElement.h"
|
||||
#include "nsSVGLength2.h"
|
||||
#include "nsSVGEnum.h"
|
||||
@ -39,6 +40,7 @@ namespace dom {
|
||||
typedef nsSVGElement SVGGradientElementBase;
|
||||
|
||||
class SVGGradientElement : public SVGGradientElementBase
|
||||
, public nsIDOMSVGUnitTypes
|
||||
{
|
||||
friend class ::nsSVGGradientFrame;
|
||||
|
||||
|
@ -46,9 +46,9 @@ nsSVGElement::EnumInfo SVGMaskElement::sEnumInfo[2] =
|
||||
//----------------------------------------------------------------------
|
||||
// nsISupports methods
|
||||
|
||||
NS_IMPL_ISUPPORTS_INHERITED3(SVGMaskElement, SVGMaskElementBase,
|
||||
NS_IMPL_ISUPPORTS_INHERITED4(SVGMaskElement, SVGMaskElementBase,
|
||||
nsIDOMNode, nsIDOMElement,
|
||||
nsIDOMSVGElement)
|
||||
nsIDOMSVGElement, nsIDOMSVGUnitTypes)
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Implementation
|
||||
|
@ -6,6 +6,7 @@
|
||||
#ifndef mozilla_dom_SVGMaskElement_h
|
||||
#define mozilla_dom_SVGMaskElement_h
|
||||
|
||||
#include "nsIDOMSVGUnitTypes.h"
|
||||
#include "nsSVGEnum.h"
|
||||
#include "nsSVGLength2.h"
|
||||
#include "nsSVGElement.h"
|
||||
@ -23,7 +24,8 @@ namespace dom {
|
||||
typedef nsSVGElement SVGMaskElementBase;
|
||||
|
||||
class SVGMaskElement MOZ_FINAL : public SVGMaskElementBase,
|
||||
public nsIDOMSVGElement
|
||||
public nsIDOMSVGElement,
|
||||
public nsIDOMSVGUnitTypes
|
||||
{
|
||||
friend class ::nsSVGMaskFrame;
|
||||
|
||||
|
@ -52,9 +52,9 @@ nsSVGElement::StringInfo SVGPatternElement::sStringInfo[1] =
|
||||
//----------------------------------------------------------------------
|
||||
// nsISupports methods
|
||||
|
||||
NS_IMPL_ISUPPORTS_INHERITED3(SVGPatternElement, SVGPatternElementBase,
|
||||
NS_IMPL_ISUPPORTS_INHERITED4(SVGPatternElement, SVGPatternElementBase,
|
||||
nsIDOMNode, nsIDOMElement,
|
||||
nsIDOMSVGElement)
|
||||
nsIDOMSVGElement, nsIDOMSVGUnitTypes)
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Implementation
|
||||
|
@ -6,6 +6,7 @@
|
||||
#ifndef mozilla_dom_SVGPatternElement_h
|
||||
#define mozilla_dom_SVGPatternElement_h
|
||||
|
||||
#include "nsIDOMSVGUnitTypes.h"
|
||||
#include "nsSVGEnum.h"
|
||||
#include "nsSVGLength2.h"
|
||||
#include "nsSVGString.h"
|
||||
@ -27,7 +28,8 @@ namespace dom {
|
||||
typedef nsSVGElement SVGPatternElementBase;
|
||||
|
||||
class SVGPatternElement MOZ_FINAL : public SVGPatternElementBase,
|
||||
public nsIDOMSVGElement
|
||||
public nsIDOMSVGElement,
|
||||
public nsIDOMSVGUnitTypes
|
||||
{
|
||||
friend class ::nsSVGPatternFrame;
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* a*- 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/. */
|
||||
@ -40,6 +40,7 @@
|
||||
#include "mozilla/dom/SVGFEFuncBElementBinding.h"
|
||||
#include "mozilla/dom/SVGFEFuncGElementBinding.h"
|
||||
#include "mozilla/dom/SVGFEFuncRElementBinding.h"
|
||||
#include "mozilla/dom/SVGFEPointLightElement.h"
|
||||
|
||||
#if defined(XP_WIN)
|
||||
// Prevent Windows redefining LoadImage
|
||||
@ -3669,117 +3670,6 @@ nsSVGFEDistantLightElement::GetNumberInfo()
|
||||
ArrayLength(sNumberInfo));
|
||||
}
|
||||
|
||||
//---------------------PointLight------------------------
|
||||
|
||||
typedef SVGFEUnstyledElement nsSVGFEPointLightElementBase;
|
||||
|
||||
class nsSVGFEPointLightElement : public nsSVGFEPointLightElementBase,
|
||||
public nsIDOMSVGFEPointLightElement
|
||||
{
|
||||
friend nsresult NS_NewSVGFEPointLightElement(nsIContent **aResult,
|
||||
already_AddRefed<nsINodeInfo> aNodeInfo);
|
||||
protected:
|
||||
nsSVGFEPointLightElement(already_AddRefed<nsINodeInfo> aNodeInfo)
|
||||
: nsSVGFEPointLightElementBase(aNodeInfo) {}
|
||||
|
||||
public:
|
||||
// interfaces:
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
NS_DECL_NSIDOMSVGFEPOINTLIGHTELEMENT
|
||||
|
||||
NS_FORWARD_NSIDOMSVGELEMENT(nsSVGFEPointLightElementBase::)
|
||||
NS_FORWARD_NSIDOMNODE_TO_NSINODE
|
||||
NS_FORWARD_NSIDOMELEMENT_TO_GENERIC
|
||||
|
||||
virtual bool AttributeAffectsRendering(
|
||||
int32_t aNameSpaceID, nsIAtom* aAttribute) const;
|
||||
|
||||
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
|
||||
|
||||
virtual nsXPCClassInfo* GetClassInfo();
|
||||
|
||||
virtual nsIDOMNode* AsDOMNode() { return this; }
|
||||
protected:
|
||||
virtual NumberAttributesInfo GetNumberInfo();
|
||||
|
||||
enum { X, Y, Z };
|
||||
nsSVGNumber2 mNumberAttributes[3];
|
||||
static NumberInfo sNumberInfo[3];
|
||||
};
|
||||
|
||||
NS_IMPL_NS_NEW_SVG_ELEMENT(FEPointLight)
|
||||
|
||||
nsSVGElement::NumberInfo nsSVGFEPointLightElement::sNumberInfo[3] =
|
||||
{
|
||||
{ &nsGkAtoms::x, 0, false },
|
||||
{ &nsGkAtoms::y, 0, false },
|
||||
{ &nsGkAtoms::z, 0, false }
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISupports methods
|
||||
|
||||
NS_IMPL_ADDREF_INHERITED(nsSVGFEPointLightElement,nsSVGFEPointLightElementBase)
|
||||
NS_IMPL_RELEASE_INHERITED(nsSVGFEPointLightElement,nsSVGFEPointLightElementBase)
|
||||
|
||||
DOMCI_NODE_DATA(SVGFEPointLightElement, nsSVGFEPointLightElement)
|
||||
|
||||
NS_INTERFACE_TABLE_HEAD(nsSVGFEPointLightElement)
|
||||
NS_NODE_INTERFACE_TABLE4(nsSVGFEPointLightElement, nsIDOMNode,
|
||||
nsIDOMElement, nsIDOMSVGElement,
|
||||
nsIDOMSVGFEPointLightElement)
|
||||
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(SVGFEPointLightElement)
|
||||
NS_INTERFACE_MAP_END_INHERITING(nsSVGFEPointLightElementBase)
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsIDOMNode methods
|
||||
|
||||
NS_IMPL_ELEMENT_CLONE_WITH_INIT(nsSVGFEPointLightElement)
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsFEUnstyledElement methods
|
||||
|
||||
bool
|
||||
nsSVGFEPointLightElement::AttributeAffectsRendering(int32_t aNameSpaceID,
|
||||
nsIAtom* aAttribute) const
|
||||
{
|
||||
return aNameSpaceID == kNameSpaceID_None &&
|
||||
(aAttribute == nsGkAtoms::x ||
|
||||
aAttribute == nsGkAtoms::y ||
|
||||
aAttribute == nsGkAtoms::z);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsIDOMSVGFEPointLightElement methods
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGFEPointLightElement::GetX(nsIDOMSVGAnimatedNumber **aX)
|
||||
{
|
||||
return mNumberAttributes[X].ToDOMAnimatedNumber(aX, this);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGFEPointLightElement::GetY(nsIDOMSVGAnimatedNumber **aY)
|
||||
{
|
||||
return mNumberAttributes[Y].ToDOMAnimatedNumber(aY, this);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGFEPointLightElement::GetZ(nsIDOMSVGAnimatedNumber **aZ)
|
||||
{
|
||||
return mNumberAttributes[Z].ToDOMAnimatedNumber(aZ, this);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsSVGElement methods
|
||||
|
||||
nsSVGElement::NumberAttributesInfo
|
||||
nsSVGFEPointLightElement::GetNumberInfo()
|
||||
{
|
||||
return NumberAttributesInfo(mNumberAttributes, sNumberInfo,
|
||||
ArrayLength(sNumberInfo));
|
||||
}
|
||||
|
||||
//---------------------SpotLight------------------------
|
||||
|
||||
typedef SVGFEUnstyledElement nsSVGFESpotLightElementBase;
|
||||
@ -4195,7 +4085,7 @@ nsSVGFELightingElement::Filter(nsSVGFilterInstance *instance,
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
nsCOMPtr<nsIDOMSVGFEDistantLightElement> distantLight;
|
||||
nsCOMPtr<nsIDOMSVGFEPointLightElement> pointLight;
|
||||
SVGFEPointLightElement* pointLight;
|
||||
nsCOMPtr<nsIDOMSVGFESpotLightElement> spotLight;
|
||||
|
||||
nsIFrame* frame = GetPrimaryFrame();
|
||||
@ -4204,12 +4094,13 @@ nsSVGFELightingElement::Filter(nsSVGFilterInstance *instance,
|
||||
|
||||
nscolor lightColor = style->StyleSVGReset()->mLightingColor;
|
||||
|
||||
// find specified light
|
||||
// find specified light
|
||||
for (nsCOMPtr<nsIContent> child = nsINode::GetFirstChild();
|
||||
child;
|
||||
child = child->GetNextSibling()) {
|
||||
distantLight = do_QueryInterface(child);
|
||||
pointLight = do_QueryInterface(child);
|
||||
pointLight = child->IsSVG(nsGkAtoms::fePointLight) ?
|
||||
static_cast<SVGFEPointLightElement*>(child.get()) : nullptr;
|
||||
spotLight = do_QueryInterface(child);
|
||||
if (distantLight || pointLight || spotLight)
|
||||
break;
|
||||
@ -4234,11 +4125,10 @@ nsSVGFELightingElement::Filter(nsSVGFilterInstance *instance,
|
||||
float lightPos[3], pointsAt[3], specularExponent;
|
||||
float cosConeAngle = 0;
|
||||
if (pointLight) {
|
||||
static_cast<nsSVGFEPointLightElement*>
|
||||
(pointLight.get())->GetAnimatedNumberValues(lightPos,
|
||||
lightPos + 1,
|
||||
lightPos + 2,
|
||||
nullptr);
|
||||
pointLight->GetAnimatedNumberValues(lightPos,
|
||||
lightPos + 1,
|
||||
lightPos + 2,
|
||||
nullptr);
|
||||
instance->ConvertLocation(lightPos);
|
||||
}
|
||||
if (spotLight) {
|
||||
|
@ -68,6 +68,7 @@ MOCHITEST_FILES = \
|
||||
test_SVGStringList.xhtml \
|
||||
test_SVGTransformList.xhtml \
|
||||
test_SVGTransformListAddition.xhtml \
|
||||
test_SVGUnitTypes.html \
|
||||
test_SVGxxxList.xhtml \
|
||||
test_SVGxxxListIndexing.xhtml \
|
||||
test_switch.xhtml \
|
||||
|
43
content/svg/content/test/test_SVGUnitTypes.html
Normal file
43
content/svg/content/test/test_SVGUnitTypes.html
Normal file
@ -0,0 +1,43 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=366697
|
||||
-->
|
||||
<head>
|
||||
<title>Test for Bug 842201</title>
|
||||
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||
</head>
|
||||
<body>
|
||||
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=842201">Mozilla Bug 842201</a>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none"></div>
|
||||
|
||||
<pre id="test">
|
||||
<script class="testbody" type="application/javascript">
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
function runTest()
|
||||
{
|
||||
ok(document.createElementNS("http://www.w3.org/2000/svg", "pattern")
|
||||
instanceof SVGUnitTypes, "Pattern should implement SVGUnitTypes");
|
||||
ok(document.createElementNS("http://www.w3.org/2000/svg", "filter")
|
||||
instanceof SVGUnitTypes, "Filter should implement SVGUnitTypes");
|
||||
ok(document.createElementNS("http://www.w3.org/2000/svg", "mask")
|
||||
instanceof SVGUnitTypes, "Mask should implement SVGUnitTypes");
|
||||
ok(document.createElementNS("http://www.w3.org/2000/svg", "clipPath")
|
||||
instanceof SVGUnitTypes, "ClipPath should implement SVGUnitTypes");
|
||||
ok(document.createElementNS("http://www.w3.org/2000/svg", "linearGradient")
|
||||
instanceof SVGUnitTypes, "LinearGradient should implement SVGUnitTypes");
|
||||
ok(document.createElementNS("http://www.w3.org/2000/svg", "radialGradient")
|
||||
instanceof SVGUnitTypes, "radialGradient should implement SVGUnitTypes");
|
||||
ok(!(document.createElementNS("http://www.w3.org/2000/svg", "svg")
|
||||
instanceof SVGUnitTypes), "svg should not implement SVGUnitTypes");
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
window.addEventListener("load", runTest, false);
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
@ -144,6 +144,16 @@ XULContentSinkImpl::ContextStack::Clear()
|
||||
mDepth = 0;
|
||||
}
|
||||
|
||||
void
|
||||
XULContentSinkImpl::ContextStack::Traverse(nsCycleCollectionTraversalCallback& aCb)
|
||||
{
|
||||
nsCycleCollectionTraversalCallback& cb = aCb;
|
||||
for (ContextStack::Entry* tmp = mTop; tmp; tmp = tmp->mNext) {
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mNode)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mChildren)
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
|
||||
@ -177,10 +187,29 @@ XULContentSinkImpl::~XULContentSinkImpl()
|
||||
//----------------------------------------------------------------------
|
||||
// nsISupports interface
|
||||
|
||||
NS_IMPL_ISUPPORTS3(XULContentSinkImpl,
|
||||
nsIXMLContentSink,
|
||||
nsIContentSink,
|
||||
nsIExpatSink)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(XULContentSinkImpl)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mNodeInfoManager)
|
||||
tmp->mContextStack.Clear();
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mPrototype)
|
||||
NS_IF_RELEASE(tmp->mParser);
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(XULContentSinkImpl)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mNodeInfoManager)
|
||||
tmp->mContextStack.Traverse(cb);
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPrototype)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_RAWPTR(mParser)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
||||
|
||||
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(XULContentSinkImpl)
|
||||
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXMLContentSink)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIXMLContentSink)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIExpatSink)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIContentSink)
|
||||
NS_INTERFACE_MAP_END
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTING_ADDREF(XULContentSinkImpl)
|
||||
NS_IMPL_CYCLE_COLLECTING_RELEASE(XULContentSinkImpl)
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsIContentSink interface
|
||||
|
@ -29,9 +29,11 @@ public:
|
||||
virtual ~XULContentSinkImpl();
|
||||
|
||||
// nsISupports
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
||||
NS_DECL_NSIEXPATSINK
|
||||
|
||||
NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(XULContentSinkImpl, nsIXMLContentSink)
|
||||
|
||||
// nsIContentSink
|
||||
NS_IMETHOD WillParse(void) { return NS_OK; }
|
||||
NS_IMETHOD WillBuildModel(nsDTDMode aDTDMode);
|
||||
@ -128,6 +130,8 @@ protected:
|
||||
nsresult GetTopChildren(nsPrototypeArray** aChildren);
|
||||
|
||||
void Clear();
|
||||
|
||||
void Traverse(nsCycleCollectionTraversalCallback& aCallback);
|
||||
};
|
||||
|
||||
friend class ContextStack;
|
||||
|
@ -1101,7 +1101,7 @@ nsSHistory::GloballyEvictContentViewers()
|
||||
for (uint32_t j = 0; j < shTransactions.Length(); j++) {
|
||||
TransactionAndDistance &container = shTransactions[j];
|
||||
if (container.mViewer == contentViewer) {
|
||||
container.mDistance = std::min(container.mDistance, Abs(i - shist->mIndex));
|
||||
container.mDistance = std::min(container.mDistance, DeprecatedAbs(i - shist->mIndex));
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
@ -1110,7 +1110,7 @@ nsSHistory::GloballyEvictContentViewers()
|
||||
// If we didn't find a TransactionAndDistance for this content viewer, make a new
|
||||
// one.
|
||||
if (!found) {
|
||||
TransactionAndDistance container(trans, Abs(i - shist->mIndex));
|
||||
TransactionAndDistance container(trans, DeprecatedAbs(i - shist->mIndex));
|
||||
shTransactions.AppendElement(container);
|
||||
}
|
||||
}
|
||||
|
@ -837,8 +837,6 @@ static nsDOMClassInfoData sClassInfoData[] = {
|
||||
ELEMENT_SCRIPTABLE_FLAGS)
|
||||
NS_DEFINE_CLASSINFO_DATA(SVGFEOffsetElement, nsElementSH,
|
||||
ELEMENT_SCRIPTABLE_FLAGS)
|
||||
NS_DEFINE_CLASSINFO_DATA(SVGFEPointLightElement, nsElementSH,
|
||||
ELEMENT_SCRIPTABLE_FLAGS)
|
||||
NS_DEFINE_CLASSINFO_DATA(SVGFESpecularLightingElement, nsElementSH,
|
||||
ELEMENT_SCRIPTABLE_FLAGS)
|
||||
NS_DEFINE_CLASSINFO_DATA(SVGFESpotLightElement, nsElementSH,
|
||||
@ -2322,11 +2320,6 @@ nsDOMClassInfo::Init()
|
||||
DOM_CLASSINFO_SVG_ELEMENT_MAP_ENTRIES
|
||||
DOM_CLASSINFO_MAP_END
|
||||
|
||||
DOM_CLASSINFO_MAP_BEGIN(SVGFEPointLightElement, nsIDOMSVGFEPointLightElement)
|
||||
DOM_CLASSINFO_MAP_ENTRY(nsIDOMSVGFEPointLightElement)
|
||||
DOM_CLASSINFO_SVG_ELEMENT_MAP_ENTRIES
|
||||
DOM_CLASSINFO_MAP_END
|
||||
|
||||
DOM_CLASSINFO_MAP_BEGIN(SVGFESpecularLightingElement, nsIDOMSVGFESpecularLightingElement)
|
||||
DOM_CLASSINFO_MAP_ENTRY(nsIDOMSVGFESpecularLightingElement)
|
||||
DOM_CLASSINFO_MAP_ENTRY(nsIDOMSVGFilterPrimitiveStandardAttributes)
|
||||
|
@ -132,7 +132,6 @@ DOMCI_CLASS(SVGFEDistantLightElement)
|
||||
DOMCI_CLASS(SVGFEGaussianBlurElement)
|
||||
DOMCI_CLASS(SVGFEMorphologyElement)
|
||||
DOMCI_CLASS(SVGFEOffsetElement)
|
||||
DOMCI_CLASS(SVGFEPointLightElement)
|
||||
DOMCI_CLASS(SVGFESpecularLightingElement)
|
||||
DOMCI_CLASS(SVGFESpotLightElement)
|
||||
DOMCI_CLASS(SVGFETurbulenceElement)
|
||||
|
@ -159,6 +159,10 @@ DOMInterfaces = {
|
||||
'resultNotAddRefed': [ 'item' ]
|
||||
},
|
||||
|
||||
'CommandEvent': {
|
||||
'nativeType': 'nsDOMCommandEvent',
|
||||
},
|
||||
|
||||
'CSS': {
|
||||
'concrete': False,
|
||||
},
|
||||
@ -497,6 +501,10 @@ DOMInterfaces = {
|
||||
'binaryNames': { '__indexedGetter': 'IndexedGetter' }
|
||||
},
|
||||
|
||||
'MessageEvent': {
|
||||
'nativeType': 'nsDOMMessageEvent',
|
||||
},
|
||||
|
||||
'MozChannel': [
|
||||
{
|
||||
'nativeType': 'nsIChannel',
|
||||
@ -831,6 +839,10 @@ DOMInterfaces = {
|
||||
'resultNotAddRefed': [ 'getElementById' ]
|
||||
},
|
||||
|
||||
'SVGUnitTypes' : {
|
||||
'concrete': False,
|
||||
},
|
||||
|
||||
'Text': {
|
||||
# Total hack to allow binding code to realize that nsTextNode can
|
||||
# in fact be cast to Text.
|
||||
@ -864,6 +876,10 @@ DOMInterfaces = {
|
||||
'resultNotAddRefed': [ 'root', 'currentNode' ],
|
||||
},
|
||||
|
||||
'UIEvent': {
|
||||
'nativeType': 'nsDOMUIEvent',
|
||||
},
|
||||
|
||||
'URL' : [{
|
||||
'concrete': False,
|
||||
},
|
||||
@ -1083,6 +1099,47 @@ DOMInterfaces = {
|
||||
'register': False
|
||||
},
|
||||
|
||||
'ImplementedInterface' : {
|
||||
'headerFile': 'TestBindingHeader.h',
|
||||
'concrete': False,
|
||||
'register': False,
|
||||
},
|
||||
|
||||
'ImplementedInterfaceParent' : {
|
||||
'headerFile': 'TestBindingHeader.h',
|
||||
'concrete': False,
|
||||
'register': False
|
||||
},
|
||||
|
||||
'DiamondImplements' : {
|
||||
'headerFile': 'TestBindingHeader.h',
|
||||
'concrete': False,
|
||||
'register': False
|
||||
},
|
||||
|
||||
'DiamondBranch1A' : {
|
||||
'headerFile': 'TestBindingHeader.h',
|
||||
'concrete': False,
|
||||
'register': False
|
||||
},
|
||||
|
||||
'DiamondBranch1B' : {
|
||||
'headerFile': 'TestBindingHeader.h',
|
||||
'concrete': False,
|
||||
'register': False
|
||||
},
|
||||
|
||||
'DiamondBranch2A' : {
|
||||
'headerFile': 'TestBindingHeader.h',
|
||||
'concrete': False,
|
||||
'register': False
|
||||
},
|
||||
|
||||
'DiamondBranch2B' : {
|
||||
'headerFile': 'TestBindingHeader.h',
|
||||
'concrete': False,
|
||||
'register': False
|
||||
},
|
||||
|
||||
'TestIndexedGetterInterface' : {
|
||||
'headerFile': 'TestBindingHeader.h',
|
||||
|
@ -265,7 +265,6 @@ class CGInterfaceObjectJSClass(CGThing):
|
||||
else:
|
||||
ctorname = "ThrowingConstructor"
|
||||
if NeedsGeneratedHasInstance(self.descriptor):
|
||||
assert self.descriptor.interface.hasInterfacePrototypeObject()
|
||||
hasinstance = HASINSTANCE_HOOK_NAME
|
||||
elif self.descriptor.interface.hasInterfacePrototypeObject():
|
||||
hasinstance = "InterfaceHasInstance"
|
||||
@ -497,11 +496,13 @@ class CGHeaders(CGWrapper):
|
||||
bindingIncludes = set(self.getDeclarationFilename(d) for d in interfaceDeps)
|
||||
|
||||
# Grab all the implementation declaration files we need.
|
||||
implementationIncludes = set(d.headerFile for d in descriptors)
|
||||
implementationIncludes = set(d.headerFile for d in descriptors if d.needsHeaderInclude())
|
||||
|
||||
# Grab the includes for the things that involve XPCOM interfaces
|
||||
hasInstanceIncludes = set("nsIDOM" + d.interface.identifier.name + ".h" for d
|
||||
in descriptors if NeedsGeneratedHasInstance(d))
|
||||
in descriptors if
|
||||
NeedsGeneratedHasInstance(d) and
|
||||
d.interface.hasInterfaceObject())
|
||||
|
||||
# Now find all the things we'll need as arguments because we
|
||||
# need to wrap or unwrap them.
|
||||
@ -1052,16 +1053,23 @@ class CGClassHasInstanceHook(CGAbstractStaticMethod):
|
||||
|
||||
def generate_code(self):
|
||||
assert self.descriptor.nativeOwnership == 'nsisupports'
|
||||
if self.descriptor.interface.hasInterfacePrototypeObject():
|
||||
hasInstanceCode = """
|
||||
bool ok = InterfaceHasInstance(cx, obj, instance, bp);
|
||||
if (!ok || *bp) {
|
||||
return ok;
|
||||
}
|
||||
"""
|
||||
else:
|
||||
hasInstanceCode = ""
|
||||
|
||||
return """ if (!vp.isObject()) {
|
||||
*bp = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
JSObject* instance = &vp.toObject();
|
||||
bool ok = InterfaceHasInstance(cx, obj, instance, bp);
|
||||
if (!ok || *bp) {
|
||||
return ok;
|
||||
}
|
||||
%s
|
||||
|
||||
// FIXME Limit this to chrome by checking xpc::AccessCheck::isChrome(obj).
|
||||
nsISupports* native =
|
||||
@ -1069,7 +1077,7 @@ class CGClassHasInstanceHook(CGAbstractStaticMethod):
|
||||
js::UnwrapObject(instance));
|
||||
nsCOMPtr<nsIDOM%s> qiResult = do_QueryInterface(native);
|
||||
*bp = !!qiResult;
|
||||
return true;""" % self.descriptor.interface.identifier.name
|
||||
return true;""" % (hasInstanceCode, self.descriptor.interface.identifier.name)
|
||||
|
||||
def isChromeOnly(m):
|
||||
return m.getExtendedAttribute("ChromeOnly")
|
||||
|
@ -36,9 +36,9 @@ class Configuration:
|
||||
self.interfaces[iface.identifier.name] = iface
|
||||
if iface.identifier.name not in config:
|
||||
# Completely skip consequential interfaces with no descriptor
|
||||
# because chances are we don't need to do anything interesting
|
||||
# with them.
|
||||
if iface.isConsequential():
|
||||
# if they have no interface object because chances are we
|
||||
# don't need to do anything interesting with them.
|
||||
if iface.isConsequential() and not iface.hasInterfaceObject():
|
||||
continue
|
||||
entry = {}
|
||||
else:
|
||||
@ -447,6 +447,15 @@ class Descriptor(DescriptorProvider):
|
||||
assert self.interface.hasInterfaceObject()
|
||||
return False
|
||||
|
||||
def needsHeaderInclude(self):
|
||||
"""
|
||||
An interface doesn't need a header file if it is not concrete,
|
||||
not pref-controlled, and has only consts.
|
||||
"""
|
||||
return (self.interface.isExternal() or self.concrete or
|
||||
self.interface.getExtendedAttribute("PrefControlled") or
|
||||
not all(m.isConst() for m in self.interface.members))
|
||||
|
||||
# Some utility methods
|
||||
def getTypesFromDescriptor(descriptor):
|
||||
"""
|
||||
|
@ -522,6 +522,7 @@ interface TestChildInterface : TestParentInterface {
|
||||
interface TestNonWrapperCacheInterface {
|
||||
};
|
||||
|
||||
[NoInterfaceObject]
|
||||
interface ImplementedInterfaceParent {
|
||||
void implementedParentMethod();
|
||||
attribute boolean implementedParentProperty;
|
||||
@ -539,6 +540,7 @@ interface IndirectlyImplementedInterface {
|
||||
const long indirectlyImplementedConstant = 9;
|
||||
};
|
||||
|
||||
[NoInterfaceObject]
|
||||
interface ImplementedInterface : ImplementedInterfaceParent {
|
||||
void implementedMethod();
|
||||
attribute boolean implementedProperty;
|
||||
@ -546,15 +548,20 @@ interface ImplementedInterface : ImplementedInterfaceParent {
|
||||
const long implementedConstant = 5;
|
||||
};
|
||||
|
||||
[NoInterfaceObject]
|
||||
interface DiamondImplements {
|
||||
readonly attribute long diamondImplementedProperty;
|
||||
};
|
||||
[NoInterfaceObject]
|
||||
interface DiamondBranch1A {
|
||||
};
|
||||
[NoInterfaceObject]
|
||||
interface DiamondBranch1B {
|
||||
};
|
||||
[NoInterfaceObject]
|
||||
interface DiamondBranch2A : DiamondImplements {
|
||||
};
|
||||
[NoInterfaceObject]
|
||||
interface DiamondBranch2B : DiamondImplements {
|
||||
};
|
||||
TestInterface implements DiamondBranch1A;
|
||||
|
@ -20,7 +20,7 @@ interface nsIDOMValidityState;
|
||||
* http://www.whatwg.org/specs/web-apps/current-work/
|
||||
*/
|
||||
|
||||
[scriptable, uuid(8bc13946-1e4f-4fb2-a723-c768e0ee22ee)]
|
||||
[scriptable, uuid(2a382800-8c28-11e2-9e96-0800200c9a66)]
|
||||
interface nsIDOMHTMLInputElement : nsIDOMHTMLElement
|
||||
{
|
||||
attribute DOMString accept;
|
||||
@ -43,7 +43,7 @@ interface nsIDOMHTMLInputElement : nsIDOMHTMLElement
|
||||
attribute unsigned long height;
|
||||
attribute boolean indeterminate;
|
||||
|
||||
attribute DOMString inputmode;
|
||||
attribute DOMString inputMode;
|
||||
|
||||
readonly attribute nsIDOMHTMLElement list;
|
||||
attribute DOMString max;
|
||||
|
@ -212,13 +212,6 @@ interface nsIDOMSVGFEDistantLightElement : nsIDOMSVGElement {
|
||||
readonly attribute nsIDOMSVGAnimatedNumber elevation;
|
||||
};
|
||||
|
||||
[scriptable, uuid(0fd668af-52de-463f-ac07-22a8a44c3b3a)]
|
||||
interface nsIDOMSVGFEPointLightElement : nsIDOMSVGElement {
|
||||
readonly attribute nsIDOMSVGAnimatedNumber x;
|
||||
readonly attribute nsIDOMSVGAnimatedNumber y;
|
||||
readonly attribute nsIDOMSVGAnimatedNumber z;
|
||||
};
|
||||
|
||||
[scriptable, uuid(e9bd8308-dc52-438b-a315-a0d545dfeda3)]
|
||||
interface nsIDOMSVGFESpotLightElement : nsIDOMSVGElement {
|
||||
readonly attribute nsIDOMSVGAnimatedNumber x;
|
||||
|
@ -16,8 +16,4 @@
|
||||
[scriptable, uuid(154b572f-3d0b-49c0-8b5d-8864d05bd3d1)]
|
||||
interface nsIDOMSVGUnitTypes : nsISupports
|
||||
{
|
||||
// Unit Types
|
||||
const unsigned short SVG_UNIT_TYPE_UNKNOWN = 0;
|
||||
const unsigned short SVG_UNIT_TYPE_USERSPACEONUSE = 1;
|
||||
const unsigned short SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
|
||||
};
|
||||
|
@ -17,6 +17,7 @@ Cu.import("resource://gre/modules/SettingsQueue.jsm");
|
||||
Cu.import("resource://gre/modules/SettingsDB.jsm");
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
Cu.import("resource://gre/modules/ObjectWrapper.jsm")
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetter(this, "cpmm",
|
||||
"@mozilla.org/childprocessmessagemanager;1",
|
||||
@ -42,6 +43,10 @@ SettingsLock.prototype = {
|
||||
return !this._open;
|
||||
},
|
||||
|
||||
_wrap: function _wrap(obj) {
|
||||
return ObjectWrapper.wrap(obj, this._settingsManager._window);
|
||||
},
|
||||
|
||||
process: function process() {
|
||||
let lock = this;
|
||||
lock._open = false;
|
||||
@ -127,35 +132,25 @@ SettingsLock.prototype = {
|
||||
: store.mozGetAll(info.name);
|
||||
|
||||
getReq.onsuccess = function(event) {
|
||||
if (DEBUG) debug("Request for '" + info.name + "' successful. " +
|
||||
if (DEBUG) debug("Request for '" + info.name + "' successful. " +
|
||||
"Record count: " + event.target.result.length);
|
||||
|
||||
if (event.target.result.length == 0) {
|
||||
if (DEBUG) debug("MOZSETTINGS-GET-WARNING: " + info.name + " is not in the database.\n");
|
||||
}
|
||||
|
||||
let results = {
|
||||
__exposedProps__: {
|
||||
}
|
||||
};
|
||||
let results = {};
|
||||
|
||||
for (var i in event.target.result) {
|
||||
let result = event.target.result[i];
|
||||
var name = result.settingName;
|
||||
if (DEBUG) debug("VAL: " + result.userValue +", " + result.defaultValue + "\n");
|
||||
var value = result.userValue !== undefined ? result.userValue : result.defaultValue;
|
||||
results[name] = value;
|
||||
results.__exposedProps__[name] = "r";
|
||||
// If the value itself is an object, expose the properties.
|
||||
if (typeof value == "object" && value != null) {
|
||||
var exposed = {};
|
||||
Object.keys(value).forEach(function(key) { exposed[key] = 'r'; });
|
||||
results[name].__exposedProps__ = exposed;
|
||||
}
|
||||
results[name] = this._wrap(value);
|
||||
}
|
||||
|
||||
this._open = true;
|
||||
Services.DOMRequest.fireSuccess(request, results);
|
||||
Services.DOMRequest.fireSuccess(request, this._wrap(results));
|
||||
this._open = false;
|
||||
}.bind(lock);
|
||||
|
||||
@ -272,6 +267,10 @@ SettingsManager.prototype = {
|
||||
_onsettingchange: null,
|
||||
_callbacks: null,
|
||||
|
||||
_wrap: function _wrap(obj) {
|
||||
return ObjectWrapper.wrap(obj, this._window);
|
||||
},
|
||||
|
||||
nextTick: function nextTick(aCallback, thisObj) {
|
||||
if (thisObj)
|
||||
aCallback = aCallback.bind(thisObj);
|
||||
@ -326,15 +325,14 @@ SettingsManager.prototype = {
|
||||
if (this._callbacks && this._callbacks[msg.key]) {
|
||||
if (DEBUG) debug("observe callback called! " + msg.key + " " + this._callbacks[msg.key].length);
|
||||
this._callbacks[msg.key].forEach(function(cb) {
|
||||
cb({settingName: msg.key, settingValue: msg.value,
|
||||
__exposedProps__: {settingName: 'r', settingValue: 'r'}});
|
||||
});
|
||||
cb(this._wrap({settingName: msg.key, settingValue: msg.value}));
|
||||
}.bind(this));
|
||||
}
|
||||
} else {
|
||||
if (DEBUG) debug("no observers stored!");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
default:
|
||||
if (DEBUG) debug("Wrong message: " + aMessage.name);
|
||||
}
|
||||
},
|
||||
|
@ -308,7 +308,7 @@ var steps = [
|
||||
is(req2.result["screen.brightness"], 0.7, "same Value");
|
||||
}
|
||||
req2.onerror = onFailure;
|
||||
|
||||
|
||||
var lock2 = mozSettings.createLock();
|
||||
req5 = lock2.get("screen.brightness");
|
||||
req5.onsuccess = function () {
|
||||
@ -465,7 +465,7 @@ var steps = [
|
||||
}.bind({testObj: testObj, request: req5});
|
||||
req5.onerror = onFailure;
|
||||
}
|
||||
|
||||
|
||||
var lock5 = mozSettings.createLock();
|
||||
req6 = lock5.clear();
|
||||
req6.onsuccess = function () {
|
||||
@ -495,14 +495,14 @@ var steps = [
|
||||
function () {
|
||||
ok(true, "Test locking result");
|
||||
var lock = mozSettings.createLock();
|
||||
|
||||
|
||||
req = lock.get("wifi.enabled");
|
||||
req.onsuccess = function() {
|
||||
check(req.result, wifiEnabled);
|
||||
ok(true, "Test2 locking result done");
|
||||
}
|
||||
req.onerror = onFailure;
|
||||
|
||||
|
||||
req2 = lock.clear();
|
||||
req2.onsuccess = function () {
|
||||
ok(true, "Deleted the database");
|
||||
@ -515,7 +515,7 @@ var steps = [
|
||||
next();
|
||||
}
|
||||
req3.onerror = onFailure;
|
||||
|
||||
|
||||
},
|
||||
function () {
|
||||
ok(true, "Get all settings");
|
||||
@ -734,6 +734,32 @@ var steps = [
|
||||
};
|
||||
req.onerror = onFailure;
|
||||
},
|
||||
function() {
|
||||
ok(true, "Set object value");
|
||||
var lock = mozSettings.createLock();
|
||||
req = lock.set({"setting-obj": {foo: {bar: 23}}});
|
||||
req.onsuccess = function() {
|
||||
req2 = lock.get("setting-obj");
|
||||
req2.onsuccess = function(event) {
|
||||
var result = event.target.result["setting-obj"];
|
||||
ok(result, "Got valid result");
|
||||
ok(typeof result == "object", "Result is object");
|
||||
ok("foo" in result && "bar" in result.foo, "Result has properties");
|
||||
ok(result.foo.bar == 23, "Result properties are set");
|
||||
next();
|
||||
};
|
||||
};
|
||||
},
|
||||
function() {
|
||||
ok(true, "Clear DB");
|
||||
var lock = mozSettings.createLock();
|
||||
req = lock.clear();
|
||||
req.onsuccess = function () {
|
||||
ok(true, "Deleted the database");
|
||||
next();
|
||||
};
|
||||
req.onerror = onFailure;
|
||||
},
|
||||
function () {
|
||||
ok(true, "all done!\n");
|
||||
SimpleTest.finish();
|
||||
|
@ -2670,7 +2670,7 @@ RadioInterfaceLayer.prototype = {
|
||||
|
||||
let options = this._fragmentText(message, null, strict7BitEncoding);
|
||||
options.rilMessageType = "sendSMS";
|
||||
options.number = number;
|
||||
options.number = PhoneNumberUtils.normalize(number);
|
||||
options.requestStatusReport = true;
|
||||
if (options.segmentMaxSeq > 1) {
|
||||
options.segmentRef16Bit = this.segmentRef16Bit;
|
||||
@ -2701,7 +2701,14 @@ RadioInterfaceLayer.prototype = {
|
||||
sms: sms,
|
||||
requestStatusReport: options.requestStatusReport
|
||||
});
|
||||
this.worker.postMessage(options);
|
||||
|
||||
if (PhoneNumberUtils.isPlainPhoneNumber(options.number)) {
|
||||
this.worker.postMessage(options);
|
||||
} else {
|
||||
debug('Number ' + options.number + ' is not sendable.');
|
||||
this.handleSmsSendFailed(options);
|
||||
}
|
||||
|
||||
}.bind(this));
|
||||
},
|
||||
|
||||
|
@ -15,22 +15,51 @@
|
||||
ok(window.performance.now() >= n, "The value of now() should monotonically increase.");
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
// The spec says performance.now() should have micro-second resolution, but allows 1ms if the platform doesn't support it.
|
||||
// Our implementation does provide micro-second resolution, except for windows XP combined with some HW properties
|
||||
// where we can't use QueryPerformanceCounters (see comments at mozilla-central/xpcom/ds/TimeStamp_windows.cpp).
|
||||
// This XP-low-res case results in about 15ms resolutions, and can be identified when perf.now() returns only integers.
|
||||
//
|
||||
// Since setTimeout might return too early/late, our goal is that perf.now() changed within 2ms
|
||||
// (or 25ms for XP-low-res), rather than specific number of setTimeout(N) invocations.
|
||||
// See bug 749894 (intermittent failures of this test)
|
||||
var platformPossiblyLowRes = navigator.oscpu.indexOf("Windows NT 5.1") == 0; // XP only
|
||||
var allInts = (n % 1) == 0; // Indicator of limited HW resolution.
|
||||
var checks = 0;
|
||||
|
||||
function checkAfterTimeout() {
|
||||
checks++;
|
||||
var d2 = Date.now();
|
||||
// Timeouts aren't extremely reliable and especially on Windows we are prone to fallback to
|
||||
// millisecond timers, in which case this test might occasionally fail. This is a workaround:
|
||||
if (navigator.platform.indexOf("Win") == 0 &&
|
||||
window.performance.now() == n && d == d2 &&
|
||||
checks < 5) {
|
||||
setTimeout(checkAfterTimeout, 20);
|
||||
var n2 = window.performance.now();
|
||||
|
||||
allInts = allInts && (n2 % 1) == 0;
|
||||
var lowResCounter = platformPossiblyLowRes && allInts;
|
||||
|
||||
if ( n2 == n && checks < 50 && // 50 is just a failsafe. Our real goals are 2ms or 25ms.
|
||||
( (d2 - d) < 2 // The spec allows 1ms resolution. We allow up to measured 2ms to ellapse.
|
||||
||
|
||||
lowResCounter &&
|
||||
(d2 - d) < 25
|
||||
)
|
||||
) {
|
||||
setTimeout(checkAfterTimeout, 1);
|
||||
return;
|
||||
}
|
||||
ok(window.performance.now() > n, "After a timeout, the value of now() should be strictly greater than before.");
|
||||
|
||||
// Loose spec: 1ms resolution, or 15ms resolution for the XP-low-res case.
|
||||
// We shouldn't test that dt is actually within 2/25ms since the iterations break if it isn't, and timeout could be late.
|
||||
ok(n2 > n, "Loose - the value of now() should increase within 2ms (or 25ms if low-res counter) (delta now(): " + (n2 - n) + " ms).");
|
||||
|
||||
// Strict spec: if it's not the XP-low-res case, while the spec allows 1ms resolution, it prefers microseconds, which we provide.
|
||||
// Since the fastest setTimeout return which I observed was ~500 microseconds, a microseconds counter should change in 1 iteretion.
|
||||
ok(n2 > n && (lowResCounter || checks == 1),
|
||||
"Strict - [if high-res counter] the value of now() should increase after one setTimeout (hi-res: " + (!lowResCounter) +
|
||||
", iters: " + checks +
|
||||
", dt: " + (d2 - d) +
|
||||
", now(): " + n2 + ").");
|
||||
SimpleTest.finish();
|
||||
};
|
||||
setTimeout(checkAfterTimeout, 20);
|
||||
setTimeout(checkAfterTimeout, 1);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -25,7 +25,10 @@ interface AudioBufferSourceNode : AudioSourceNode {
|
||||
attribute AudioBuffer? buffer;
|
||||
|
||||
//attribute AudioParam playbackRate;
|
||||
//attribute boolean loop;
|
||||
|
||||
attribute boolean loop;
|
||||
attribute double loopStart;
|
||||
attribute double loopEnd;
|
||||
|
||||
[Throws]
|
||||
void start(optional double when = 0, optional double grainOffset = 0,
|
||||
|
14
dom/webidl/CommandEvent.webidl
Normal file
14
dom/webidl/CommandEvent.webidl
Normal file
@ -0,0 +1,14 @@
|
||||
/* -*- Mode: IDL; 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/.
|
||||
*/
|
||||
|
||||
interface CommandEvent : Event {
|
||||
readonly attribute DOMString? command;
|
||||
|
||||
void initCommandEvent(DOMString type,
|
||||
boolean canBubble,
|
||||
boolean cancelable,
|
||||
DOMString? command);
|
||||
};
|
52
dom/webidl/MessageEvent.webidl
Normal file
52
dom/webidl/MessageEvent.webidl
Normal file
@ -0,0 +1,52 @@
|
||||
/* -*- Mode: IDL; 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/.
|
||||
*
|
||||
* For more information on this interface, please see
|
||||
* http://www.whatwg.org/specs/web-apps/current-work/#messageevent
|
||||
*/
|
||||
|
||||
interface WindowProxy;
|
||||
|
||||
interface MessageEvent : Event
|
||||
{
|
||||
/**
|
||||
* Custom data associated with this event.
|
||||
*/
|
||||
[GetterThrows]
|
||||
readonly attribute any data;
|
||||
|
||||
/**
|
||||
* The origin of the site from which this event originated, which is the
|
||||
* scheme, ":", and if the URI has a host, "//" followed by the
|
||||
* host, and if the port is not the default for the given scheme,
|
||||
* ":" followed by that port. This value does not have a trailing slash.
|
||||
*/
|
||||
readonly attribute DOMString origin;
|
||||
|
||||
/**
|
||||
* The last event ID string of the event source, for server-sent DOM events; this
|
||||
* value is the empty string for cross-origin messaging.
|
||||
*/
|
||||
readonly attribute DOMString lastEventId;
|
||||
|
||||
/**
|
||||
* The window which originated this event.
|
||||
*/
|
||||
readonly attribute WindowProxy? source;
|
||||
|
||||
/**
|
||||
* Initializes this event with the given data, in a manner analogous to
|
||||
* the similarly-named method on the nsIDOMEvent interface, also setting the
|
||||
* data, origin, source, and lastEventId attributes of this appropriately.
|
||||
*/
|
||||
[Throws]
|
||||
void initMessageEvent(DOMString aType,
|
||||
boolean aCanBubble,
|
||||
boolean aCancelable,
|
||||
any aData,
|
||||
DOMString aOrigin,
|
||||
DOMString aLastEventId,
|
||||
WindowProxy? aSource);
|
||||
};
|
19
dom/webidl/SVGFEPointLightElement.webidl
Normal file
19
dom/webidl/SVGFEPointLightElement.webidl
Normal file
@ -0,0 +1,19 @@
|
||||
/* -*- Mode: IDL; 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/.
|
||||
*
|
||||
* The origin of this IDL file is
|
||||
* http://www.w3.org/TR/SVG2/
|
||||
*
|
||||
* Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C
|
||||
* liability, trademark and document use rules apply.
|
||||
*/
|
||||
|
||||
interface SVGAnimatedNumber;
|
||||
|
||||
interface SVGFEPointLightElement : SVGElement {
|
||||
readonly attribute SVGAnimatedNumber x;
|
||||
readonly attribute SVGAnimatedNumber y;
|
||||
readonly attribute SVGAnimatedNumber z;
|
||||
};
|
47
dom/webidl/UIEvent.webidl
Normal file
47
dom/webidl/UIEvent.webidl
Normal file
@ -0,0 +1,47 @@
|
||||
/* -*- Mode: IDL; 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/.
|
||||
*
|
||||
* For more information on this interface please see
|
||||
* http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html
|
||||
*
|
||||
* Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C
|
||||
* liability, trademark and document use rules apply.
|
||||
*/
|
||||
|
||||
interface WindowProxy;
|
||||
|
||||
[Constructor(DOMString type, optional UIEventInit eventInitDict)]
|
||||
interface UIEvent : Event
|
||||
{
|
||||
readonly attribute WindowProxy? view;
|
||||
readonly attribute long detail;
|
||||
void initUIEvent(DOMString aType,
|
||||
boolean aCanBubble,
|
||||
boolean aCancelable,
|
||||
WindowProxy? aView,
|
||||
long aDetail);
|
||||
};
|
||||
|
||||
// Additional DOM0 properties.
|
||||
partial interface UIEvent {
|
||||
const long SCROLL_PAGE_UP = -32768;
|
||||
const long SCROLL_PAGE_DOWN = 32768;
|
||||
|
||||
readonly attribute long layerX;
|
||||
readonly attribute long layerY;
|
||||
readonly attribute long pageX;
|
||||
readonly attribute long pageY;
|
||||
readonly attribute unsigned long which;
|
||||
readonly attribute Node? rangeParent;
|
||||
readonly attribute long rangeOffset;
|
||||
attribute boolean cancelBubble;
|
||||
readonly attribute boolean isChar;
|
||||
};
|
||||
|
||||
dictionary UIEventInit : EventInit
|
||||
{
|
||||
WindowProxy? view = null;
|
||||
long detail = 0;
|
||||
};
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user