Merge last PGO-green changeset of mozilla-inbound to mozilla-central

This commit is contained in:
Ed Morley 2012-12-03 19:05:07 +00:00
commit b3e1fc52a1
87 changed files with 2729 additions and 715 deletions

View File

@ -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

View File

@ -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;

View File

@ -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:

View File

@ -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

View File

@ -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 \

View 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>

View File

@ -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>

View File

@ -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);

View File

@ -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))

View 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;
}
}
};

View 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>

View File

@ -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");

View File

@ -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">

View File

@ -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],

View File

@ -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))) \
) \
)
################################################################################

View File

@ -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);
}
}

View File

@ -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")

View File

@ -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()

View File

@ -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()

View File

@ -883,6 +883,7 @@ nsHTMLFormElement::SubmitSubmission(nsFormSubmission* aFormSubmission)
rv = linkHandler->OnLinkClickSync(this, actionURI,
target.get(),
NullString(),
postDataStream, nullptr,
getter_AddRefs(docShell),
getter_AddRefs(mSubmittingRequest));

View File

@ -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);

View File

@ -68,6 +68,7 @@ nsSVGAElement::GetHref(nsIDOMSVGAnimatedString * *aHref)
return mStringAttributes[HREF].ToDOMAnimatedString(aHref, this);
}
NS_IMPL_STRING_ATTR(nsSVGAElement, Download, download)
//----------------------------------------------------------------------
// nsINode methods

View File

@ -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)) {

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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;

View File

@ -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();

View File

@ -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;
};

View File

@ -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]);

View File

@ -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;
};

View File

@ -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;

View File

@ -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() {

View File

@ -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;

View File

@ -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.
*

View File

@ -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;

View File

@ -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

View File

@ -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
/*

View File

@ -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))) \
) \
)
################################################################################

View File

@ -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

View File

@ -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 {

View File

@ -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 *

View File

@ -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_;

View File

@ -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));
}

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -136,6 +136,11 @@ AutoFlushCache::update(uintptr_t newStart, size_t len)
{
}
void
AutoFlushCache::flushAnyway()
{
}
AutoFlushCache::~AutoFlushCache()
{
if (!myCompartment_)

View File

@ -2541,6 +2541,8 @@ TypeCompartment::nukeTypes(FreeOp *fop)
# endif
}
#endif /* JS_METHODJIT */
pendingNukeTypes = false;
}
void

View File

@ -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. */

View File

@ -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);

View File

@ -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();
}

View File

@ -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;
};

View File

@ -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();

View File

@ -0,0 +1 @@
<html style="transition: 1s;"><body onload="document.documentElement.style.stroke = '-moz-objectStroke';"></body></html>

View File

@ -144,3 +144,4 @@ load 782141-1.svg
load 784061-1.svg
load 790072.svg
load 791826-1.svg
load 789390-1.html

View File

@ -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

View File

@ -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)

View File

@ -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);
}

View File

@ -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

View File

@ -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(),

View File

@ -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);

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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_;

View File

@ -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);
}
}

View File

@ -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_ */

View File

@ -34,6 +34,12 @@ LIBS += \
endif
endif
ifdef MOZ_NATIVE_LIBVPX
LIBS += \
$(MOZ_LIBVPX_LIBS) \
$(NULL)
endif
ifeq (gtk2,$(MOZ_WIDGET_TOOLKIT))
LIBS += \
$(XLIBS) \

View File

@ -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) {

View File

@ -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) {

View File

@ -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);

View File

@ -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 {

View File

@ -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();
}
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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 \

View File

@ -156,8 +156,7 @@ class MemoryMonitor extends BroadcastReceiver {
}
ScreenshotHandler.disableScreenshot(false);
GeckoAppShell.geckoEventSync();
GeckoApp.mAppContext.getFavicons().clearMemCache();
Favicons.getInstance().clearMemCache();
}
}

View File

@ -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);
}

View 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>

View 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>

View File

@ -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>

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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;