mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Merge last PGO-green changeset of mozilla-inbound to mozilla-central
This commit is contained in:
commit
b3e1fc52a1
@ -144,7 +144,7 @@ static nsRoleMapEntry sWAIRoleMaps[] =
|
||||
eNoValue,
|
||||
eNoAction,
|
||||
eNoLiveAttr,
|
||||
kGenericAccType,
|
||||
Accessible::eListAccessible,
|
||||
kNoReqStates
|
||||
},
|
||||
{ // document
|
||||
@ -239,7 +239,7 @@ static nsRoleMapEntry sWAIRoleMaps[] =
|
||||
eNoValue,
|
||||
eNoAction,
|
||||
eNoLiveAttr,
|
||||
kGenericAccType,
|
||||
Accessible::eListAccessible,
|
||||
states::READONLY
|
||||
},
|
||||
{ // listbox
|
||||
|
@ -830,6 +830,15 @@ nsAccessibilityService::GetOrCreateAccessible(nsINode* aNode,
|
||||
} else if (frame->AccessibleType() == eHTMLTableCellAccessible &&
|
||||
aContext->ARIARoleMap() == &nsARIAMap::gEmptyRoleMap) {
|
||||
roleMapEntry = &nsARIAMap::gEmptyRoleMap;
|
||||
|
||||
} else if (content->Tag() == nsGkAtoms::dt ||
|
||||
content->Tag() == nsGkAtoms::li ||
|
||||
content->Tag() == nsGkAtoms::dd ||
|
||||
frame->AccessibleType() == eHTMLLiAccessible) {
|
||||
nsRoleMapEntry* contextRoleMap = aContext->ARIARoleMap();
|
||||
if (contextRoleMap &&
|
||||
!(contextRoleMap->accTypes & Accessible::eListAccessible))
|
||||
roleMapEntry = &nsARIAMap::gEmptyRoleMap;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1237,18 +1246,30 @@ nsAccessibilityService::CreateHTMLAccessibleByMarkup(nsIFrame* aFrame,
|
||||
return accessible;
|
||||
}
|
||||
|
||||
if (tag == nsGkAtoms::dt || tag == nsGkAtoms::li) {
|
||||
// Create list item accessible unconditionally by tag name. nsBlockFrame
|
||||
// creates the list item accessible for other elements styled as list items.
|
||||
Accessible* accessible = new HTMLLIAccessible(aContent, document);
|
||||
NS_ADDREF(accessible);
|
||||
return accessible;
|
||||
if (aContext->IsOfType(Accessible::eListAccessible)) {
|
||||
// If list item is a child of accessible list then create an accessible for
|
||||
// it unconditionally by tag name. nsBlockFrame creates the list item
|
||||
// accessible for other elements styled as list items.
|
||||
if (aContext->GetContent() == aContent->GetParent()) {
|
||||
if (tag == nsGkAtoms::dt || tag == nsGkAtoms::li) {
|
||||
Accessible* accessible = new HTMLLIAccessible(aContent, document);
|
||||
NS_ADDREF(accessible);
|
||||
return accessible;
|
||||
}
|
||||
|
||||
if (tag == nsGkAtoms::dd) {
|
||||
Accessible* accessible = new HyperTextAccessibleWrap(aContent, document);
|
||||
NS_ADDREF(accessible);
|
||||
return accessible;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (tag == nsGkAtoms::abbr ||
|
||||
tag == nsGkAtoms::acronym ||
|
||||
tag == nsGkAtoms::blockquote ||
|
||||
tag == nsGkAtoms::dd ||
|
||||
tag == nsGkAtoms::form ||
|
||||
tag == nsGkAtoms::h1 ||
|
||||
tag == nsGkAtoms::h2 ||
|
||||
@ -1326,7 +1347,10 @@ nsAccessibilityService::CreateAccessibleByFrameType(nsIFrame* aFrame,
|
||||
newAcc = new HTMLLabelAccessible(aContent, document);
|
||||
break;
|
||||
case eHTMLLiAccessible:
|
||||
newAcc = new HTMLLIAccessible(aContent, document);
|
||||
if (aContext->IsOfType(Accessible::eListAccessible) &&
|
||||
aContext->GetContent() == aContent->GetParent()) {
|
||||
newAcc = new HTMLLIAccessible(aContent, document);
|
||||
}
|
||||
break;
|
||||
case eHTMLSelectListAccessible:
|
||||
newAcc = new HTMLSelectListAccessible(aContent, document);
|
||||
@ -1374,8 +1398,10 @@ nsAccessibilityService::CreateAccessibleByFrameType(nsIFrame* aFrame,
|
||||
newAcc = new HTMLTextFieldAccessible(aContent, document);
|
||||
break;
|
||||
case eHyperTextAccessible:
|
||||
newAcc = new HyperTextAccessibleWrap(aContent, document);
|
||||
if (aContent->Tag() != nsGkAtoms::dt && aContent->Tag() != nsGkAtoms::dd)
|
||||
newAcc = new HyperTextAccessibleWrap(aContent, document);
|
||||
break;
|
||||
|
||||
case eImageAccessible:
|
||||
newAcc = new ImageAccessibleWrap(aContent, document);
|
||||
break;
|
||||
|
@ -790,18 +790,19 @@ public: // XXX: a small hack to make these visible for nsARIAMap
|
||||
eHTMLTableRowAccessible = 1 << 15,
|
||||
eImageAccessible = 1 << 16,
|
||||
eImageMapAccessible = 1 << 17,
|
||||
eListControlAccessible = 1 << 18,
|
||||
eMenuButtonAccessible = 1 << 19,
|
||||
eMenuPopupAccessible = 1 << 20,
|
||||
eProgressAccessible = 1 << 21,
|
||||
eRootAccessible = 1 << 22,
|
||||
eSelectAccessible = 1 << 23,
|
||||
eTableAccessible = 1 << 24,
|
||||
eTableCellAccessible = 1 << 25,
|
||||
eTableRowAccessible = 1 << 26,
|
||||
eTextLeafAccessible = 1 << 27,
|
||||
eXULDeckAccessible = 1 << 28,
|
||||
eXULTreeAccessible = 1 << 29
|
||||
eListAccessible = 1 << 18,
|
||||
eListControlAccessible = 1 << 19,
|
||||
eMenuButtonAccessible = 1 << 20,
|
||||
eMenuPopupAccessible = 1 << 21,
|
||||
eProgressAccessible = 1 << 22,
|
||||
eRootAccessible = 1 << 23,
|
||||
eSelectAccessible = 1 << 24,
|
||||
eTableAccessible = 1 << 25,
|
||||
eTableCellAccessible = 1 << 26,
|
||||
eTableRowAccessible = 1 << 27,
|
||||
eTextLeafAccessible = 1 << 28,
|
||||
eXULDeckAccessible = 1 << 29,
|
||||
eXULTreeAccessible = 1 << 30
|
||||
};
|
||||
|
||||
protected:
|
||||
|
@ -22,7 +22,7 @@ class HTMLListAccessible : public HyperTextAccessibleWrap
|
||||
{
|
||||
public:
|
||||
HTMLListAccessible(nsIContent* aContent, DocAccessible* aDoc) :
|
||||
HyperTextAccessibleWrap(aContent, aDoc) { }
|
||||
HyperTextAccessibleWrap(aContent, aDoc) { mFlags |= eListAccessible; }
|
||||
virtual ~HTMLListAccessible() { }
|
||||
|
||||
// nsISupports
|
||||
|
@ -17,6 +17,7 @@ MOCHITEST_A11Y_FILES =\
|
||||
test_aria_globals.html \
|
||||
test_aria_grid.html \
|
||||
test_aria_imgmap.html \
|
||||
test_aria_list.html \
|
||||
test_aria_menu.html \
|
||||
test_aria_presentation.html \
|
||||
test_brokencontext.html \
|
||||
|
87
accessible/tests/mochitest/tree/test_aria_list.html
Normal file
87
accessible/tests/mochitest/tree/test_aria_list.html
Normal file
@ -0,0 +1,87 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>ARIA lists</title>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="chrome://mochikit/content/tests/SimpleTest/test.css" />
|
||||
|
||||
<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="../role.js"></script>
|
||||
|
||||
<script type="application/javascript">
|
||||
function doTest()
|
||||
{
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// list
|
||||
|
||||
var accTree =
|
||||
{ LIST: [
|
||||
{ LISTITEM: [
|
||||
{ TEXT_LEAF: [ ] }
|
||||
] }
|
||||
] };
|
||||
|
||||
testAccessibleTree("list", accTree);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// crazy list (mad mix of ARIA and HTML)
|
||||
|
||||
accTree = { // div@role="list"
|
||||
role: ROLE_LIST,
|
||||
children: [
|
||||
{ // li text leaf
|
||||
role: ROLE_TEXT_LEAF,
|
||||
name: "item1",
|
||||
children: [ ]
|
||||
},
|
||||
{ // li@role="listitem"
|
||||
role: ROLE_LISTITEM,
|
||||
children: [
|
||||
{ // text leaf
|
||||
role: ROLE_TEXT_LEAF,
|
||||
name: "item2",
|
||||
children: [ ]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
testAccessibleTree("crazy_list", accTree);
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
addA11yLoadEvent(doTest);
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<a target="_blank"
|
||||
title="Build the context dependent tree"
|
||||
href="https://bugzilla.mozilla.org/show_bug.cgi?id=804461">
|
||||
Mozilla Bug 804461
|
||||
</a>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none"></div>
|
||||
<pre id="test">
|
||||
</pre>
|
||||
|
||||
<div id="list" role="list">
|
||||
<div role="listitem">item1</div>
|
||||
</div>
|
||||
|
||||
<div id="crazy_list" role="list">
|
||||
<ul role="presentation">
|
||||
<li>item1</li>
|
||||
<li role="listitem">item2</li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -38,6 +38,61 @@
|
||||
] };
|
||||
testAccessibleTree("button_table", tree);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// HTML list elements outside list context.
|
||||
|
||||
ok(!isAccessible("presentation_ul"),
|
||||
"presentational ul shouldn't be accessible");
|
||||
ok(!isAccessible("item_in_presentation_ul"),
|
||||
"li in presentational ul shouldn't be accessible");
|
||||
ok(!isAccessible("styleditem_in_presentation_ul"),
|
||||
"list styled span in presentational ul shouldn't be accessible");
|
||||
|
||||
ok(!isAccessible("presentation_ol"),
|
||||
"presentational ol shouldn't be accessible");
|
||||
ok(!isAccessible("item_in_presentation_ol"),
|
||||
"li in presentational ol shouldn't be accessible");
|
||||
|
||||
ok(!isAccessible("presentation_dl"),
|
||||
"presentational dl shouldn't be accessible");
|
||||
ok(!isAccessible("dt_in_presentation_dl"),
|
||||
"dt in presentational dl shouldn't be accessible");
|
||||
ok(!isAccessible("dd_in_presentation_dl"),
|
||||
"dd in presentational dl shouldn't be accessible");
|
||||
|
||||
tree =
|
||||
{ PUSHBUTTON: [ // ul
|
||||
{ NOTHING: [ // li
|
||||
{ STATICTEXT: [ ] },
|
||||
{ TEXT_LEAF: [ ] }
|
||||
] },
|
||||
{ NOTHING: [ // span styled as a list
|
||||
{ STATICTEXT: [ ] },
|
||||
{ TEXT_LEAF: [ ] }
|
||||
] }
|
||||
] };
|
||||
testAccessibleTree("button_ul", tree);
|
||||
|
||||
tree =
|
||||
{ PUSHBUTTON: [ // ol
|
||||
{ NOTHING: [ // li
|
||||
{ STATICTEXT: [ ] },
|
||||
{ TEXT_LEAF: [ ] }
|
||||
] }
|
||||
] };
|
||||
testAccessibleTree("button_ol", tree);
|
||||
|
||||
tree =
|
||||
{ PUSHBUTTON: [ // dl
|
||||
{ NOTHING: [ // dt
|
||||
{ TEXT_LEAF: [ ] }
|
||||
] },
|
||||
{ NOTHING: [ // dd
|
||||
{ TEXT_LEAF: [ ] }
|
||||
] }
|
||||
] };
|
||||
testAccessibleTree("button_dl", tree);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// Styled as HTML table elements, accessible is created by tag name
|
||||
|
||||
@ -72,6 +127,11 @@
|
||||
title="Create accessible by tag name as fallback if table descendant style is used out of table context">
|
||||
Mozilla Bug 706849
|
||||
</a>
|
||||
<a target="_blank"
|
||||
href="https://bugzilla.mozilla.org/show_bug.cgi?id=804461"
|
||||
title="Build the context dependent tree ">
|
||||
Mozilla Bug 804461
|
||||
</a>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none"></div>
|
||||
<pre id="test">
|
||||
@ -92,6 +152,37 @@
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- HTML list elements out of list -->
|
||||
<ul role="presentation" id="presentation_ul">
|
||||
<li id="item_in_presentation_ul">item</li>
|
||||
<span id="styleditem_in_presentation_ul"
|
||||
style="display:list-item">Oranges</span>
|
||||
</ul>
|
||||
|
||||
<ol role="presentation" id="presentation_ol">
|
||||
<li id="item_in_presentation_ol">item</li>
|
||||
</ol>
|
||||
|
||||
<dl role="presentation" id="presentation_dl">
|
||||
<dt id="dt_in_presentation_dl">term</dt>
|
||||
<dd id="dd_in_presentation_dl">definition</dd>
|
||||
</dl>
|
||||
|
||||
<ul role="button" id="button_ul">
|
||||
<li id="item_in_button_ul">item</li>
|
||||
<span id="styleditem_in_button_ul"
|
||||
style="display:list-item">Oranges</span>
|
||||
</ul>
|
||||
|
||||
<ol role="button" id="button_ol">
|
||||
<li id="item_in_button_ul">item</li>
|
||||
</ol>
|
||||
|
||||
<dl role="button" id="button_dl">
|
||||
<dt id="dt_in_button_dl">term</ld>
|
||||
<dd id="dd_in_button_dl">definition</dd>
|
||||
</dl>
|
||||
|
||||
<!-- styled as HTML table elements -->
|
||||
<a id="a_as_td" style="display:table-cell;" href="http://www.google.com">Google</a>
|
||||
<h1 id="h1_as_td" style="display: table-cell;">h1</h1>
|
||||
|
@ -128,14 +128,14 @@ SettingsListener.observe('language.current', 'en-US', function(value) {
|
||||
|
||||
// =================== RIL ====================
|
||||
(function RILSettingsToPrefs() {
|
||||
let strPrefs = ['ril.data.mmsc', 'ril.data.mmsproxy'];
|
||||
let strPrefs = ['ril.mms.mmsc', 'ril.mms.mmsproxy'];
|
||||
strPrefs.forEach(function(key) {
|
||||
SettingsListener.observe(key, "", function(value) {
|
||||
Services.prefs.setCharPref(key, value);
|
||||
});
|
||||
});
|
||||
|
||||
['ril.data.mmsport'].forEach(function(key) {
|
||||
['ril.mms.mmsport'].forEach(function(key) {
|
||||
SettingsListener.observe(key, null, function(value) {
|
||||
if (value != null) {
|
||||
Services.prefs.setIntPref(key, value);
|
||||
|
@ -292,6 +292,8 @@ _BROWSER_FILES = \
|
||||
social_flyout.html \
|
||||
social_window.html \
|
||||
social_worker.js \
|
||||
browser_bug676619.js \
|
||||
download_page.html \
|
||||
$(NULL)
|
||||
|
||||
ifneq (cocoa,$(MOZ_WIDGET_TOOLKIT))
|
||||
|
109
browser/base/content/test/browser_bug676619.js
Normal file
109
browser/base/content/test/browser_bug676619.js
Normal file
@ -0,0 +1,109 @@
|
||||
function test () {
|
||||
waitForExplicitFinish();
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.selectedBrowser.addEventListener("load", function () {
|
||||
gBrowser.selectedBrowser.removeEventListener("load", arguments.callee, true);
|
||||
let doc = gBrowser.contentDocument;
|
||||
|
||||
|
||||
function testLocation(link, url, next) {
|
||||
var tabOpenListener = new TabOpenListener(url, function () {
|
||||
gBrowser.removeTab(this.tab);
|
||||
}, function () {
|
||||
next();
|
||||
});
|
||||
|
||||
doc.getElementById(link).click();
|
||||
}
|
||||
|
||||
function testLink(link, name, next) {
|
||||
addWindowListener("chrome://mozapps/content/downloads/unknownContentType.xul", function (win) {
|
||||
is(win.document.getElementById("location").value, name, "file name should match");
|
||||
win.close();
|
||||
next();
|
||||
});
|
||||
|
||||
doc.getElementById(link).click();
|
||||
}
|
||||
|
||||
testLink("link1", "test.txt",
|
||||
testLink.bind(null, "link2", "video.ogg",
|
||||
testLink.bind(null, "link3", "just some video",
|
||||
testLink.bind(null, "link4", "with-target.txt",
|
||||
testLink.bind(null, "link5", "javascript.txt",
|
||||
testLink.bind(null, "link6", "test.blob",
|
||||
testLocation.bind(null, "link7", "http://example.com/",
|
||||
function () {
|
||||
gBrowser.removeCurrentTab();
|
||||
finish();
|
||||
})))))));
|
||||
|
||||
}, true);
|
||||
|
||||
content.location = "http://mochi.test:8888/browser/browser/base/content/test/download_page.html";
|
||||
}
|
||||
|
||||
|
||||
function addWindowListener(aURL, aCallback) {
|
||||
Services.wm.addListener({
|
||||
onOpenWindow: function(aXULWindow) {
|
||||
info("window opened, waiting for focus");
|
||||
Services.wm.removeListener(this);
|
||||
|
||||
var domwindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor)
|
||||
.getInterface(Ci.nsIDOMWindow);
|
||||
waitForFocus(function() {
|
||||
is(domwindow.document.location.href, aURL, "should have seen the right window open");
|
||||
aCallback(domwindow);
|
||||
}, domwindow);
|
||||
},
|
||||
onCloseWindow: function(aXULWindow) { },
|
||||
onWindowTitleChange: function(aXULWindow, aNewTitle) { }
|
||||
});
|
||||
}
|
||||
|
||||
// This listens for the next opened tab and checks it is of the right url.
|
||||
// opencallback is called when the new tab is fully loaded
|
||||
// closecallback is called when the tab is closed
|
||||
function TabOpenListener(url, opencallback, closecallback) {
|
||||
this.url = url;
|
||||
this.opencallback = opencallback;
|
||||
this.closecallback = closecallback;
|
||||
|
||||
gBrowser.tabContainer.addEventListener("TabOpen", this, false);
|
||||
}
|
||||
|
||||
TabOpenListener.prototype = {
|
||||
url: null,
|
||||
opencallback: null,
|
||||
closecallback: null,
|
||||
tab: null,
|
||||
browser: null,
|
||||
|
||||
handleEvent: function(event) {
|
||||
if (event.type == "TabOpen") {
|
||||
gBrowser.tabContainer.removeEventListener("TabOpen", this, false);
|
||||
this.tab = event.originalTarget;
|
||||
this.browser = this.tab.linkedBrowser;
|
||||
gBrowser.addEventListener("pageshow", this, false);
|
||||
} else if (event.type == "pageshow") {
|
||||
if (event.target.location.href != this.url)
|
||||
return;
|
||||
gBrowser.removeEventListener("pageshow", this, false);
|
||||
this.tab.addEventListener("TabClose", this, false);
|
||||
var url = this.browser.contentDocument.location.href;
|
||||
is(url, this.url, "Should have opened the correct tab");
|
||||
this.opencallback(this.tab, this.browser.contentWindow);
|
||||
} else if (event.type == "TabClose") {
|
||||
if (event.originalTarget != this.tab)
|
||||
return;
|
||||
this.tab.removeEventListener("TabClose", this, false);
|
||||
this.opencallback = null;
|
||||
this.tab = null;
|
||||
this.browser = null;
|
||||
// Let the window close complete
|
||||
executeSoon(this.closecallback);
|
||||
this.closecallback = null;
|
||||
}
|
||||
}
|
||||
};
|
42
browser/base/content/test/download_page.html
Normal file
42
browser/base/content/test/download_page.html
Normal file
@ -0,0 +1,42 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=676619
|
||||
-->
|
||||
<head>
|
||||
<title>Test for the download attribute</title>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=676619">Bug 676619</a>
|
||||
<br/>
|
||||
<ul>
|
||||
<li><a href="data:text/plain,Hey What are you looking for?"
|
||||
download="test.txt" id="link1">Download "test.txt"</a></li>
|
||||
<li><a href="http://mochi.test:8888/browser/browser/base/content/test/video.ogg"
|
||||
download id="link2">Download "video.ogg"</a></li>
|
||||
<li><a href="http://mochi.test:8888/browser/browser/base/content/test/video.ogg"
|
||||
download="just some video" id="link3">Download "just some video"</a></li>
|
||||
<li><a href="data:text/plain,test"
|
||||
download="with-target.txt" id="link4">Download "with-target.txt"</a></li>
|
||||
<li><a href="javascript:1+2"
|
||||
download="javascript.txt" id="link5">Download "javascript.txt"</a></li>
|
||||
</ul>
|
||||
<script>
|
||||
var li = document.createElement('li');
|
||||
var a = document.createElement('a');
|
||||
|
||||
a.href = window.URL.createObjectURL(new Blob(["just text"])) ;
|
||||
a.download = "test.blob";
|
||||
a.id = "link6";
|
||||
a.textContent = 'Download "test.blob"';
|
||||
|
||||
li.appendChild(a);
|
||||
document.getElementsByTagName('ul')[0].appendChild(li);
|
||||
</script>
|
||||
<ul>
|
||||
<li><a href="http://example.com/"
|
||||
download="example.com" id="link7" target="_blank">Download "example.com"</a></li>
|
||||
<ul>
|
||||
</body>
|
||||
</html>
|
@ -64,12 +64,6 @@
|
||||
// Focus the location bar
|
||||
mainWindow.focusAndSelectUrlBar();
|
||||
|
||||
function openSanitizeDialog() {
|
||||
let browserGlue = Cc["@mozilla.org/browser/browserglue;1"].
|
||||
getService(Ci.nsIBrowserGlue);
|
||||
browserGlue.sanitize(mainWindow);
|
||||
}
|
||||
|
||||
function setFavIcon(url) {
|
||||
var icon = document.createElement("link");
|
||||
icon.setAttribute("rel", "icon");
|
||||
|
@ -10,11 +10,6 @@
|
||||
|
||||
<!ENTITY privatebrowsingpage.description "In a Private Browsing session, &brandShortName; won't keep any browser history, search history, download history, web form history, cookies, or temporary internet files. However, files you download and bookmarks you make will be kept.">
|
||||
|
||||
<!-- LOCALIZATION NOTE (privatebrowsingpage.clearRecentHistoryBefore): include a trailing space as needed -->
|
||||
<!-- LOCALIZATION NOTE (privatebrowsingpage.clearRecentHistoryAfter): include a starting space as needed -->
|
||||
<!ENTITY privatebrowsingpage.clearRecentHistoryBefore "You may want to start by also ">
|
||||
<!ENTITY privatebrowsingpage.clearRecentHistoryInner "clearing your recent history">
|
||||
<!ENTITY privatebrowsingpage.clearRecentHistoryAfter ".">
|
||||
|
||||
<!ENTITY privatebrowsingpage.startPrivateBrowsing.label "Start Private Browsing">
|
||||
<!ENTITY privatebrowsingpage.startPrivateBrowsing.accesskey "P">
|
||||
|
@ -166,6 +166,7 @@ def checkForCrashes(dumpDir, symbolsPath, testName=None):
|
||||
for d in dumps:
|
||||
stackwalkOutput = []
|
||||
stackwalkOutput.append("Crash dump filename: " + d)
|
||||
topFrame = None
|
||||
if symbolsPath and stackwalkPath and os.path.exists(stackwalkPath):
|
||||
# run minidump stackwalk
|
||||
p = subprocess.Popen([stackwalkPath, d, symbolsPath],
|
||||
|
@ -1560,29 +1560,50 @@ $(foreach category,$(INSTALL_TARGETS),\
|
||||
# Preprocessing rules
|
||||
#
|
||||
# The PP_TARGETS variable contains a list of all preprocessing target
|
||||
# categories. Each category defines a target path, and optional extra flags
|
||||
# like the following:
|
||||
# categories. Each category has associated variables listing input files, the
|
||||
# output directory, extra preprocessor flags, and so on. For example:
|
||||
#
|
||||
# FOO_PATH := target_path
|
||||
# FOO_FLAGS := -Dsome_flag
|
||||
# PP_TARGETS += FOO
|
||||
# FOO := input-file
|
||||
# FOO_PATH := target-directory
|
||||
# FOO_FLAGS := -Dsome_flag
|
||||
# PP_TARGETS += FOO
|
||||
#
|
||||
# Additionally, a FOO_TARGET variable may be added to indicate the target for
|
||||
# which the files and executables are installed. Default is "libs".
|
||||
# If PP_TARGETS lists a category name <C> (like FOO, above), then we consult the
|
||||
# following make variables to see what to do:
|
||||
#
|
||||
# - <C> lists input files to be preprocessed with config/Preprocessor.py. We
|
||||
# search VPATH for the names given here. If an input file name ends in '.in',
|
||||
# that suffix is omitted from the output file name.
|
||||
#
|
||||
# - <C>_PATH names the directory in which to place the preprocessed output
|
||||
# files. We create this directory if it does not already exist. Setting
|
||||
# this variable is optional; if unset, we install the files in $(CURDIR).
|
||||
#
|
||||
# - <C>_FLAGS lists flags to pass to Preprocessor.py, in addition to the usual
|
||||
# bunch. Setting this variable is optional.
|
||||
#
|
||||
# - <C>_TARGET names the 'make' target that should depend on creating the output
|
||||
# files. Setting this variable is optional; if unset, we preprocess the
|
||||
# files for the 'libs' target.
|
||||
|
||||
# preprocess_file_template defines preprocessing rules.
|
||||
# $(call preprocess_file_template, source_file, target_path, extra_flags)
|
||||
# $(call preprocess_file_template, source_file, output_file,
|
||||
# makefile_target, extra_flags)
|
||||
define preprocess_file_template
|
||||
$(2)/$(notdir $(1)): $(1) $$(call mkdir_deps,$(2)) $$(GLOBAL_DEPS)
|
||||
$(2): $(1) $$(call mkdir_deps,$(dir $(2))) $$(GLOBAL_DEPS)
|
||||
$$(RM) $$@
|
||||
$$(PYTHON) $$(topsrcdir)/config/Preprocessor.py $(4) $$(DEFINES) $$(ACDEFINES) $$(XULPPFLAGS) $$< > $$@
|
||||
$(or $(3),libs):: $(2)/$(notdir $(1))
|
||||
$(3):: $(2)
|
||||
endef
|
||||
|
||||
$(foreach category,$(PP_TARGETS),\
|
||||
$(foreach file,$($(category)),\
|
||||
$(eval $(call preprocess_file_template,$(file),$($(category)_PATH),$($(category)_TARGET),$($(category)_FLAGS)))\
|
||||
)\
|
||||
$(foreach category,$(PP_TARGETS), \
|
||||
$(foreach file,$($(category)), \
|
||||
$(eval $(call preprocess_file_template, \
|
||||
$(file), \
|
||||
$(or $($(category)_PATH),$(CURDIR))/$(notdir $(file:.in=)), \
|
||||
$(or $($(category)_TARGET),libs), \
|
||||
$($(category)_FLAGS))) \
|
||||
) \
|
||||
)
|
||||
|
||||
################################################################################
|
||||
|
@ -4663,7 +4663,6 @@ nsContentUtils::TriggerLink(nsIContent *aContent, nsPresContext *aPresContext,
|
||||
|
||||
if (!aClick) {
|
||||
handler->OnOverLink(aContent, aLinkURI, aTargetSpec.get());
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -4681,9 +4680,25 @@ nsContentUtils::TriggerLink(nsIContent *aContent, nsPresContext *aPresContext,
|
||||
}
|
||||
|
||||
// Only pass off the click event if the script security manager says it's ok.
|
||||
// We need to rest aTargetSpec for forced downloads.
|
||||
if (NS_SUCCEEDED(proceed)) {
|
||||
handler->OnLinkClick(aContent, aLinkURI, aTargetSpec.get(), nullptr, nullptr,
|
||||
aIsTrusted);
|
||||
|
||||
// A link/area element with a download attribute is allowed to set
|
||||
// a pseudo Content-Disposition header.
|
||||
// For security reasons we only allow websites to declare same-origin resources
|
||||
// as downloadable. If this check fails we will just do the normal thing
|
||||
// (i.e. navigate to the resource).
|
||||
nsAutoString fileName;
|
||||
if ((!aContent->IsHTML(nsGkAtoms::a) && !aContent->IsHTML(nsGkAtoms::area) &&
|
||||
!aContent->IsSVG(nsGkAtoms::a)) ||
|
||||
!aContent->GetAttr(kNameSpaceID_None, nsGkAtoms::download, fileName) ||
|
||||
NS_FAILED(aContent->NodePrincipal()->CheckMayLoad(aLinkURI, false, true))) {
|
||||
fileName.SetIsVoid(true); // No actionable download attribute was found.
|
||||
}
|
||||
|
||||
handler->OnLinkClick(aContent, aLinkURI,
|
||||
fileName.IsVoid() ? aTargetSpec.get() : EmptyString().get(),
|
||||
fileName, nullptr, nullptr, aIsTrusted);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -287,6 +287,7 @@ GK_ATOM(dl, "dl")
|
||||
GK_ATOM(doctypePublic, "doctype-public")
|
||||
GK_ATOM(doctypeSystem, "doctype-system")
|
||||
GK_ATOM(document, "document")
|
||||
GK_ATOM(download, "download")
|
||||
GK_ATOM(DOMAttrModified, "DOMAttrModified")
|
||||
GK_ATOM(DOMCharacterDataModified, "DOMCharacterDataModified")
|
||||
GK_ATOM(DOMNodeInserted, "DOMNodeInserted")
|
||||
|
@ -47,7 +47,7 @@ public:
|
||||
virtual bool Draggable() const MOZ_OVERRIDE;
|
||||
|
||||
// nsIDOMHTMLAnchorElement
|
||||
NS_DECL_NSIDOMHTMLANCHORELEMENT
|
||||
NS_DECL_NSIDOMHTMLANCHORELEMENT
|
||||
|
||||
// DOM memory reporter participant
|
||||
NS_DECL_SIZEOF_EXCLUDING_THIS
|
||||
@ -92,7 +92,7 @@ public:
|
||||
virtual nsXPCClassInfo* GetClassInfo();
|
||||
|
||||
virtual nsIDOMNode* AsDOMNode() { return this; }
|
||||
|
||||
|
||||
virtual void OnDNSPrefetchDeferred();
|
||||
virtual void OnDNSPrefetchRequested();
|
||||
virtual bool HasDeferredDNSPrefetchRequest();
|
||||
@ -160,6 +160,7 @@ NS_IMPL_STRING_ATTR(nsHTMLAnchorElement, Rel, rel)
|
||||
NS_IMPL_STRING_ATTR(nsHTMLAnchorElement, Rev, rev)
|
||||
NS_IMPL_STRING_ATTR(nsHTMLAnchorElement, Shape, shape)
|
||||
NS_IMPL_STRING_ATTR(nsHTMLAnchorElement, Type, type)
|
||||
NS_IMPL_STRING_ATTR(nsHTMLAnchorElement, Download, download)
|
||||
|
||||
int32_t
|
||||
nsHTMLAnchorElement::TabIndexDefault()
|
||||
|
@ -120,6 +120,7 @@ NS_IMPL_STRING_ATTR(nsHTMLAreaElement, Coords, coords)
|
||||
NS_IMPL_URI_ATTR(nsHTMLAreaElement, Href, href)
|
||||
NS_IMPL_BOOL_ATTR(nsHTMLAreaElement, NoHref, nohref)
|
||||
NS_IMPL_STRING_ATTR(nsHTMLAreaElement, Shape, shape)
|
||||
NS_IMPL_STRING_ATTR(nsHTMLAreaElement, Download, download)
|
||||
|
||||
int32_t
|
||||
nsHTMLAreaElement::TabIndexDefault()
|
||||
|
@ -883,6 +883,7 @@ nsHTMLFormElement::SubmitSubmission(nsFormSubmission* aFormSubmission)
|
||||
|
||||
rv = linkHandler->OnLinkClickSync(this, actionURI,
|
||||
target.get(),
|
||||
NullString(),
|
||||
postDataStream, nullptr,
|
||||
getter_AddRefs(docShell),
|
||||
getter_AddRefs(mSubmittingRequest));
|
||||
|
@ -401,11 +401,12 @@ MediaDecoderStateMachine::MediaDecoderStateMachine(MediaDecoder* aDecoder,
|
||||
// If we've got more than mAmpleVideoFrames decoded video frames waiting in
|
||||
// the video queue, we will not decode any more video frames until some have
|
||||
// been consumed by the play state machine thread.
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
// On B2G this is decided by a similar value which varies for each OMX decoder
|
||||
// |OMX_PARAM_PORTDEFINITIONTYPE::nBufferCountMin|. This number must be less
|
||||
// than the OMX equivalent or gecko will think it is chronically starved of
|
||||
// video frames. All decoders seen so far have a value of at least 4.
|
||||
#if defined(MOZ_WIDGET_GONK) || defined(MOZ_MEDIA_PLUGINS)
|
||||
// On B2G and Android this is decided by a similar value which varies for
|
||||
// each OMX decoder |OMX_PARAM_PORTDEFINITIONTYPE::nBufferCountMin|. This
|
||||
// number must be less than the OMX equivalent or gecko will think it is
|
||||
// chronically starved of video frames. All decoders seen so far have a value
|
||||
// of at least 4.
|
||||
mAmpleVideoFrames = Preferences::GetUint("media.video-queue.default-size", 3);
|
||||
#else
|
||||
mAmpleVideoFrames = Preferences::GetUint("media.video-queue.default-size", 10);
|
||||
|
@ -68,6 +68,7 @@ nsSVGAElement::GetHref(nsIDOMSVGAnimatedString * *aHref)
|
||||
return mStringAttributes[HREF].ToDOMAnimatedString(aHref, this);
|
||||
}
|
||||
|
||||
NS_IMPL_STRING_ATTR(nsSVGAElement, Download, download)
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsINode methods
|
||||
|
@ -1501,6 +1501,7 @@ nsDocShell::LoadURI(nsIURI * aURI,
|
||||
flags,
|
||||
target.get(),
|
||||
nullptr, // No type hint
|
||||
NullString(), // No forced download
|
||||
postStream,
|
||||
headersStream,
|
||||
loadType,
|
||||
@ -4494,7 +4495,7 @@ nsDocShell::LoadErrorPage(nsIURI *aURI, const PRUnichar *aURL,
|
||||
|
||||
return InternalLoad(errorPageURI, nullptr, nullptr,
|
||||
INTERNAL_LOAD_FLAGS_INHERIT_OWNER, nullptr, nullptr,
|
||||
nullptr, nullptr, LOAD_ERROR_PAGE,
|
||||
NullString(), nullptr, nullptr, LOAD_ERROR_PAGE,
|
||||
nullptr, true, nullptr, nullptr);
|
||||
}
|
||||
|
||||
@ -4525,7 +4526,7 @@ nsDocShell::Reload(uint32_t aReloadFlags)
|
||||
|
||||
if (!canReload)
|
||||
return NS_OK;
|
||||
|
||||
|
||||
/* If you change this part of code, make sure bug 45297 does not re-occur */
|
||||
if (mOSHE) {
|
||||
rv = LoadHistoryEntry(mOSHE, loadType);
|
||||
@ -4549,15 +4550,15 @@ nsDocShell::Reload(uint32_t aReloadFlags)
|
||||
INTERNAL_LOAD_FLAGS_NONE, // Do not inherit owner from document
|
||||
nullptr, // No window target
|
||||
NS_LossyConvertUTF16toASCII(contentTypeHint).get(),
|
||||
NullString(), // No forced download
|
||||
nullptr, // No post data
|
||||
nullptr, // No headers data
|
||||
loadType, // Load type
|
||||
loadType, // Load type
|
||||
nullptr, // No SHEntry
|
||||
true,
|
||||
nullptr, // No nsIDocShell
|
||||
nullptr); // No nsIRequest
|
||||
}
|
||||
|
||||
|
||||
return rv;
|
||||
}
|
||||
@ -8318,12 +8319,13 @@ public:
|
||||
mTypeHint = aTypeHint;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
return mDocShell->InternalLoad(mURI, mReferrer, mOwner, mFlags,
|
||||
nullptr, mTypeHint.get(),
|
||||
mPostData, mHeadersData, mLoadType,
|
||||
mSHEntry, mFirstParty, nullptr, nullptr);
|
||||
NullString(), mPostData, mHeadersData,
|
||||
mLoadType, mSHEntry, mFirstParty,
|
||||
nullptr, nullptr);
|
||||
}
|
||||
|
||||
private:
|
||||
@ -8368,6 +8370,7 @@ nsDocShell::InternalLoad(nsIURI * aURI,
|
||||
uint32_t aFlags,
|
||||
const PRUnichar *aWindowTarget,
|
||||
const char* aTypeHint,
|
||||
const nsAString& aFileName,
|
||||
nsIInputStream * aPostData,
|
||||
nsIInputStream * aHeadersData,
|
||||
uint32_t aLoadType,
|
||||
@ -8387,7 +8390,6 @@ nsDocShell::InternalLoad(nsIURI * aURI,
|
||||
PR_LogPrint("DOCSHELL %p InternalLoad %s\n", this, spec.get());
|
||||
}
|
||||
#endif
|
||||
|
||||
// Initialize aDocShell/aRequest
|
||||
if (aDocShell) {
|
||||
*aDocShell = nullptr;
|
||||
@ -8602,6 +8604,7 @@ nsDocShell::InternalLoad(nsIURI * aURI,
|
||||
aFlags,
|
||||
nullptr, // No window target
|
||||
aTypeHint,
|
||||
NullString(), // No forced download
|
||||
aPostData,
|
||||
aHeadersData,
|
||||
aLoadType,
|
||||
@ -9096,8 +9099,8 @@ nsDocShell::InternalLoad(nsIURI * aURI,
|
||||
nsCOMPtr<nsIRequest> req;
|
||||
rv = DoURILoad(aURI, aReferrer,
|
||||
!(aFlags & INTERNAL_LOAD_FLAGS_DONT_SEND_REFERRER),
|
||||
owner, aTypeHint, aPostData, aHeadersData, aFirstParty,
|
||||
aDocShell, getter_AddRefs(req),
|
||||
owner, aTypeHint, aFileName, aPostData, aHeadersData,
|
||||
aFirstParty, aDocShell, getter_AddRefs(req),
|
||||
(aFlags & INTERNAL_LOAD_FLAGS_FIRST_LOAD) != 0,
|
||||
(aFlags & INTERNAL_LOAD_FLAGS_BYPASS_CLASSIFIER) != 0,
|
||||
(aFlags & INTERNAL_LOAD_FLAGS_FORCE_ALLOW_COOKIES) != 0);
|
||||
@ -9170,6 +9173,7 @@ nsDocShell::DoURILoad(nsIURI * aURI,
|
||||
bool aSendReferrer,
|
||||
nsISupports * aOwner,
|
||||
const char * aTypeHint,
|
||||
const nsAString & aFileName,
|
||||
nsIInputStream * aPostData,
|
||||
nsIInputStream * aHeadersData,
|
||||
bool aFirstParty,
|
||||
@ -9269,11 +9273,19 @@ nsDocShell::DoURILoad(nsIURI * aURI,
|
||||
if (aTypeHint && *aTypeHint) {
|
||||
channel->SetContentType(nsDependentCString(aTypeHint));
|
||||
mContentTypeHint = aTypeHint;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
mContentTypeHint.Truncate();
|
||||
}
|
||||
|
||||
|
||||
if (!aFileName.IsVoid()) {
|
||||
rv = channel->SetContentDisposition(nsIChannel::DISPOSITION_ATTACHMENT);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
if (!aFileName.IsEmpty()) {
|
||||
rv = channel->SetContentDispositionFilename(aFileName);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
}
|
||||
|
||||
//hack
|
||||
nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(channel));
|
||||
nsCOMPtr<nsIHttpChannelInternal> httpChannelInternal(do_QueryInterface(channel));
|
||||
@ -10586,11 +10598,12 @@ nsDocShell::LoadHistoryEntry(nsISHEntry * aEntry, uint32_t aLoadType)
|
||||
owner,
|
||||
INTERNAL_LOAD_FLAGS_NONE, // Do not inherit owner from document (security-critical!)
|
||||
nullptr, // No window target
|
||||
contentType.get(), // Type hint
|
||||
postData, // Post data stream
|
||||
contentType.get(), // Type hint
|
||||
NullString(), // No forced file download
|
||||
postData, // Post data stream
|
||||
nullptr, // No headers stream
|
||||
aLoadType, // Load type
|
||||
aEntry, // SHEntry
|
||||
aLoadType, // Load type
|
||||
aEntry, // SHEntry
|
||||
true,
|
||||
nullptr, // No nsIDocShell
|
||||
nullptr); // No nsIRequest
|
||||
@ -11823,7 +11836,8 @@ public:
|
||||
OnLinkClickEvent(nsDocShell* aHandler, nsIContent* aContent,
|
||||
nsIURI* aURI,
|
||||
const PRUnichar* aTargetSpec,
|
||||
nsIInputStream* aPostDataStream,
|
||||
const nsAString& aFileName,
|
||||
nsIInputStream* aPostDataStream,
|
||||
nsIInputStream* aHeadersDataStream,
|
||||
bool aIsTrusted);
|
||||
|
||||
@ -11834,8 +11848,8 @@ public:
|
||||
nsCxPusher pusher;
|
||||
if (mIsTrusted || pusher.Push(mContent)) {
|
||||
mHandler->OnLinkClickSync(mContent, mURI,
|
||||
mTargetSpec.get(), mPostDataStream,
|
||||
mHeadersDataStream,
|
||||
mTargetSpec.get(), mFileName,
|
||||
mPostDataStream, mHeadersDataStream,
|
||||
nullptr, nullptr);
|
||||
}
|
||||
return NS_OK;
|
||||
@ -11845,6 +11859,7 @@ private:
|
||||
nsRefPtr<nsDocShell> mHandler;
|
||||
nsCOMPtr<nsIURI> mURI;
|
||||
nsString mTargetSpec;
|
||||
nsString mFileName;
|
||||
nsCOMPtr<nsIInputStream> mPostDataStream;
|
||||
nsCOMPtr<nsIInputStream> mHeadersDataStream;
|
||||
nsCOMPtr<nsIContent> mContent;
|
||||
@ -11856,12 +11871,14 @@ OnLinkClickEvent::OnLinkClickEvent(nsDocShell* aHandler,
|
||||
nsIContent *aContent,
|
||||
nsIURI* aURI,
|
||||
const PRUnichar* aTargetSpec,
|
||||
const nsAString& aFileName,
|
||||
nsIInputStream* aPostDataStream,
|
||||
nsIInputStream* aHeadersDataStream,
|
||||
bool aIsTrusted)
|
||||
: mHandler(aHandler)
|
||||
, mURI(aURI)
|
||||
, mTargetSpec(aTargetSpec)
|
||||
, mFileName(aFileName)
|
||||
, mPostDataStream(aPostDataStream)
|
||||
, mHeadersDataStream(aHeadersDataStream)
|
||||
, mContent(aContent)
|
||||
@ -11878,6 +11895,7 @@ NS_IMETHODIMP
|
||||
nsDocShell::OnLinkClick(nsIContent* aContent,
|
||||
nsIURI* aURI,
|
||||
const PRUnichar* aTargetSpec,
|
||||
const nsAString& aFileName,
|
||||
nsIInputStream* aPostDataStream,
|
||||
nsIInputStream* aHeadersDataStream,
|
||||
bool aIsTrusted)
|
||||
@ -11917,7 +11935,7 @@ nsDocShell::OnLinkClick(nsIContent* aContent,
|
||||
target = aTargetSpec;
|
||||
|
||||
nsCOMPtr<nsIRunnable> ev =
|
||||
new OnLinkClickEvent(this, aContent, aURI, target.get(),
|
||||
new OnLinkClickEvent(this, aContent, aURI, target.get(), aFileName,
|
||||
aPostDataStream, aHeadersDataStream, aIsTrusted);
|
||||
return NS_DispatchToCurrentThread(ev);
|
||||
}
|
||||
@ -11926,6 +11944,7 @@ NS_IMETHODIMP
|
||||
nsDocShell::OnLinkClickSync(nsIContent *aContent,
|
||||
nsIURI* aURI,
|
||||
const PRUnichar* aTargetSpec,
|
||||
const nsAString& aFileName,
|
||||
nsIInputStream* aPostDataStream,
|
||||
nsIInputStream* aHeadersDataStream,
|
||||
nsIDocShell** aDocShell,
|
||||
@ -12018,7 +12037,7 @@ nsDocShell::OnLinkClickSync(nsIContent *aContent,
|
||||
if (!clonedURI) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
|
||||
nsresult rv = InternalLoad(clonedURI, // New URI
|
||||
referer, // Referer URI
|
||||
aContent->NodePrincipal(), // Owner is our node's
|
||||
@ -12026,11 +12045,12 @@ nsDocShell::OnLinkClickSync(nsIContent *aContent,
|
||||
INTERNAL_LOAD_FLAGS_NONE,
|
||||
target.get(), // Window target
|
||||
NS_LossyConvertUTF16toASCII(typeHint).get(),
|
||||
aFileName, // Download as file
|
||||
aPostDataStream, // Post data stream
|
||||
aHeadersDataStream, // Headers stream
|
||||
LOAD_LINK, // Load type
|
||||
nullptr, // No SHEntry
|
||||
true, // first party site
|
||||
nullptr, // No SHEntry
|
||||
true, // first party site
|
||||
aDocShell, // DocShell out-param
|
||||
aRequest); // Request out-param
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
|
@ -197,12 +197,14 @@ public:
|
||||
NS_IMETHOD OnLinkClick(nsIContent* aContent,
|
||||
nsIURI* aURI,
|
||||
const PRUnichar* aTargetSpec,
|
||||
const nsAString& aFileName,
|
||||
nsIInputStream* aPostDataStream,
|
||||
nsIInputStream* aHeadersDataStream,
|
||||
bool aIsTrusted);
|
||||
NS_IMETHOD OnLinkClickSync(nsIContent* aContent,
|
||||
nsIURI* aURI,
|
||||
const PRUnichar* aTargetSpec,
|
||||
const nsAString& aFileName,
|
||||
nsIInputStream* aPostDataStream = 0,
|
||||
nsIInputStream* aHeadersDataStream = 0,
|
||||
nsIDocShell** aDocShell = 0,
|
||||
@ -291,6 +293,7 @@ protected:
|
||||
bool aSendReferrer,
|
||||
nsISupports * aOwner,
|
||||
const char * aTypeHint,
|
||||
const nsAString & aFileName,
|
||||
nsIInputStream * aPostData,
|
||||
nsIInputStream * aHeadersData,
|
||||
bool firstParty,
|
||||
|
@ -39,7 +39,7 @@ interface nsIWebBrowserPrint;
|
||||
interface nsIVariant;
|
||||
interface nsIPrivacyTransitionObserver;
|
||||
|
||||
[scriptable, builtinclass, uuid(318CE516-3F7A-41F6-8F3D-3661650F7A46)]
|
||||
[scriptable, builtinclass, uuid(a106db7f-6449-4a6b-914f-834ba308c3e2)]
|
||||
interface nsIDocShell : nsISupports
|
||||
{
|
||||
/**
|
||||
@ -118,6 +118,8 @@ interface nsIDocShell : nsISupports
|
||||
* @param aWindowTarget - Window target for the load.
|
||||
* @param aTypeHint - A hint as to the content-type of the resulting
|
||||
* data. May be null or empty if no hint.
|
||||
* @param aFileName - Non-null when the link should be downloaded as
|
||||
the given filename.
|
||||
* @param aPostDataStream - Post data stream (if POSTing)
|
||||
* @param aHeadersStream - Stream containing "extra" request headers...
|
||||
* @param aLoadFlags - Flags to modify load behaviour. Flags are defined
|
||||
@ -130,6 +132,7 @@ interface nsIDocShell : nsISupports
|
||||
in uint32_t aFlags,
|
||||
in wstring aWindowTarget,
|
||||
in string aTypeHint,
|
||||
in AString aFileName,
|
||||
in nsIInputStream aPostDataStream,
|
||||
in nsIInputStream aHeadersStream,
|
||||
in unsigned long aLoadFlags,
|
||||
|
@ -16,8 +16,8 @@ class nsGUIEvent;
|
||||
|
||||
// Interface ID for nsILinkHandler
|
||||
#define NS_ILINKHANDLER_IID \
|
||||
{ 0xd85670a1, 0x224a, 0x4562, \
|
||||
{ 0x87, 0xa9, 0x43, 0xa5, 0x24, 0xe7, 0xd0, 0x1b } }
|
||||
{ 0xceb9aade, 0x43da, 0x4f1a, \
|
||||
{ 0xac, 0x8a, 0xc7, 0x09, 0xfb, 0x22, 0x46, 0x64 } }
|
||||
|
||||
/**
|
||||
* Interface used for handling clicks on links
|
||||
@ -34,12 +34,14 @@ public:
|
||||
* @param aTargetSpec indicates where the link is targeted (may be an empty
|
||||
* string)
|
||||
* @param aPostDataStream the POST data to send
|
||||
* @param aFileName non-null when the link should be downloaded as the given file
|
||||
* @param aHeadersDataStream ???
|
||||
* @param aIsTrusted false if the triggerer is an untrusted DOM event.
|
||||
*/
|
||||
NS_IMETHOD OnLinkClick(nsIContent* aContent,
|
||||
NS_IMETHOD OnLinkClick(nsIContent* aContent,
|
||||
nsIURI* aURI,
|
||||
const PRUnichar* aTargetSpec,
|
||||
const nsAString& aFileName,
|
||||
nsIInputStream* aPostDataStream,
|
||||
nsIInputStream* aHeadersDataStream,
|
||||
bool aIsTrusted) = 0;
|
||||
@ -54,14 +56,16 @@ public:
|
||||
* @param aURI a URI obect that defines the destination for the link
|
||||
* @param aTargetSpec indicates where the link is targeted (may be an empty
|
||||
* string)
|
||||
* @param aFileName non-null when the link should be downloaded as the given file
|
||||
* @param aPostDataStream the POST data to send
|
||||
* @param aHeadersDataStream ???
|
||||
* @param aDocShell (out-param) the DocShell that the request was opened on
|
||||
* @param aRequest the request that was opened
|
||||
*/
|
||||
NS_IMETHOD OnLinkClickSync(nsIContent* aContent,
|
||||
NS_IMETHOD OnLinkClickSync(nsIContent* aContent,
|
||||
nsIURI* aURI,
|
||||
const PRUnichar* aTargetSpec,
|
||||
const nsAString& aFileName,
|
||||
nsIInputStream* aPostDataStream = 0,
|
||||
nsIInputStream* aHeadersDataStream = 0,
|
||||
nsIDocShell** aDocShell = 0,
|
||||
|
@ -16,13 +16,14 @@
|
||||
* http://www.whatwg.org/specs/web-apps/current-work/
|
||||
*/
|
||||
|
||||
[scriptable, uuid(68F49F8F-5FFD-44EB-A59F-D2B3F4817299)]
|
||||
[scriptable, uuid(1339c36e-23ad-4047-a04c-1702e27c7c83)]
|
||||
interface nsIDOMHTMLAnchorElement : nsIDOMHTMLElement
|
||||
{
|
||||
attribute DOMString href;
|
||||
attribute DOMString target;
|
||||
|
||||
attribute DOMString ping;
|
||||
attribute DOMString download;
|
||||
|
||||
attribute DOMString rel;
|
||||
attribute DOMString hreflang;
|
||||
|
@ -16,7 +16,7 @@
|
||||
* http://www.whatwg.org/specs/web-apps/current-work/
|
||||
*/
|
||||
|
||||
[scriptable, uuid(D3043539-158A-43EC-B845-175B5726AEB7)]
|
||||
[scriptable, uuid(69c5ce45-108a-442e-91c5-8c874e384ed7)]
|
||||
interface nsIDOMHTMLAreaElement : nsIDOMHTMLElement
|
||||
{
|
||||
attribute DOMString alt;
|
||||
@ -26,16 +26,17 @@ interface nsIDOMHTMLAreaElement : nsIDOMHTMLElement
|
||||
attribute DOMString target;
|
||||
|
||||
attribute DOMString ping;
|
||||
attribute DOMString download;
|
||||
|
||||
// URL decomposition IDL attributes
|
||||
attribute DOMString protocol;
|
||||
attribute DOMString host;
|
||||
attribute DOMString hostname;
|
||||
attribute DOMString hostname;
|
||||
attribute DOMString port;
|
||||
attribute DOMString pathname;
|
||||
attribute DOMString search;
|
||||
attribute DOMString hash;
|
||||
|
||||
|
||||
attribute boolean noHref;
|
||||
DOMString toString();
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
interface nsIDOMSVGAnimatedString;
|
||||
|
||||
[scriptable, uuid(DBC9B56C-3DE3-4475-A934-EE88D3BCB03C)]
|
||||
[scriptable, uuid(6e0eff6e-ce35-4c01-ab3c-ae81b79b40ca)]
|
||||
interface nsIDOMSVGAElement
|
||||
: nsIDOMSVGElement
|
||||
/*
|
||||
@ -33,4 +33,5 @@ interface nsIDOMSVGAElement
|
||||
*/
|
||||
{
|
||||
readonly attribute nsIDOMSVGAnimatedString target;
|
||||
attribute DOMString download;
|
||||
};
|
||||
|
@ -19,6 +19,7 @@ const DEBUG = false;
|
||||
|
||||
const kNetworkInterfaceStateChangedTopic = "network-interface-state-changed";
|
||||
const kXpcomShutdownObserverTopic = "xpcom-shutdown";
|
||||
const kPrefenceChangedObserverTopic = "nsPref:changed";
|
||||
|
||||
// File modes for saving MMS attachments.
|
||||
const FILE_OPEN_MODE = FileUtils.MODE_CREATE
|
||||
@ -57,6 +58,20 @@ XPCOMUtils.defineLazyGetter(this, "MMS", function () {
|
||||
function MmsService() {
|
||||
Services.obs.addObserver(this, kXpcomShutdownObserverTopic, false);
|
||||
Services.obs.addObserver(this, kNetworkInterfaceStateChangedTopic, false);
|
||||
this.MMSProxySettings.forEach(function(name) {
|
||||
Services.prefs.addObserver(name, this, false);
|
||||
}, this);
|
||||
|
||||
try {
|
||||
this.MMSC = Services.prefs.getCharPref("ril.mms.mmsc");
|
||||
this.MMSProxy = Services.prefs.getCharPref("ril.mms.mmsproxy");
|
||||
this.MMSPort = Services.prefs.getIntPref("ril.mms.mmsport");
|
||||
this.updateMMSProxyInfo();
|
||||
} catch (e) {
|
||||
debug("Failed to initialize the MMS proxy settings from the preference.");
|
||||
this.clearMMSProxySettings();
|
||||
}
|
||||
|
||||
try {
|
||||
this.urlUAProf = Services.prefs.getCharPref('wap.UAProf.url');
|
||||
} catch (e) {
|
||||
@ -82,8 +97,15 @@ MmsService.prototype = {
|
||||
*/
|
||||
confSendDeliveryReport: CONFIG_SEND_REPORT_DEFAULT_YES,
|
||||
|
||||
proxyInfo: null,
|
||||
/** MMS proxy settings. */
|
||||
MMSC: null,
|
||||
MMSProxy: null,
|
||||
MMSPort: null,
|
||||
MMSProxyInfo: null,
|
||||
MMSProxySettings: ["ril.mms.mmsc",
|
||||
"ril.mms.mmsproxy",
|
||||
"ril.mms.mmsport"],
|
||||
MMSNetworkConnected: false,
|
||||
|
||||
/** MMS proxy filter reference count. */
|
||||
proxyFilterRefCount: 0,
|
||||
@ -539,30 +561,31 @@ MmsService.prototype = {
|
||||
},
|
||||
|
||||
/**
|
||||
* Update proxyInfo & MMSC from preferences.
|
||||
*
|
||||
* @param enabled
|
||||
* Enable or disable MMS proxy.
|
||||
* Update the MMS proxy info.
|
||||
*/
|
||||
updateProxyInfo: function updateProxyInfo(enabled) {
|
||||
try {
|
||||
if (enabled) {
|
||||
this.MMSC = Services.prefs.getCharPref("ril.data.mmsc");
|
||||
this.proxyInfo = gpps.newProxyInfo("http",
|
||||
Services.prefs.getCharPref("ril.data.mmsproxy"),
|
||||
Services.prefs.getIntPref("ril.data.mmsport"),
|
||||
Ci.nsIProxyInfo.TRANSPARENT_PROXY_RESOLVES_HOST,
|
||||
-1, null);
|
||||
debug("updateProxyInfo: "
|
||||
+ JSON.stringify({MMSC: this.MMSC, proxyInfo: this.proxyInfo}));
|
||||
return;
|
||||
}
|
||||
} catch (e) {
|
||||
// Failed to refresh proxy info from settings. Fallback to disable.
|
||||
updateMMSProxyInfo: function updateMMSProxyInfo() {
|
||||
if (this.MMSProxy === null || this.MMSPort === null) {
|
||||
debug("updateMMSProxyInfo: MMSProxy or MMSPort is not yet decided." );
|
||||
return;
|
||||
}
|
||||
|
||||
this.MMSProxyInfo =
|
||||
gpps.newProxyInfo("http",
|
||||
this.MMSProxy,
|
||||
this.MMSPort,
|
||||
Ci.nsIProxyInfo.TRANSPARENT_PROXY_RESOLVES_HOST,
|
||||
-1, null);
|
||||
debug("updateMMSProxyInfo: " + JSON.stringify(this.MMSProxyInfo));
|
||||
},
|
||||
|
||||
/**
|
||||
* Clear the MMS proxy settings.
|
||||
*/
|
||||
clearMMSProxySettings: function clearMMSProxySettings() {
|
||||
this.MMSC = null;
|
||||
this.proxyInfo = null;
|
||||
this.MMSProxy = null;
|
||||
this.MMSPort = null;
|
||||
this.MMSProxyInfo = null;
|
||||
},
|
||||
|
||||
// nsIMmsService
|
||||
@ -583,15 +606,43 @@ MmsService.prototype = {
|
||||
switch (topic) {
|
||||
case kNetworkInterfaceStateChangedTopic: {
|
||||
let iface = subject.QueryInterface(Ci.nsINetworkInterface);
|
||||
if ((iface.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE)
|
||||
|| (iface.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS)) {
|
||||
this.updateProxyInfo(iface.state == Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED);
|
||||
if (iface.type != Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE &&
|
||||
iface.type != Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS) {
|
||||
return;
|
||||
}
|
||||
this.MMSNetworkConnected =
|
||||
iface.state == Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED;
|
||||
break;
|
||||
}
|
||||
case kXpcomShutdownObserverTopic: {
|
||||
Services.obs.removeObserver(this, kXpcomShutdownObserverTopic);
|
||||
Services.obs.removeObserver(this, kNetworkInterfaceStateChangedTopic);
|
||||
this.MMSProxySettings.forEach(function(name) {
|
||||
Services.prefs.removeObserver(name, this);
|
||||
}, this);
|
||||
break;
|
||||
}
|
||||
case kPrefenceChangedObserverTopic: {
|
||||
try {
|
||||
switch (data) {
|
||||
case "ril.mms.mmsc":
|
||||
this.MMSC = Services.prefs.getCharPref("ril.mms.mmsc");
|
||||
break;
|
||||
case "ril.mms.mmsproxy":
|
||||
this.MMSProxy = Services.prefs.getCharPref("ril.mms.mmsproxy");
|
||||
this.updateMMSProxyInfo();
|
||||
break;
|
||||
case "ril.mms.mmsport":
|
||||
this.MMSPort = Services.prefs.getIntPref("ril.mms.mmsport");
|
||||
this.updateMMSProxyInfo();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} catch (e) {
|
||||
debug("Failed to update the MMS proxy settings from the preference.");
|
||||
this.clearMMSProxySettings();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -600,13 +651,27 @@ MmsService.prototype = {
|
||||
// nsIProtocolProxyFilter
|
||||
|
||||
applyFilter: function applyFilter(service, uri, proxyInfo) {
|
||||
if (uri.prePath == this.MMSC) {
|
||||
debug("applyFilter: match " + uri.spec);
|
||||
return this.proxyInfo;
|
||||
if (!this.MMSNetworkConnected) {
|
||||
debug("applyFilter: the MMS network is not connected.");
|
||||
return proxyInfo;
|
||||
}
|
||||
|
||||
if (this.MMSC === null || uri.prePath != this.MMSC) {
|
||||
debug("applyFilter: MMSC is not matched.");
|
||||
return proxyInfo;
|
||||
}
|
||||
|
||||
return proxyInfo;
|
||||
},
|
||||
if (this.MMSProxyInfo === null) {
|
||||
debug("applyFilter: MMS proxy info is not yet decided.");
|
||||
return proxyInfo;
|
||||
}
|
||||
|
||||
// Fall-through, reutrn the MMS proxy info.
|
||||
debug("applyFilter: MMSC is matched: " +
|
||||
JSON.stringify({ MMSC: this.MMSC,
|
||||
MMSProxyInfo: this.MMSProxyInfo }));
|
||||
return this.MMSProxyInfo;
|
||||
}
|
||||
};
|
||||
|
||||
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([MmsService]);
|
||||
|
@ -24,6 +24,7 @@ interface nsIDOMMozMobileConnection : nsIDOMEventTarget
|
||||
const long ICC_SERVICE_CLASS_DATA_ASYNC = (1 << 5);
|
||||
const long ICC_SERVICE_CLASS_PACKET = (1 << 6);
|
||||
const long ICC_SERVICE_CLASS_PAD = (1 << 7);
|
||||
const long ICC_SERVICE_CLASS_MAX = (1 << 7);
|
||||
|
||||
/**
|
||||
* Indicates the state of the device's ICC card.
|
||||
@ -455,7 +456,7 @@ interface nsIDOMMozMobileICCInfo : nsISupports
|
||||
readonly attribute DOMString msisdn;
|
||||
};
|
||||
|
||||
[scriptable, uuid(2e40982a-ddf6-4d92-a3e8-4d69ce5a3a2e)]
|
||||
[scriptable, uuid(d1b35ad8-99aa-47cc-ab49-2e72b00e39df)]
|
||||
interface nsIDOMMozMobileCFInfo : nsISupports
|
||||
{
|
||||
/**
|
||||
@ -515,4 +516,10 @@ interface nsIDOMMozMobileCFInfo : nsISupports
|
||||
* seconds to wait before call is forwarded.
|
||||
*/
|
||||
readonly attribute unsigned short timeSeconds;
|
||||
|
||||
/**
|
||||
* Service for which the call forward is set up. It should be one of the
|
||||
* nsIDOMMozMobileConnectionInfo.ICC_SERVICE_CLASS_* values.
|
||||
*/
|
||||
readonly attribute unsigned short serviceClass;
|
||||
};
|
||||
|
@ -563,7 +563,7 @@ NS_IMETHODIMP nsPluginInstanceOwner::GetURL(const char *aURL,
|
||||
Preferences::GetInt("privacy.popups.disable_from_plugins");
|
||||
nsAutoPopupStatePusher popupStatePusher((PopupControlState)blockPopups);
|
||||
|
||||
rv = lh->OnLinkClick(mContent, uri, unitarget.get(),
|
||||
rv = lh->OnLinkClick(mContent, uri, unitarget.get(), NullString(),
|
||||
aPostStream, headersDataStream, true);
|
||||
|
||||
return rv;
|
||||
|
@ -224,7 +224,8 @@ MobileCFInfo.prototype = {
|
||||
action: 'r',
|
||||
reason: 'r',
|
||||
number: 'r',
|
||||
timeSeconds: 'r'},
|
||||
timeSeconds: 'r',
|
||||
serviceClass: 'r'},
|
||||
QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMMozMobileCFInfo]),
|
||||
classID: MOBILECFINFO_CID,
|
||||
classInfo: XPCOMUtils.generateCI({
|
||||
@ -240,7 +241,8 @@ MobileCFInfo.prototype = {
|
||||
action: -1,
|
||||
reason: -1,
|
||||
number: null,
|
||||
timeSeconds: 0
|
||||
timeSeconds: 0,
|
||||
serviceClass: -1
|
||||
};
|
||||
|
||||
function RILContentHelper() {
|
||||
|
@ -2080,6 +2080,7 @@ this.MMI_SC_CF_ALL_CONDITIONAL = "004";
|
||||
this.MMI_SC_TO_CF_REASON = {};
|
||||
MMI_SC_TO_CF_REASON[MMI_SC_CFU] = CALL_FORWARD_REASON_UNCONDITIONAL;
|
||||
MMI_SC_TO_CF_REASON[MMI_SC_CF_BUSY] = CALL_FORWARD_REASON_MOBILE_BUSY;
|
||||
MMI_SC_TO_CF_REASON[MMI_SC_CF_NO_REPLY] = CALL_FORWARD_REASON_NO_REPLY;
|
||||
MMI_SC_TO_CF_REASON[MMI_SC_CF_NOT_REACHABLE] = CALL_FORWARD_REASON_NOT_REACHABLE;
|
||||
MMI_SC_TO_CF_REASON[MMI_SC_CF_ALL] = CALL_FORWARD_REASON_ALL_CALL_FORWARDING;
|
||||
MMI_SC_TO_CF_REASON[MMI_SC_CF_ALL_CONDITIONAL] = CALL_FORWARD_REASON_ALL_CONDITIONAL_CALL_FORWARDING;
|
||||
|
@ -2691,7 +2691,7 @@ let RIL = {
|
||||
options.rilMessageType = "sendMMI";
|
||||
options.reason = MMI_SC_TO_CF_REASON[sc];
|
||||
options.number = mmi.sia;
|
||||
options.serviceClass = mmi.sib;
|
||||
options.serviceClass = this._siToServiceClass(mmi.sib);
|
||||
if (options.action == CALL_FORWARD_ACTION_QUERY_STATUS) {
|
||||
this.queryCallForwardStatus(options);
|
||||
return;
|
||||
@ -3961,6 +3961,44 @@ let RIL = {
|
||||
return toa;
|
||||
},
|
||||
|
||||
/**
|
||||
* Helper for translating basic service group to call forwarding service class
|
||||
* parameter.
|
||||
*/
|
||||
_siToServiceClass: function _siToServiceClass(si) {
|
||||
if (!si) {
|
||||
return ICC_SERVICE_CLASS_NONE;
|
||||
}
|
||||
|
||||
let serviceCode = parseInt(si, 10);
|
||||
switch (serviceCode) {
|
||||
case 10:
|
||||
return ICC_SERVICE_CLASS_SMS + ICC_SERVICE_CLASS_FAX + ICC_SERVICE_CLASS_VOICE;
|
||||
case 11:
|
||||
return ICC_SERVICE_CLASS_VOICE;
|
||||
case 12:
|
||||
return ICC_SERVICE_CLASS_SMS + ICC_SERVICE_CLASS_FAX;
|
||||
case 13:
|
||||
return ICC_SERVICE_CLASS_FAX;
|
||||
case 16:
|
||||
return ICC_SERVICE_CLASS_SMS;
|
||||
case 19:
|
||||
return ICC_SERVICE_CLASS_FAX + ICC_SERVICE_CLASS_VOICE;
|
||||
case 21:
|
||||
return ICC_SERVICE_CLASS_PAD + ICC_SERVICE_CLASS_DATA_ASYNC;
|
||||
case 22:
|
||||
return ICC_SERVICE_CLASS_PACKET + ICC_SERVICE_CLASS_DATA_SYNC;
|
||||
case 25:
|
||||
return ICC_SERVICE_CLASS_DATA_ASYNC;
|
||||
case 26:
|
||||
return ICC_SERVICE_CLASS_DATA_SYNC + SERVICE_CLASS_VOICE;
|
||||
case 99:
|
||||
return ICC_SERVICE_CLASS_PACKET;
|
||||
default:
|
||||
return ICC_SERVICE_CLASS_NONE;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @param message A decoded SMS-DELIVER message.
|
||||
*
|
||||
|
@ -853,17 +853,15 @@ const gfx::Rect AsyncPanZoomController::CalculatePendingDisplayPort(
|
||||
// probably not work at all for RTL content. This is not intended to be
|
||||
// incredibly accurate; it'll just prevent the entire displayport from being
|
||||
// outside the content rect (which causes bad things to happen).
|
||||
if (enlargedX || enlargedY) {
|
||||
if (scrollOffset.x + compositionBounds.width > scrollableRect.width) {
|
||||
scrollOffset.x -= compositionBounds.width + scrollOffset.x - scrollableRect.width;
|
||||
} else if (scrollOffset.x < scrollableRect.x) {
|
||||
scrollOffset.x = scrollableRect.x;
|
||||
}
|
||||
if (scrollOffset.y + compositionBounds.height > scrollableRect.height) {
|
||||
scrollOffset.y -= compositionBounds.height + scrollOffset.y - scrollableRect.height;
|
||||
} else if (scrollOffset.y < scrollableRect.y) {
|
||||
scrollOffset.y = scrollableRect.y;
|
||||
}
|
||||
if (scrollOffset.x + compositionBounds.width > scrollableRect.width) {
|
||||
scrollOffset.x -= compositionBounds.width + scrollOffset.x - scrollableRect.width;
|
||||
} else if (scrollOffset.x < scrollableRect.x) {
|
||||
scrollOffset.x = scrollableRect.x;
|
||||
}
|
||||
if (scrollOffset.y + compositionBounds.height > scrollableRect.height) {
|
||||
scrollOffset.y -= compositionBounds.height + scrollOffset.y - scrollableRect.height;
|
||||
} else if (scrollOffset.y < scrollableRect.y) {
|
||||
scrollOffset.y = scrollableRect.y;
|
||||
}
|
||||
|
||||
gfx::Rect shiftedDisplayPort = displayPort;
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
#include "nsIMemoryReporter.h"
|
||||
#include "nsMemory.h"
|
||||
#include "mozilla/Base64.h"
|
||||
#include "mozilla/CheckedInt.h"
|
||||
#include "mozilla/Attributes.h"
|
||||
|
||||
@ -41,16 +42,14 @@
|
||||
|
||||
#include "imgIEncoder.h"
|
||||
#include "nsComponentManagerUtils.h"
|
||||
#include "prmem.h"
|
||||
#include "nsISupportsUtils.h"
|
||||
#include "plbase64.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsIConsoleService.h"
|
||||
#include "nsServiceManagerUtils.h"
|
||||
#include "nsStringGlue.h"
|
||||
#include "nsIClipboardHelper.h"
|
||||
|
||||
using mozilla::CheckedInt;
|
||||
using namespace mozilla;
|
||||
|
||||
static cairo_user_data_key_t gfxasurface_pointer_key;
|
||||
|
||||
@ -776,7 +775,7 @@ gfxASurface::WriteAsPNG_internal(FILE* aFile, bool aBinary)
|
||||
// got everything. 16 bytes for better padding (maybe)
|
||||
bufSize += 16;
|
||||
uint32_t imgSize = 0;
|
||||
char* imgData = (char*)PR_Malloc(bufSize);
|
||||
char* imgData = (char*)moz_malloc(bufSize);
|
||||
if (!imgData)
|
||||
return;
|
||||
uint32_t numReadThisTime = 0;
|
||||
@ -788,9 +787,9 @@ gfxASurface::WriteAsPNG_internal(FILE* aFile, bool aBinary)
|
||||
if (imgSize == bufSize) {
|
||||
// need a bigger buffer, just double
|
||||
bufSize *= 2;
|
||||
char* newImgData = (char*)PR_Realloc(imgData, bufSize);
|
||||
char* newImgData = (char*)moz_realloc(imgData, bufSize);
|
||||
if (!newImgData) {
|
||||
PR_Free(imgData);
|
||||
moz_free(imgData);
|
||||
return;
|
||||
}
|
||||
imgData = newImgData;
|
||||
@ -807,9 +806,10 @@ gfxASurface::WriteAsPNG_internal(FILE* aFile, bool aBinary)
|
||||
}
|
||||
|
||||
// base 64, result will be NULL terminated
|
||||
char* encodedImg = PL_Base64Encode(imgData, imgSize, nullptr);
|
||||
PR_Free(imgData);
|
||||
if (!encodedImg) // not sure why this would fail
|
||||
nsCString encodedImg;
|
||||
rv = Base64Encode(Substring(imgData, imgSize), encodedImg);
|
||||
moz_free(imgData);
|
||||
if (NS_FAILED(rv)) // not sure why this would fail
|
||||
return;
|
||||
|
||||
nsCString string("data:image/png;base64,");
|
||||
@ -838,8 +838,6 @@ gfxASurface::WriteAsPNG_internal(FILE* aFile, bool aBinary)
|
||||
}
|
||||
}
|
||||
|
||||
PR_Free(encodedImg);
|
||||
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
@ -11,10 +11,9 @@
|
||||
#include "zlib.h"
|
||||
|
||||
#ifdef WOFF_MOZILLA_CLIENT /* define this when building as part of Gecko */
|
||||
# include "prmem.h"
|
||||
# define malloc PR_Malloc
|
||||
# define realloc PR_Realloc
|
||||
# define free PR_Free
|
||||
# define malloc moz_malloc
|
||||
# define realloc moz_realloc
|
||||
# define free moz_free
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -1560,29 +1560,50 @@ $(foreach category,$(INSTALL_TARGETS),\
|
||||
# Preprocessing rules
|
||||
#
|
||||
# The PP_TARGETS variable contains a list of all preprocessing target
|
||||
# categories. Each category defines a target path, and optional extra flags
|
||||
# like the following:
|
||||
# categories. Each category has associated variables listing input files, the
|
||||
# output directory, extra preprocessor flags, and so on. For example:
|
||||
#
|
||||
# FOO_PATH := target_path
|
||||
# FOO_FLAGS := -Dsome_flag
|
||||
# PP_TARGETS += FOO
|
||||
# FOO := input-file
|
||||
# FOO_PATH := target-directory
|
||||
# FOO_FLAGS := -Dsome_flag
|
||||
# PP_TARGETS += FOO
|
||||
#
|
||||
# Additionally, a FOO_TARGET variable may be added to indicate the target for
|
||||
# which the files and executables are installed. Default is "libs".
|
||||
# If PP_TARGETS lists a category name <C> (like FOO, above), then we consult the
|
||||
# following make variables to see what to do:
|
||||
#
|
||||
# - <C> lists input files to be preprocessed with config/Preprocessor.py. We
|
||||
# search VPATH for the names given here. If an input file name ends in '.in',
|
||||
# that suffix is omitted from the output file name.
|
||||
#
|
||||
# - <C>_PATH names the directory in which to place the preprocessed output
|
||||
# files. We create this directory if it does not already exist. Setting
|
||||
# this variable is optional; if unset, we install the files in $(CURDIR).
|
||||
#
|
||||
# - <C>_FLAGS lists flags to pass to Preprocessor.py, in addition to the usual
|
||||
# bunch. Setting this variable is optional.
|
||||
#
|
||||
# - <C>_TARGET names the 'make' target that should depend on creating the output
|
||||
# files. Setting this variable is optional; if unset, we preprocess the
|
||||
# files for the 'libs' target.
|
||||
|
||||
# preprocess_file_template defines preprocessing rules.
|
||||
# $(call preprocess_file_template, source_file, target_path, extra_flags)
|
||||
# $(call preprocess_file_template, source_file, output_file,
|
||||
# makefile_target, extra_flags)
|
||||
define preprocess_file_template
|
||||
$(2)/$(notdir $(1)): $(1) $$(call mkdir_deps,$(2)) $$(GLOBAL_DEPS)
|
||||
$(2): $(1) $$(call mkdir_deps,$(dir $(2))) $$(GLOBAL_DEPS)
|
||||
$$(RM) $$@
|
||||
$$(PYTHON) $$(topsrcdir)/config/Preprocessor.py $(4) $$(DEFINES) $$(ACDEFINES) $$(XULPPFLAGS) $$< > $$@
|
||||
$(or $(3),libs):: $(2)/$(notdir $(1))
|
||||
$(3):: $(2)
|
||||
endef
|
||||
|
||||
$(foreach category,$(PP_TARGETS),\
|
||||
$(foreach file,$($(category)),\
|
||||
$(eval $(call preprocess_file_template,$(file),$($(category)_PATH),$($(category)_TARGET),$($(category)_FLAGS)))\
|
||||
)\
|
||||
$(foreach category,$(PP_TARGETS), \
|
||||
$(foreach file,$($(category)), \
|
||||
$(eval $(call preprocess_file_template, \
|
||||
$(file), \
|
||||
$(or $($(category)_PATH),$(CURDIR))/$(notdir $(file:.in=)), \
|
||||
$(or $($(category)_TARGET),libs), \
|
||||
$($(category)_FLAGS))) \
|
||||
) \
|
||||
)
|
||||
|
||||
################################################################################
|
||||
|
@ -1515,14 +1515,13 @@ EnterIon(JSContext *cx, StackFrame *fp, void *jitcode)
|
||||
|
||||
// Caller must construct |this| before invoking the Ion function.
|
||||
JS_ASSERT_IF(fp->isConstructing(), fp->functionThis().isObject());
|
||||
|
||||
Value result = Int32Value(numActualArgs);
|
||||
{
|
||||
AssertCompartmentUnchanged pcc(cx);
|
||||
IonContext ictx(cx, cx->compartment, NULL);
|
||||
IonActivation activation(cx, fp);
|
||||
JSAutoResolveFlags rf(cx, RESOLVE_INFER);
|
||||
|
||||
AutoFlushInhibitor afi(cx->compartment->ionCompartment());
|
||||
// Single transition point from Interpreter to Ion.
|
||||
enter(jitcode, maxArgc, maxArgv, fp, calleeToken, &result);
|
||||
}
|
||||
@ -2012,6 +2011,31 @@ AutoFlushCache::AutoFlushCache(const char *nonce, IonCompartment *comp)
|
||||
}
|
||||
myCompartment_ = comp;
|
||||
}
|
||||
|
||||
AutoFlushInhibitor::AutoFlushInhibitor(IonCompartment *ic) : ic_(ic), afc(NULL)
|
||||
{
|
||||
if (!ic)
|
||||
return;
|
||||
afc = ic->flusher();
|
||||
// Ensure that called functions get a fresh flusher
|
||||
ic->setFlusher(NULL);
|
||||
// Ensure the current flusher has been flushed
|
||||
if (afc) {
|
||||
afc->flushAnyway();
|
||||
IonSpewCont(IonSpew_CacheFlush, "}");
|
||||
}
|
||||
}
|
||||
AutoFlushInhibitor::~AutoFlushInhibitor()
|
||||
{
|
||||
if (!ic_)
|
||||
return;
|
||||
JS_ASSERT(ic_->flusher() == NULL);
|
||||
// Ensure any future modifications are recorded
|
||||
ic_->setFlusher(afc);
|
||||
if (afc)
|
||||
IonSpewCont(IonSpew_CacheFlush, "{");
|
||||
}
|
||||
|
||||
int js::ion::LabelBase::id_count = 0;
|
||||
|
||||
void
|
||||
|
@ -576,8 +576,25 @@ struct AutoFlushCache {
|
||||
static void updateTop(uintptr_t p, size_t len);
|
||||
~AutoFlushCache();
|
||||
AutoFlushCache(const char * nonce, IonCompartment *comp = NULL);
|
||||
void flushAnyway();
|
||||
};
|
||||
|
||||
// If you are currently in the middle of modifing Ion-compiled code, which
|
||||
// is going to be flushed at *some* point, but determine that you *must*
|
||||
// call a function *right* *now*, two things can go wrong:
|
||||
// 1) The flusher that you were using is still active, but you are about to
|
||||
// enter jitted code, so it needs to be flushed
|
||||
// 2) the called function can re-enter a compilation/modification path which
|
||||
// will use your AFC, and thus not flush when his compilation is done
|
||||
|
||||
struct AutoFlushInhibitor {
|
||||
private:
|
||||
IonCompartment *ic_;
|
||||
AutoFlushCache *afc;
|
||||
public:
|
||||
AutoFlushInhibitor(IonCompartment *ic);
|
||||
~AutoFlushInhibitor();
|
||||
};
|
||||
} // namespace ion
|
||||
|
||||
namespace gc {
|
||||
|
@ -588,7 +588,7 @@ MUrsh::infer(const TypeOracle::BinaryTypes &b)
|
||||
static inline bool
|
||||
NeedNegativeZeroCheck(MDefinition *def)
|
||||
{
|
||||
// Test if all uses have the same symantic for -0 and 0
|
||||
// Test if all uses have the same semantics for -0 and 0
|
||||
for (MUseIterator use = def->usesBegin(); use != def->usesEnd(); use++) {
|
||||
if (use->node()->isResumePoint())
|
||||
continue;
|
||||
@ -596,6 +596,10 @@ NeedNegativeZeroCheck(MDefinition *def)
|
||||
MDefinition *use_def = use->node()->toDefinition();
|
||||
switch (use_def->op()) {
|
||||
case MDefinition::Op_Add: {
|
||||
// If add is truncating -0 and 0 are observed as the same.
|
||||
if (use_def->toAdd()->isTruncated())
|
||||
break;
|
||||
|
||||
// x + y gives -0, when both x and y are -0
|
||||
|
||||
// Figure out the order in which the addition's operands will
|
||||
@ -640,6 +644,11 @@ NeedNegativeZeroCheck(MDefinition *def)
|
||||
// been evaluated as int32 and the addition's result cannot be -0.
|
||||
break;
|
||||
}
|
||||
case MDefinition::Op_Sub:
|
||||
// If sub is truncating -0 and 0 are observed as the same
|
||||
if (use_def->toSub()->isTruncated())
|
||||
break;
|
||||
/* Fall through... */
|
||||
case MDefinition::Op_StoreElement:
|
||||
case MDefinition::Op_StoreElementHole:
|
||||
case MDefinition::Op_LoadElement:
|
||||
@ -648,7 +657,6 @@ NeedNegativeZeroCheck(MDefinition *def)
|
||||
case MDefinition::Op_LoadTypedArrayElementHole:
|
||||
case MDefinition::Op_CharCodeAt:
|
||||
case MDefinition::Op_Mod:
|
||||
case MDefinition::Op_Sub:
|
||||
// Only allowed to remove check when definition is the second operand
|
||||
if (use_def->getOperand(0) == def)
|
||||
return true;
|
||||
@ -672,6 +680,7 @@ NeedNegativeZeroCheck(MDefinition *def)
|
||||
case MDefinition::Op_BitOr:
|
||||
case MDefinition::Op_BitXor:
|
||||
case MDefinition::Op_Abs:
|
||||
case MDefinition::Op_TruncateToInt32:
|
||||
// Always allowed to remove check. No matter which operand.
|
||||
break;
|
||||
default:
|
||||
@ -735,36 +744,36 @@ MDiv::analyzeEdgeCasesForward()
|
||||
// If lhs is a constant int != INT32_MIN, then
|
||||
// negative overflow check can be skipped.
|
||||
if (lhs()->isConstant() && !lhs()->toConstant()->value().isInt32(INT32_MIN))
|
||||
canBeNegativeOverflow_ = false;
|
||||
setCanBeNegativeZero(false);
|
||||
|
||||
// If rhs is a constant int != -1, likewise.
|
||||
if (rhs()->isConstant() && !rhs()->toConstant()->value().isInt32(-1))
|
||||
canBeNegativeOverflow_ = false;
|
||||
setCanBeNegativeZero(false);
|
||||
|
||||
// If lhs is != 0, then negative zero check can be skipped.
|
||||
if (lhs()->isConstant() && !lhs()->toConstant()->value().isInt32(0))
|
||||
canBeNegativeZero_ = false;
|
||||
setCanBeNegativeZero(false);
|
||||
|
||||
// If rhs is >= 0, likewise.
|
||||
if (rhs()->isConstant()) {
|
||||
const js::Value &val = rhs()->toConstant()->value();
|
||||
if (val.isInt32() && val.toInt32() >= 0)
|
||||
canBeNegativeZero_ = false;
|
||||
setCanBeNegativeZero(false);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MDiv::analyzeEdgeCasesBackward()
|
||||
{
|
||||
if (canBeNegativeZero_)
|
||||
canBeNegativeZero_ = NeedNegativeZeroCheck(this);
|
||||
if (canBeNegativeZero() && !NeedNegativeZeroCheck(this))
|
||||
setCanBeNegativeZero(false);
|
||||
}
|
||||
|
||||
void
|
||||
MDiv::analyzeTruncateBackward()
|
||||
{
|
||||
if (!isTruncated())
|
||||
setTruncated(js::ion::EdgeCaseAnalysis::AllUsesTruncate(this));
|
||||
if (!isTruncated() && js::ion::EdgeCaseAnalysis::AllUsesTruncate(this))
|
||||
setTruncated(true);
|
||||
}
|
||||
|
||||
bool
|
||||
@ -774,8 +783,7 @@ MDiv::updateForReplacement(MDefinition *ins_)
|
||||
MDiv *ins = ins_->toDiv();
|
||||
// Since EdgeCaseAnalysis is not being run before GVN, its information does
|
||||
// not need to be merged here.
|
||||
if (isTruncated())
|
||||
setTruncated(ins->isTruncated());
|
||||
setTruncated(isTruncated() && ins->isTruncated());
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -839,8 +847,8 @@ MMod::foldsTo(bool useValueNumbers)
|
||||
void
|
||||
MAdd::analyzeTruncateBackward()
|
||||
{
|
||||
if (!isTruncated())
|
||||
setTruncated(js::ion::EdgeCaseAnalysis::AllUsesTruncate(this));
|
||||
if (!isTruncated() && js::ion::EdgeCaseAnalysis::AllUsesTruncate(this))
|
||||
setTruncated(true);
|
||||
}
|
||||
|
||||
bool
|
||||
@ -848,8 +856,7 @@ MAdd::updateForReplacement(MDefinition *ins_)
|
||||
{
|
||||
JS_ASSERT(ins_->isAdd());
|
||||
MAdd *ins = ins_->toAdd();
|
||||
if (isTruncated())
|
||||
setTruncated(ins->isTruncated());
|
||||
setTruncated(isTruncated() && ins->isTruncated());
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -862,8 +869,8 @@ MAdd::fallible()
|
||||
void
|
||||
MSub::analyzeTruncateBackward()
|
||||
{
|
||||
if (!isTruncated())
|
||||
setTruncated(js::ion::EdgeCaseAnalysis::AllUsesTruncate(this));
|
||||
if (!isTruncated() && js::ion::EdgeCaseAnalysis::AllUsesTruncate(this))
|
||||
setTruncated(true);
|
||||
}
|
||||
|
||||
bool
|
||||
@ -871,8 +878,7 @@ MSub::updateForReplacement(MDefinition *ins_)
|
||||
{
|
||||
JS_ASSERT(ins_->isSub());
|
||||
MSub *ins = ins_->toSub();
|
||||
if (isTruncated())
|
||||
setTruncated(ins->isTruncated());
|
||||
setTruncated(isTruncated() && ins->isTruncated());
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -893,7 +899,7 @@ MMul::foldsTo(bool useValueNumbers)
|
||||
return this;
|
||||
|
||||
if (EqualValues(useValueNumbers, lhs(), rhs()))
|
||||
canBeNegativeZero_ = false;
|
||||
setCanBeNegativeZero(false);
|
||||
|
||||
return this;
|
||||
}
|
||||
@ -910,14 +916,14 @@ MMul::analyzeEdgeCasesForward()
|
||||
if (lhs()->isConstant()) {
|
||||
const js::Value &val = lhs()->toConstant()->value();
|
||||
if (val.isInt32() && val.toInt32() > 0)
|
||||
canBeNegativeZero_ = false;
|
||||
setCanBeNegativeZero(false);
|
||||
}
|
||||
|
||||
// If rhs is > 0, likewise.
|
||||
if (rhs()->isConstant()) {
|
||||
const js::Value &val = rhs()->toConstant()->value();
|
||||
if (val.isInt32() && val.toInt32() > 0)
|
||||
canBeNegativeZero_ = false;
|
||||
setCanBeNegativeZero(false);
|
||||
}
|
||||
|
||||
}
|
||||
@ -925,15 +931,15 @@ MMul::analyzeEdgeCasesForward()
|
||||
void
|
||||
MMul::analyzeEdgeCasesBackward()
|
||||
{
|
||||
if (canBeNegativeZero_)
|
||||
canBeNegativeZero_ = NeedNegativeZeroCheck(this);
|
||||
if (canBeNegativeZero() && !NeedNegativeZeroCheck(this))
|
||||
setCanBeNegativeZero(false);
|
||||
}
|
||||
|
||||
void
|
||||
MMul::analyzeTruncateBackward()
|
||||
{
|
||||
if (!isPossibleTruncated())
|
||||
setPossibleTruncated(js::ion::EdgeCaseAnalysis::AllUsesTruncate(this));
|
||||
if (!isPossibleTruncated() && js::ion::EdgeCaseAnalysis::AllUsesTruncate(this))
|
||||
setPossibleTruncated(true);
|
||||
}
|
||||
|
||||
bool
|
||||
@ -941,8 +947,12 @@ MMul::updateForReplacement(MDefinition *ins_)
|
||||
{
|
||||
JS_ASSERT(ins_->isMul());
|
||||
MMul *ins = ins_->toMul();
|
||||
if (isPossibleTruncated())
|
||||
setPossibleTruncated(ins->isPossibleTruncated());
|
||||
// setPossibleTruncated can reset the canBenegativeZero check,
|
||||
// therefore first query the state, before setting the new state.
|
||||
bool truncated = isPossibleTruncated() && ins->isPossibleTruncated();
|
||||
bool negativeZero = canBeNegativeZero() || ins->canBeNegativeZero();
|
||||
setPossibleTruncated(truncated);
|
||||
setCanBeNegativeZero(negativeZero);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -954,21 +964,11 @@ MMul::canOverflow()
|
||||
return !range() || !range()->isFinite();
|
||||
}
|
||||
|
||||
bool
|
||||
MMul::canBeNegativeZero()
|
||||
{
|
||||
if (!range())
|
||||
return canBeNegativeZero_;
|
||||
if (range()->lower() > 0 || range()->upper() < 0)
|
||||
return false;
|
||||
return canBeNegativeZero_;
|
||||
}
|
||||
|
||||
void
|
||||
MBinaryArithInstruction::infer(JSContext *cx, const TypeOracle::BinaryTypes &b)
|
||||
{
|
||||
// Retrieve type information of lhs and rhs
|
||||
// Rhs is defaulted to int32 first,
|
||||
// Rhs is defaulted to int32 first,
|
||||
// because in some cases there is no rhs type information
|
||||
MIRType lhs = MIRTypeFromValueType(b.lhsTypes->getKnownTypeTag());
|
||||
MIRType rhs = MIRType_Int32;
|
||||
@ -1284,7 +1284,8 @@ MToInt32::foldsTo(bool useValueNumbers)
|
||||
void
|
||||
MToInt32::analyzeEdgeCasesBackward()
|
||||
{
|
||||
canBeNegativeZero_ = NeedNegativeZeroCheck(this);
|
||||
if (!NeedNegativeZeroCheck(this))
|
||||
setCanBeNegativeZero(false);
|
||||
}
|
||||
|
||||
MDefinition *
|
||||
|
@ -1759,6 +1759,9 @@ class MToInt32 : public MUnaryInstruction
|
||||
bool canBeNegativeZero() {
|
||||
return canBeNegativeZero_;
|
||||
}
|
||||
void setCanBeNegativeZero(bool negativeZero) {
|
||||
canBeNegativeZero_ = negativeZero;
|
||||
}
|
||||
|
||||
bool congruentTo(MDefinition *const &ins) const {
|
||||
return congruentIfOperandsEqual(ins);
|
||||
@ -2438,8 +2441,8 @@ class MAdd : public MBinaryArithInstruction
|
||||
bool isTruncated() const {
|
||||
return implicitTruncate_;
|
||||
}
|
||||
void setTruncated(bool val) {
|
||||
implicitTruncate_ = val;
|
||||
void setTruncated(bool truncate) {
|
||||
implicitTruncate_ = truncate;
|
||||
}
|
||||
bool updateForReplacement(MDefinition *ins);
|
||||
double getIdentity() {
|
||||
@ -2470,8 +2473,8 @@ class MSub : public MBinaryArithInstruction
|
||||
bool isTruncated() const {
|
||||
return implicitTruncate_;
|
||||
}
|
||||
void setTruncated(bool val) {
|
||||
implicitTruncate_ = val;
|
||||
void setTruncated(bool truncate) {
|
||||
implicitTruncate_ = truncate;
|
||||
}
|
||||
bool updateForReplacement(MDefinition *ins);
|
||||
|
||||
@ -2528,7 +2531,13 @@ class MMul : public MBinaryArithInstruction
|
||||
}
|
||||
|
||||
bool canOverflow();
|
||||
bool canBeNegativeZero();
|
||||
|
||||
bool canBeNegativeZero() {
|
||||
return canBeNegativeZero_;
|
||||
}
|
||||
void setCanBeNegativeZero(bool negativeZero) {
|
||||
canBeNegativeZero_ = negativeZero;
|
||||
}
|
||||
|
||||
bool updateForReplacement(MDefinition *ins);
|
||||
|
||||
@ -2544,6 +2553,13 @@ class MMul : public MBinaryArithInstruction
|
||||
|
||||
void setPossibleTruncated(bool truncate) {
|
||||
possibleTruncate_ = truncate;
|
||||
|
||||
// We can remove the negative zero check, because op if it is only used truncated.
|
||||
// The "Possible" in the function name means that we are not sure,
|
||||
// that "integer mul and disregarding overflow" == "double mul and ToInt32"
|
||||
// Note: when removing truncated state, we have to add negative zero check again,
|
||||
// because we are not sure if it was removed by this or other passes.
|
||||
canBeNegativeZero_ = !truncate;
|
||||
}
|
||||
};
|
||||
|
||||
@ -2589,13 +2605,16 @@ class MDiv : public MBinaryArithInstruction
|
||||
bool isTruncated() const {
|
||||
return implicitTruncate_;
|
||||
}
|
||||
void setTruncated(bool val) {
|
||||
implicitTruncate_ = val;
|
||||
void setTruncated(bool truncate) {
|
||||
implicitTruncate_ = truncate;
|
||||
}
|
||||
|
||||
bool canBeNegativeZero() {
|
||||
return canBeNegativeZero_;
|
||||
}
|
||||
void setCanBeNegativeZero(bool negativeZero) {
|
||||
canBeNegativeZero_ = negativeZero;
|
||||
}
|
||||
|
||||
bool canBeNegativeOverflow() {
|
||||
return canBeNegativeOverflow_;
|
||||
|
@ -474,6 +474,27 @@ Range::precisionLossMul(const Range *lhs, const Range *rhs)
|
||||
return lower > loss || upper > loss;
|
||||
}
|
||||
|
||||
bool
|
||||
Range::negativeZeroMul(const Range *lhs, const Range *rhs)
|
||||
{
|
||||
EnsureRange(&lhs);
|
||||
EnsureRange(&rhs);
|
||||
|
||||
// Both values are positive
|
||||
if (lhs->lower_ >= 0 && rhs->lower_ >= 0)
|
||||
return false;
|
||||
|
||||
// Both values are negative (non zero)
|
||||
if (lhs->upper_ < 0 && rhs->upper_ < 0)
|
||||
return false;
|
||||
|
||||
// One operand is positive (non zero)
|
||||
if (lhs->lower_ > 0 || rhs->lower_ > 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
Range::update(const Range *other)
|
||||
{
|
||||
@ -630,6 +651,8 @@ MMul::computeRange()
|
||||
Range *right = getOperand(1)->range();
|
||||
if (isPossibleTruncated())
|
||||
implicitTruncate_ = !Range::precisionLossMul(left, right);
|
||||
if (canBeNegativeZero())
|
||||
canBeNegativeZero_ = Range::negativeZeroMul(left, right);
|
||||
setRange(Range::mul(left, right));
|
||||
}
|
||||
|
||||
|
@ -183,6 +183,7 @@ class Range : public TempObject {
|
||||
static Range * shr(const Range *lhs, int32 c);
|
||||
|
||||
static bool precisionLossMul(const Range *lhs, const Range *rhs);
|
||||
static bool negativeZeroMul(const Range *lhs, const Range *rhs);
|
||||
|
||||
inline void makeLowerInfinite() {
|
||||
lower_infinite_ = true;
|
||||
|
@ -2462,15 +2462,25 @@ AutoFlushCache::update(uintptr_t newStart, size_t len)
|
||||
|
||||
AutoFlushCache::~AutoFlushCache()
|
||||
{
|
||||
if (!myCompartment_)
|
||||
if (!myCompartment_)
|
||||
return;
|
||||
|
||||
flushAnyway();
|
||||
IonSpewCont(IonSpew_CacheFlush, ">", name_);
|
||||
if (myCompartment_->flusher() == this) {
|
||||
IonSpewFin(IonSpew_CacheFlush);
|
||||
myCompartment_->setFlusher(NULL);
|
||||
}
|
||||
|
||||
}
|
||||
void
|
||||
AutoFlushCache::flushAnyway()
|
||||
{
|
||||
if (!myCompartment_)
|
||||
return;
|
||||
|
||||
IonSpewCont(IonSpew_CacheFlush, "|", name_);
|
||||
|
||||
if (!used_)
|
||||
return;
|
||||
|
||||
@ -2479,6 +2489,7 @@ AutoFlushCache::~AutoFlushCache()
|
||||
} else {
|
||||
JSC::ExecutableAllocator::cacheFlush(NULL, 0xff000000);
|
||||
}
|
||||
used_ = false;
|
||||
|
||||
}
|
||||
Assembler *Assembler::dummy = NULL;
|
||||
|
@ -68,7 +68,20 @@ MacroAssemblerARM::branchTruncateDouble(const FloatRegister &src, const Register
|
||||
void
|
||||
MacroAssemblerARM::inc64(AbsoluteAddress dest)
|
||||
{
|
||||
JS_NOT_REACHED("NYI");
|
||||
|
||||
ma_strd(r0, r1, EDtrAddr(sp, EDtrOffImm(-8)), PreIndex);
|
||||
|
||||
ma_mov(Imm32((int32)dest.addr), ScratchRegister);
|
||||
|
||||
ma_ldrd(EDtrAddr(ScratchRegister, EDtrOffImm(0)), r0, r1);
|
||||
|
||||
ma_add(Imm32(1), r0, SetCond);
|
||||
ma_adc(Imm32(0), r1, NoSetCond);
|
||||
|
||||
ma_strd(r0, r1, EDtrAddr(ScratchRegister, EDtrOffImm(0)));
|
||||
|
||||
ma_ldrd(EDtrAddr(sp, EDtrOffImm(8)), r0, r1, PostIndex);
|
||||
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -136,6 +136,11 @@ AutoFlushCache::update(uintptr_t newStart, size_t len)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
AutoFlushCache::flushAnyway()
|
||||
{
|
||||
}
|
||||
|
||||
AutoFlushCache::~AutoFlushCache()
|
||||
{
|
||||
if (!myCompartment_)
|
||||
|
@ -2541,6 +2541,8 @@ TypeCompartment::nukeTypes(FreeOp *fop)
|
||||
# endif
|
||||
}
|
||||
#endif /* JS_METHODJIT */
|
||||
|
||||
pendingNukeTypes = false;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -991,8 +991,9 @@ CompileStatus
|
||||
mjit::CanMethodJIT(JSContext *cx, JSScript *scriptArg, jsbytecode *pc,
|
||||
bool construct, CompileRequest request, StackFrame *frame)
|
||||
{
|
||||
bool compiledOnce = false;
|
||||
RootedScript script(cx, scriptArg);
|
||||
restart:
|
||||
checkOutput:
|
||||
if (!cx->methodJitEnabled)
|
||||
return Compile_Abort;
|
||||
|
||||
@ -1057,7 +1058,7 @@ mjit::CanMethodJIT(JSContext *cx, JSScript *scriptArg, jsbytecode *pc,
|
||||
FreeOp *fop = cx->runtime->defaultFreeOp();
|
||||
jit->destroy(fop);
|
||||
fop->free_(jit);
|
||||
goto restart;
|
||||
return Compile_Skipped;
|
||||
}
|
||||
|
||||
jith->setValid(jit);
|
||||
@ -1083,6 +1084,8 @@ mjit::CanMethodJIT(JSContext *cx, JSScript *scriptArg, jsbytecode *pc,
|
||||
|
||||
if (desc.chunk)
|
||||
return Compile_Okay;
|
||||
if (compiledOnce)
|
||||
return Compile_Skipped;
|
||||
|
||||
if (!cx->hasRunOption(JSOPTION_METHODJIT_ALWAYS) &&
|
||||
++desc.counter <= INFER_USES_BEFORE_COMPILE)
|
||||
@ -1110,7 +1113,8 @@ mjit::CanMethodJIT(JSContext *cx, JSScript *scriptArg, jsbytecode *pc,
|
||||
* Compiling a script can occasionally trigger its own recompilation,
|
||||
* so go back through the compilation logic.
|
||||
*/
|
||||
goto restart;
|
||||
compiledOnce = true;
|
||||
goto checkOutput;
|
||||
}
|
||||
|
||||
/* Non-OOM errors should have an associated exception. */
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "jscompartment.h"
|
||||
#include "jsscope.h"
|
||||
#include "ion/Ion.h"
|
||||
#include "ion/IonCode.h"
|
||||
#include "ion/IonCompartment.h"
|
||||
#include "methodjit/Retcon.h"
|
||||
|
||||
@ -1036,6 +1037,7 @@ mjit::EnterMethodJIT(JSContext *cx, StackFrame *fp, void *code, Value *stackLimi
|
||||
#ifdef JS_ION
|
||||
ion::IonContext ictx(cx, cx->compartment, NULL);
|
||||
ion::IonActivation activation(cx, NULL);
|
||||
ion::AutoFlushInhibitor afi(cx->compartment->ionCompartment());
|
||||
#endif
|
||||
|
||||
JSAutoResolveFlags rf(cx, RESOLVE_INFER);
|
||||
|
@ -24,10 +24,14 @@ var win = window.openDialog("data:text/html,<div style='height:200px; width:100p
|
||||
|
||||
function loaded() {
|
||||
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
|
||||
var disableWindowResizePref = "dom.disable_window_move_resize";
|
||||
var oldPrefValue = SpecialPowers.getBoolPref(disableWindowResizePref);
|
||||
SpecialPowers.setBoolPref(disableWindowResizePref, false);
|
||||
win.sizeToContent();
|
||||
ok(win.innerWidth >= 100, "innerWidth: " + win.innerWidth + " >= 100 ?");
|
||||
ok(win.innerHeight >= 200, "innerHeight: " + win.innerHeight + " >= 200 ?");
|
||||
win.close();
|
||||
SpecialPowers.setBoolPref(disableWindowResizePref, oldPrefValue);
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
|
@ -489,19 +489,12 @@ public:
|
||||
|
||||
virtual void RequestContentRepaint(const FrameMetrics& aFrameMetrics) MOZ_OVERRIDE
|
||||
{
|
||||
if (MessageLoop::current() != mUILoop) {
|
||||
// We have to send this message from the "UI thread" (main
|
||||
// thread).
|
||||
mUILoop->PostTask(
|
||||
FROM_HERE,
|
||||
NewRunnableMethod(this, &RemoteContentController::RequestContentRepaint,
|
||||
aFrameMetrics));
|
||||
return;
|
||||
}
|
||||
if (mRenderFrame) {
|
||||
TabParent* browser = static_cast<TabParent*>(mRenderFrame->Manager());
|
||||
browser->UpdateFrame(aFrameMetrics);
|
||||
}
|
||||
// We always need to post requests into the "UI thread" otherwise the
|
||||
// requests may get processed out of order.
|
||||
mUILoop->PostTask(
|
||||
FROM_HERE,
|
||||
NewRunnableMethod(this, &RemoteContentController::DoRequestContentRepaint,
|
||||
aFrameMetrics));
|
||||
}
|
||||
|
||||
virtual void HandleDoubleTap(const nsIntPoint& aPoint) MOZ_OVERRIDE
|
||||
@ -558,6 +551,14 @@ public:
|
||||
void ClearRenderFrame() { mRenderFrame = nullptr; }
|
||||
|
||||
private:
|
||||
void DoRequestContentRepaint(const FrameMetrics& aFrameMetrics)
|
||||
{
|
||||
if (mRenderFrame) {
|
||||
TabParent* browser = static_cast<TabParent*>(mRenderFrame->Manager());
|
||||
browser->UpdateFrame(aFrameMetrics);
|
||||
}
|
||||
}
|
||||
|
||||
MessageLoop* mUILoop;
|
||||
RenderFrameParent* mRenderFrame;
|
||||
};
|
||||
|
@ -487,7 +487,7 @@ nsStyleAnimation::ComputeDistance(nsCSSProperty aProperty,
|
||||
unit[1] = GetCommonUnit(aProperty, pair1->mYValue.GetUnit(),
|
||||
pair2->mYValue.GetUnit());
|
||||
if (unit[0] == eCSSUnit_Null || unit[1] == eCSSUnit_Null ||
|
||||
unit[0] == eCSSUnit_URL) {
|
||||
unit[0] == eCSSUnit_URL || unit[0] == eCSSUnit_Enumerated) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -1827,7 +1827,7 @@ nsStyleAnimation::AddWeighted(nsCSSProperty aProperty,
|
||||
unit[1] = GetCommonUnit(aProperty, pair1->mYValue.GetUnit(),
|
||||
pair2->mYValue.GetUnit());
|
||||
if (unit[0] == eCSSUnit_Null || unit[1] == eCSSUnit_Null ||
|
||||
unit[0] == eCSSUnit_URL) {
|
||||
unit[0] == eCSSUnit_URL || unit[0] == eCSSUnit_Enumerated) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -3125,6 +3125,17 @@ nsStyleAnimation::ExtractComputedValue(nsCSSProperty aProperty,
|
||||
eUnit_CSSValuePair);
|
||||
return true;
|
||||
}
|
||||
if (paint.mType == eStyleSVGPaintType_ObjectFill ||
|
||||
paint.mType == eStyleSVGPaintType_ObjectStroke) {
|
||||
nsAutoPtr<nsCSSValuePair> pair(new nsCSSValuePair);
|
||||
pair->mXValue.SetIntValue(paint.mType == eStyleSVGPaintType_ObjectFill ?
|
||||
NS_COLOR_OBJECTFILL : NS_COLOR_OBJECTSTROKE,
|
||||
eCSSUnit_Enumerated);
|
||||
pair->mYValue.SetColorValue(paint.mFallbackColor);
|
||||
aComputedValue.SetAndAdoptCSSValuePairValue(pair.forget(),
|
||||
eUnit_CSSValuePair);
|
||||
return true;
|
||||
}
|
||||
NS_ABORT_IF_FALSE(paint.mType == eStyleSVGPaintType_None,
|
||||
"Unexpected SVG paint type");
|
||||
aComputedValue.SetNoneValue();
|
||||
|
1
layout/svg/crashtests/789390-1.html
Normal file
1
layout/svg/crashtests/789390-1.html
Normal file
@ -0,0 +1 @@
|
||||
<html style="transition: 1s;"><body onload="document.documentElement.style.stroke = '-moz-objectStroke';"></body></html>
|
@ -144,3 +144,4 @@ load 782141-1.svg
|
||||
load 784061-1.svg
|
||||
load 790072.svg
|
||||
load 791826-1.svg
|
||||
load 789390-1.html
|
||||
|
@ -21,6 +21,21 @@ class runnable_args_base : public nsRunnable {
|
||||
};
|
||||
|
||||
|
||||
// The generated file contains four major function templates
|
||||
// (in variants for arbitrary numbers of arguments up to 10,
|
||||
// which is why it is machine generated). The four templates
|
||||
// are:
|
||||
//
|
||||
// WrapRunnable(o, m, ...) -- wraps a member function m of an object ptr o
|
||||
// WrapRunnableRet(o, m, ..., r) -- wraps a member function m of an object ptr o
|
||||
// the function returns something that can
|
||||
// be assigned to *r
|
||||
// WrapRunnableNM(f, ...) -- wraps a function f
|
||||
// WrapRunnableNMRet(f, ..., r) -- wraps a function f that returns something
|
||||
// that can be assigned to *r
|
||||
//
|
||||
// All of these template functions return a Runnable* which can be passed
|
||||
// to Dispatch().
|
||||
#include "runnable_utils_generated.h"
|
||||
|
||||
// Temporary hack. Really we want to have a template which will do this
|
||||
|
@ -1,13 +1,28 @@
|
||||
# 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/.
|
||||
MAX_ARGS = 10
|
||||
|
||||
def gen_args_type(args):
|
||||
ret = ["C o", "M m"]
|
||||
boilerplate = "/* This Source Code Form is subject to the terms of the Mozilla Public\n\
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this\n\
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n"
|
||||
|
||||
def gen_args_type(args, member):
|
||||
if member:
|
||||
ret = ["C o"]
|
||||
else:
|
||||
ret = []
|
||||
ret.append("M m")
|
||||
for arg in range(0, args):
|
||||
ret.append("A%d a%d"%(arg, arg))
|
||||
return ", ".join(ret)
|
||||
|
||||
def gen_args(args):
|
||||
ret = ["o", "m"]
|
||||
def gen_args(args, member):
|
||||
if member:
|
||||
ret = ["o"]
|
||||
else:
|
||||
ret = []
|
||||
ret.append("m")
|
||||
for arg in range(0, args):
|
||||
ret.append("a%d"%(arg))
|
||||
return ", ".join(ret)
|
||||
@ -18,8 +33,13 @@ def gen_args_(args):
|
||||
ret.append("a%d_"%(arg))
|
||||
return ", ".join(ret)
|
||||
|
||||
def gen_init(args, r = False):
|
||||
ret = ["o_(o)", "m_(m)"]
|
||||
def gen_init(args, r = False, member = False):
|
||||
if member:
|
||||
ret = ["o_(o)"]
|
||||
else:
|
||||
ret = []
|
||||
ret.append("m_(m)")
|
||||
|
||||
if r:
|
||||
ret.append("r_(r)")
|
||||
|
||||
@ -27,45 +47,65 @@ def gen_init(args, r = False):
|
||||
ret.append("a%d_(a%d)"%(arg, arg))
|
||||
return ", ".join(ret)
|
||||
|
||||
def gen_typenames(args):
|
||||
ret = ["typename C", "typename M"]
|
||||
def gen_typenames(args, member):
|
||||
if member:
|
||||
ret = ["typename C"]
|
||||
else:
|
||||
ret = []
|
||||
ret.append("typename M")
|
||||
|
||||
for arg in range(0, args):
|
||||
ret.append("typename A%d"%(arg))
|
||||
return ", ".join(ret)
|
||||
|
||||
def gen_types(args):
|
||||
ret = ["C", "M"]
|
||||
def gen_types(args, member):
|
||||
if member:
|
||||
ret = ["C"]
|
||||
else:
|
||||
ret = []
|
||||
ret.append("M")
|
||||
for arg in range(0, args):
|
||||
ret.append("A%d"%(arg))
|
||||
return ", ".join(ret)
|
||||
|
||||
|
||||
def generate_class_template(args, ret = False):
|
||||
def generate_class_template(args, ret = False, member = True):
|
||||
print "// %d arguments --"%args
|
||||
if not ret:
|
||||
print "template<"+ gen_typenames(args) + "> class runnable_args%d : public runnable_args_base {"%args
|
||||
if member:
|
||||
nm = "m"
|
||||
else:
|
||||
print "template<"+ gen_typenames(args) + ", typename R> class runnable_args%d_ret : public runnable_args_base {"%args
|
||||
nm = "nm"
|
||||
|
||||
if not ret:
|
||||
print "template<"+ gen_typenames(args, member) + "> class runnable_args_%s_%d : public runnable_args_base {"%(nm, args)
|
||||
else:
|
||||
print "template<"+ gen_typenames(args, member) + ", typename R> class runnable_args_%s_%d_ret : public runnable_args_base {"%(nm, args)
|
||||
|
||||
print " public:"
|
||||
|
||||
if not ret:
|
||||
print " runnable_args%d("%args + gen_args_type(args) + ") :"
|
||||
print " " + gen_init(args) + " {}"
|
||||
print " runnable_args_%s_%d("%(nm, args) + gen_args_type(args, member) + ") :"
|
||||
print " " + gen_init(args, False, member) + " {}"
|
||||
else:
|
||||
print " runnable_args%d_ret("%args + gen_args_type(args) + ", R *r) :"
|
||||
print " " + gen_init(args, True) + " {}"
|
||||
print " runnable_args_%s_%d_ret("%(nm, args) + gen_args_type(args, member) + ", R *r) :"
|
||||
print " " + gen_init(args, True, member) + " {}"
|
||||
print
|
||||
print " NS_IMETHOD Run() {"
|
||||
if not ret:
|
||||
print " ((*o_).*m_)(" + gen_args_(args) + ");"
|
||||
if ret:
|
||||
print " *r_ =",
|
||||
else:
|
||||
print " *r_ = ((*o_).*m_)(" + gen_args_(args) + ");"
|
||||
print " ",
|
||||
if member:
|
||||
print "((*o_).*m_)(" + gen_args_(args) + ");"
|
||||
else:
|
||||
print "m_(" + gen_args_(args) + ");"
|
||||
|
||||
print " return NS_OK;"
|
||||
print " }"
|
||||
print
|
||||
print " private:"
|
||||
print " C o_;"
|
||||
if member:
|
||||
print " C o_;"
|
||||
print " M m_;"
|
||||
if ret:
|
||||
print " R* r_;"
|
||||
@ -76,36 +116,57 @@ def generate_class_template(args, ret = False):
|
||||
print
|
||||
print
|
||||
|
||||
def generate_function_template(args):
|
||||
def generate_function_template(args, member):
|
||||
if member:
|
||||
nm = "m"
|
||||
NM = "";
|
||||
else:
|
||||
nm = "nm"
|
||||
NM = "NM";
|
||||
|
||||
print "// %d arguments --"%args
|
||||
print "template<" + gen_typenames(args) + ">"
|
||||
print "runnable_args%d<"%args + gen_types(args) + ">* WrapRunnable(" + gen_args_type(args) + ") {"
|
||||
print " return new runnable_args%d<"%args + gen_types(args) + ">"
|
||||
print " (" + gen_args(args) + ");"
|
||||
print "template<" + gen_typenames(args, member) + ">"
|
||||
print "runnable_args_%s_%d<"%(nm, args) + gen_types(args, member) + ">* WrapRunnable%s("%NM + gen_args_type(args, member) + ") {"
|
||||
print " return new runnable_args_%s_%d<"%(nm, args) + gen_types(args, member) + ">"
|
||||
print " (" + gen_args(args, member) + ");"
|
||||
print "}"
|
||||
print
|
||||
|
||||
def generate_function_template_ret(args):
|
||||
def generate_function_template_ret(args, member):
|
||||
if member:
|
||||
nm = "m"
|
||||
NM = "";
|
||||
else:
|
||||
nm = "nm"
|
||||
NM = "NM";
|
||||
print "// %d arguments --"%args
|
||||
print "template<" + gen_typenames(args) + ", typename R>"
|
||||
print "runnable_args%d_ret<"%args + gen_types(args) + ", R>* WrapRunnableRet(" + gen_args_type(args) + ", R* r) {"
|
||||
print " return new runnable_args%d_ret<"%args + gen_types(args) + ", R>"
|
||||
print " (" + gen_args(args) + ", r);"
|
||||
print "template<" + gen_typenames(args, member) + ", typename R>"
|
||||
print "runnable_args_%s_%d_ret<"%(nm, args) + gen_types(args, member) + ", R>* WrapRunnable%sRet("%NM + gen_args_type(args, member) + ", R* r) {"
|
||||
print " return new runnable_args_%s_%d_ret<"%(nm, args) + gen_types(args, member) + ", R>"
|
||||
print " (" + gen_args(args, member) + ", r);"
|
||||
print "}"
|
||||
print
|
||||
|
||||
|
||||
print boilerplate
|
||||
print
|
||||
|
||||
for num_args in range (0, MAX_ARGS):
|
||||
generate_class_template(num_args)
|
||||
generate_class_template(num_args, True)
|
||||
generate_class_template(num_args, False, False)
|
||||
generate_class_template(num_args, True, False)
|
||||
generate_class_template(num_args, False, True)
|
||||
generate_class_template(num_args, True, True)
|
||||
|
||||
|
||||
print
|
||||
print
|
||||
print
|
||||
|
||||
for num_args in range(0, MAX_ARGS):
|
||||
generate_function_template(num_args)
|
||||
generate_function_template_ret(num_args)
|
||||
|
||||
generate_function_template(num_args, False)
|
||||
generate_function_template_ret(num_args, False)
|
||||
generate_function_template(num_args, True)
|
||||
generate_function_template_ret(num_args, True)
|
||||
|
||||
|
||||
|
||||
|
@ -1,12 +1,47 @@
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* 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/. */
|
||||
* 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/. */
|
||||
|
||||
|
||||
// 0 arguments --
|
||||
template<typename C, typename M> class runnable_args0 : public runnable_args_base {
|
||||
template<typename M> class runnable_args_nm_0 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args0(C o, M m) :
|
||||
runnable_args_nm_0(M m) :
|
||||
m_(m) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
m_();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 0 arguments --
|
||||
template<typename M, typename R> class runnable_args_nm_0_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_nm_0_ret(M m, R *r) :
|
||||
m_(m), r_(r) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
*r_ = m_();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
R* r_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 0 arguments --
|
||||
template<typename C, typename M> class runnable_args_m_0 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_m_0(C o, M m) :
|
||||
o_(o), m_(m) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -22,9 +57,9 @@ template<typename C, typename M> class runnable_args0 : public runnable_args_bas
|
||||
|
||||
|
||||
// 0 arguments --
|
||||
template<typename C, typename M, typename R> class runnable_args0_ret : public runnable_args_base {
|
||||
template<typename C, typename M, typename R> class runnable_args_m_0_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args0_ret(C o, M m, R *r) :
|
||||
runnable_args_m_0_ret(C o, M m, R *r) :
|
||||
o_(o), m_(m), r_(r) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -41,9 +76,46 @@ template<typename C, typename M, typename R> class runnable_args0_ret : public r
|
||||
|
||||
|
||||
// 1 arguments --
|
||||
template<typename C, typename M, typename A0> class runnable_args1 : public runnable_args_base {
|
||||
template<typename M, typename A0> class runnable_args_nm_1 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args1(C o, M m, A0 a0) :
|
||||
runnable_args_nm_1(M m, A0 a0) :
|
||||
m_(m), a0_(a0) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
m_(a0_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
A0 a0_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 1 arguments --
|
||||
template<typename M, typename A0, typename R> class runnable_args_nm_1_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_nm_1_ret(M m, A0 a0, R *r) :
|
||||
m_(m), r_(r), a0_(a0) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
*r_ = m_(a0_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
R* r_;
|
||||
A0 a0_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 1 arguments --
|
||||
template<typename C, typename M, typename A0> class runnable_args_m_1 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_m_1(C o, M m, A0 a0) :
|
||||
o_(o), m_(m), a0_(a0) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -60,9 +132,9 @@ template<typename C, typename M, typename A0> class runnable_args1 : public runn
|
||||
|
||||
|
||||
// 1 arguments --
|
||||
template<typename C, typename M, typename A0, typename R> class runnable_args1_ret : public runnable_args_base {
|
||||
template<typename C, typename M, typename A0, typename R> class runnable_args_m_1_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args1_ret(C o, M m, A0 a0, R *r) :
|
||||
runnable_args_m_1_ret(C o, M m, A0 a0, R *r) :
|
||||
o_(o), m_(m), r_(r), a0_(a0) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -80,9 +152,48 @@ template<typename C, typename M, typename A0, typename R> class runnable_args1_r
|
||||
|
||||
|
||||
// 2 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1> class runnable_args2 : public runnable_args_base {
|
||||
template<typename M, typename A0, typename A1> class runnable_args_nm_2 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args2(C o, M m, A0 a0, A1 a1) :
|
||||
runnable_args_nm_2(M m, A0 a0, A1 a1) :
|
||||
m_(m), a0_(a0), a1_(a1) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
m_(a0_, a1_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
A0 a0_;
|
||||
A1 a1_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 2 arguments --
|
||||
template<typename M, typename A0, typename A1, typename R> class runnable_args_nm_2_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_nm_2_ret(M m, A0 a0, A1 a1, R *r) :
|
||||
m_(m), r_(r), a0_(a0), a1_(a1) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
*r_ = m_(a0_, a1_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
R* r_;
|
||||
A0 a0_;
|
||||
A1 a1_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 2 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1> class runnable_args_m_2 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_m_2(C o, M m, A0 a0, A1 a1) :
|
||||
o_(o), m_(m), a0_(a0), a1_(a1) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -100,9 +211,9 @@ template<typename C, typename M, typename A0, typename A1> class runnable_args2
|
||||
|
||||
|
||||
// 2 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename R> class runnable_args2_ret : public runnable_args_base {
|
||||
template<typename C, typename M, typename A0, typename A1, typename R> class runnable_args_m_2_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args2_ret(C o, M m, A0 a0, A1 a1, R *r) :
|
||||
runnable_args_m_2_ret(C o, M m, A0 a0, A1 a1, R *r) :
|
||||
o_(o), m_(m), r_(r), a0_(a0), a1_(a1) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -121,9 +232,50 @@ template<typename C, typename M, typename A0, typename A1, typename R> class run
|
||||
|
||||
|
||||
// 3 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2> class runnable_args3 : public runnable_args_base {
|
||||
template<typename M, typename A0, typename A1, typename A2> class runnable_args_nm_3 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args3(C o, M m, A0 a0, A1 a1, A2 a2) :
|
||||
runnable_args_nm_3(M m, A0 a0, A1 a1, A2 a2) :
|
||||
m_(m), a0_(a0), a1_(a1), a2_(a2) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
m_(a0_, a1_, a2_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
A0 a0_;
|
||||
A1 a1_;
|
||||
A2 a2_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 3 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename R> class runnable_args_nm_3_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_nm_3_ret(M m, A0 a0, A1 a1, A2 a2, R *r) :
|
||||
m_(m), r_(r), a0_(a0), a1_(a1), a2_(a2) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
*r_ = m_(a0_, a1_, a2_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
R* r_;
|
||||
A0 a0_;
|
||||
A1 a1_;
|
||||
A2 a2_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 3 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2> class runnable_args_m_3 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_m_3(C o, M m, A0 a0, A1 a1, A2 a2) :
|
||||
o_(o), m_(m), a0_(a0), a1_(a1), a2_(a2) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -142,9 +294,9 @@ template<typename C, typename M, typename A0, typename A1, typename A2> class ru
|
||||
|
||||
|
||||
// 3 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename R> class runnable_args3_ret : public runnable_args_base {
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename R> class runnable_args_m_3_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args3_ret(C o, M m, A0 a0, A1 a1, A2 a2, R *r) :
|
||||
runnable_args_m_3_ret(C o, M m, A0 a0, A1 a1, A2 a2, R *r) :
|
||||
o_(o), m_(m), r_(r), a0_(a0), a1_(a1), a2_(a2) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -164,9 +316,52 @@ template<typename C, typename M, typename A0, typename A1, typename A2, typename
|
||||
|
||||
|
||||
// 4 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3> class runnable_args4 : public runnable_args_base {
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3> class runnable_args_nm_4 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args4(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3) :
|
||||
runnable_args_nm_4(M m, A0 a0, A1 a1, A2 a2, A3 a3) :
|
||||
m_(m), a0_(a0), a1_(a1), a2_(a2), a3_(a3) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
m_(a0_, a1_, a2_, a3_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
A0 a0_;
|
||||
A1 a1_;
|
||||
A2 a2_;
|
||||
A3 a3_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 4 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename R> class runnable_args_nm_4_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_nm_4_ret(M m, A0 a0, A1 a1, A2 a2, A3 a3, R *r) :
|
||||
m_(m), r_(r), a0_(a0), a1_(a1), a2_(a2), a3_(a3) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
*r_ = m_(a0_, a1_, a2_, a3_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
R* r_;
|
||||
A0 a0_;
|
||||
A1 a1_;
|
||||
A2 a2_;
|
||||
A3 a3_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 4 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3> class runnable_args_m_4 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_m_4(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3) :
|
||||
o_(o), m_(m), a0_(a0), a1_(a1), a2_(a2), a3_(a3) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -186,9 +381,9 @@ template<typename C, typename M, typename A0, typename A1, typename A2, typename
|
||||
|
||||
|
||||
// 4 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename R> class runnable_args4_ret : public runnable_args_base {
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename R> class runnable_args_m_4_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args4_ret(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, R *r) :
|
||||
runnable_args_m_4_ret(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, R *r) :
|
||||
o_(o), m_(m), r_(r), a0_(a0), a1_(a1), a2_(a2), a3_(a3) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -209,9 +404,54 @@ template<typename C, typename M, typename A0, typename A1, typename A2, typename
|
||||
|
||||
|
||||
// 5 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4> class runnable_args5 : public runnable_args_base {
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4> class runnable_args_nm_5 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args5(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) :
|
||||
runnable_args_nm_5(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) :
|
||||
m_(m), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
m_(a0_, a1_, a2_, a3_, a4_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
A0 a0_;
|
||||
A1 a1_;
|
||||
A2 a2_;
|
||||
A3 a3_;
|
||||
A4 a4_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 5 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename R> class runnable_args_nm_5_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_nm_5_ret(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, R *r) :
|
||||
m_(m), r_(r), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
*r_ = m_(a0_, a1_, a2_, a3_, a4_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
R* r_;
|
||||
A0 a0_;
|
||||
A1 a1_;
|
||||
A2 a2_;
|
||||
A3 a3_;
|
||||
A4 a4_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 5 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4> class runnable_args_m_5 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_m_5(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) :
|
||||
o_(o), m_(m), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -232,9 +472,9 @@ template<typename C, typename M, typename A0, typename A1, typename A2, typename
|
||||
|
||||
|
||||
// 5 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename R> class runnable_args5_ret : public runnable_args_base {
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename R> class runnable_args_m_5_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args5_ret(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, R *r) :
|
||||
runnable_args_m_5_ret(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, R *r) :
|
||||
o_(o), m_(m), r_(r), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -256,9 +496,56 @@ template<typename C, typename M, typename A0, typename A1, typename A2, typename
|
||||
|
||||
|
||||
// 6 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5> class runnable_args6 : public runnable_args_base {
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5> class runnable_args_nm_6 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args6(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) :
|
||||
runnable_args_nm_6(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) :
|
||||
m_(m), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
m_(a0_, a1_, a2_, a3_, a4_, a5_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
A0 a0_;
|
||||
A1 a1_;
|
||||
A2 a2_;
|
||||
A3 a3_;
|
||||
A4 a4_;
|
||||
A5 a5_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 6 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename R> class runnable_args_nm_6_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_nm_6_ret(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, R *r) :
|
||||
m_(m), r_(r), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
*r_ = m_(a0_, a1_, a2_, a3_, a4_, a5_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
R* r_;
|
||||
A0 a0_;
|
||||
A1 a1_;
|
||||
A2 a2_;
|
||||
A3 a3_;
|
||||
A4 a4_;
|
||||
A5 a5_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 6 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5> class runnable_args_m_6 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_m_6(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) :
|
||||
o_(o), m_(m), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -280,9 +567,9 @@ template<typename C, typename M, typename A0, typename A1, typename A2, typename
|
||||
|
||||
|
||||
// 6 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename R> class runnable_args6_ret : public runnable_args_base {
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename R> class runnable_args_m_6_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args6_ret(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, R *r) :
|
||||
runnable_args_m_6_ret(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, R *r) :
|
||||
o_(o), m_(m), r_(r), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -305,9 +592,58 @@ template<typename C, typename M, typename A0, typename A1, typename A2, typename
|
||||
|
||||
|
||||
// 7 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6> class runnable_args7 : public runnable_args_base {
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6> class runnable_args_nm_7 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args7(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) :
|
||||
runnable_args_nm_7(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) :
|
||||
m_(m), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5), a6_(a6) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
m_(a0_, a1_, a2_, a3_, a4_, a5_, a6_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
A0 a0_;
|
||||
A1 a1_;
|
||||
A2 a2_;
|
||||
A3 a3_;
|
||||
A4 a4_;
|
||||
A5 a5_;
|
||||
A6 a6_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 7 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename R> class runnable_args_nm_7_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_nm_7_ret(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, R *r) :
|
||||
m_(m), r_(r), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5), a6_(a6) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
*r_ = m_(a0_, a1_, a2_, a3_, a4_, a5_, a6_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
R* r_;
|
||||
A0 a0_;
|
||||
A1 a1_;
|
||||
A2 a2_;
|
||||
A3 a3_;
|
||||
A4 a4_;
|
||||
A5 a5_;
|
||||
A6 a6_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 7 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6> class runnable_args_m_7 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_m_7(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) :
|
||||
o_(o), m_(m), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5), a6_(a6) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -330,9 +666,9 @@ template<typename C, typename M, typename A0, typename A1, typename A2, typename
|
||||
|
||||
|
||||
// 7 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename R> class runnable_args7_ret : public runnable_args_base {
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename R> class runnable_args_m_7_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args7_ret(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, R *r) :
|
||||
runnable_args_m_7_ret(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, R *r) :
|
||||
o_(o), m_(m), r_(r), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5), a6_(a6) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -356,9 +692,60 @@ template<typename C, typename M, typename A0, typename A1, typename A2, typename
|
||||
|
||||
|
||||
// 8 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7> class runnable_args8 : public runnable_args_base {
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7> class runnable_args_nm_8 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args8(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) :
|
||||
runnable_args_nm_8(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) :
|
||||
m_(m), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5), a6_(a6), a7_(a7) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
m_(a0_, a1_, a2_, a3_, a4_, a5_, a6_, a7_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
A0 a0_;
|
||||
A1 a1_;
|
||||
A2 a2_;
|
||||
A3 a3_;
|
||||
A4 a4_;
|
||||
A5 a5_;
|
||||
A6 a6_;
|
||||
A7 a7_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 8 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename R> class runnable_args_nm_8_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_nm_8_ret(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, R *r) :
|
||||
m_(m), r_(r), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5), a6_(a6), a7_(a7) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
*r_ = m_(a0_, a1_, a2_, a3_, a4_, a5_, a6_, a7_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
R* r_;
|
||||
A0 a0_;
|
||||
A1 a1_;
|
||||
A2 a2_;
|
||||
A3 a3_;
|
||||
A4 a4_;
|
||||
A5 a5_;
|
||||
A6 a6_;
|
||||
A7 a7_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 8 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7> class runnable_args_m_8 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_m_8(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) :
|
||||
o_(o), m_(m), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5), a6_(a6), a7_(a7) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -382,9 +769,9 @@ template<typename C, typename M, typename A0, typename A1, typename A2, typename
|
||||
|
||||
|
||||
// 8 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename R> class runnable_args8_ret : public runnable_args_base {
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename R> class runnable_args_m_8_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args8_ret(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, R *r) :
|
||||
runnable_args_m_8_ret(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, R *r) :
|
||||
o_(o), m_(m), r_(r), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5), a6_(a6), a7_(a7) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -409,9 +796,62 @@ template<typename C, typename M, typename A0, typename A1, typename A2, typename
|
||||
|
||||
|
||||
// 9 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8> class runnable_args9 : public runnable_args_base {
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8> class runnable_args_nm_9 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args9(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) :
|
||||
runnable_args_nm_9(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) :
|
||||
m_(m), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5), a6_(a6), a7_(a7), a8_(a8) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
m_(a0_, a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
A0 a0_;
|
||||
A1 a1_;
|
||||
A2 a2_;
|
||||
A3 a3_;
|
||||
A4 a4_;
|
||||
A5 a5_;
|
||||
A6 a6_;
|
||||
A7 a7_;
|
||||
A8 a8_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 9 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename R> class runnable_args_nm_9_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_nm_9_ret(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, R *r) :
|
||||
m_(m), r_(r), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5), a6_(a6), a7_(a7), a8_(a8) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
*r_ = m_(a0_, a1_, a2_, a3_, a4_, a5_, a6_, a7_, a8_);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
private:
|
||||
M m_;
|
||||
R* r_;
|
||||
A0 a0_;
|
||||
A1 a1_;
|
||||
A2 a2_;
|
||||
A3 a3_;
|
||||
A4 a4_;
|
||||
A5 a5_;
|
||||
A6 a6_;
|
||||
A7 a7_;
|
||||
A8 a8_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 9 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8> class runnable_args_m_9 : public runnable_args_base {
|
||||
public:
|
||||
runnable_args_m_9(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) :
|
||||
o_(o), m_(m), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5), a6_(a6), a7_(a7), a8_(a8) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -436,9 +876,9 @@ template<typename C, typename M, typename A0, typename A1, typename A2, typename
|
||||
|
||||
|
||||
// 9 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename R> class runnable_args9_ret : public runnable_args_base {
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename R> class runnable_args_m_9_ret : public runnable_args_base {
|
||||
public:
|
||||
runnable_args9_ret(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, R *r) :
|
||||
runnable_args_m_9_ret(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, R *r) :
|
||||
o_(o), m_(m), r_(r), a0_(a0), a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5), a6_(a6), a7_(a7), a8_(a8) {}
|
||||
|
||||
NS_IMETHOD Run() {
|
||||
@ -466,143 +906,283 @@ template<typename C, typename M, typename A0, typename A1, typename A2, typename
|
||||
|
||||
|
||||
|
||||
// 0 arguments --
|
||||
template<typename M>
|
||||
runnable_args_nm_0<M>* WrapRunnableNM(M m) {
|
||||
return new runnable_args_nm_0<M>
|
||||
(m);
|
||||
}
|
||||
|
||||
// 0 arguments --
|
||||
template<typename M, typename R>
|
||||
runnable_args_nm_0_ret<M, R>* WrapRunnableNMRet(M m, R* r) {
|
||||
return new runnable_args_nm_0_ret<M, R>
|
||||
(m, r);
|
||||
}
|
||||
|
||||
// 0 arguments --
|
||||
template<typename C, typename M>
|
||||
runnable_args0<C, M>* WrapRunnable(C o, M m) {
|
||||
return new runnable_args0<C, M>
|
||||
runnable_args_m_0<C, M>* WrapRunnable(C o, M m) {
|
||||
return new runnable_args_m_0<C, M>
|
||||
(o, m);
|
||||
}
|
||||
|
||||
// 0 arguments --
|
||||
template<typename C, typename M, typename R>
|
||||
runnable_args0_ret<C, M, R>* WrapRunnableRet(C o, M m, R* r) {
|
||||
return new runnable_args0_ret<C, M, R>
|
||||
runnable_args_m_0_ret<C, M, R>* WrapRunnableRet(C o, M m, R* r) {
|
||||
return new runnable_args_m_0_ret<C, M, R>
|
||||
(o, m, r);
|
||||
}
|
||||
|
||||
// 1 arguments --
|
||||
template<typename M, typename A0>
|
||||
runnable_args_nm_1<M, A0>* WrapRunnableNM(M m, A0 a0) {
|
||||
return new runnable_args_nm_1<M, A0>
|
||||
(m, a0);
|
||||
}
|
||||
|
||||
// 1 arguments --
|
||||
template<typename M, typename A0, typename R>
|
||||
runnable_args_nm_1_ret<M, A0, R>* WrapRunnableNMRet(M m, A0 a0, R* r) {
|
||||
return new runnable_args_nm_1_ret<M, A0, R>
|
||||
(m, a0, r);
|
||||
}
|
||||
|
||||
// 1 arguments --
|
||||
template<typename C, typename M, typename A0>
|
||||
runnable_args1<C, M, A0>* WrapRunnable(C o, M m, A0 a0) {
|
||||
return new runnable_args1<C, M, A0>
|
||||
runnable_args_m_1<C, M, A0>* WrapRunnable(C o, M m, A0 a0) {
|
||||
return new runnable_args_m_1<C, M, A0>
|
||||
(o, m, a0);
|
||||
}
|
||||
|
||||
// 1 arguments --
|
||||
template<typename C, typename M, typename A0, typename R>
|
||||
runnable_args1_ret<C, M, A0, R>* WrapRunnableRet(C o, M m, A0 a0, R* r) {
|
||||
return new runnable_args1_ret<C, M, A0, R>
|
||||
runnable_args_m_1_ret<C, M, A0, R>* WrapRunnableRet(C o, M m, A0 a0, R* r) {
|
||||
return new runnable_args_m_1_ret<C, M, A0, R>
|
||||
(o, m, a0, r);
|
||||
}
|
||||
|
||||
// 2 arguments --
|
||||
template<typename M, typename A0, typename A1>
|
||||
runnable_args_nm_2<M, A0, A1>* WrapRunnableNM(M m, A0 a0, A1 a1) {
|
||||
return new runnable_args_nm_2<M, A0, A1>
|
||||
(m, a0, a1);
|
||||
}
|
||||
|
||||
// 2 arguments --
|
||||
template<typename M, typename A0, typename A1, typename R>
|
||||
runnable_args_nm_2_ret<M, A0, A1, R>* WrapRunnableNMRet(M m, A0 a0, A1 a1, R* r) {
|
||||
return new runnable_args_nm_2_ret<M, A0, A1, R>
|
||||
(m, a0, a1, r);
|
||||
}
|
||||
|
||||
// 2 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1>
|
||||
runnable_args2<C, M, A0, A1>* WrapRunnable(C o, M m, A0 a0, A1 a1) {
|
||||
return new runnable_args2<C, M, A0, A1>
|
||||
runnable_args_m_2<C, M, A0, A1>* WrapRunnable(C o, M m, A0 a0, A1 a1) {
|
||||
return new runnable_args_m_2<C, M, A0, A1>
|
||||
(o, m, a0, a1);
|
||||
}
|
||||
|
||||
// 2 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename R>
|
||||
runnable_args2_ret<C, M, A0, A1, R>* WrapRunnableRet(C o, M m, A0 a0, A1 a1, R* r) {
|
||||
return new runnable_args2_ret<C, M, A0, A1, R>
|
||||
runnable_args_m_2_ret<C, M, A0, A1, R>* WrapRunnableRet(C o, M m, A0 a0, A1 a1, R* r) {
|
||||
return new runnable_args_m_2_ret<C, M, A0, A1, R>
|
||||
(o, m, a0, a1, r);
|
||||
}
|
||||
|
||||
// 3 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2>
|
||||
runnable_args_nm_3<M, A0, A1, A2>* WrapRunnableNM(M m, A0 a0, A1 a1, A2 a2) {
|
||||
return new runnable_args_nm_3<M, A0, A1, A2>
|
||||
(m, a0, a1, a2);
|
||||
}
|
||||
|
||||
// 3 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename R>
|
||||
runnable_args_nm_3_ret<M, A0, A1, A2, R>* WrapRunnableNMRet(M m, A0 a0, A1 a1, A2 a2, R* r) {
|
||||
return new runnable_args_nm_3_ret<M, A0, A1, A2, R>
|
||||
(m, a0, a1, a2, r);
|
||||
}
|
||||
|
||||
// 3 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2>
|
||||
runnable_args3<C, M, A0, A1, A2>* WrapRunnable(C o, M m, A0 a0, A1 a1, A2 a2) {
|
||||
return new runnable_args3<C, M, A0, A1, A2>
|
||||
runnable_args_m_3<C, M, A0, A1, A2>* WrapRunnable(C o, M m, A0 a0, A1 a1, A2 a2) {
|
||||
return new runnable_args_m_3<C, M, A0, A1, A2>
|
||||
(o, m, a0, a1, a2);
|
||||
}
|
||||
|
||||
// 3 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename R>
|
||||
runnable_args3_ret<C, M, A0, A1, A2, R>* WrapRunnableRet(C o, M m, A0 a0, A1 a1, A2 a2, R* r) {
|
||||
return new runnable_args3_ret<C, M, A0, A1, A2, R>
|
||||
runnable_args_m_3_ret<C, M, A0, A1, A2, R>* WrapRunnableRet(C o, M m, A0 a0, A1 a1, A2 a2, R* r) {
|
||||
return new runnable_args_m_3_ret<C, M, A0, A1, A2, R>
|
||||
(o, m, a0, a1, a2, r);
|
||||
}
|
||||
|
||||
// 4 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3>
|
||||
runnable_args_nm_4<M, A0, A1, A2, A3>* WrapRunnableNM(M m, A0 a0, A1 a1, A2 a2, A3 a3) {
|
||||
return new runnable_args_nm_4<M, A0, A1, A2, A3>
|
||||
(m, a0, a1, a2, a3);
|
||||
}
|
||||
|
||||
// 4 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename R>
|
||||
runnable_args_nm_4_ret<M, A0, A1, A2, A3, R>* WrapRunnableNMRet(M m, A0 a0, A1 a1, A2 a2, A3 a3, R* r) {
|
||||
return new runnable_args_nm_4_ret<M, A0, A1, A2, A3, R>
|
||||
(m, a0, a1, a2, a3, r);
|
||||
}
|
||||
|
||||
// 4 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3>
|
||||
runnable_args4<C, M, A0, A1, A2, A3>* WrapRunnable(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3) {
|
||||
return new runnable_args4<C, M, A0, A1, A2, A3>
|
||||
runnable_args_m_4<C, M, A0, A1, A2, A3>* WrapRunnable(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3) {
|
||||
return new runnable_args_m_4<C, M, A0, A1, A2, A3>
|
||||
(o, m, a0, a1, a2, a3);
|
||||
}
|
||||
|
||||
// 4 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename R>
|
||||
runnable_args4_ret<C, M, A0, A1, A2, A3, R>* WrapRunnableRet(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, R* r) {
|
||||
return new runnable_args4_ret<C, M, A0, A1, A2, A3, R>
|
||||
runnable_args_m_4_ret<C, M, A0, A1, A2, A3, R>* WrapRunnableRet(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, R* r) {
|
||||
return new runnable_args_m_4_ret<C, M, A0, A1, A2, A3, R>
|
||||
(o, m, a0, a1, a2, a3, r);
|
||||
}
|
||||
|
||||
// 5 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4>
|
||||
runnable_args_nm_5<M, A0, A1, A2, A3, A4>* WrapRunnableNM(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
|
||||
return new runnable_args_nm_5<M, A0, A1, A2, A3, A4>
|
||||
(m, a0, a1, a2, a3, a4);
|
||||
}
|
||||
|
||||
// 5 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename R>
|
||||
runnable_args_nm_5_ret<M, A0, A1, A2, A3, A4, R>* WrapRunnableNMRet(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, R* r) {
|
||||
return new runnable_args_nm_5_ret<M, A0, A1, A2, A3, A4, R>
|
||||
(m, a0, a1, a2, a3, a4, r);
|
||||
}
|
||||
|
||||
// 5 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4>
|
||||
runnable_args5<C, M, A0, A1, A2, A3, A4>* WrapRunnable(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
|
||||
return new runnable_args5<C, M, A0, A1, A2, A3, A4>
|
||||
runnable_args_m_5<C, M, A0, A1, A2, A3, A4>* WrapRunnable(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
|
||||
return new runnable_args_m_5<C, M, A0, A1, A2, A3, A4>
|
||||
(o, m, a0, a1, a2, a3, a4);
|
||||
}
|
||||
|
||||
// 5 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename R>
|
||||
runnable_args5_ret<C, M, A0, A1, A2, A3, A4, R>* WrapRunnableRet(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, R* r) {
|
||||
return new runnable_args5_ret<C, M, A0, A1, A2, A3, A4, R>
|
||||
runnable_args_m_5_ret<C, M, A0, A1, A2, A3, A4, R>* WrapRunnableRet(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, R* r) {
|
||||
return new runnable_args_m_5_ret<C, M, A0, A1, A2, A3, A4, R>
|
||||
(o, m, a0, a1, a2, a3, a4, r);
|
||||
}
|
||||
|
||||
// 6 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
|
||||
runnable_args_nm_6<M, A0, A1, A2, A3, A4, A5>* WrapRunnableNM(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
|
||||
return new runnable_args_nm_6<M, A0, A1, A2, A3, A4, A5>
|
||||
(m, a0, a1, a2, a3, a4, a5);
|
||||
}
|
||||
|
||||
// 6 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename R>
|
||||
runnable_args_nm_6_ret<M, A0, A1, A2, A3, A4, A5, R>* WrapRunnableNMRet(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, R* r) {
|
||||
return new runnable_args_nm_6_ret<M, A0, A1, A2, A3, A4, A5, R>
|
||||
(m, a0, a1, a2, a3, a4, a5, r);
|
||||
}
|
||||
|
||||
// 6 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
|
||||
runnable_args6<C, M, A0, A1, A2, A3, A4, A5>* WrapRunnable(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
|
||||
return new runnable_args6<C, M, A0, A1, A2, A3, A4, A5>
|
||||
runnable_args_m_6<C, M, A0, A1, A2, A3, A4, A5>* WrapRunnable(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
|
||||
return new runnable_args_m_6<C, M, A0, A1, A2, A3, A4, A5>
|
||||
(o, m, a0, a1, a2, a3, a4, a5);
|
||||
}
|
||||
|
||||
// 6 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename R>
|
||||
runnable_args6_ret<C, M, A0, A1, A2, A3, A4, A5, R>* WrapRunnableRet(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, R* r) {
|
||||
return new runnable_args6_ret<C, M, A0, A1, A2, A3, A4, A5, R>
|
||||
runnable_args_m_6_ret<C, M, A0, A1, A2, A3, A4, A5, R>* WrapRunnableRet(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, R* r) {
|
||||
return new runnable_args_m_6_ret<C, M, A0, A1, A2, A3, A4, A5, R>
|
||||
(o, m, a0, a1, a2, a3, a4, a5, r);
|
||||
}
|
||||
|
||||
// 7 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
|
||||
runnable_args_nm_7<M, A0, A1, A2, A3, A4, A5, A6>* WrapRunnableNM(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
|
||||
return new runnable_args_nm_7<M, A0, A1, A2, A3, A4, A5, A6>
|
||||
(m, a0, a1, a2, a3, a4, a5, a6);
|
||||
}
|
||||
|
||||
// 7 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename R>
|
||||
runnable_args_nm_7_ret<M, A0, A1, A2, A3, A4, A5, A6, R>* WrapRunnableNMRet(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, R* r) {
|
||||
return new runnable_args_nm_7_ret<M, A0, A1, A2, A3, A4, A5, A6, R>
|
||||
(m, a0, a1, a2, a3, a4, a5, a6, r);
|
||||
}
|
||||
|
||||
// 7 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
|
||||
runnable_args7<C, M, A0, A1, A2, A3, A4, A5, A6>* WrapRunnable(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
|
||||
return new runnable_args7<C, M, A0, A1, A2, A3, A4, A5, A6>
|
||||
runnable_args_m_7<C, M, A0, A1, A2, A3, A4, A5, A6>* WrapRunnable(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
|
||||
return new runnable_args_m_7<C, M, A0, A1, A2, A3, A4, A5, A6>
|
||||
(o, m, a0, a1, a2, a3, a4, a5, a6);
|
||||
}
|
||||
|
||||
// 7 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename R>
|
||||
runnable_args7_ret<C, M, A0, A1, A2, A3, A4, A5, A6, R>* WrapRunnableRet(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, R* r) {
|
||||
return new runnable_args7_ret<C, M, A0, A1, A2, A3, A4, A5, A6, R>
|
||||
runnable_args_m_7_ret<C, M, A0, A1, A2, A3, A4, A5, A6, R>* WrapRunnableRet(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, R* r) {
|
||||
return new runnable_args_m_7_ret<C, M, A0, A1, A2, A3, A4, A5, A6, R>
|
||||
(o, m, a0, a1, a2, a3, a4, a5, a6, r);
|
||||
}
|
||||
|
||||
// 8 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
|
||||
runnable_args_nm_8<M, A0, A1, A2, A3, A4, A5, A6, A7>* WrapRunnableNM(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {
|
||||
return new runnable_args_nm_8<M, A0, A1, A2, A3, A4, A5, A6, A7>
|
||||
(m, a0, a1, a2, a3, a4, a5, a6, a7);
|
||||
}
|
||||
|
||||
// 8 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename R>
|
||||
runnable_args_nm_8_ret<M, A0, A1, A2, A3, A4, A5, A6, A7, R>* WrapRunnableNMRet(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, R* r) {
|
||||
return new runnable_args_nm_8_ret<M, A0, A1, A2, A3, A4, A5, A6, A7, R>
|
||||
(m, a0, a1, a2, a3, a4, a5, a6, a7, r);
|
||||
}
|
||||
|
||||
// 8 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
|
||||
runnable_args8<C, M, A0, A1, A2, A3, A4, A5, A6, A7>* WrapRunnable(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {
|
||||
return new runnable_args8<C, M, A0, A1, A2, A3, A4, A5, A6, A7>
|
||||
runnable_args_m_8<C, M, A0, A1, A2, A3, A4, A5, A6, A7>* WrapRunnable(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {
|
||||
return new runnable_args_m_8<C, M, A0, A1, A2, A3, A4, A5, A6, A7>
|
||||
(o, m, a0, a1, a2, a3, a4, a5, a6, a7);
|
||||
}
|
||||
|
||||
// 8 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename R>
|
||||
runnable_args8_ret<C, M, A0, A1, A2, A3, A4, A5, A6, A7, R>* WrapRunnableRet(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, R* r) {
|
||||
return new runnable_args8_ret<C, M, A0, A1, A2, A3, A4, A5, A6, A7, R>
|
||||
runnable_args_m_8_ret<C, M, A0, A1, A2, A3, A4, A5, A6, A7, R>* WrapRunnableRet(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, R* r) {
|
||||
return new runnable_args_m_8_ret<C, M, A0, A1, A2, A3, A4, A5, A6, A7, R>
|
||||
(o, m, a0, a1, a2, a3, a4, a5, a6, a7, r);
|
||||
}
|
||||
|
||||
// 9 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
|
||||
runnable_args_nm_9<M, A0, A1, A2, A3, A4, A5, A6, A7, A8>* WrapRunnableNM(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) {
|
||||
return new runnable_args_nm_9<M, A0, A1, A2, A3, A4, A5, A6, A7, A8>
|
||||
(m, a0, a1, a2, a3, a4, a5, a6, a7, a8);
|
||||
}
|
||||
|
||||
// 9 arguments --
|
||||
template<typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename R>
|
||||
runnable_args_nm_9_ret<M, A0, A1, A2, A3, A4, A5, A6, A7, A8, R>* WrapRunnableNMRet(M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, R* r) {
|
||||
return new runnable_args_nm_9_ret<M, A0, A1, A2, A3, A4, A5, A6, A7, A8, R>
|
||||
(m, a0, a1, a2, a3, a4, a5, a6, a7, a8, r);
|
||||
}
|
||||
|
||||
// 9 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
|
||||
runnable_args9<C, M, A0, A1, A2, A3, A4, A5, A6, A7, A8>* WrapRunnable(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) {
|
||||
return new runnable_args9<C, M, A0, A1, A2, A3, A4, A5, A6, A7, A8>
|
||||
runnable_args_m_9<C, M, A0, A1, A2, A3, A4, A5, A6, A7, A8>* WrapRunnable(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) {
|
||||
return new runnable_args_m_9<C, M, A0, A1, A2, A3, A4, A5, A6, A7, A8>
|
||||
(o, m, a0, a1, a2, a3, a4, a5, a6, a7, a8);
|
||||
}
|
||||
|
||||
// 9 arguments --
|
||||
template<typename C, typename M, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename R>
|
||||
runnable_args9_ret<C, M, A0, A1, A2, A3, A4, A5, A6, A7, A8, R>* WrapRunnableRet(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, R* r) {
|
||||
return new runnable_args9_ret<C, M, A0, A1, A2, A3, A4, A5, A6, A7, A8, R>
|
||||
runnable_args_m_9_ret<C, M, A0, A1, A2, A3, A4, A5, A6, A7, A8, R>* WrapRunnableRet(C o, M m, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, R* r) {
|
||||
return new runnable_args_m_9_ret<C, M, A0, A1, A2, A3, A4, A5, A6, A7, A8, R>
|
||||
(o, m, a0, a1, a2, a3, a4, a5, a6, a7, a8, r);
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
@ -83,6 +84,7 @@ class RunnableArgsTest : public ::testing::Test {
|
||||
TargetClass cl_;
|
||||
};
|
||||
|
||||
|
||||
class DispatchTest : public ::testing::Test {
|
||||
public:
|
||||
DispatchTest() : ran_(0), cl_(&ran_) {}
|
||||
@ -121,9 +123,11 @@ class DispatchTest : public ::testing::Test {
|
||||
ASSERT_EQ(10, z);
|
||||
}
|
||||
|
||||
private:
|
||||
protected:
|
||||
int ran_;
|
||||
TargetClass cl_;
|
||||
|
||||
private:
|
||||
nsCOMPtr<nsIEventTarget> target_;
|
||||
};
|
||||
|
||||
@ -152,6 +156,34 @@ TEST_F(DispatchTest, TestRet) {
|
||||
TestRet();
|
||||
}
|
||||
|
||||
void SetNonMethod(TargetClass *cl, int x) {
|
||||
cl->m1(x);
|
||||
}
|
||||
|
||||
int SetNonMethodRet(TargetClass *cl, int x) {
|
||||
cl->m1(x);
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
TEST_F(DispatchTest, TestNonMethod) {
|
||||
test_utils->sts_target()->Dispatch(
|
||||
WrapRunnableNM(SetNonMethod, &cl_, 10), NS_DISPATCH_SYNC);
|
||||
|
||||
ASSERT_EQ(1, ran_);
|
||||
}
|
||||
|
||||
TEST_F(DispatchTest, TestNonMethodRet) {
|
||||
int z;
|
||||
|
||||
test_utils->sts_target()->Dispatch(
|
||||
WrapRunnableNMRet(SetNonMethodRet, &cl_, 10, &z), NS_DISPATCH_SYNC);
|
||||
|
||||
ASSERT_EQ(1, ran_);
|
||||
ASSERT_EQ(10, z);
|
||||
}
|
||||
|
||||
|
||||
|
||||
} // end of namespace
|
||||
|
||||
|
@ -465,6 +465,7 @@ bool TransportLayerDtls::Setup() {
|
||||
pr_fd.forget(); // ownership transfered to ssl_fd;
|
||||
|
||||
if (role_ == CLIENT) {
|
||||
MOZ_MTLOG(PR_LOG_DEBUG, "Setting up DTLS as client");
|
||||
rv = SSL_GetClientAuthDataHook(ssl_fd, GetClientAuthDataHook,
|
||||
this);
|
||||
if (rv != SECSuccess) {
|
||||
@ -472,6 +473,7 @@ bool TransportLayerDtls::Setup() {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
MOZ_MTLOG(PR_LOG_DEBUG, "Setting up DTLS as server");
|
||||
// Server side
|
||||
rv = SSL_ConfigSecureServer(ssl_fd, identity_->cert(),
|
||||
identity_->privkey(),
|
||||
|
@ -715,7 +715,6 @@ NS_IMETHODIMP
|
||||
PeerConnectionImpl::CreateOffer(const JS::Value& aConstraints, JSContext* aCx)
|
||||
{
|
||||
CheckIceState();
|
||||
mRole = kRoleOfferer; // TODO(ekr@rtfm.com): Interrogate SIPCC here?
|
||||
|
||||
MediaConstraints* cs = new MediaConstraints();
|
||||
nsresult rv = ConvertConstraints(aConstraints, cs, aCx);
|
||||
@ -730,6 +729,8 @@ PeerConnectionImpl::CreateOffer(const JS::Value& aConstraints, JSContext* aCx)
|
||||
NS_IMETHODIMP
|
||||
PeerConnectionImpl::CreateOffer(MediaConstraints& constraints)
|
||||
{
|
||||
mRole = kRoleOfferer; // TODO(ekr@rtfm.com): Interrogate SIPCC here?
|
||||
|
||||
cc_media_constraints_t* cc_constraints = nullptr;
|
||||
constraints.buildArray(&cc_constraints);
|
||||
|
||||
@ -741,7 +742,6 @@ NS_IMETHODIMP
|
||||
PeerConnectionImpl::CreateAnswer(const JS::Value& aConstraints, JSContext* aCx)
|
||||
{
|
||||
CheckIceState();
|
||||
mRole = kRoleAnswerer; // TODO(ekr@rtfm.com): Interrogate SIPCC here?
|
||||
|
||||
MediaConstraints* cs = new MediaConstraints();
|
||||
nsresult rv = ConvertConstraints(aConstraints, cs, aCx);
|
||||
@ -756,6 +756,8 @@ PeerConnectionImpl::CreateAnswer(const JS::Value& aConstraints, JSContext* aCx)
|
||||
NS_IMETHODIMP
|
||||
PeerConnectionImpl::CreateAnswer(MediaConstraints& constraints)
|
||||
{
|
||||
mRole = kRoleAnswerer; // TODO(ekr@rtfm.com): Interrogate SIPCC here?
|
||||
|
||||
cc_media_constraints_t* cc_constraints = nullptr;
|
||||
constraints.buildArray(&cc_constraints);
|
||||
|
||||
|
@ -82,3 +82,72 @@ vcm_media_payload_type_t vcmRtpToMediaPayload (int32_t ptype,
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
#define EXTRACT_DYNAMIC_PAYLOAD_TYPE(PTYPE) ((PTYPE)>>16)
|
||||
#define CLEAR_DYNAMIC_PAYLOAD_TYPE(PTYPE) (PTYPE & 0x0000FFFF)
|
||||
#define CHECK_DYNAMIC_PAYLOAD_TYPE(PTYPE) (PTYPE & 0xFFFF0000)
|
||||
/* TODO -- This function is temporary, to deal with the fact
|
||||
that we currently have two different codec representations.
|
||||
It should be removed when the media types are unified. */
|
||||
int32_t mediaPayloadToVcmRtp (vcm_media_payload_type_t payload_in)
|
||||
{
|
||||
int vcmPayload = -1;
|
||||
int rtp_payload = -1;
|
||||
|
||||
if (CHECK_DYNAMIC_PAYLOAD_TYPE(payload_in)) {
|
||||
vcmPayload = CLEAR_DYNAMIC_PAYLOAD_TYPE(payload_in);
|
||||
} else {
|
||||
//static payload type
|
||||
vcmPayload = payload_in;
|
||||
}
|
||||
|
||||
switch(vcmPayload) {
|
||||
case VCM_Media_Payload_G711Ulaw64k:
|
||||
rtp_payload = RTP_PCMU;
|
||||
break;
|
||||
|
||||
case VCM_Media_Payload_G729:
|
||||
rtp_payload = RTP_G729;
|
||||
break;
|
||||
|
||||
case VCM_Media_Payload_Wide_Band_256k:
|
||||
rtp_payload = RTP_L16;
|
||||
break;
|
||||
|
||||
case VCM_Media_Payload_G722_64k:
|
||||
rtp_payload = RTP_G722;
|
||||
break;
|
||||
|
||||
case VCM_Media_Payload_ILBC20:
|
||||
case VCM_Media_Payload_ILBC30:
|
||||
rtp_payload = RTP_ILBC;
|
||||
break;
|
||||
|
||||
case VCM_Media_Payload_ISAC:
|
||||
rtp_payload = RTP_ISAC;
|
||||
break;
|
||||
|
||||
case VCM_Media_Payload_H263:
|
||||
rtp_payload = RTP_H263;
|
||||
break;
|
||||
|
||||
case VCM_Media_Payload_H264:
|
||||
rtp_payload = RTP_H264_P0;
|
||||
break;
|
||||
|
||||
case VCM_Media_Payload_VP8:
|
||||
rtp_payload = RTP_VP8;
|
||||
break;
|
||||
|
||||
case VCM_Media_Payload_OPUS:
|
||||
rtp_payload = RTP_OPUS;
|
||||
break;
|
||||
|
||||
default:
|
||||
rtp_payload = RTP_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
return rtp_payload;
|
||||
|
||||
}
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "prlog.h"
|
||||
#include "plstr.h"
|
||||
#include "sdp_private.h"
|
||||
#include "vcm_util.h"
|
||||
|
||||
//TODO Need to place this in a portable location
|
||||
#define MULTICAST_START_ADDRESS 0xe1000000
|
||||
@ -348,6 +349,8 @@ gsmsdp_free_media (fsmdef_media_t *media)
|
||||
|
||||
if(media->payloads != NULL) {
|
||||
cpr_free(media->payloads);
|
||||
cpr_free(media->local_dpt_list);
|
||||
cpr_free(media->remote_dpt_list);
|
||||
media->num_payloads = 0;
|
||||
}
|
||||
/*
|
||||
@ -388,7 +391,6 @@ gsmsdp_init_media (fsmdef_media_t *media)
|
||||
media->mode = (uint16_t)vcmGetILBCMode();
|
||||
media->vad = VCM_VAD_OFF;
|
||||
/* Default to audio codec */
|
||||
media->payload = RTP_NONE;
|
||||
media->level = 0;
|
||||
media->dest_port = 0;
|
||||
media->dest_addr = ip_addr_invalid;
|
||||
@ -414,11 +416,14 @@ gsmsdp_init_media (fsmdef_media_t *media)
|
||||
media->previous_sdp.direction = SDP_DIRECTION_INACTIVE;
|
||||
media->previous_sdp.packetization_period = media->packetization_period;
|
||||
media->previous_sdp.max_packetization_period = media->max_packetization_period;
|
||||
media->previous_sdp.payload_type = media->payload;
|
||||
media->previous_sdp.local_payload_type = media->payload;
|
||||
media->previous_sdp.payload_type =
|
||||
media->num_payloads ? media->payloads[0] : RTP_NONE;
|
||||
media->previous_sdp.local_payload_type =
|
||||
media->num_payloads ? media->payloads[0] : RTP_NONE;
|
||||
media->previous_sdp.tias_bw = SDP_INVALID_VALUE;
|
||||
media->previous_sdp.profile_level = 0;
|
||||
media->local_dynamic_payload_type_value = media->payload;
|
||||
media->local_dynamic_payload_type_value =
|
||||
media->num_payloads ? media->payloads[0] : RTP_NONE;
|
||||
media->hold = FSM_HOLD_NONE;
|
||||
media->flags = 0; /* clear all flags */
|
||||
media->cap_index = CC_MAX_MEDIA_CAP; /* max is invalid value */
|
||||
@ -427,6 +432,8 @@ gsmsdp_init_media (fsmdef_media_t *media)
|
||||
media->rtcp_mux = FALSE;
|
||||
media->protocol = NULL;
|
||||
media->payloads = NULL;
|
||||
media->local_dpt_list = NULL;
|
||||
media->remote_dpt_list = NULL;
|
||||
media->num_payloads = 0;
|
||||
}
|
||||
|
||||
@ -1661,7 +1668,7 @@ gsmsdp_set_local_sdp_direction (fsmdef_dcb_t *dcb_p,
|
||||
if (media->direction_set) {
|
||||
media->previous_sdp.direction = media->direction;
|
||||
gsmsdp_remove_sdp_direction(media, media->direction,
|
||||
dcb_p->sdp ? dcb_p->sdp->src_sdp: NULL );
|
||||
dcb_p->sdp ? dcb_p->sdp->src_sdp : NULL );
|
||||
media->direction_set = FALSE;
|
||||
}
|
||||
gsmsdp_set_sdp_direction(media, direction, dcb_p->sdp ? dcb_p->sdp->src_sdp : NULL);
|
||||
@ -1926,18 +1933,30 @@ gsmsdp_add_default_audio_formats_to_local_sdp (fsmdef_dcb_t *dcb_p,
|
||||
(rtp_ptype *) local_media_types,
|
||||
CC_MAX_MEDIA_TYPES);
|
||||
/*
|
||||
* If the media payload type is set to RTP_NONE, its because we are making an
|
||||
* If there are no media payload types, it's because we are making an
|
||||
* initial offer. We will be opening our receive port so we need to specify
|
||||
* the media payload type to be used initially. We set the media payload
|
||||
* type in the dcb to do this. Until we receive an answer from the far
|
||||
* end, we will use our first choice payload type. i.e. the first payload
|
||||
* type sent in our AUDIO media line.
|
||||
*/
|
||||
if (dcb_p && media && media->payload == RTP_NONE) {
|
||||
media->payload = local_media_types[0];
|
||||
|
||||
/* TODO -- Eventually, the structure in previous_sdp needs to be
|
||||
updated to match the payloads[] array so that we can act on
|
||||
a codec other than the first one changing. */
|
||||
if (dcb_p && media && media->num_payloads == 0) {
|
||||
if (!media->payloads) {
|
||||
media->payloads = cpr_calloc(1, sizeof(vcm_media_payload_type_t));
|
||||
media->local_dpt_list = cpr_calloc(1, sizeof(uint8_t));
|
||||
media->remote_dpt_list = cpr_calloc(1, sizeof(uint8_t));
|
||||
}
|
||||
media->payloads[0] = local_media_types[0];
|
||||
media->previous_sdp.payload_type = local_media_types[0];
|
||||
media->previous_sdp.local_payload_type = local_media_types[0];
|
||||
media->num_payloads = 1;
|
||||
}
|
||||
|
||||
|
||||
/* reset the local dynamic payload to NONE */
|
||||
if (media) {
|
||||
media->local_dynamic_payload_type_value = RTP_NONE;
|
||||
@ -2061,10 +2080,22 @@ gsmsdp_add_default_video_formats_to_local_sdp (fsmdef_dcb_t *dcb_p,
|
||||
* end, we will use our first choice payload type. i.e. the first payload
|
||||
* type sent in our video media line.
|
||||
*/
|
||||
if (dcb_p && media && media->payload == RTP_NONE) {
|
||||
media->payload = video_media_types[0];
|
||||
|
||||
/* TODO -- Eventually, the structure in previous_sdp needs to be
|
||||
updated to match the payloads[] array so that we can act on
|
||||
a codec other than the first one changing. */
|
||||
|
||||
if (dcb_p && media && media->num_payloads == 0) {
|
||||
if (!media->payloads) {
|
||||
media->payloads = (vcm_media_payload_type_t*)
|
||||
cpr_calloc(1, sizeof(vcm_media_payload_type_t));
|
||||
media->local_dpt_list = cpr_calloc(1, sizeof(uint8_t));
|
||||
media->remote_dpt_list = cpr_calloc(1, sizeof(uint8_t));
|
||||
}
|
||||
media->payloads[0] = video_media_types[0];
|
||||
media->previous_sdp.payload_type = video_media_types[0];
|
||||
media->previous_sdp.local_payload_type = video_media_types[0];
|
||||
media->num_payloads = 1;
|
||||
}
|
||||
/* reset the local dynamic payload to NONE */
|
||||
if (media) {
|
||||
@ -2241,6 +2272,7 @@ gsmsdp_update_local_sdp_media (fsmdef_dcb_t *dcb_p, cc_sdp_t *cc_sdp_p,
|
||||
uint16_t level;
|
||||
void *sdp_p;
|
||||
int sdpmode = 0;
|
||||
int i = 0;
|
||||
|
||||
if (!dcb_p || !media) {
|
||||
GSM_ERR_MSG(get_debug_string(FSMDEF_DBG_INVALID_DCB), fname);
|
||||
@ -2317,42 +2349,52 @@ gsmsdp_update_local_sdp_media (fsmdef_dcb_t *dcb_p, cc_sdp_t *cc_sdp_p,
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
|
||||
/*
|
||||
* add the single negotiated media format
|
||||
* answer with the same dynamic payload type value, if a dynamic payload is choosen.
|
||||
* Add negotiated codec list to the sdp
|
||||
*/
|
||||
if (media->remote_dynamic_payload_type_value > 0) {
|
||||
dynamic_payload_type = media->remote_dynamic_payload_type_value;
|
||||
} else {
|
||||
dynamic_payload_type = media->payload;
|
||||
}
|
||||
result =
|
||||
for(i=0; i < media->num_payloads; i++) {
|
||||
// Get the PT value. If the remote party has
|
||||
// specified a dynamic value for this payload,
|
||||
// we re-use the same value they do. Otherwise,
|
||||
// we use our own selected dynamic payload type.
|
||||
if (media->remote_dpt_list[i] > 0) {
|
||||
dynamic_payload_type = media->remote_dpt_list[i];
|
||||
} else {
|
||||
dynamic_payload_type = media->local_dpt_list[i];
|
||||
}
|
||||
|
||||
result =
|
||||
sdp_add_media_payload_type(sdp_p, level,
|
||||
(uint16_t)dynamic_payload_type,
|
||||
SDP_PAYLOAD_NUMERIC);
|
||||
if (result != SDP_SUCCESS) {
|
||||
|
||||
if (result != SDP_SUCCESS) {
|
||||
GSM_ERR_MSG(GSM_L_C_F_PREFIX"Adding dynamic payload type failed\n",
|
||||
dcb_p->line, dcb_p->call_id, fname);
|
||||
}
|
||||
switch (media->type) {
|
||||
case SDP_MEDIA_AUDIO:
|
||||
gsmsdp_set_media_attributes(media->payload, sdp_p, level,
|
||||
(uint16_t)dynamic_payload_type);
|
||||
break;
|
||||
case SDP_MEDIA_VIDEO:
|
||||
gsmsdp_set_video_media_attributes(media->payload, cc_sdp_p, level,
|
||||
(uint16_t)dynamic_payload_type);
|
||||
break;
|
||||
case SDP_MEDIA_APPLICATION:
|
||||
gsmsdp_set_sctp_attributes (sdp_p, level, media);
|
||||
break;
|
||||
default:
|
||||
GSM_ERR_MSG(GSM_L_C_F_PREFIX"SDP ERROR media %d for level %d is not"
|
||||
" supported\n",
|
||||
}
|
||||
|
||||
switch (media->type) {
|
||||
case SDP_MEDIA_AUDIO:
|
||||
gsmsdp_set_media_attributes(mediaPayloadToVcmRtp(
|
||||
media->payloads[i]), sdp_p, level,
|
||||
(uint16_t)dynamic_payload_type);
|
||||
break;
|
||||
case SDP_MEDIA_VIDEO:
|
||||
gsmsdp_set_video_media_attributes(mediaPayloadToVcmRtp(
|
||||
media->payloads[i]), cc_sdp_p, level,
|
||||
(uint16_t)dynamic_payload_type);
|
||||
break;
|
||||
case SDP_MEDIA_APPLICATION:
|
||||
gsmsdp_set_sctp_attributes (sdp_p, level, media);
|
||||
break;
|
||||
default:
|
||||
GSM_ERR_MSG(GSM_L_C_F_PREFIX"SDP ERROR media %d for level %d is"
|
||||
" not supported\n",
|
||||
dcb_p->line, dcb_p->call_id, fname, media->level);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}//end for
|
||||
|
||||
/*
|
||||
* add the avt media type
|
||||
@ -2808,7 +2850,8 @@ gsmsdp_negotiate_codec (fsmdef_dcb_t *dcb_p, cc_sdp_t *sdp_p,
|
||||
/*
|
||||
* Save pay load type for use by gsmspd_compare_to_previous_sdp
|
||||
*/
|
||||
media->previous_sdp.payload_type = media->payload;
|
||||
media->previous_sdp.payload_type =
|
||||
media->num_payloads ? media->payloads[0] : RTP_NONE;
|
||||
media->previous_sdp.local_payload_type = media->local_dynamic_payload_type_value;
|
||||
|
||||
/*
|
||||
@ -2821,13 +2864,19 @@ gsmsdp_negotiate_codec (fsmdef_dcb_t *dcb_p, cc_sdp_t *sdp_p,
|
||||
payload_types_count = num_slave_types;
|
||||
}
|
||||
|
||||
media->payloads = (vcm_media_payload_type_t*) cpr_malloc(payload_types_count * sizeof(vcm_media_payload_type_t));
|
||||
if (!(media->payloads))
|
||||
{
|
||||
GSM_ERR_MSG(GSM_L_C_F_PREFIX"Memory Allocation failed for payloads\n",
|
||||
DEB_L_C_F_PREFIX_ARGS(GSM, dcb_p->line, dcb_p->call_id, fname));
|
||||
return RTP_NONE;
|
||||
/* Remove any previously allocated lists */
|
||||
if (media->payloads) {
|
||||
cpr_free(media->payloads);
|
||||
cpr_free(media->local_dpt_list);
|
||||
cpr_free(media->remote_dpt_list);
|
||||
}
|
||||
/* Allocate memory for PT value, local PT and remote PT. */
|
||||
media->payloads = cpr_calloc(payload_types_count,
|
||||
sizeof(vcm_media_payload_type_t));
|
||||
media->local_dpt_list = cpr_calloc(payload_types_count,
|
||||
sizeof(uint8_t));
|
||||
media->remote_dpt_list = cpr_calloc(payload_types_count,
|
||||
sizeof(uint8_t));
|
||||
|
||||
for (i = 0; i < num_master_types; i++) {
|
||||
for (j = 0; j < num_slave_types; j++) {
|
||||
@ -2842,7 +2891,7 @@ gsmsdp_negotiate_codec (fsmdef_dcb_t *dcb_p, cc_sdp_t *sdp_p,
|
||||
}
|
||||
} else { //if remote SDP is an answer
|
||||
if (media->local_dynamic_payload_type_value == RTP_NONE ||
|
||||
media->payload != media->previous_sdp.payload_type) {
|
||||
!media->num_payloads || media->payloads[0] != media->previous_sdp.payload_type) {
|
||||
/* If the the negotiated payload type is different from previous,
|
||||
set it the local dynamic to payload type as this is what we offered*/
|
||||
}
|
||||
@ -2858,7 +2907,7 @@ gsmsdp_negotiate_codec (fsmdef_dcb_t *dcb_p, cc_sdp_t *sdp_p,
|
||||
if (payload == RTP_ILBC) {
|
||||
media->mode = (uint16_t)sdp_attr_get_fmtp_mode_for_payload_type
|
||||
(sdp_p->dest_sdp, level, 0,
|
||||
media->remote_dynamic_payload_type_value);
|
||||
remote_dynamic_payload_type_value);
|
||||
}
|
||||
if (payload == RTP_OPUS) {
|
||||
u16 a_inst;
|
||||
@ -2908,14 +2957,13 @@ gsmsdp_negotiate_codec (fsmdef_dcb_t *dcb_p, cc_sdp_t *sdp_p,
|
||||
vcmFreeMediaPtr(media->video);
|
||||
media->video = NULL;
|
||||
}
|
||||
|
||||
if ( vcmCheckAttribs(media->payload, sdp_p, level,
|
||||
&media->video) == FALSE ) {
|
||||
GSM_DEBUG(DEB_L_C_F_PREFIX"codec= %d ignored - attribs not accepted\n",
|
||||
DEB_L_C_F_PREFIX_ARGS(GSM, dcb_p->line,
|
||||
dcb_p->call_id, fname), media->payload);
|
||||
explicit_reject = TRUE;
|
||||
continue; // keep looking
|
||||
if ( vcmCheckAttribs(payload, sdp_p, level,
|
||||
&media->video) == FALSE ) {
|
||||
GSM_DEBUG(DEB_L_C_F_PREFIX"codec= %d ignored - attribs not accepted\n",
|
||||
DEB_L_C_F_PREFIX_ARGS(GSM, dcb_p->line,
|
||||
dcb_p->call_id, fname), payload);
|
||||
explicit_reject = TRUE;
|
||||
continue; // keep looking
|
||||
}
|
||||
|
||||
// cache the negotiated profile_level and bandwidth
|
||||
@ -2929,7 +2977,7 @@ gsmsdp_negotiate_codec (fsmdef_dcb_t *dcb_p, cc_sdp_t *sdp_p,
|
||||
|
||||
GSM_DEBUG(DEB_L_C_F_PREFIX"codec= %d\n",
|
||||
DEB_L_C_F_PREFIX_ARGS(GSM, dcb_p->line,
|
||||
dcb_p->call_id, fname), media->payload);
|
||||
dcb_p->call_id, fname), payload);
|
||||
|
||||
}
|
||||
found_codec = TRUE;
|
||||
@ -2937,12 +2985,17 @@ gsmsdp_negotiate_codec (fsmdef_dcb_t *dcb_p, cc_sdp_t *sdp_p,
|
||||
//we maxed our allocated memory. ignore and return;
|
||||
return payload;
|
||||
}
|
||||
//update media structure with the negotiated value
|
||||
media->payloads[media->num_payloads] = vcmRtpToMediaPayload(payload,
|
||||
remote_dynamic_payload_type_value,
|
||||
media->mode);
|
||||
media->local_dpt_list[media->num_payloads] = payload;
|
||||
media->remote_dpt_list[media->num_payloads] = remote_dynamic_payload_type_value;
|
||||
media->num_payloads++;
|
||||
if(offer) {
|
||||
//return on the first match
|
||||
// TODO -- Eventually, we'll (probably) want to answer with all
|
||||
// the codecs we can receive. See bug 814227.
|
||||
return payload;
|
||||
}
|
||||
}
|
||||
@ -2962,20 +3015,20 @@ gsmsdp_negotiate_codec (fsmdef_dcb_t *dcb_p, cc_sdp_t *sdp_p,
|
||||
*/
|
||||
if (!initial_offer && explicit_reject == FALSE) {
|
||||
for (i = 0; i < num_types; i++) {
|
||||
if (media->payload == GET_CODEC_TYPE(remote_media_types[i])) {
|
||||
if (media->num_payloads != 0 && media->payloads[0] == GET_CODEC_TYPE(remote_media_types[i])) {
|
||||
/*
|
||||
* CSCta40560 - DSP runs out of bandwidth as the current API's do not consider the request is for
|
||||
* the same call. Need to update dynamic payload types for dynamic PT codecs. Would need to possibly
|
||||
* add other video codecs as support is added here.
|
||||
*/
|
||||
if ( (media->payload == RTP_H264_P1 || media->payload == RTP_H264_P0) && offer == TRUE ) {
|
||||
if ( (media->payloads[0] == RTP_H264_P1 || media->payloads[0] == RTP_H264_P0) && offer == TRUE ) {
|
||||
media->remote_dynamic_payload_type_value = GET_DYN_PAYLOAD_TYPE_VALUE(master_list_p[i]);
|
||||
media->local_dynamic_payload_type_value = GET_DYN_PAYLOAD_TYPE_VALUE(master_list_p[i]);
|
||||
}
|
||||
GSM_DEBUG(DEB_L_C_F_PREFIX"local codec list was empty codec= %d local=%d remote =%d\n",
|
||||
DEB_L_C_F_PREFIX_ARGS(GSM, dcb_p->line, dcb_p->call_id, fname),
|
||||
media->payload, media->local_dynamic_payload_type_value, media->remote_dynamic_payload_type_value);
|
||||
return (media->payload);
|
||||
media->payloads[0], media->local_dynamic_payload_type_value, media->remote_dynamic_payload_type_value);
|
||||
return (media->payloads[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4141,7 +4194,7 @@ gsmsdp_negotiate_media_lines (fsm_fcb_t *fcb_p, cc_sdp_t *sdp_p, boolean initial
|
||||
|
||||
GSM_DEBUG(DEB_L_C_F_PREFIX"remote_direction: %d global match %sfound\n",
|
||||
DEB_L_C_F_PREFIX_ARGS(GSM, dcb_p->line, dcb_p->call_id, fname),
|
||||
remote_direction, (cap_index != CC_MAX_MEDIA_CAP)?"":"not ");
|
||||
remote_direction, (cap_index != CC_MAX_MEDIA_CAP) ? "" : "not ");
|
||||
if ( cap_index != CC_MAX_MEDIA_CAP &&
|
||||
remote_direction != SDP_DIRECTION_INACTIVE ) {
|
||||
// this is an offer and platform can support video
|
||||
@ -4756,11 +4809,17 @@ gsmsdp_add_media_line (fsmdef_dcb_t *dcb_p, const cc_media_cap_t *media_cap,
|
||||
* Since we are initiating an initial offer and opening a
|
||||
* receive port, store initial media settings.
|
||||
*/
|
||||
|
||||
/* TODO -- Eventually, the structure in previous_sdp needs to be
|
||||
updated to match the payloads[] array so that we can act on
|
||||
a codec other than the first one changing. */
|
||||
media->previous_sdp.avt_payload_type = media->avt_payload_type;
|
||||
media->previous_sdp.direction = media->direction;
|
||||
media->previous_sdp.packetization_period = media->packetization_period;
|
||||
media->previous_sdp.payload_type = media->payload;
|
||||
media->previous_sdp.local_payload_type = media->payload;
|
||||
media->previous_sdp.payload_type =
|
||||
media->num_payloads ? media->payloads[0] : RTP_NONE;
|
||||
media->previous_sdp.local_payload_type =
|
||||
media->num_payloads ? media->payloads[0] : RTP_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -6231,11 +6290,14 @@ gsmsdp_sdp_differs_from_previous_sdp (boolean rcv_only, fsmdef_media_t *media)
|
||||
* Consider attributes of interest common to all active directions.
|
||||
*/
|
||||
if ((media->previous_sdp.avt_payload_type != media->avt_payload_type) ||
|
||||
(media->previous_sdp.payload_type != media->payload)) {
|
||||
(0 == media->num_payloads) ||
|
||||
(media->previous_sdp.payload_type != media->payloads[0])) {
|
||||
GSM_DEBUG(DEB_F_PREFIX"previous payload: %d new payload: %d\n",
|
||||
DEB_F_PREFIX_ARGS(GSM, fname), media->previous_sdp.payload_type, media->payload);
|
||||
DEB_F_PREFIX_ARGS(GSM, fname),
|
||||
media->previous_sdp.payload_type, media->payloads[0]);
|
||||
GSM_DEBUG(DEB_F_PREFIX"previous avt payload: %d new avt payload: %d\n",
|
||||
DEB_F_PREFIX_ARGS(GSM, fname), media->previous_sdp.avt_payload_type,
|
||||
DEB_F_PREFIX_ARGS(GSM, fname),
|
||||
media->previous_sdp.avt_payload_type,
|
||||
media->avt_payload_type);
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -146,7 +146,6 @@ typedef struct fsmdef_media_t_ {
|
||||
* We answer with the same payload type value that the remote offers.
|
||||
* If remote choses to answer with different value than we offer, we support asymmetric.
|
||||
*/
|
||||
int32_t payload; //payload type - one of rtp_ptype enumerations
|
||||
int32_t local_dynamic_payload_type_value; // dynamic payload type value offered/answered by us
|
||||
int32_t remote_dynamic_payload_type_value; // dynamic payload type value offered/answered by remote
|
||||
int32_t avt_payload_type;
|
||||
@ -237,11 +236,30 @@ typedef struct fsmdef_media_t_ {
|
||||
uint32 streams;
|
||||
char *protocol;
|
||||
|
||||
/*
|
||||
* This field contains the size of the payloads,
|
||||
* local_dpt_list, and remote_dpt_list fields.
|
||||
*/
|
||||
int32_t num_payloads;
|
||||
|
||||
/*
|
||||
* List of active lists of payloads negotiated
|
||||
* There needs to be 1-1 mapping between the 3 arrays
|
||||
* TODO:crypt: Move these to a aggregate structure per payload
|
||||
* since we need to include codec type, local rtp type, remote rty type,
|
||||
* codec specific parameters as generated by any SDP action.
|
||||
*/
|
||||
vcm_media_payload_type_t* payloads;
|
||||
int32_t num_payloads;
|
||||
|
||||
/*
|
||||
* dynamic payload type value offered/answered by us
|
||||
*/
|
||||
uint8_t* local_dpt_list;
|
||||
|
||||
/*
|
||||
* dynamic payload type value offered/answered by remote
|
||||
*/
|
||||
uint8_t* remote_dpt_list;
|
||||
} fsmdef_media_t;
|
||||
|
||||
struct fsm_fcb_t_;
|
||||
|
@ -995,7 +995,8 @@ lsm_rx_start (lsm_lcb_t *lcb, const char *fname, fsmdef_media_t *media)
|
||||
pc_track_id = 0;
|
||||
dcb->cur_video_avail &= ~CC_ATTRIB_CAST;
|
||||
if (media->local_dynamic_payload_type_value == RTP_NONE) {
|
||||
media->local_dynamic_payload_type_value = media->payload;
|
||||
media->local_dynamic_payload_type_value =
|
||||
media->num_payloads ? media->payloads[0] : RTP_NONE;
|
||||
}
|
||||
|
||||
config_get_value(CFGID_SDPMODE, &sdpmode, sizeof(sdpmode));
|
||||
@ -1014,9 +1015,15 @@ lsm_rx_start (lsm_lcb_t *lcb, const char *fname, fsmdef_media_t *media)
|
||||
} else if (!sdpmode) {
|
||||
ret_val = vcmRxStart(media->cap_index, group_id, media->refid,
|
||||
lsm_get_ms_ui_call_handle(dcb->line, call_id, CC_NO_CALL_ID),
|
||||
vcmRtpToMediaPayload(media->payload,
|
||||
media->local_dynamic_payload_type_value,
|
||||
media->mode),
|
||||
/* RTP_NONE is not technically a valid
|
||||
value for vcm_media_payload_type_t.
|
||||
However, we really should never
|
||||
reach this part of the code with
|
||||
num_payloads < 1, so the RTP_NONE
|
||||
shouldn't ever be used. It's only
|
||||
here are extra protection against
|
||||
an invalid pointer deref.*/
|
||||
media->num_payloads ? media->payloads[0] : RTP_NONE,
|
||||
media->is_multicast ? &media->dest_addr:&media->src_addr,
|
||||
port,
|
||||
FSM_NEGOTIATED_CRYPTO_ALGORITHM_ID(media),
|
||||
@ -1235,9 +1242,7 @@ lsm_tx_start (lsm_lcb_t *lcb, const char *fname, fsmdef_media_t *media)
|
||||
if (vcmTxStart(media->cap_index, group_id,
|
||||
media->refid,
|
||||
lsm_get_ms_ui_call_handle(dcb->line, call_id, CC_NO_CALL_ID),
|
||||
vcmRtpToMediaPayload(media->payload,
|
||||
media->remote_dynamic_payload_type_value,
|
||||
media->mode),
|
||||
media->num_payloads ? media->payloads[0] : RTP_NONE,
|
||||
(short)dscp,
|
||||
&media->src_addr,
|
||||
media->src_port,
|
||||
@ -1263,9 +1268,7 @@ lsm_tx_start (lsm_lcb_t *lcb, const char *fname, fsmdef_media_t *media)
|
||||
dcb->media_cap_tbl->cap[media->cap_index].pc_track,
|
||||
lsm_get_ms_ui_call_handle(dcb->line, call_id, CC_NO_CALL_ID),
|
||||
dcb->peerconnection,
|
||||
vcmRtpToMediaPayload(media->payload,
|
||||
media->remote_dynamic_payload_type_value,
|
||||
media->mode),
|
||||
media->num_payloads ? media->payloads[0] : RTP_NONE,
|
||||
(short)dscp,
|
||||
FSM_NEGOTIATED_CRYPTO_DIGEST_ALGORITHM(media),
|
||||
FSM_NEGOTIATED_CRYPTO_DIGEST(media),
|
||||
@ -1949,7 +1952,7 @@ lsm_get_free_lcb (callid_t call_id, line_t line, fsmdef_dcb_t *dcb)
|
||||
lcb->mru = mru;
|
||||
lcb->dcb = dcb;
|
||||
// start unmuted if txPref is true
|
||||
lcb->vid_mute = cc_media_getVideoAutoTxPref()?FALSE:TRUE;
|
||||
lcb->vid_mute = cc_media_getVideoAutoTxPref() ? FALSE : TRUE;
|
||||
|
||||
lcb->ui_id = call_id; /* default UI ID is the same as call_id */
|
||||
break;
|
||||
@ -3810,6 +3813,7 @@ lsm_update_media (lsm_lcb_t *lcb, const char *caller_fname)
|
||||
boolean rx_refresh;
|
||||
boolean tx_refresh;
|
||||
char addr_str[MAX_IPADDR_STR_LEN];
|
||||
int i;
|
||||
|
||||
dcb = lcb->dcb;
|
||||
if (dcb == NULL) {
|
||||
@ -3857,12 +3861,16 @@ lsm_update_media (lsm_lcb_t *lcb, const char *caller_fname)
|
||||
if (LSMDebug) {
|
||||
/* debug is enabled, format the dest addr into string */
|
||||
ipaddr2dotted(addr_str, &media->dest_addr);
|
||||
for (i = 0; i < media->num_payloads; i++)
|
||||
{
|
||||
LSM_DEBUG(DEB_L_C_F_PREFIX"%d rx, tx refresh's are %d %d"
|
||||
", dir=%d, payload=%d addr=%s, multicast=%d\n",
|
||||
DEB_L_C_F_PREFIX_ARGS(LSM, dcb->line,
|
||||
dcb->call_id, fname), media->refid, rx_refresh,
|
||||
tx_refresh, media->direction,
|
||||
media->payloads[i], addr_str, media->is_multicast );
|
||||
}
|
||||
}
|
||||
LSM_DEBUG(DEB_L_C_F_PREFIX"%d rx, tx refresh's are %d %d"
|
||||
", dir=%d, payload=%d addr=%s, multicast=%d\n",
|
||||
DEB_L_C_F_PREFIX_ARGS(LSM, dcb->line, dcb->call_id, fname),
|
||||
media->refid, rx_refresh, tx_refresh, media->direction,
|
||||
media->payload, addr_str, media->is_multicast );
|
||||
if (rx_refresh ||
|
||||
(media->is_multicast &&
|
||||
media->direction_set &&
|
||||
@ -5289,9 +5297,9 @@ void lsm_add_remote_stream (line_t line, callid_t call_id, fsmdef_media_t *media
|
||||
return;
|
||||
}
|
||||
|
||||
vcmCreateRemoteStream(media->cap_index, dcb->peerconnection, pc_stream_id,
|
||||
vcmRtpToMediaPayload(media->payload,
|
||||
media->local_dynamic_payload_type_value,media->mode));
|
||||
vcmCreateRemoteStream(media->cap_index, dcb->peerconnection,
|
||||
pc_stream_id,
|
||||
media->num_payloads ? media->payloads[0] : RTP_NONE);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -19,4 +19,5 @@ vcm_media_payload_type_t vcm_rtp_to_media_payload (int32_t ptype,
|
||||
uint16_t mode);
|
||||
|
||||
|
||||
int32_t mediaPayloadToVcmRtp (vcm_media_payload_type_t payload_in);
|
||||
#endif /* VCM_UTIL_H_ */
|
||||
|
@ -34,6 +34,12 @@ LIBS += \
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef MOZ_NATIVE_LIBVPX
|
||||
LIBS += \
|
||||
$(MOZ_LIBVPX_LIBS) \
|
||||
$(NULL)
|
||||
endif
|
||||
|
||||
ifeq (gtk2,$(MOZ_WIDGET_TOOLKIT))
|
||||
LIBS += \
|
||||
$(XLIBS) \
|
||||
|
@ -575,7 +575,8 @@ class SignalingAgent {
|
||||
}
|
||||
|
||||
void CreateAnswer(sipcc::MediaConstraints& constraints, std::string offer,
|
||||
uint32_t offerAnswerFlags, uint32_t sdpCheck) {
|
||||
uint32_t offerAnswerFlags,
|
||||
uint32_t sdpCheck = DONT_CHECK_AUDIO|DONT_CHECK_VIDEO) {
|
||||
// Create a media stream as if it came from GUM
|
||||
nsRefPtr<nsDOMMediaStream> domMediaStream = new nsDOMMediaStream();
|
||||
|
||||
@ -1217,7 +1218,8 @@ TEST_F(SignalingTest, FullCallTrickle)
|
||||
ASSERT_GE(a2_.GetPacketsReceived(0), 40);
|
||||
}
|
||||
|
||||
TEST_F(SignalingTest, Bug810220)
|
||||
// This test comes from Bug 810220
|
||||
TEST_F(SignalingTest, AudioOnlyG711Call)
|
||||
{
|
||||
sipcc::MediaConstraints constraints;
|
||||
std::string offer =
|
||||
@ -1228,10 +1230,11 @@ TEST_F(SignalingTest, Bug810220)
|
||||
"t=0 0\r\n"
|
||||
"a=fingerprint:sha-256 F3:FA:20:C0:CD:48:C4:5F:02:5F:A5:D3:21:D0:2D:48:"
|
||||
"7B:31:60:5C:5A:D8:0D:CD:78:78:6C:6D:CE:CC:0C:67\r\n"
|
||||
"m=audio 9000 RTP/AVP 0 126\r\n"
|
||||
"m=audio 9000 RTP/AVP 0 8 126\r\n"
|
||||
"c=IN IP4 148.147.200.251\r\n"
|
||||
"b=TIAS:64000\r\n"
|
||||
"a=rtpmap:0 PCMU/8000\r\n"
|
||||
"a=rtpmap:8 PCMA/8000\r\n"
|
||||
"a=rtpmap:126 telephone-event/8000\r\n"
|
||||
"a=candidate:0 1 udp 2130706432 148.147.200.251 9000 typ host\r\n"
|
||||
"a=candidate:0 2 udp 2130706432 148.147.200.251 9005 typ host\r\n"
|
||||
@ -1247,12 +1250,29 @@ TEST_F(SignalingTest, Bug810220)
|
||||
DONT_CHECK_AUDIO | DONT_CHECK_VIDEO);
|
||||
|
||||
std::string answer = a2_.answer();
|
||||
/* TODO -- make sure the answer looks right */
|
||||
|
||||
// They didn't offer opus, so our answer shouldn't include it.
|
||||
ASSERT_EQ(answer.find(" opus/"), std::string::npos);
|
||||
|
||||
// They also didn't offer video or application
|
||||
ASSERT_EQ(answer.find("video"), std::string::npos);
|
||||
ASSERT_EQ(answer.find("application"), std::string::npos);
|
||||
|
||||
// We should answer with PCMU and telephone-event
|
||||
ASSERT_NE(answer.find(" PCMU/8000"), std::string::npos);
|
||||
ASSERT_NE(answer.find(" telephone-event/8000"), std::string::npos);
|
||||
|
||||
// Double-check the directionality
|
||||
ASSERT_NE(answer.find("\r\na=sendrecv"), std::string::npos);
|
||||
|
||||
}
|
||||
|
||||
TEST_F(SignalingTest, Bug814038)
|
||||
// This test comes from Bug814038
|
||||
TEST_F(SignalingTest, ChromeOfferAnswer)
|
||||
{
|
||||
sipcc::MediaConstraints constraints;
|
||||
|
||||
// This is captured SDP from an early interop attempt with Chrome.
|
||||
std::string offer =
|
||||
"v=0\r\n"
|
||||
"o=- 1713781661 2 IN IP4 127.0.0.1\r\n"
|
||||
@ -1275,7 +1295,12 @@ TEST_F(SignalingTest, Bug814038)
|
||||
"RzrYlzpkTsvgYFD1hQqNCzQ7y4emNLKI1tODsjim\r\n"
|
||||
"a=rtpmap:103 ISAC/16000\r\n"
|
||||
"a=rtpmap:104 ISAC/32000\r\n"
|
||||
"a=rtpmap:111 opus/48000\r\n"
|
||||
// NOTE: the actual SDP that Chrome sends at the moment
|
||||
// doesn't indicate two channels. I've amended their SDP
|
||||
// here, under the assumption that the constraints
|
||||
// described in draft-spittka-payload-rtp-opus will
|
||||
// eventually be implemented by Google.
|
||||
"a=rtpmap:111 opus/48000/2\r\n"
|
||||
"a=rtpmap:0 PCMU/8000\r\n"
|
||||
"a=rtpmap:8 PCMA/8000\r\n"
|
||||
"a=rtpmap:107 CN/48000\r\n"
|
||||
@ -1314,13 +1339,13 @@ TEST_F(SignalingTest, Bug814038)
|
||||
a2_.SetRemote(TestObserver::OFFER, offer);
|
||||
|
||||
std::cout << "Creating answer:" << std::endl;
|
||||
a2_.CreateAnswer(constraints, offer, OFFER_AUDIO | ANSWER_AUDIO,
|
||||
SHOULD_INACTIVE_AUDIO | SHOULD_INACTIVE_VIDEO);
|
||||
a2_.CreateAnswer(constraints, offer, OFFER_AUDIO | ANSWER_AUDIO);
|
||||
|
||||
std::string answer = a2_.answer();
|
||||
}
|
||||
|
||||
|
||||
|
||||
} // End namespace test.
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
@ -554,7 +554,7 @@ public class AboutHomeContent extends ScrollView
|
||||
}
|
||||
});
|
||||
|
||||
Favicons favicons = mActivity.getFavicons();
|
||||
Favicons favicons = Favicons.getInstance();
|
||||
favicons.loadFavicon(pageUrl, iconUrl, true,
|
||||
new Favicons.OnFaviconLoadedListener() {
|
||||
public void onFaviconLoaded(String url, Bitmap favicon) {
|
||||
|
@ -332,6 +332,12 @@ abstract public class BrowserApp extends GeckoApp
|
||||
mAboutHomeContent.refresh();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
mBrowserToolbar.fromAwesomeBarSearch();
|
||||
}
|
||||
|
||||
public View getActionBarLayout() {
|
||||
int actionBarRes;
|
||||
|
||||
@ -594,7 +600,7 @@ abstract public class BrowserApp extends GeckoApp
|
||||
private void loadFavicon(final Tab tab) {
|
||||
maybeCancelFaviconLoad(tab);
|
||||
|
||||
long id = getFavicons().loadFavicon(tab.getURL(), tab.getFaviconURL(), !tab.isPrivate(),
|
||||
long id = Favicons.getInstance().loadFavicon(tab.getURL(), tab.getFaviconURL(), !tab.isPrivate(),
|
||||
new Favicons.OnFaviconLoadedListener() {
|
||||
|
||||
public void onFaviconLoaded(String pageUrl, Bitmap favicon) {
|
||||
@ -628,7 +634,7 @@ abstract public class BrowserApp extends GeckoApp
|
||||
return;
|
||||
|
||||
// Cancel pending favicon load task
|
||||
getFavicons().cancelFaviconLoad(faviconLoadId);
|
||||
Favicons.getInstance().cancelFaviconLoad(faviconLoadId);
|
||||
|
||||
// Reset favicon load state
|
||||
tab.setFaviconLoadId(Favicons.NOT_LOADING);
|
||||
|
@ -26,6 +26,7 @@ import android.view.MotionEvent;
|
||||
import android.view.TouchDelegate;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewGroup.MarginLayoutParams;
|
||||
import android.view.Window;
|
||||
import android.view.accessibility.AccessibilityNodeInfo;
|
||||
import android.view.animation.AlphaAnimation;
|
||||
@ -39,6 +40,7 @@ import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.PopupWindow;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.RelativeLayout.LayoutParams;
|
||||
import android.widget.TextView;
|
||||
import android.widget.ViewSwitcher;
|
||||
|
||||
@ -53,8 +55,13 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory,
|
||||
private static final String LOGTAG = "GeckoToolbar";
|
||||
private LinearLayout mLayout;
|
||||
private View mAwesomeBar;
|
||||
private LayoutParams mAwesomeBarParams;
|
||||
private View mAwesomeBarEntry;
|
||||
private int mAwesomeBarEntryRightMargin;
|
||||
private GeckoFrameLayout mAwesomeBarRightEdge;
|
||||
private BrowserToolbarBackground mAddressBarBg;
|
||||
private BrowserToolbarBackground.CurveTowards mAddressBarBgCurveTowards;
|
||||
private int mAddressBarBgRightMargin;
|
||||
private GeckoTextView mTitle;
|
||||
private int mTitlePadding;
|
||||
private boolean mSiteSecurityVisible;
|
||||
@ -121,18 +128,9 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory,
|
||||
mShowSiteSecurity = false;
|
||||
mShowReader = false;
|
||||
|
||||
// Only used on tablet layout. We need a separate view for the background
|
||||
// because we need to slide it left/right for hiding/shoing the tabs sidebar
|
||||
// See prepareTabsAnimation().
|
||||
mAddressBarBg = (BrowserToolbarBackground) mLayout.findViewById(R.id.address_bar_bg);
|
||||
|
||||
// Only used on tablet layout. The tabs sidebar slide animation is implemented
|
||||
// in terms of translating the inner elements of the tablet toolbar to give the
|
||||
// impression of resizing. In order to do this, This "fake" right edge is kept
|
||||
// in the same position during the animation while the elements on the left
|
||||
// (favicon, back, forware, lock icon, title, ...) slide behind it.
|
||||
// See prepareTabsAnimation().
|
||||
mAwesomeBarRightEdge = (GeckoFrameLayout) mLayout.findViewById(R.id.awesome_bar_right_edge);
|
||||
mAwesomeBarEntry = mLayout.findViewById(R.id.awesome_bar_entry);
|
||||
|
||||
// This will hold the translation width inside the toolbar when the tabs
|
||||
// pane is visible. It will affect the padding applied to the title TextView.
|
||||
@ -432,8 +430,206 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory,
|
||||
return mInflater.inflate(R.layout.tabs_counter, null);
|
||||
}
|
||||
|
||||
public void fromAwesomeBarSearch() {
|
||||
if (mActivity.hasTabsSideBar() || Build.VERSION.SDK_INT < 11) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Restore opacity of content elements in the toolbar immediatelly
|
||||
// so that the response is immediate from user interaction in the
|
||||
// awesome screen.
|
||||
AnimatorProxy proxy = AnimatorProxy.create(mFavicon);
|
||||
proxy.setAlpha(1);
|
||||
proxy = AnimatorProxy.create(mSiteSecurity);
|
||||
proxy.setAlpha(1);
|
||||
proxy = AnimatorProxy.create(mTitle);
|
||||
proxy.setAlpha(1);
|
||||
proxy = AnimatorProxy.create(mForward);
|
||||
proxy.setAlpha(1);
|
||||
proxy = AnimatorProxy.create(mBack);
|
||||
proxy.setAlpha(1);
|
||||
|
||||
final PropertyAnimator contentAnimator = new PropertyAnimator(250);
|
||||
|
||||
// Shrink the awesome entry back to its original size
|
||||
contentAnimator.attach(mAwesomeBarRightEdge,
|
||||
PropertyAnimator.Property.TRANSLATION_X,
|
||||
0);
|
||||
contentAnimator.attach(mTabs,
|
||||
PropertyAnimator.Property.TRANSLATION_X,
|
||||
0);
|
||||
contentAnimator.attach(mTabsCount,
|
||||
PropertyAnimator.Property.TRANSLATION_X,
|
||||
0);
|
||||
contentAnimator.attach(mMenu,
|
||||
PropertyAnimator.Property.TRANSLATION_X,
|
||||
0);
|
||||
contentAnimator.attach(mActionItemBar,
|
||||
PropertyAnimator.Property.TRANSLATION_X,
|
||||
0);
|
||||
|
||||
contentAnimator.setPropertyAnimationListener(new PropertyAnimator.PropertyAnimationListener() {
|
||||
@Override
|
||||
public void onPropertyAnimationStart() {
|
||||
mTabs.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPropertyAnimationEnd() {
|
||||
// Turn off selected state on the entry
|
||||
mAwesomeBar.setSelected(false);
|
||||
|
||||
// Restore entry state
|
||||
MarginLayoutParams entryParams = (MarginLayoutParams) mAwesomeBarEntry.getLayoutParams();
|
||||
entryParams.rightMargin = mAwesomeBarEntryRightMargin;
|
||||
mAwesomeBarEntry.requestLayout();
|
||||
|
||||
// Restore the background state
|
||||
MarginLayoutParams barParams = (MarginLayoutParams) mAddressBarBg.getLayoutParams();
|
||||
barParams.rightMargin = mAddressBarBgRightMargin;
|
||||
mAddressBarBg.setCurveTowards(mAddressBarBgCurveTowards);
|
||||
mAddressBarBg.requestLayout();
|
||||
|
||||
// If there are action bar items in the toolbar, we have to restore the
|
||||
// alignment of the entry in relation to them.
|
||||
if (mActionItemBar.getVisibility() == View.VISIBLE)
|
||||
((View) mAwesomeBar.getParent()).setLayoutParams(mAwesomeBarParams);
|
||||
|
||||
// Hide fake right edge, we only use for the animation
|
||||
mAwesomeBarRightEdge.setVisibility(View.INVISIBLE);
|
||||
|
||||
PropertyAnimator buttonsAnimator = new PropertyAnimator(150);
|
||||
|
||||
// Fade toolbar buttons (reader, stop) after the entry
|
||||
// is schrunk back to its original size.
|
||||
buttonsAnimator.attach(mReader,
|
||||
PropertyAnimator.Property.ALPHA,
|
||||
1);
|
||||
buttonsAnimator.attach(mStop,
|
||||
PropertyAnimator.Property.ALPHA,
|
||||
1);
|
||||
|
||||
buttonsAnimator.start();
|
||||
}
|
||||
});
|
||||
|
||||
mHandler.postDelayed(new Runnable() {
|
||||
public void run() {
|
||||
contentAnimator.start();
|
||||
}
|
||||
}, 500);
|
||||
}
|
||||
|
||||
private void onAwesomeBarSearch() {
|
||||
mActivity.onSearchRequested();
|
||||
// This animation doesn't make much sense in a sidebar UI
|
||||
if (mActivity.hasTabsSideBar() || Build.VERSION.SDK_INT < 11) {
|
||||
mActivity.onSearchRequested();
|
||||
return;
|
||||
}
|
||||
|
||||
final PropertyAnimator contentAnimator = new PropertyAnimator(250);
|
||||
|
||||
// Keep the entry highlighted during the animation
|
||||
mAwesomeBar.setSelected(true);
|
||||
|
||||
// Expand the entry to fill all the horizontal space available during the
|
||||
// animation. The fake right edge will slide on top of it to give the effect
|
||||
// of expanding the entry.
|
||||
MarginLayoutParams entryParams = (MarginLayoutParams) mAwesomeBarEntry.getLayoutParams();
|
||||
mAwesomeBarEntryRightMargin = entryParams.rightMargin;
|
||||
entryParams.rightMargin = 0;
|
||||
mAwesomeBarEntry.requestLayout();
|
||||
|
||||
// Remove any curves from the toolbar background and expand it to fill all
|
||||
// the horizontal space.
|
||||
MarginLayoutParams barParams = (MarginLayoutParams) mAddressBarBg.getLayoutParams();
|
||||
mAddressBarBgRightMargin = barParams.rightMargin;
|
||||
barParams.rightMargin = 0;
|
||||
mAddressBarBgCurveTowards = mAddressBarBg.getCurveTowards();
|
||||
mAddressBarBg.setCurveTowards(BrowserToolbarBackground.CurveTowards.NONE);
|
||||
mAddressBarBg.requestLayout();
|
||||
|
||||
// If we don't have any menu_items, then we simply slide all elements on the
|
||||
// rigth side of the toolbar out of screen.
|
||||
int translation = mAwesomeBarEntryRightMargin;
|
||||
|
||||
if (mActionItemBar.getVisibility() == View.VISIBLE) {
|
||||
// If the toolbar has action items (e.g. on the tablet UI), the translation will
|
||||
// be in relation to the left side of their container (i.e. mActionItemBar).
|
||||
MarginLayoutParams itemBarParams = (MarginLayoutParams) mActionItemBar.getLayoutParams();
|
||||
translation = itemBarParams.rightMargin + mActionItemBar.getWidth() - entryParams.leftMargin;
|
||||
|
||||
// Expand the whole entry container to fill all the horizontal space available
|
||||
View awesomeBarParent = (View) mAwesomeBar.getParent();
|
||||
mAwesomeBarParams = (LayoutParams) awesomeBarParent.getLayoutParams();
|
||||
awesomeBarParent.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.MATCH_PARENT));
|
||||
|
||||
// Align the fake right edge to the right side of the entry bar
|
||||
MarginLayoutParams rightEdgeParams = (MarginLayoutParams) mAwesomeBarRightEdge.getLayoutParams();
|
||||
rightEdgeParams.rightMargin = itemBarParams.rightMargin + mActionItemBar.getWidth() - 100;
|
||||
mAwesomeBarRightEdge.requestLayout();
|
||||
|
||||
contentAnimator.attach(mFavicon,
|
||||
PropertyAnimator.Property.ALPHA,
|
||||
0);
|
||||
contentAnimator.attach(mSiteSecurity,
|
||||
PropertyAnimator.Property.ALPHA,
|
||||
0);
|
||||
contentAnimator.attach(mTitle,
|
||||
PropertyAnimator.Property.ALPHA,
|
||||
0);
|
||||
}
|
||||
|
||||
// Make the right edge visible to start the animation
|
||||
mAwesomeBarRightEdge.setVisibility(View.VISIBLE);
|
||||
|
||||
// Fade out all controls inside the toolbar
|
||||
contentAnimator.attach(mForward,
|
||||
PropertyAnimator.Property.ALPHA,
|
||||
0);
|
||||
contentAnimator.attach(mBack,
|
||||
PropertyAnimator.Property.ALPHA,
|
||||
0);
|
||||
contentAnimator.attach(mReader,
|
||||
PropertyAnimator.Property.ALPHA,
|
||||
0);
|
||||
contentAnimator.attach(mStop,
|
||||
PropertyAnimator.Property.ALPHA,
|
||||
0);
|
||||
|
||||
// Slide the right side elements of the toolbar
|
||||
contentAnimator.attach(mAwesomeBarRightEdge,
|
||||
PropertyAnimator.Property.TRANSLATION_X,
|
||||
translation);
|
||||
contentAnimator.attach(mTabs,
|
||||
PropertyAnimator.Property.TRANSLATION_X,
|
||||
translation);
|
||||
contentAnimator.attach(mTabsCount,
|
||||
PropertyAnimator.Property.TRANSLATION_X,
|
||||
translation);
|
||||
contentAnimator.attach(mMenu,
|
||||
PropertyAnimator.Property.TRANSLATION_X,
|
||||
translation);
|
||||
contentAnimator.attach(mActionItemBar,
|
||||
PropertyAnimator.Property.TRANSLATION_X,
|
||||
translation);
|
||||
|
||||
contentAnimator.setPropertyAnimationListener(new PropertyAnimator.PropertyAnimationListener() {
|
||||
@Override
|
||||
public void onPropertyAnimationStart() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPropertyAnimationEnd() {
|
||||
mTabs.setVisibility(View.INVISIBLE);
|
||||
|
||||
// Once the entry is fully expanded, start awesome screen
|
||||
mActivity.onSearchRequested();
|
||||
}
|
||||
});
|
||||
|
||||
contentAnimator.start();
|
||||
}
|
||||
|
||||
private void addTab() {
|
||||
@ -705,7 +901,7 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory,
|
||||
if (Tabs.getInstance().getSelectedTab().getState() == Tab.STATE_LOADING)
|
||||
return;
|
||||
|
||||
if (image != null && image.getWidth() > 0 && image.getHeight() > 0) {
|
||||
if (image != null) {
|
||||
image = Bitmap.createScaledBitmap(image, mFaviconSize, mFaviconSize, false);
|
||||
mFavicon.setImageBitmap(image);
|
||||
} else {
|
||||
|
@ -21,7 +21,7 @@ public class BrowserToolbarBackground extends GeckoLinearLayout
|
||||
private CurveTowards mSide;
|
||||
private CanvasDelegate mCanvasDelegate;
|
||||
|
||||
private enum CurveTowards { NONE, LEFT, RIGHT };
|
||||
public enum CurveTowards { NONE, LEFT, RIGHT };
|
||||
|
||||
public BrowserToolbarBackground(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
@ -127,4 +127,16 @@ public class BrowserToolbarBackground extends GeckoLinearLayout
|
||||
super.onLayout(changed, left, top, right, bottom);
|
||||
onLightweightThemeChanged();
|
||||
}
|
||||
|
||||
public CurveTowards getCurveTowards() {
|
||||
return mSide;
|
||||
}
|
||||
|
||||
public void setCurveTowards(CurveTowards side) {
|
||||
if (side == mSide)
|
||||
return;
|
||||
|
||||
mSide = side;
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
|
@ -56,11 +56,9 @@ public class Favicons {
|
||||
public void onFaviconLoaded(String url, Bitmap favicon);
|
||||
}
|
||||
|
||||
public Favicons(Context context) {
|
||||
public Favicons() {
|
||||
Log.d(LOGTAG, "Creating Favicons instance");
|
||||
|
||||
mContext = context;
|
||||
|
||||
mLoadTasks = Collections.synchronizedMap(new HashMap<Long,LoadFaviconTask>());
|
||||
mNextFaviconLoadId = 0;
|
||||
|
||||
@ -169,6 +167,18 @@ public class Favicons {
|
||||
mHttpClient.close();
|
||||
}
|
||||
|
||||
private static class FaviconsInstanceHolder {
|
||||
private static final Favicons INSTANCE = new Favicons();
|
||||
}
|
||||
|
||||
public static Favicons getInstance() {
|
||||
return Favicons.FaviconsInstanceHolder.INSTANCE;
|
||||
}
|
||||
|
||||
public void attachToContext(Context context) {
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
private class LoadFaviconTask extends AsyncTask<Void, Void, Bitmap> {
|
||||
private long mId;
|
||||
private String mPageUrl;
|
||||
@ -286,8 +296,10 @@ public class Favicons {
|
||||
|
||||
image = downloadFavicon(faviconUrl);
|
||||
|
||||
if (image != null) {
|
||||
if (image != null && image.getWidth() > 0 && image.getHeight() > 0) {
|
||||
saveFaviconToDb(image);
|
||||
} else {
|
||||
image = null;
|
||||
}
|
||||
|
||||
return image;
|
||||
|
@ -442,13 +442,6 @@ abstract public class GeckoApp
|
||||
return null;
|
||||
}
|
||||
|
||||
synchronized Favicons getFavicons() {
|
||||
if (mFavicons == null)
|
||||
mFavicons = new Favicons(this);
|
||||
|
||||
return mFavicons;
|
||||
}
|
||||
|
||||
Class<?> getPluginClass(String packageName, String className)
|
||||
throws NameNotFoundException, ClassNotFoundException {
|
||||
Context pluginContext = mAppContext.createPackageContext(packageName,
|
||||
@ -785,7 +778,7 @@ abstract public class GeckoApp
|
||||
(new GeckoAsyncTask<Void, Void, String>(mAppContext, GeckoAppShell.getHandler()) {
|
||||
@Override
|
||||
public String doInBackground(Void... params) {
|
||||
return getFavicons().getFaviconUrlForPageUrl(url);
|
||||
return Favicons.getInstance().getFaviconUrlForPageUrl(url);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -1480,6 +1473,7 @@ abstract public class GeckoApp
|
||||
|
||||
mAppContext = this;
|
||||
Tabs.getInstance().attachToActivity(this);
|
||||
Favicons.getInstance().attachToContext(this);
|
||||
|
||||
// Check to see if the activity is restarted after configuration change.
|
||||
if (getLastNonConfigurationInstance() != null) {
|
||||
@ -2460,7 +2454,7 @@ abstract public class GeckoApp
|
||||
|
||||
public boolean showAwesomebar(AwesomeBar.Target aTarget, String aUrl) {
|
||||
Intent intent = new Intent(getBaseContext(), AwesomeBar.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_NO_HISTORY);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
|
||||
intent.putExtra(AwesomeBar.TARGET_KEY, aTarget.name());
|
||||
|
||||
// if we were passed in a url, show it
|
||||
@ -2481,6 +2475,7 @@ abstract public class GeckoApp
|
||||
|
||||
int requestCode = GeckoAppShell.sActivityHelper.makeRequestCodeForAwesomebar();
|
||||
startActivityForResult(intent, requestCode);
|
||||
overridePendingTransition (R.anim.awesomebar_fade_in, R.anim.awesomebar_hold_still);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -479,6 +479,8 @@ RES_XML = \
|
||||
$(NULL)
|
||||
|
||||
RES_ANIM = \
|
||||
res/anim/awesomebar_fade_in.xml \
|
||||
res/anim/awesomebar_hold_still.xml \
|
||||
res/anim/grow_fade_in.xml \
|
||||
res/anim/grow_fade_in_center.xml \
|
||||
res/anim/shrink_fade_out.xml \
|
||||
|
@ -156,8 +156,7 @@ class MemoryMonitor extends BroadcastReceiver {
|
||||
}
|
||||
ScreenshotHandler.disableScreenshot(false);
|
||||
GeckoAppShell.geckoEventSync();
|
||||
|
||||
GeckoApp.mAppContext.getFavicons().clearMemCache();
|
||||
Favicons.getInstance().clearMemCache();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -262,8 +262,7 @@ public class AllPagesTab extends AwesomeBarTab implements GeckoEventListener {
|
||||
|
||||
final String url = mCursor.getString(mCursor.getColumnIndexOrThrow(URLColumns.URL));
|
||||
|
||||
Favicons favicons = GeckoApp.mAppContext.getFavicons();
|
||||
Bitmap bitmap = favicons.getFaviconFromMemCache(url);
|
||||
Bitmap bitmap = Favicons.getInstance().getFaviconFromMemCache(url);
|
||||
byte[] favicon = null;
|
||||
|
||||
if (bitmap != null) {
|
||||
@ -735,8 +734,7 @@ public class AllPagesTab extends AwesomeBarTab implements GeckoEventListener {
|
||||
|
||||
// We only want to load favicons from DB if they are not in the
|
||||
// memory cache yet.
|
||||
Favicons favicons = GeckoApp.mAppContext.getFavicons();
|
||||
if (favicons.getFaviconFromMemCache(url) != null)
|
||||
if (Favicons.getInstance().getFaviconFromMemCache(url) != null)
|
||||
continue;
|
||||
|
||||
urls.add(url);
|
||||
@ -750,8 +748,6 @@ public class AllPagesTab extends AwesomeBarTab implements GeckoEventListener {
|
||||
if (c == null || !c.moveToFirst())
|
||||
return;
|
||||
|
||||
Favicons favicons = GeckoApp.mAppContext.getFavicons();
|
||||
|
||||
do {
|
||||
final String url = c.getString(c.getColumnIndexOrThrow(Combined.URL));
|
||||
final byte[] b = c.getBlob(c.getColumnIndexOrThrow(Combined.FAVICON));
|
||||
@ -762,7 +758,7 @@ public class AllPagesTab extends AwesomeBarTab implements GeckoEventListener {
|
||||
if (favicon == null)
|
||||
continue;
|
||||
|
||||
favicons.putFaviconInMemCache(url, favicon);
|
||||
Favicons.getInstance().putFaviconInMemCache(url, favicon);
|
||||
} while (c.moveToNext());
|
||||
} finally {
|
||||
if (c != null)
|
||||
@ -791,8 +787,7 @@ public class AllPagesTab extends AwesomeBarTab implements GeckoEventListener {
|
||||
|
||||
private void displayFavicon(AwesomeEntryViewHolder viewHolder) {
|
||||
final String url = viewHolder.urlView.getText().toString();
|
||||
Favicons favicons = GeckoApp.mAppContext.getFavicons();
|
||||
Bitmap bitmap = favicons.getFaviconFromMemCache(url);
|
||||
Bitmap bitmap = Favicons.getInstance().getFaviconFromMemCache(url);
|
||||
updateFavicon(viewHolder.faviconView, bitmap);
|
||||
}
|
||||
|
||||
|
13
mobile/android/base/resources/anim/awesomebar_fade_in.xml
Normal file
13
mobile/android/base/resources/anim/awesomebar_fade_in.xml
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- 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/. -->
|
||||
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<alpha android:interpolator="@android:anim/accelerate_interpolator"
|
||||
android:fromAlpha="0.0"
|
||||
android:toAlpha="1.0"
|
||||
android:duration="100"/>
|
||||
|
||||
</set>
|
11
mobile/android/base/resources/anim/awesomebar_hold_still.xml
Normal file
11
mobile/android/base/resources/anim/awesomebar_hold_still.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- 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/. -->
|
||||
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<alpha android:interpolator="@android:anim/accelerate_interpolator"
|
||||
android:duration="100"/>
|
||||
|
||||
</set>
|
@ -16,6 +16,10 @@
|
||||
android:state_pressed="true"
|
||||
android:drawable="@drawable/address_bar_url_pressed_pb"/>
|
||||
|
||||
<item gecko:state_private="true"
|
||||
android:state_selected="true"
|
||||
android:drawable="@drawable/address_bar_url_pressed_pb"/>
|
||||
|
||||
<item gecko:state_private="true"
|
||||
android:drawable="@drawable/address_bar_url_default_pb"/>
|
||||
|
||||
@ -26,6 +30,9 @@
|
||||
<item android:state_pressed="true"
|
||||
android:drawable="@drawable/address_bar_url_pressed"/>
|
||||
|
||||
<item android:state_selected="true"
|
||||
android:drawable="@drawable/address_bar_url_pressed"/>
|
||||
|
||||
<item android:drawable="@drawable/address_bar_url_default"/>
|
||||
|
||||
</selector>
|
||||
|
@ -20,11 +20,6 @@
|
||||
android:contentDescription="@string/forward"
|
||||
style="@style/AddressBar.ImageButton.Unused"/>
|
||||
|
||||
<LinearLayout android:id="@+id/menu_items"
|
||||
android:layout_width="0dip"
|
||||
android:layout_height="0dip"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<org.mozilla.gecko.BrowserToolbarBackground android:id="@+id/address_bar_bg"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
@ -33,43 +28,58 @@
|
||||
android:layout_alignParentRight="true"
|
||||
android:background="@drawable/address_bar_bg"/>
|
||||
|
||||
<org.mozilla.gecko.MenuButton android:id="@+id/menu"
|
||||
style="@style/AddressBar.ImageButton.Unused"/>
|
||||
|
||||
<org.mozilla.gecko.TabsButton android:id="@+id/tabs"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="60dip"
|
||||
android:layout_alignParentRight="true"
|
||||
gecko:curveTowards="right"
|
||||
gecko:cropped="true"
|
||||
android:background="@drawable/tabs_button"
|
||||
android:gravity="center_vertical"
|
||||
android:src="@drawable/tabs_level"
|
||||
android:paddingLeft="30dip"
|
||||
android:paddingRight="10dip"/>
|
||||
|
||||
<Gecko.TextSwitcher android:id="@+id/tabs_count"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="39dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4.5dp"
|
||||
android:layout_alignRight="@id/tabs"
|
||||
android:gravity="center_horizontal"/>
|
||||
|
||||
<FrameLayout style="@style/AddressBar.Button"
|
||||
android:layout_marginTop="3dp"
|
||||
android:layout_marginBottom="3dp"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:layout_marginRight="45dp"
|
||||
android:layout_marginRight="4dp"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerVertical="true">
|
||||
|
||||
<Gecko.Button android:id="@+id/awesome_bar"
|
||||
style="@style/AddressBar.Button"
|
||||
android:background="@drawable/address_bar_url"/>
|
||||
<Gecko.RelativeLayout android:id="@+id/awesome_bar"
|
||||
style="@style/AddressBar.Button"
|
||||
android:layout_centerVertical="true"
|
||||
android:clickable="true"
|
||||
android:focusable="true">
|
||||
|
||||
<ImageView android:id="@+id/awesome_bar_entry"
|
||||
style="@style/AddressBar.Button"
|
||||
android:duplicateParentState="true"
|
||||
android:layout_marginTop="3dp"
|
||||
android:layout_marginBottom="3dp"
|
||||
android:layout_marginRight="45dp"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
android:background="@drawable/address_bar_url"/>
|
||||
|
||||
<view class="org.mozilla.gecko.BrowserToolbar$RightEdge"
|
||||
android:id="@+id/awesome_bar_right_edge"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="fill_parent"
|
||||
android:paddingTop="3dp"
|
||||
android:paddingBottom="3dp"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginRight="20dp"
|
||||
android:duplicateParentState="true"
|
||||
android:visibility="invisible"
|
||||
android:background="@drawable/address_bar_bg">
|
||||
|
||||
<ImageView android:layout_width="50dp"
|
||||
android:layout_height="fill_parent"
|
||||
android:scaleType="fitXY"
|
||||
android:layout_marginLeft="-26dp"
|
||||
android:duplicateParentState="true"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
android:src="@drawable/address_bar_url"/>
|
||||
|
||||
</view>
|
||||
|
||||
</Gecko.RelativeLayout>
|
||||
|
||||
<LinearLayout style="@style/AddressBar.Button"
|
||||
android:paddingRight="45dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageButton android:id="@+id/favicon"
|
||||
@ -122,6 +132,34 @@
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<LinearLayout android:id="@+id/menu_items"
|
||||
android:layout_width="0dip"
|
||||
android:layout_height="0dip"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<org.mozilla.gecko.MenuButton android:id="@+id/menu"
|
||||
style="@style/AddressBar.ImageButton.Unused"/>
|
||||
|
||||
<org.mozilla.gecko.TabsButton android:id="@+id/tabs"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="60dip"
|
||||
android:layout_alignParentRight="true"
|
||||
gecko:curveTowards="right"
|
||||
gecko:cropped="true"
|
||||
android:background="@drawable/tabs_button"
|
||||
android:gravity="center_vertical"
|
||||
android:src="@drawable/tabs_level"
|
||||
android:paddingLeft="30dip"
|
||||
android:paddingRight="10dip"/>
|
||||
|
||||
<Gecko.TextSwitcher android:id="@+id/tabs_count"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="39dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4.5dp"
|
||||
android:layout_alignRight="@id/tabs"
|
||||
android:gravity="center_horizontal"/>
|
||||
|
||||
<ImageView android:id="@+id/shadow"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="2dp"
|
||||
|
@ -20,11 +20,6 @@
|
||||
android:contentDescription="@string/forward"
|
||||
style="@style/AddressBar.ImageButton.Unused"/>
|
||||
|
||||
<LinearLayout android:id="@+id/menu_items"
|
||||
android:layout_width="0dip"
|
||||
android:layout_height="0dip"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<org.mozilla.gecko.BrowserToolbarBackground android:id="@+id/address_bar_bg"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
@ -32,52 +27,59 @@
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:background="@drawable/address_bar_bg"/>
|
||||
|
||||
<org.mozilla.gecko.MenuButton android:id="@+id/menu"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="65dip"
|
||||
android:layout_alignParentRight="true"
|
||||
android:gravity="center_vertical"
|
||||
android:src="@drawable/menu_level"
|
||||
android:contentDescription="@string/menu"
|
||||
android:background="@drawable/menu_button"
|
||||
android:paddingLeft="35dip"
|
||||
android:paddingRight="10dip"/>
|
||||
|
||||
<org.mozilla.gecko.TabsButton android:id="@+id/tabs"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="80dip"
|
||||
android:layout_marginRight="15dip"
|
||||
android:layout_alignParentRight="true"
|
||||
gecko:curveTowards="right"
|
||||
android:background="@drawable/tabs_button"
|
||||
android:gravity="center_vertical"
|
||||
android:src="@drawable/tabs_level"
|
||||
android:paddingLeft="30dip"
|
||||
android:paddingRight="30dip"/>
|
||||
|
||||
<Gecko.TextSwitcher android:id="@+id/tabs_count"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="80dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4.5dp"
|
||||
android:layout_alignRight="@id/tabs"
|
||||
android:gravity="center_horizontal"/>
|
||||
|
||||
<FrameLayout style="@style/AddressBar.Button"
|
||||
android:layout_marginTop="3dp"
|
||||
android:layout_marginBottom="3dp"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:layout_marginRight="80dp"
|
||||
android:layout_marginRight="4dp"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerVertical="true">
|
||||
|
||||
<Gecko.Button android:id="@+id/awesome_bar"
|
||||
style="@style/AddressBar.Button"
|
||||
android:background="@drawable/address_bar_url"/>
|
||||
<Gecko.RelativeLayout android:id="@+id/awesome_bar"
|
||||
style="@style/AddressBar.Button"
|
||||
android:layout_centerVertical="true"
|
||||
android:clickable="true"
|
||||
android:focusable="true">
|
||||
|
||||
<ImageView android:id="@+id/awesome_bar_entry"
|
||||
style="@style/AddressBar.Button"
|
||||
android:duplicateParentState="true"
|
||||
android:layout_marginTop="3dp"
|
||||
android:layout_marginBottom="3dp"
|
||||
android:layout_marginRight="80dp"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
android:background="@drawable/address_bar_url"/>
|
||||
|
||||
<view class="org.mozilla.gecko.BrowserToolbar$RightEdge"
|
||||
android:id="@+id/awesome_bar_right_edge"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="fill_parent"
|
||||
android:paddingTop="3dp"
|
||||
android:paddingBottom="3dp"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginRight="55dp"
|
||||
android:duplicateParentState="true"
|
||||
android:visibility="invisible"
|
||||
android:background="@drawable/address_bar_bg">
|
||||
|
||||
<ImageView android:layout_width="50dp"
|
||||
android:layout_height="fill_parent"
|
||||
android:scaleType="fitXY"
|
||||
android:layout_marginLeft="-26dp"
|
||||
android:duplicateParentState="true"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
android:src="@drawable/address_bar_url"/>
|
||||
|
||||
</view>
|
||||
|
||||
</Gecko.RelativeLayout>
|
||||
|
||||
<LinearLayout style="@style/AddressBar.Button"
|
||||
android:paddingRight="80dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageButton android:id="@+id/favicon"
|
||||
@ -130,6 +132,42 @@
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<LinearLayout android:id="@+id/menu_items"
|
||||
android:layout_width="0dip"
|
||||
android:layout_height="0dip"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<org.mozilla.gecko.MenuButton android:id="@+id/menu"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="65dip"
|
||||
android:layout_alignParentRight="true"
|
||||
android:gravity="center_vertical"
|
||||
android:src="@drawable/menu_level"
|
||||
android:contentDescription="@string/menu"
|
||||
android:background="@drawable/menu_button"
|
||||
android:paddingLeft="35dip"
|
||||
android:paddingRight="10dip"/>
|
||||
|
||||
<org.mozilla.gecko.TabsButton android:id="@+id/tabs"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="80dip"
|
||||
android:layout_marginRight="15dip"
|
||||
android:layout_alignParentRight="true"
|
||||
gecko:curveTowards="right"
|
||||
android:background="@drawable/tabs_button"
|
||||
android:gravity="center_vertical"
|
||||
android:src="@drawable/tabs_level"
|
||||
android:paddingLeft="30dip"
|
||||
android:paddingRight="30dip"/>
|
||||
|
||||
<Gecko.TextSwitcher android:id="@+id/tabs_count"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="80dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4.5dp"
|
||||
android:layout_alignRight="@id/tabs"
|
||||
android:gravity="center_horizontal"/>
|
||||
|
||||
<ImageView android:id="@+id/shadow"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="2dp"
|
||||
|
@ -20,65 +20,61 @@
|
||||
android:layout_alignParentRight="true"
|
||||
android:background="@drawable/address_bar_bg"/>
|
||||
|
||||
<org.mozilla.gecko.MenuButton android:id="@+id/menu"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="90dip"
|
||||
android:layout_alignParentRight="true"
|
||||
android:gravity="center_vertical"
|
||||
android:src="@drawable/menu_level"
|
||||
android:contentDescription="@string/menu"
|
||||
android:background="@drawable/menu_button"
|
||||
android:paddingLeft="48dip"
|
||||
android:paddingRight="14dip"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<org.mozilla.gecko.TabsButton android:id="@+id/tabs"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="112dip"
|
||||
android:layout_marginRight="28dip"
|
||||
android:layout_alignParentRight="true"
|
||||
gecko:curveTowards="right"
|
||||
android:background="@drawable/tabs_button"
|
||||
android:gravity="center_vertical"
|
||||
android:src="@drawable/tabs_level"
|
||||
android:paddingLeft="42dip"
|
||||
android:paddingRight="42dip"/>
|
||||
|
||||
<Gecko.TextSwitcher android:id="@+id/tabs_count"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="112dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="6dp"
|
||||
android:layout_alignRight="@id/tabs"
|
||||
android:gravity="center_horizontal"/>
|
||||
|
||||
<LinearLayout android:id="@+id/menu_items"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="fill_parent"
|
||||
android:orientation="horizontal"
|
||||
android:layout_marginRight="110dip"
|
||||
android:layout_alignParentRight="true"/>
|
||||
|
||||
<FrameLayout style="@style/AddressBar.Button"
|
||||
android:layout_toLeftOf="@id/menu_items"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerVertical="true">
|
||||
|
||||
<Gecko.Button android:id="@+id/awesome_bar"
|
||||
style="@style/AddressBar.Button"
|
||||
android:layout_marginLeft="20dp"
|
||||
android:layout_marginTop="6dp"
|
||||
android:layout_marginBottom="6dp"
|
||||
android:layout_marginRight="0dp"
|
||||
android:background="@drawable/address_bar_url"/>
|
||||
<Gecko.RelativeLayout android:id="@+id/awesome_bar"
|
||||
style="@style/AddressBar.Button"
|
||||
android:layout_centerVertical="true"
|
||||
android:clickable="true"
|
||||
android:focusable="true">
|
||||
|
||||
<ImageView android:id="@+id/awesome_bar_entry"
|
||||
style="@style/AddressBar.Button"
|
||||
android:duplicateParentState="true"
|
||||
android:layout_marginLeft="6dp"
|
||||
android:layout_marginTop="6dp"
|
||||
android:layout_marginBottom="6dp"
|
||||
android:layout_marginRight="0dp"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
android:background="@drawable/address_bar_url"/>
|
||||
|
||||
<view class="org.mozilla.gecko.BrowserToolbar$RightEdge"
|
||||
android:id="@+id/awesome_bar_right_edge"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="100dp"
|
||||
android:layout_height="fill_parent"
|
||||
android:paddingTop="6dp"
|
||||
android:paddingBottom="6dp"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:duplicateParentState="true"
|
||||
android:visibility="invisible"
|
||||
android:background="@drawable/address_bar_bg">
|
||||
|
||||
<ImageView android:layout_width="50dp"
|
||||
android:layout_height="fill_parent"
|
||||
android:scaleType="fitXY"
|
||||
android:layout_marginLeft="-26dp"
|
||||
android:duplicateParentState="true"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
android:src="@drawable/address_bar_url"/>
|
||||
|
||||
</view>
|
||||
|
||||
</Gecko.RelativeLayout>
|
||||
|
||||
<ImageButton android:id="@+id/forward"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="64dip"
|
||||
android:layout_height="40dip"
|
||||
android:layout_marginLeft="26dp"
|
||||
android:paddingLeft="26dp"
|
||||
android:layout_marginLeft="21dp"
|
||||
android:paddingLeft="21dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:src="@drawable/ic_menu_forward"
|
||||
android:contentDescription="@string/forward"
|
||||
@ -88,7 +84,7 @@
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="50dip"
|
||||
android:layout_height="50dip"
|
||||
android:layout_marginLeft="6dp"
|
||||
android:layout_marginLeft="1dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:src="@drawable/ic_menu_back"
|
||||
android:contentDescription="@string/back"
|
||||
@ -149,6 +145,45 @@
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<org.mozilla.gecko.MenuButton android:id="@+id/menu"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="90dip"
|
||||
android:layout_alignParentRight="true"
|
||||
android:gravity="center_vertical"
|
||||
android:src="@drawable/menu_level"
|
||||
android:contentDescription="@string/menu"
|
||||
android:background="@drawable/menu_button"
|
||||
android:paddingLeft="48dip"
|
||||
android:paddingRight="14dip"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<org.mozilla.gecko.TabsButton android:id="@+id/tabs"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="112dip"
|
||||
android:layout_marginRight="28dip"
|
||||
android:layout_alignParentRight="true"
|
||||
gecko:curveTowards="right"
|
||||
android:background="@drawable/tabs_button"
|
||||
android:gravity="center_vertical"
|
||||
android:src="@drawable/tabs_level"
|
||||
android:paddingLeft="42dip"
|
||||
android:paddingRight="42dip"/>
|
||||
|
||||
<Gecko.TextSwitcher android:id="@+id/tabs_count"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="112dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="6dp"
|
||||
android:layout_alignRight="@id/tabs"
|
||||
android:gravity="center_horizontal"/>
|
||||
|
||||
<LinearLayout android:id="@+id/menu_items"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="fill_parent"
|
||||
android:orientation="horizontal"
|
||||
android:layout_marginRight="110dip"
|
||||
android:layout_alignParentRight="true"/>
|
||||
|
||||
<ImageView android:id="@+id/shadow"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="2dp"
|
||||
|
@ -20,11 +20,6 @@
|
||||
android:contentDescription="@string/forward"
|
||||
style="@style/AddressBar.ImageButton.Unused"/>
|
||||
|
||||
<LinearLayout android:id="@+id/menu_items"
|
||||
android:layout_width="0dip"
|
||||
android:layout_height="0dip"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<org.mozilla.gecko.BrowserToolbarBackground android:id="@+id/address_bar_bg"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
@ -33,43 +28,58 @@
|
||||
android:layout_alignParentRight="true"
|
||||
android:background="@drawable/address_bar_bg"/>
|
||||
|
||||
<org.mozilla.gecko.MenuButton android:id="@+id/menu"
|
||||
style="@style/AddressBar.ImageButton.Unused"/>
|
||||
|
||||
<org.mozilla.gecko.TabsButton android:id="@+id/tabs"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="72dip"
|
||||
android:layout_alignParentRight="true"
|
||||
gecko:curveTowards="right"
|
||||
gecko:cropped="true"
|
||||
android:background="@drawable/tabs_button"
|
||||
android:gravity="center_vertical"
|
||||
android:src="@drawable/tabs_level"
|
||||
android:paddingLeft="38dip"
|
||||
android:paddingRight="10dip"/>
|
||||
|
||||
<Gecko.TextSwitcher android:id="@+id/tabs_count"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="44.5dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:layout_alignRight="@id/tabs"
|
||||
android:gravity="center_horizontal"/>
|
||||
|
||||
<FrameLayout style="@style/AddressBar.Button"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:layout_marginRight="52dp"
|
||||
android:layout_marginRight="4dp"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerVertical="true">
|
||||
|
||||
<Gecko.Button android:id="@+id/awesome_bar"
|
||||
style="@style/AddressBar.Button"
|
||||
android:background="@drawable/address_bar_url"/>
|
||||
<Gecko.RelativeLayout android:id="@+id/awesome_bar"
|
||||
style="@style/AddressBar.Button"
|
||||
android:layout_centerVertical="true"
|
||||
android:clickable="true"
|
||||
android:focusable="true">
|
||||
|
||||
<ImageView android:id="@+id/awesome_bar_entry"
|
||||
style="@style/AddressBar.Button"
|
||||
android:duplicateParentState="true"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:layout_marginRight="52dp"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
android:background="@drawable/address_bar_url"/>
|
||||
|
||||
<view class="org.mozilla.gecko.BrowserToolbar$RightEdge"
|
||||
android:id="@+id/awesome_bar_right_edge"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="fill_parent"
|
||||
android:paddingTop="4dp"
|
||||
android:paddingBottom="4dp"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginRight="27dp"
|
||||
android:duplicateParentState="true"
|
||||
android:visibility="invisible"
|
||||
android:background="@drawable/address_bar_bg">
|
||||
|
||||
<ImageView android:layout_width="50dp"
|
||||
android:layout_height="fill_parent"
|
||||
android:scaleType="fitXY"
|
||||
android:layout_marginLeft="-26dp"
|
||||
android:duplicateParentState="true"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
android:src="@drawable/address_bar_url"/>
|
||||
|
||||
</view>
|
||||
|
||||
</Gecko.RelativeLayout>
|
||||
|
||||
<LinearLayout style="@style/AddressBar.Button"
|
||||
android:paddingRight="52dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageButton android:id="@+id/favicon"
|
||||
@ -120,6 +130,34 @@
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<LinearLayout android:id="@+id/menu_items"
|
||||
android:layout_width="0dip"
|
||||
android:layout_height="0dip"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<org.mozilla.gecko.MenuButton android:id="@+id/menu"
|
||||
style="@style/AddressBar.ImageButton.Unused"/>
|
||||
|
||||
<org.mozilla.gecko.TabsButton android:id="@+id/tabs"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="72dip"
|
||||
android:layout_alignParentRight="true"
|
||||
gecko:curveTowards="right"
|
||||
gecko:cropped="true"
|
||||
android:background="@drawable/tabs_button"
|
||||
android:gravity="center_vertical"
|
||||
android:src="@drawable/tabs_level"
|
||||
android:paddingLeft="38dip"
|
||||
android:paddingRight="10dip"/>
|
||||
|
||||
<Gecko.TextSwitcher android:id="@+id/tabs_count"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="44.5dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:layout_alignRight="@id/tabs"
|
||||
android:gravity="center_horizontal"/>
|
||||
|
||||
<ImageView android:id="@+id/shadow"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="2dp"
|
||||
|
@ -20,11 +20,6 @@
|
||||
android:contentDescription="@string/forward"
|
||||
style="@style/AddressBar.ImageButton.Unused"/>
|
||||
|
||||
<LinearLayout android:id="@+id/menu_items"
|
||||
android:layout_width="0dip"
|
||||
android:layout_height="0dip"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<org.mozilla.gecko.BrowserToolbarBackground android:id="@+id/address_bar_bg"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
@ -33,52 +28,58 @@
|
||||
android:layout_alignParentRight="true"
|
||||
android:background="@drawable/address_bar_bg"/>
|
||||
|
||||
<org.mozilla.gecko.MenuButton android:id="@+id/menu"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="78dip"
|
||||
android:layout_alignParentRight="true"
|
||||
gecko:curveTowards="right"
|
||||
android:gravity="center_vertical"
|
||||
android:src="@drawable/menu_level"
|
||||
android:contentDescription="@string/menu"
|
||||
android:background="@drawable/menu_button"
|
||||
android:paddingLeft="42dip"
|
||||
android:paddingRight="12dip"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<org.mozilla.gecko.TabsButton android:id="@+id/tabs"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="98dip"
|
||||
android:layout_marginRight="22dip"
|
||||
android:layout_alignParentRight="true"
|
||||
android:background="@drawable/tabs_button"
|
||||
android:gravity="center_vertical"
|
||||
android:src="@drawable/tabs_level"
|
||||
android:paddingLeft="38dip"
|
||||
android:paddingRight="36dip"/>
|
||||
|
||||
<Gecko.TextSwitcher android:id="@+id/tabs_count"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="98dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:layout_alignRight="@id/tabs"
|
||||
android:gravity="center_horizontal"/>
|
||||
|
||||
<FrameLayout style="@style/AddressBar.Button"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:layout_marginRight="100dp"
|
||||
android:layout_marginRight="4dp"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerVertical="true">
|
||||
|
||||
<Gecko.Button android:id="@+id/awesome_bar"
|
||||
style="@style/AddressBar.Button"
|
||||
android:background="@drawable/address_bar_url"/>
|
||||
<Gecko.RelativeLayout android:id="@+id/awesome_bar"
|
||||
style="@style/AddressBar.Button"
|
||||
android:layout_centerVertical="true"
|
||||
android:clickable="true"
|
||||
android:focusable="true">
|
||||
|
||||
<ImageView android:id="@+id/awesome_bar_entry"
|
||||
style="@style/AddressBar.Button"
|
||||
android:duplicateParentState="true"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:layout_marginRight="100dp"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
android:background="@drawable/address_bar_url"/>
|
||||
|
||||
<view class="org.mozilla.gecko.BrowserToolbar$RightEdge"
|
||||
android:id="@+id/awesome_bar_right_edge"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="fill_parent"
|
||||
android:paddingTop="4dp"
|
||||
android:paddingBottom="4dp"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginRight="75dp"
|
||||
android:duplicateParentState="true"
|
||||
android:visibility="invisible"
|
||||
android:background="@drawable/address_bar_bg">
|
||||
|
||||
<ImageView android:layout_width="50dp"
|
||||
android:layout_height="fill_parent"
|
||||
android:scaleType="fitXY"
|
||||
android:layout_marginLeft="-26dp"
|
||||
android:duplicateParentState="true"
|
||||
android:clickable="false"
|
||||
android:focusable="false"
|
||||
android:src="@drawable/address_bar_url"/>
|
||||
|
||||
</view>
|
||||
|
||||
</Gecko.RelativeLayout>
|
||||
|
||||
<LinearLayout style="@style/AddressBar.Button"
|
||||
android:paddingRight="100dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageButton android:id="@+id/favicon"
|
||||
@ -129,6 +130,43 @@
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<LinearLayout android:id="@+id/menu_items"
|
||||
android:layout_width="0dip"
|
||||
android:layout_height="0dip"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<org.mozilla.gecko.MenuButton android:id="@+id/menu"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="78dip"
|
||||
android:layout_alignParentRight="true"
|
||||
gecko:curveTowards="right"
|
||||
android:gravity="center_vertical"
|
||||
android:src="@drawable/menu_level"
|
||||
android:contentDescription="@string/menu"
|
||||
android:background="@drawable/menu_button"
|
||||
android:paddingLeft="42dip"
|
||||
android:paddingRight="12dip"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<org.mozilla.gecko.TabsButton android:id="@+id/tabs"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="98dip"
|
||||
android:layout_marginRight="22dip"
|
||||
android:layout_alignParentRight="true"
|
||||
android:background="@drawable/tabs_button"
|
||||
android:gravity="center_vertical"
|
||||
android:src="@drawable/tabs_level"
|
||||
android:paddingLeft="38dip"
|
||||
android:paddingRight="36dip"/>
|
||||
|
||||
<Gecko.TextSwitcher android:id="@+id/tabs_count"
|
||||
style="@style/AddressBar.ImageButton"
|
||||
android:layout_width="98dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="5dp"
|
||||
android:layout_alignRight="@id/tabs"
|
||||
android:gravity="center_horizontal"/>
|
||||
|
||||
<ImageView android:id="@+id/shadow"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="2dp"
|
||||
|
@ -364,6 +364,7 @@ nsWindow::nsWindow()
|
||||
mWindowType = eWindowType_child;
|
||||
mSizeState = nsSizeMode_Normal;
|
||||
mLastSizeMode = nsSizeMode_Normal;
|
||||
mSizeConstraints.mMaxSize = GetSafeWindowSize(mSizeConstraints.mMaxSize);
|
||||
|
||||
#ifdef MOZ_X11
|
||||
mOldFocusWindow = 0;
|
||||
@ -938,19 +939,20 @@ nsWindow::ConstrainPosition(bool aAllowSlop, int32_t *aX, int32_t *aY)
|
||||
|
||||
void nsWindow::SetSizeConstraints(const SizeConstraints& aConstraints)
|
||||
{
|
||||
if (mShell) {
|
||||
GdkGeometry geometry;
|
||||
geometry.min_width = aConstraints.mMinSize.width;
|
||||
geometry.min_height = aConstraints.mMinSize.height;
|
||||
geometry.max_width = aConstraints.mMaxSize.width;
|
||||
geometry.max_height = aConstraints.mMaxSize.height;
|
||||
mSizeConstraints.mMinSize = GetSafeWindowSize(aConstraints.mMinSize);
|
||||
mSizeConstraints.mMaxSize = GetSafeWindowSize(aConstraints.mMaxSize);
|
||||
|
||||
uint32_t hints = GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE;
|
||||
gtk_window_set_geometry_hints(GTK_WINDOW(mShell), nullptr,
|
||||
&geometry, GdkWindowHints(hints));
|
||||
}
|
||||
if (mShell) {
|
||||
GdkGeometry geometry;
|
||||
geometry.min_width = mSizeConstraints.mMinSize.width;
|
||||
geometry.min_height = mSizeConstraints.mMinSize.height;
|
||||
geometry.max_width = mSizeConstraints.mMaxSize.width;
|
||||
geometry.max_height = mSizeConstraints.mMaxSize.height;
|
||||
|
||||
nsBaseWidget::SetSizeConstraints(aConstraints);
|
||||
uint32_t hints = GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE;
|
||||
gtk_window_set_geometry_hints(GTK_WINDOW(mShell), nullptr,
|
||||
&geometry, GdkWindowHints(hints));
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
@ -1017,7 +1019,7 @@ nsWindow::Resize(int32_t aWidth, int32_t aHeight, bool aRepaint)
|
||||
// interpreted as frame bounds, but NativeResize treats these as window
|
||||
// bounds (Bug 581866).
|
||||
|
||||
mBounds.SizeTo(GetSafeWindowSize(nsIntSize(aWidth, aHeight)));
|
||||
mBounds.SizeTo(aWidth, aHeight);
|
||||
|
||||
if (!mCreated)
|
||||
return NS_OK;
|
||||
@ -1092,7 +1094,7 @@ nsWindow::Resize(int32_t aX, int32_t aY, int32_t aWidth, int32_t aHeight,
|
||||
|
||||
mBounds.x = aX;
|
||||
mBounds.y = aY;
|
||||
mBounds.SizeTo(GetSafeWindowSize(nsIntSize(aWidth, aHeight)));
|
||||
mBounds.SizeTo(aWidth, aHeight);
|
||||
|
||||
mNeedsMove = true;
|
||||
|
||||
@ -3370,6 +3372,7 @@ nsWindow::Create(nsIWidget *aParent,
|
||||
|
||||
// save our bounds
|
||||
mBounds = aRect;
|
||||
ConstrainSize(&mBounds.width, &mBounds.height);
|
||||
|
||||
// figure out our parent window
|
||||
GtkWidget *parentMozContainer = nullptr;
|
||||
@ -3976,14 +3979,16 @@ nsWindow::SetHasMappedToplevel(bool aState)
|
||||
nsIntSize
|
||||
nsWindow::GetSafeWindowSize(nsIntSize aSize)
|
||||
{
|
||||
// The X protocol uses CARD32 for window sizes, but the server (1.11.3)
|
||||
// reads it as CARD16. Sizes of pixmaps, used for drawing, are (unsigned)
|
||||
// CARD16 in the protocol, but the server's ProcCreatePixmap returns
|
||||
// BadAlloc if dimensions cannot be represented by signed shorts.
|
||||
nsIntSize result = aSize;
|
||||
const int32_t kInt16Max = 32767;
|
||||
if (result.width > kInt16Max) {
|
||||
NS_WARNING("Clamping huge window width");
|
||||
result.width = kInt16Max;
|
||||
}
|
||||
if (result.height > kInt16Max) {
|
||||
NS_WARNING("Clamping huge window height");
|
||||
result.height = kInt16Max;
|
||||
}
|
||||
return result;
|
||||
|
Loading…
Reference in New Issue
Block a user