--- a/accessible/src/base/nsAccessible.cpp
+++ b/accessible/src/base/nsAccessible.cpp
@@ -964,20 +964,18 @@ void nsAccessible::GetBoundsRect(nsRect&
// This is an ancestor frame that will incompass all frames for this content node.
// We need the relative parent so we can get absolute screen coordinates
nsIFrame *ancestorFrame = firstFrame;
while (ancestorFrame) {
*aBoundingFrame = ancestorFrame;
// If any other frame type, we only need to deal with the primary frame
// Otherwise, there may be more frames attached to the same content node
- if (!nsCoreUtils::IsCorrectFrameType(ancestorFrame,
- nsGkAtoms::inlineFrame) &&
- !nsCoreUtils::IsCorrectFrameType(ancestorFrame,
- nsGkAtoms::textFrame))
+ if (ancestorFrame->GetType() != nsGkAtoms::inlineFrame &&
+ ancestorFrame->GetType() != nsGkAtoms::textFrame)
break;
ancestorFrame = ancestorFrame->GetParent();
}
nsIFrame *iterFrame = firstFrame;
nsCOMPtr<nsIContent> firstContent(mContent);
nsIContent* iterContent = firstContent;
PRInt32 depth = 0;
@@ -991,18 +989,17 @@ void nsAccessible::GetBoundsRect(nsRect&
currFrameBounds +=
iterFrame->GetParent()->GetOffsetToExternal(*aBoundingFrame);
// Add this frame's bounds to total
aTotalBounds.UnionRect(aTotalBounds, currFrameBounds);
nsIFrame *iterNextFrame = nsnull;
- if (nsCoreUtils::IsCorrectFrameType(iterFrame,
- nsGkAtoms::inlineFrame)) {
+ if (iterFrame->GetType() == nsGkAtoms::inlineFrame) {
// Only do deeper bounds search if we're on an inline frame
// Inline frames can contain larger frames inside of them
iterNextFrame = iterFrame->GetFirstPrincipalChild();
}
if (iterNextFrame)
++depth; // Child was found in code above this: We are going deeper in this iteration of the loop
else {
--- a/accessible/src/base/nsCoreUtils.cpp
+++ b/accessible/src/base/nsCoreUtils.cpp
@@ -498,27 +498,16 @@ nsCoreUtils::IsErrorPage(nsIDocument *aD
uri->GetPath(path);
NS_NAMED_LITERAL_CSTRING(neterror, "neterror");
NS_NAMED_LITERAL_CSTRING(certerror, "certerror");
return StringBeginsWith(path, neterror) || StringBeginsWith(path, certerror);
}
-bool
-nsCoreUtils::IsCorrectFrameType(nsIFrame *aFrame, nsIAtom *aAtom)
-{
- NS_ASSERTION(aFrame != nsnull,
- "aFrame is null in call to IsCorrectFrameType!");
- NS_ASSERTION(aAtom != nsnull,
- "aAtom is null in call to IsCorrectFrameType!");
-
- return aFrame->GetType() == aAtom;
-}
-
already_AddRefed<nsIDOMNode>
nsCoreUtils::GetDOMNodeForContainer(nsIDocShellTreeItem *aContainer)
{
nsCOMPtr<nsIDocShell> shell = do_QueryInterface(aContainer);
nsCOMPtr<nsIContentViewer> cv;
shell->GetContentViewer(getter_AddRefs(cv));
--- a/accessible/src/base/nsCoreUtils.h
+++ b/accessible/src/base/nsCoreUtils.h
@@ -237,24 +237,16 @@ public:
static bool IsTabDocument(nsIDocument* aDocumentNode);
/**
* Return true if the given document is an error page.
*/
static bool IsErrorPage(nsIDocument *aDocument);
/**
- * Retrun true if the type of given frame equals to the given frame type.
- *
- * @param aFrame the frame
- * @param aAtom the frame type
- */
- static bool IsCorrectFrameType(nsIFrame* aFrame, nsIAtom* aAtom);
-
- /**
* Return presShell for the document containing the given DOM node.
*/
static nsIPresShell *GetPresShellFor(nsINode *aNode)
{
return aNode->OwnerDoc()->GetShell();
}
/**
--- a/b2g/chrome/content/webapi.js
+++ b/b2g/chrome/content/webapi.js
@@ -176,67 +176,87 @@ const ContentPanning = {
this.onTouchMove(evt);
break;
case 'mouseup':
this.onTouchEnd(evt);
break;
case 'click':
evt.stopPropagation();
evt.preventDefault();
- evt.target.removeEventListener('click', this, true);
+
+ let target = evt.target;
+ let view = target.ownerDocument ? target.ownerDocument.defaultView
+ : target;
+ view.removeEventListener('click', this, true, true);
break;
}
},
position: new Point(0 , 0),
onTouchStart: function cp_onTouchStart(evt) {
this.dragging = true;
+ this.panning = false;
+
+ let oldTarget = this.target;
+ [this.target, this.scrollCallback] = this.getPannable(evt.target);
// If there is a pan animation running (from a previous pan gesture) and
// the user touch back the screen, stop this animation immediatly and
- // prevent the possible click action.
+ // prevent the possible click action if the touch happens on the same
+ // target.
+ this.preventNextClick = false;
if (KineticPanning.active) {
KineticPanning.stop();
- this.preventNextClick = true;
+
+ if (oldTarget && oldTarget == this.target)
+ this.preventNextClick = true;
}
- this.scrollCallback = this.getPannable(evt.originalTarget);
+
this.position.set(evt.screenX, evt.screenY);
KineticPanning.record(new Point(0, 0), evt.timeStamp);
},
onTouchEnd: function cp_onTouchEnd(evt) {
if (!this.dragging)
return;
this.dragging = false;
this.onTouchMove(evt);
- let pan = KineticPanning.isPan();
let click = evt.detail;
- if (click && (pan || this.preventNextClick))
- evt.target.addEventListener('click', this, true);
+ if (this.target && click && (this.panning || this.preventNextClick)) {
+ let target = this.target;
+ let view = target.ownerDocument ? target.ownerDocument.defaultView
+ : target;
+ view.addEventListener('click', this, true, true);
+ }
- this.preventNextClick = false;
-
- if (pan)
+ if (this.panning)
KineticPanning.start(this);
},
onTouchMove: function cp_onTouchMove(evt) {
if (!this.dragging || !this.scrollCallback)
return;
let current = this.position;
let delta = new Point(evt.screenX - current.x, evt.screenY - current.y);
current.set(evt.screenX, evt.screenY);
KineticPanning.record(delta, evt.timeStamp);
this.scrollCallback(delta.scale(-1));
+
+ // If a pan action happens, cancel the active state of the
+ // current target.
+ if (!this.panning && KineticPanning.isPan()) {
+ this.panning = true;
+ this._resetActive();
+ }
},
onKineticBegin: function cp_onKineticBegin(evt) {
},
onKineticPan: function cp_onKineticPan(delta) {
return !this.scrollCallback(delta);
@@ -244,39 +264,39 @@ const ContentPanning = {
onKineticEnd: function cp_onKineticEnd() {
if (!this.dragging)
this.scrollCallback = null;
},
getPannable: function cp_getPannable(node) {
if (!(node instanceof Ci.nsIDOMHTMLElement) || node.tagName == 'HTML')
- return null;
+ return [null, null];
let content = node.ownerDocument.defaultView;
while (!(node instanceof Ci.nsIDOMHTMLBodyElement)) {
let style = content.getComputedStyle(node, null);
let overflow = [style.getPropertyValue('overflow'),
style.getPropertyValue('overflow-x'),
style.getPropertyValue('overflow-y')];
let rect = node.getBoundingClientRect();
let isAuto = (overflow.indexOf('auto') != -1 &&
(rect.height < node.scrollHeight ||
rect.width < node.scrollWidth));
let isScroll = (overflow.indexOf('scroll') != -1);
if (isScroll || isAuto)
- return this._generateCallback(node);
+ return [node, this._generateCallback(node)];
node = node.parentNode;
}
- return this._generateCallback(content);
+ return [content, this._generateCallback(content)];
},
_generateCallback: function cp_generateCallback(content) {
function scroll(delta) {
if (content instanceof Ci.nsIDOMHTMLElement) {
let oldX = content.scrollLeft, oldY = content.scrollTop;
content.scrollLeft += delta.x;
content.scrollTop += delta.y;
@@ -285,16 +305,29 @@ const ContentPanning = {
} else {
let oldX = content.scrollX, oldY = content.scrollY;
content.scrollBy(delta.x, delta.y);
let newX = content.scrollX, newY = content.scrollY;
return (newX != oldX) || (newY != oldY);
}
}
return scroll;
+ },
+
+ get _domUtils() {
+ delete this._domUtils;
+ return this._domUtils = Cc['@mozilla.org/inspector/dom-utils;1']
+ .getService(Ci.inIDOMUtils);
+ },
+
+ _resetActive: function cp_resetActive() {
+ let root = this.target.ownerDocument || this.target.document;
+
+ const kStateActive = 0x00000001;
+ this._domUtils.setContentState(root.documentElement, kStateActive);
}
};
ContentPanning.init();
// Min/max velocity of kinetic panning. This is in pixels/millisecond.
const kMinVelocity = 0.4;
@@ -365,41 +398,43 @@ const KineticPanning = {
this.target.onKineticBegin();
},
stop: function kp_stop() {
if (!this.target)
return;
this.momentums = [];
+ this.distance.set(0, 0);
this.target.onKineticEnd();
this.target = null;
},
momentums: [],
record: function kp_record(delta, timestamp) {
this.momentums.push({ 'time': timestamp, 'dx' : delta.x, 'dy' : delta.y });
+ this.distance.add(delta.x, delta.y);
},
- isPan: function cp_isPan() {
+ get threshold() {
let dpi = content.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindowUtils)
.displayDPI;
let threshold = Services.prefs.getIntPref('ui.dragThresholdX') / 240 * dpi;
- let deltaX = 0;
- let deltaY = 0;
- let start = this.momentums[0].time;
- return this.momentums.slice(1).some(function(momentum) {
- deltaX += momentum.dx;
- deltaY += momentum.dy;
- return (Math.abs(deltaX) > threshold) || (Math.abs(deltaY) > threshold);
- });
+ delete this.threshold;
+ return this.threshold = threshold;
+ },
+
+ distance: new Point(0, 0),
+ isPan: function cp_isPan() {
+ return (Math.abs(this.distance.x) > this.threshold ||
+ Math.abs(this.distance.y) > this.threshold);
},
_startAnimation: function kp_startAnimation() {
let c = kExponentialC;
function getNextPosition(position, v, a, t) {
// Important traits for this function:
// p(t=0) is 0
// p'(t=0) is v0
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -3984,20 +3984,32 @@ var FullScreen = {
this.mouseoverToggle(true);
// This is needed if they use the context menu to quit fullscreen
this._isPopupOpen = false;
this.cleanup();
}
},
- exitDomFullScreen : function(e) {
+ exitDomFullScreen : function() {
document.mozCancelFullScreen();
},
+ handleEvent: function (event) {
+ switch (event.type) {
+ case "deactivate":
+ // We must call exitDomFullScreen asynchronously, since "deactivate" is
+ // dispatched in the middle of the focus manager's window lowering code,
+ // and the focus manager gets confused if we exit fullscreen mode in the
+ // middle of window lowering. See bug 729872.
+ setTimeout(this.exitDomFullScreen.bind(this), 0);
+ break;
+ }
+ },
+
enterDomFullScreen : function(event) {
if (!document.mozFullScreen) {
return;
}
// We receive "mozfullscreenchange" events for each subdocument which
// is an ancestor of the document containing the element which requested
// full-screen. Only add listeners and show warning etc when the event we
@@ -4034,17 +4046,17 @@ var FullScreen = {
// Exit DOM full-screen mode upon open, close, or change tab.
gBrowser.tabContainer.addEventListener("TabOpen", this.exitDomFullScreen);
gBrowser.tabContainer.addEventListener("TabClose", this.exitDomFullScreen);
gBrowser.tabContainer.addEventListener("TabSelect", this.exitDomFullScreen);
// Exit DOM full-screen mode when the browser window loses focus (ALT+TAB, etc).
if (gPrefService.getBoolPref("full-screen-api.exit-on-deactivate")) {
- window.addEventListener("deactivate", this.exitDomFullScreen, true);
+ window.addEventListener("deactivate", this);
}
// Cancel any "hide the toolbar" animation which is in progress, and make
// the toolbar hide immediately.
this._cancelAnimation();
this.mouseoverToggle(false);
// If there's a full-screen toggler, remove its listeners, so that mouseover
@@ -4069,17 +4081,17 @@ var FullScreen = {
if (fullScrToggler) {
fullScrToggler.removeEventListener("mouseover", this._expandCallback, false);
fullScrToggler.removeEventListener("dragenter", this._expandCallback, false);
}
this.cancelWarning();
gBrowser.tabContainer.removeEventListener("TabOpen", this.exitDomFullScreen);
gBrowser.tabContainer.removeEventListener("TabClose", this.exitDomFullScreen);
gBrowser.tabContainer.removeEventListener("TabSelect", this.exitDomFullScreen);
- window.removeEventListener("deactivate", this.exitDomFullScreen, true);
+ window.removeEventListener("deactivate", this);
}
},
observe: function(aSubject, aTopic, aData)
{
if (aData == "browser.fullscreen.autohide") {
if (gPrefService.getBoolPref("browser.fullscreen.autohide")) {
gBrowser.mPanelContainer.addEventListener("mousemove",
@@ -6116,113 +6128,124 @@ function charsetLoadListener(event) {
if (!gCharsetMenu)
gCharsetMenu = Cc['@mozilla.org/rdf/datasource;1?name=charset-menu'].getService(Ci.nsICurrentCharsetListener);
gCharsetMenu.SetCurrentCharset(charset);
gPrevCharset = gLastBrowserCharset;
gLastBrowserCharset = charset;
}
}
-/* Begin Page Style Functions */
-function getAllStyleSheets(frameset) {
- var styleSheetsArray = Array.slice(frameset.document.styleSheets);
- for (let i = 0; i < frameset.frames.length; i++) {
- let frameSheets = getAllStyleSheets(frameset.frames[i]);
- styleSheetsArray = styleSheetsArray.concat(frameSheets);
- }
- return styleSheetsArray;
-}
-
-function stylesheetFillPopup(menuPopup) {
- var noStyle = menuPopup.firstChild;
- var persistentOnly = noStyle.nextSibling;
- var sep = persistentOnly.nextSibling;
- while (sep.nextSibling)
- menuPopup.removeChild(sep.nextSibling);
-
- var styleSheets = getAllStyleSheets(window.content);
- var currentStyleSheets = {};
- var styleDisabled = getMarkupDocumentViewer().authorStyleDisabled;
- var haveAltSheets = false;
- var altStyleSelected = false;
-
- for (let i = 0; i < styleSheets.length; ++i) {
- let currentStyleSheet = styleSheets[i];
-
- if (!currentStyleSheet.title)
- continue;
-
- // Skip any stylesheets whose media attribute doesn't match.
- if (currentStyleSheet.media.length > 0) {
- let mediaQueryList = currentStyleSheet.media.mediaText;
- if (!window.content.matchMedia(mediaQueryList).matches)
+
+var gPageStyleMenu = {
+
+ getAllStyleSheets: function (frameset) {
+ var styleSheetsArray = Array.slice(frameset.document.styleSheets);
+ for (let i = 0; i < frameset.frames.length; i++) {
+ let frameSheets = this.getAllStyleSheets(frameset.frames[i]);
+ styleSheetsArray = styleSheetsArray.concat(frameSheets);
+ }
+ return styleSheetsArray;
+ },
+
+ stylesheetFillPopup: function (menuPopup) {
+ var noStyle = menuPopup.firstChild;
+ var persistentOnly = noStyle.nextSibling;
+ var sep = persistentOnly.nextSibling;
+ while (sep.nextSibling)
+ menuPopup.removeChild(sep.nextSibling);
+
+ var styleSheets = this.getAllStyleSheets(window.content);
+ var currentStyleSheets = {};
+ var styleDisabled = getMarkupDocumentViewer().authorStyleDisabled;
+ var haveAltSheets = false;
+ var altStyleSelected = false;
+
+ for (let i = 0; i < styleSheets.length; ++i) {
+ let currentStyleSheet = styleSheets[i];
+
+ if (!currentStyleSheet.title)
continue;
- }
-
- if (!currentStyleSheet.disabled)
- altStyleSelected = true;
-
- haveAltSheets = true;
-
- let lastWithSameTitle = null;
- if (currentStyleSheet.title in currentStyleSheets)
- lastWithSameTitle = currentStyleSheets[currentStyleSheet.title];
-
- if (!lastWithSameTitle) {
- let menuItem = document.createElement("menuitem");
- menuItem.setAttribute("type", "radio");
- menuItem.setAttribute("label", currentStyleSheet.title);
- menuItem.setAttribute("data", currentStyleSheet.title);
- menuItem.setAttribute("checked", !currentStyleSheet.disabled && !styleDisabled);
- menuPopup.appendChild(menuItem);
- currentStyleSheets[currentStyleSheet.title] = menuItem;
- } else if (currentStyleSheet.disabled) {
- lastWithSameTitle.removeAttribute("checked");
- }
- }
-
- noStyle.setAttribute("checked", styleDisabled);
- persistentOnly.setAttribute("checked", !altStyleSelected && !styleDisabled);
- persistentOnly.hidden = (window.content.document.preferredStyleSheetSet) ? haveAltSheets : false;
- sep.hidden = (noStyle.hidden && persistentOnly.hidden) || !haveAltSheets;
- return true;
-}
-
-function stylesheetInFrame(frame, title) {
- return Array.some(frame.document.styleSheets,
- function (stylesheet) stylesheet.title == title);
-}
-
-function stylesheetSwitchFrame(frame, title) {
- var docStyleSheets = frame.document.styleSheets;
-
- for (let i = 0; i < docStyleSheets.length; ++i) {
- let docStyleSheet = docStyleSheets[i];
-
- if (title == "_nostyle")
- docStyleSheet.disabled = true;
- else if (docStyleSheet.title)
- docStyleSheet.disabled = (docStyleSheet.title != title);
- else if (docStyleSheet.disabled)
- docStyleSheet.disabled = false;
- }
-}
-
-function stylesheetSwitchAll(frameset, title) {
- if (!title || title == "_nostyle" || stylesheetInFrame(frameset, title))
- stylesheetSwitchFrame(frameset, title);
-
- for (let i = 0; i < frameset.frames.length; i++)
- stylesheetSwitchAll(frameset.frames[i], title);
-}
-
-function setStyleDisabled(disabled) {
- getMarkupDocumentViewer().authorStyleDisabled = disabled;
-}
-/* End of the Page Style functions */
+
+ // Skip any stylesheets whose media attribute doesn't match.
+ if (currentStyleSheet.media.length > 0) {
+ let mediaQueryList = currentStyleSheet.media.mediaText;
+ if (!window.content.matchMedia(mediaQueryList).matches)
+ continue;
+ }
+
+ if (!currentStyleSheet.disabled)
+ altStyleSelected = true;
+
+ haveAltSheets = true;
+
+ let lastWithSameTitle = null;
+ if (currentStyleSheet.title in currentStyleSheets)
+ lastWithSameTitle = currentStyleSheets[currentStyleSheet.title];
+
+ if (!lastWithSameTitle) {
+ let menuItem = document.createElement("menuitem");
+ menuItem.setAttribute("type", "radio");
+ menuItem.setAttribute("label", currentStyleSheet.title);
+ menuItem.setAttribute("data", currentStyleSheet.title);
+ menuItem.setAttribute("checked", !currentStyleSheet.disabled && !styleDisabled);
+ menuPopup.appendChild(menuItem);
+ currentStyleSheets[currentStyleSheet.title] = menuItem;
+ } else if (currentStyleSheet.disabled) {
+ lastWithSameTitle.removeAttribute("checked");
+ }
+ }
+
+ noStyle.setAttribute("checked", styleDisabled);
+ persistentOnly.setAttribute("checked", !altStyleSelected && !styleDisabled);
+ persistentOnly.hidden = (window.content.document.preferredStyleSheetSet) ? haveAltSheets : false;
+ sep.hidden = (noStyle.hidden && persistentOnly.hidden) || !haveAltSheets;
+ return true;
+ },
+
+ stylesheetInFrame: function (frame, title) {
+ return Array.some(frame.document.styleSheets,
+ function (stylesheet) stylesheet.title == title);
+ },
+
+ stylesheetSwitchFrame: function (frame, title) {
+ var docStyleSheets = frame.document.styleSheets;
+
+ for (let i = 0; i < docStyleSheets.length; ++i) {
+ let docStyleSheet = docStyleSheets[i];
+
+ if (title == "_nostyle")
+ docStyleSheet.disabled = true;
+ else if (docStyleSheet.title)
+ docStyleSheet.disabled = (docStyleSheet.title != title);
+ else if (docStyleSheet.disabled)
+ docStyleSheet.disabled = false;
+ }
+ },
+
+ stylesheetSwitchAll: function (frameset, title) {
+ if (!title || title == "_nostyle" || this.stylesheetInFrame(frameset, title))
+ this.stylesheetSwitchFrame(frameset, title);
+
+ for (let i = 0; i < frameset.frames.length; i++)
+ this.stylesheetSwitchAll(frameset.frames[i], title);
+ },
+
+ setStyleDisabled: function (disabled) {
+ getMarkupDocumentViewer().authorStyleDisabled = disabled;
+ },
+};
+
+/* Legacy global page-style functions */
+var getAllStyleSheets = gPageStyleMenu.getAllStyleSheets;
+var stylesheetFillPopup = gPageStyleMenu.stylesheetFillPopup;
+var stylesheetInFrame = gPageStyleMenu.stylesheetInFrame;
+var stylesheetSwitchFrame = gPageStyleMenu.stylesheetSwitchFrame;
+var stylesheetSwitchAll = gPageStyleMenu.stylesheetSwitchAll;
+var setStyleDisabled = gPageStyleMenu.setStyleDisabled;
+
var BrowserOffline = {
_inited: false,
/////////////////////////////////////////////////////////////////////////////
// BrowserOffline Public Methods
init: function ()
{
--- a/caps/src/nsNullPrincipalURI.cpp
+++ b/caps/src/nsNullPrincipalURI.cpp
@@ -62,21 +62,22 @@ nsNullPrincipalURI::nsNullPrincipalURI(c
static NS_DEFINE_CID(kNullPrincipalURIImplementationCID,
NS_NULLPRINCIPALURI_IMPLEMENTATION_CID);
NS_IMPL_THREADSAFE_ADDREF(nsNullPrincipalURI)
NS_IMPL_THREADSAFE_RELEASE(nsNullPrincipalURI)
NS_INTERFACE_MAP_BEGIN(nsNullPrincipalURI)
- NS_INTERFACE_MAP_ENTRY(nsISupports)
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIURI)
if (aIID.Equals(kNullPrincipalURIImplementationCID))
foundInterface = static_cast<nsIURI *>(this);
else
NS_INTERFACE_MAP_ENTRY(nsIURI)
+ NS_INTERFACE_MAP_ENTRY(nsISizeOf)
NS_INTERFACE_MAP_END
////////////////////////////////////////////////////////////////////////////////
//// nsIURI
NS_IMETHODIMP
nsNullPrincipalURI::GetAsciiHost(nsACString &_host)
{
@@ -294,8 +295,24 @@ nsNullPrincipalURI::Resolve(const nsACSt
}
NS_IMETHODIMP
nsNullPrincipalURI::SchemeIs(const char *aScheme, bool *_schemeIs)
{
*_schemeIs = (0 == nsCRT::strcasecmp(mScheme.get(), aScheme));
return NS_OK;
}
+
+////////////////////////////////////////////////////////////////////////////////
+//// nsISizeOf
+
+size_t
+nsNullPrincipalURI::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const
+{
+ return mScheme.SizeOfExcludingThisIfUnshared(aMallocSizeOf) +
+ mPath.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
+}
+
+size_t
+nsNullPrincipalURI::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf) const {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
--- a/caps/src/nsNullPrincipalURI.h
+++ b/caps/src/nsNullPrincipalURI.h
@@ -40,30 +40,36 @@
/**
* This wraps nsSimpleURI so that all calls to it are done on the main thread.
*/
#ifndef __nsNullPrincipalURI_h__
#define __nsNullPrincipalURI_h__
#include "nsIURI.h"
+#include "nsISizeOf.h"
#include "nsAutoPtr.h"
#include "nsString.h"
// {51fcd543-3b52-41f7-b91b-6b54102236e6}
#define NS_NULLPRINCIPALURI_IMPLEMENTATION_CID \
{0x51fcd543, 0x3b52, 0x41f7, \
{0xb9, 0x1b, 0x6b, 0x54, 0x10, 0x22, 0x36, 0xe6} }
class nsNullPrincipalURI : public nsIURI
+ , public nsISizeOf
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIURI
+ // nsISizeOf
+ virtual size_t SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const;
+ virtual size_t SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf) const;
+
nsNullPrincipalURI(const nsCString &aSpec);
private:
nsCString mScheme;
nsCString mPath;
};
#endif // __nsNullPrincipalURI_h__
--- a/content/base/src/Link.cpp
+++ b/content/base/src/Link.cpp
@@ -36,16 +36,17 @@
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "Link.h"
#include "nsEventStates.h"
#include "nsIURL.h"
+#include "nsISizeOf.h"
#include "nsContentUtils.h"
#include "nsEscape.h"
#include "nsGkAtoms.h"
#include "nsString.h"
#include "mozAutoDocUpdate.h"
#include "mozilla/Services.h"
@@ -526,10 +527,29 @@ Link::SetHrefAttribute(nsIURI *aURI)
NS_ASSERTION(aURI, "Null URI is illegal!");
nsCAutoString href;
(void)aURI->GetSpec(href);
(void)mElement->SetAttr(kNameSpaceID_None, nsGkAtoms::href,
NS_ConvertUTF8toUTF16(href), true);
}
+size_t
+Link::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const
+{
+ size_t n = 0;
+
+ if (mCachedURI) {
+ nsCOMPtr<nsISizeOf> iface = do_QueryInterface(mCachedURI);
+ if (iface) {
+ n += iface->SizeOfIncludingThis(aMallocSizeOf);
+ }
+ }
+
+ // The following members don't need to be measured:
+ // - mElement, because it is a pointer-to-self used to avoid QIs
+ // - mHistory, because it is non-owning
+
+ return n;
+}
+
} // namespace dom
} // namespace mozilla
--- a/content/base/src/Link.h
+++ b/content/base/src/Link.h
@@ -126,16 +126,19 @@ public:
/**
* Checks if DNS Prefetching is ok
*
* @returns boolean
* Defaults to true; should be overridden for specialised cases
*/
virtual bool HasDeferredDNSPrefetchRequest() { return true; }
+ virtual size_t
+ SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const;
+
protected:
virtual ~Link();
bool HasCachedURI() const { return !!mCachedURI; }
private:
/**
* Unregisters from History so this node no longer gets notifications about
--- a/content/base/src/nsCrossSiteListenerProxy.cpp
+++ b/content/base/src/nsCrossSiteListenerProxy.cpp
@@ -39,17 +39,16 @@
#include "nsIChannel.h"
#include "nsIHttpChannel.h"
#include "nsDOMError.h"
#include "nsContentUtils.h"
#include "nsIScriptSecurityManager.h"
#include "nsNetUtil.h"
#include "nsIParser.h"
#include "nsParserCIID.h"
-#include "nsICharsetAlias.h"
#include "nsMimeTypes.h"
#include "nsIStreamConverterService.h"
#include "nsStringStream.h"
#include "nsGkAtoms.h"
#include "nsWhitespaceTokenizer.h"
#include "nsIChannelEventSink.h"
#include "nsIAsyncVerifyRedirectCallback.h"
#include "nsCharSeparatedTokenizer.h"
--- a/content/base/src/nsDOMFile.cpp
+++ b/content/base/src/nsDOMFile.cpp
@@ -38,17 +38,16 @@
#include "nsDOMFile.h"
#include "nsCExternalHandlerService.h"
#include "nsContentCID.h"
#include "nsContentUtils.h"
#include "nsDOMClassInfoID.h"
#include "nsDOMError.h"
-#include "nsICharsetAlias.h"
#include "nsICharsetDetector.h"
#include "nsICharsetConverterManager.h"
#include "nsIConverterInputStream.h"
#include "nsIDocument.h"
#include "nsIDOMDocument.h"
#include "nsIFileStreams.h"
#include "nsIInputStream.h"
#include "nsIIPCSerializable.h"
--- a/content/base/src/nsDOMFileReader.cpp
+++ b/content/base/src/nsDOMFileReader.cpp
@@ -37,17 +37,17 @@
#include "nsDOMFileReader.h"
#include "nsContentCID.h"
#include "nsContentUtils.h"
#include "nsDOMClassInfoID.h"
#include "nsDOMFile.h"
#include "nsDOMError.h"
-#include "nsICharsetAlias.h"
+#include "nsCharsetAlias.h"
#include "nsICharsetDetector.h"
#include "nsICharsetConverterManager.h"
#include "nsIConverterInputStream.h"
#include "nsIFile.h"
#include "nsIFileStreams.h"
#include "nsIInputStream.h"
#include "nsIMIMEService.h"
#include "nsIPlatformCharset.h"
@@ -490,20 +490,17 @@ nsDOMFileReader::GetAsText(const nsACStr
if (!aCharset.IsEmpty()) {
charsetGuess = aCharset;
} else {
rv = GuessCharset(aFileData, aDataLen, charsetGuess);
NS_ENSURE_SUCCESS(rv, rv);
}
nsCAutoString charset;
- nsCOMPtr<nsICharsetAlias> alias = do_GetService(NS_CHARSETALIAS_CONTRACTID, &rv);
- NS_ENSURE_SUCCESS(rv, rv);
-
- rv = alias->GetPreferred(charsetGuess, charset);
+ rv = nsCharsetAlias::GetPreferred(charsetGuess, charset);
NS_ENSURE_SUCCESS(rv, rv);
rv = ConvertStream(aFileData, aDataLen, charset.get(), aResult);
return NS_OK;
}
nsresult
--- a/content/base/src/nsDocument.cpp
+++ b/content/base/src/nsDocument.cpp
@@ -142,17 +142,17 @@
#include "nsIScriptContext.h"
#include "nsBindingManager.h"
#include "nsIDOMHTMLDocument.h"
#include "nsIDOMHTMLFormElement.h"
#include "nsIRequest.h"
#include "nsILink.h"
#include "nsBlobProtocolHandler.h"
-#include "nsICharsetAlias.h"
+#include "nsCharsetAlias.h"
#include "nsIParser.h"
#include "nsIContentSink.h"
#include "nsDateTimeFormatCID.h"
#include "nsIDateTimeFormat.h"
#include "nsEventDispatcher.h"
#include "nsMutationEvent.h"
#include "nsIDOMXPathEvaluator.h"
@@ -3007,23 +3007,20 @@ nsDocument::GetBaseTarget(nsAString &aBa
void
nsDocument::SetDocumentCharacterSet(const nsACString& aCharSetID)
{
if (!mCharacterSet.Equals(aCharSetID)) {
mCharacterSet = aCharSetID;
#ifdef DEBUG
- nsCOMPtr<nsICharsetAlias> calias(do_GetService(NS_CHARSETALIAS_CONTRACTID));
- if (calias) {
- nsCAutoString canonicalName;
- calias->GetPreferred(aCharSetID, canonicalName);
- NS_ASSERTION(canonicalName.Equals(aCharSetID),
- "charset name must be canonical");
- }
+ nsCAutoString canonicalName;
+ nsCharsetAlias::GetPreferred(aCharSetID, canonicalName);
+ NS_ASSERTION(canonicalName.Equals(aCharSetID),
+ "charset name must be canonical");
#endif
PRInt32 n = mCharSetObservers.Length();
for (PRInt32 i = 0; i < n; i++) {
nsIObserver* observer = mCharSetObservers.ElementAt(i);
observer->Observe(static_cast<nsIDocument *>(this), "charset",
@@ -3167,26 +3164,20 @@ nsDocument::TryChannelCharset(nsIChannel
if(kCharsetFromChannel <= aCharsetSource) {
return true;
}
if (aChannel) {
nsCAutoString charsetVal;
nsresult rv = aChannel->GetContentCharset(charsetVal);
if (NS_SUCCEEDED(rv)) {
- nsCOMPtr<nsICharsetAlias> calias(do_GetService(NS_CHARSETALIAS_CONTRACTID));
- if (calias) {
- nsCAutoString preferred;
- rv = calias->GetPreferred(charsetVal,
- preferred);
- if(NS_SUCCEEDED(rv)) {
- aCharset = preferred;
- aCharsetSource = kCharsetFromChannel;
- return true;
- }
+ rv = nsCharsetAlias::GetPreferred(charsetVal, aCharset);
+ if(NS_SUCCEEDED(rv)) {
+ aCharsetSource = kCharsetFromChannel;
+ return true;
}
}
}
return false;
}
nsresult
nsDocument::CreateShell(nsPresContext* aContext, nsIViewManager* aViewManager,
--- a/content/base/src/nsXMLHttpRequest.cpp
+++ b/content/base/src/nsXMLHttpRequest.cpp
@@ -56,17 +56,17 @@
#include "nsISupportsPrimitives.h"
#include "nsGUIEvent.h"
#include "nsIPrivateDOMEvent.h"
#include "prprf.h"
#include "nsIDOMEventListener.h"
#include "nsIJSContextStack.h"
#include "nsIScriptSecurityManager.h"
#include "nsWeakPtr.h"
-#include "nsICharsetAlias.h"
+#include "nsCharsetAlias.h"
#include "nsIScriptGlobalObject.h"
#include "nsDOMClassInfoID.h"
#include "nsIDOMElement.h"
#include "nsIDOMWindow.h"
#include "nsIMIMEService.h"
#include "nsCExternalHandlerService.h"
#include "nsIVariant.h"
#include "nsVariant.h"
@@ -807,21 +807,17 @@ nsXMLHttpRequest::DetectCharset()
if (!channel) {
channel = mChannel;
}
nsCAutoString charsetVal;
nsresult rv = channel ? channel->GetContentCharset(charsetVal) :
NS_ERROR_FAILURE;
if (NS_SUCCEEDED(rv)) {
- nsCOMPtr<nsICharsetAlias> calias =
- do_GetService(NS_CHARSETALIAS_CONTRACTID, &rv);
- if (NS_SUCCEEDED(rv) && calias) {
- rv = calias->GetPreferred(charsetVal, mResponseCharset);
- }
+ rv = nsCharsetAlias::GetPreferred(charsetVal, mResponseCharset);
}
if (NS_FAILED(rv) || mResponseCharset.IsEmpty()) {
// MS documentation states UTF-8 is default for responseText
mResponseCharset.AssignLiteral("UTF-8");
}
if (mResponseType == XML_HTTP_RESPONSE_TYPE_JSON &&
--- a/content/html/content/src/nsFormSubmission.cpp
+++ b/content/html/content/src/nsFormSubmission.cpp
@@ -55,17 +55,17 @@
#include "nsIDOMFile.h"
#include "nsDirectoryServiceDefs.h"
#include "nsStringStream.h"
#include "nsIURI.h"
#include "nsIURL.h"
#include "nsNetUtil.h"
#include "nsLinebreakConverter.h"
#include "nsICharsetConverterManager.h"
-#include "nsICharsetAlias.h"
+#include "nsCharsetAlias.h"
#include "nsEscape.h"
#include "nsUnicharUtils.h"
#include "nsIMultiplexInputStream.h"
#include "nsIMIMEInputStream.h"
#include "nsIMIMEService.h"
#include "nsIConsoleService.h"
#include "nsIScriptError.h"
#include "nsIStringBundle.h"
@@ -777,46 +777,38 @@ nsEncodingFormSubmission::EncodeVal(cons
// --------------------------------------------------------------------------
static void
GetSubmitCharset(nsGenericHTMLElement* aForm,
nsACString& oCharset)
{
oCharset.AssignLiteral("UTF-8"); // default to utf-8
- nsresult rv = NS_OK;
nsAutoString acceptCharsetValue;
aForm->GetAttr(kNameSpaceID_None, nsGkAtoms::acceptcharset,
acceptCharsetValue);
PRInt32 charsetLen = acceptCharsetValue.Length();
if (charsetLen > 0) {
PRInt32 offset=0;
PRInt32 spPos=0;
// get charset from charsets one by one
- nsCOMPtr<nsICharsetAlias> calias(do_GetService(NS_CHARSETALIAS_CONTRACTID, &rv));
- if (NS_FAILED(rv)) {
- return;
- }
- if (calias) {
- do {
- spPos = acceptCharsetValue.FindChar(PRUnichar(' '), offset);
- PRInt32 cnt = ((-1==spPos)?(charsetLen-offset):(spPos-offset));
- if (cnt > 0) {
- nsAutoString uCharset;
- acceptCharsetValue.Mid(uCharset, offset, cnt);
+ do {
+ spPos = acceptCharsetValue.FindChar(PRUnichar(' '), offset);
+ PRInt32 cnt = ((-1==spPos)?(charsetLen-offset):(spPos-offset));
+ if (cnt > 0) {
+ nsAutoString uCharset;
+ acceptCharsetValue.Mid(uCharset, offset, cnt);
- if (NS_SUCCEEDED(calias->
- GetPreferred(NS_LossyConvertUTF16toASCII(uCharset),
- oCharset)))
- return;
- }
- offset = spPos + 1;
- } while (spPos != -1);
- }
+ if (NS_SUCCEEDED(nsCharsetAlias::GetPreferred(NS_LossyConvertUTF16toASCII(uCharset),
+ oCharset)))
+ return;
+ }
+ offset = spPos + 1;
+ } while (spPos != -1);
}
// if there are no accept-charset or all the charset are not supported
// Get the charset from document
nsIDocument* doc = aForm->GetDocument();
if (doc) {
oCharset = doc->GetDocumentCharacterSet();
}
}
--- a/content/html/content/src/nsHTMLAnchorElement.cpp
+++ b/content/html/content/src/nsHTMLAnchorElement.cpp
@@ -91,18 +91,18 @@ public:
}
NS_SCRIPTABLE NS_IMETHOD SetInnerHTML(const nsAString& aInnerHTML) {
return nsGenericHTMLElement::SetInnerHTML(aInnerHTML);
}
// nsIDOMHTMLAnchorElement
NS_DECL_NSIDOMHTMLANCHORELEMENT
- // TODO: nsHTMLAnchorElement::SizeOfAnchorElement should call
- // Link::SizeOfExcludingThis(). See bug 682431.
+ // DOM memory reporter participant
+ NS_DECL_SIZEOF_EXCLUDING_THIS
// nsILink
NS_IMETHOD LinkAdded() { return NS_OK; }
NS_IMETHOD LinkRemoved() { return NS_OK; }
virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
nsIContent* aBindingParent,
bool aCompileEventHandlers);
@@ -515,8 +515,15 @@ nsHTMLAnchorElement::ParseAttribute(PRIn
}
nsEventStates
nsHTMLAnchorElement::IntrinsicState() const
{
return Link::LinkState() | nsGenericHTMLElement::IntrinsicState();
}
+size_t
+nsHTMLAnchorElement::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const
+{
+ return nsGenericHTMLElement::SizeOfExcludingThis(aMallocSizeOf) +
+ Link::SizeOfExcludingThis(aMallocSizeOf);
+}
+
--- a/content/html/content/src/nsHTMLAreaElement.cpp
+++ b/content/html/content/src/nsHTMLAreaElement.cpp
@@ -56,18 +56,18 @@ class nsHTMLAreaElement : public nsGener
{
public:
nsHTMLAreaElement(already_AddRefed<nsINodeInfo> aNodeInfo);
virtual ~nsHTMLAreaElement();
// nsISupports
NS_DECL_ISUPPORTS_INHERITED
- // TODO: nsHTMLAreaElement::SizeOfAnchorElement should call
- // Link::SizeOfExcludingThis(). See bug 682431.
+ // DOM memory reporter participant
+ NS_DECL_SIZEOF_EXCLUDING_THIS
// nsIDOMNode
NS_FORWARD_NSIDOMNODE(nsGenericHTMLElement::)
// nsIDOMElement
NS_FORWARD_NSIDOMELEMENT(nsGenericHTMLElement::)
// nsIDOMHTMLElement
@@ -330,8 +330,16 @@ nsHTMLAreaElement::GetHrefURI() const
return GetHrefURIForAnchors();
}
nsEventStates
nsHTMLAreaElement::IntrinsicState() const
{
return Link::LinkState() | nsGenericHTMLElement::IntrinsicState();
}
+
+size_t
+nsHTMLAreaElement::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const
+{
+ return nsGenericHTMLElement::SizeOfExcludingThis(aMallocSizeOf) +
+ Link::SizeOfExcludingThis(aMallocSizeOf);
+}
+
--- a/content/html/content/src/nsHTMLLinkElement.cpp
+++ b/content/html/content/src/nsHTMLLinkElement.cpp
@@ -79,18 +79,18 @@ public:
NS_FORWARD_NSIDOMELEMENT(nsGenericHTMLElement::)
// nsIDOMHTMLElement
NS_FORWARD_NSIDOMHTMLELEMENT(nsGenericHTMLElement::)
// nsIDOMHTMLLinkElement
NS_DECL_NSIDOMHTMLLINKELEMENT
- // TODO: nsHTMLLinkElement::SizeOfAnchorElement should call
- // Link::SizeOfExcludingThis(). See bug 682431.
+ // DOM memory reporter participant
+ NS_DECL_SIZEOF_EXCLUDING_THIS
// nsILink
NS_IMETHOD LinkAdded();
NS_IMETHOD LinkRemoved();
virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
nsIContent* aBindingParent,
bool aCompileEventHandlers);
@@ -453,8 +453,16 @@ nsHTMLLinkElement::GetStyleSheetInfo(nsA
return;
}
nsEventStates
nsHTMLLinkElement::IntrinsicState() const
{
return Link::LinkState() | nsGenericHTMLElement::IntrinsicState();
}
+
+size_t
+nsHTMLLinkElement::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const
+{
+ return nsGenericHTMLElement::SizeOfExcludingThis(aMallocSizeOf) +
+ Link::SizeOfExcludingThis(aMallocSizeOf);
+}
+
--- a/content/html/document/src/nsHTMLDocument.cpp
+++ b/content/html/document/src/nsHTMLDocument.cpp
@@ -35,18 +35,16 @@
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "mozilla/Util.h"
-#include "nsICharsetAlias.h"
-
#include "nsCOMPtr.h"
#include "nsXPIDLString.h"
#include "nsPrintfCString.h"
#include "nsReadableUtils.h"
#include "nsUnicharUtils.h"
#include "nsHTMLDocument.h"
#include "nsIHTMLContentSink.h"
#include "nsIXMLContentSink.h"
@@ -97,17 +95,16 @@
#include "nsGenericHTMLElement.h"
#include "mozilla/css/Loader.h"
#include "nsIHttpChannel.h"
#include "nsIFile.h"
#include "nsEventListenerManager.h"
#include "nsFrameSelection.h"
#include "nsISelectionPrivate.h"//for toStringwithformat code
-#include "nsICharsetAlias.h"
#include "nsContentUtils.h"
#include "nsJSUtils.h"
#include "nsIDocumentEncoder.h" //for outputting selection
#include "nsICachingChannel.h"
#include "nsIJSContextStack.h"
#include "nsIContentViewer.h"
#include "nsIWyciwygChannel.h"
#include "nsIScriptElement.h"
--- a/content/media/nsBuiltinDecoderStateMachine.cpp
+++ b/content/media/nsBuiltinDecoderStateMachine.cpp
@@ -2014,16 +2014,23 @@ void nsBuiltinDecoderStateMachine::Advan
UsecsToDuration(currentFrame->mTime - mStartTime);
NS_ASSERTION(currentFrame->mTime >= mStartTime, "Should have positive frame time");
{
ReentrantMonitorAutoExit exitMon(mDecoder->GetReentrantMonitor());
// If we have video, we want to increment the clock in steps of the frame
// duration.
RenderVideoFrame(currentFrame, presTime);
}
+ // If we're no longer playing after dropping and reacquiring the lock,
+ // playback must've been stopped on the decode thread (by a seek, for
+ // example). In that case, the current frame is probably out of date.
+ if (!IsPlaying()) {
+ ScheduleStateMachine();
+ return;
+ }
mDecoder->GetFrameStatistics().NotifyPresentedFrame();
PRInt64 now = DurationToUsecs(TimeStamp::Now() - mPlayStartTime) + mPlayDuration;
remainingTime = currentFrame->mEndTime - mStartTime - now;
currentFrame = nsnull;
}
// Cap the current time to the larger of the audio and video end time.
// This ensures that if we're running off the system clock, we don't
--- a/content/xml/document/src/nsXMLDocument.cpp
+++ b/content/xml/document/src/nsXMLDocument.cpp
@@ -54,18 +54,16 @@
#include "nsIDOMWindow.h"
#include "nsIDOMDocumentType.h"
#include "nsINameSpaceManager.h"
#include "nsCOMPtr.h"
#include "nsXPIDLString.h"
#include "nsIHttpChannel.h"
#include "nsIURI.h"
#include "nsIServiceManager.h"
-#include "nsICharsetAlias.h"
-#include "nsICharsetAlias.h"
#include "nsNetUtil.h"
#include "nsDOMError.h"
#include "nsIScriptSecurityManager.h"
#include "nsIPrincipal.h"
#include "nsLayoutCID.h"
#include "nsDOMAttribute.h"
#include "nsGUIEvent.h"
#include "nsCExternalHandlerService.h"
--- a/content/xslt/src/xslt/txMozillaStylesheetCompiler.cpp
+++ b/content/xslt/src/xslt/txMozillaStylesheetCompiler.cpp
@@ -34,17 +34,17 @@
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsCOMArray.h"
#include "nsIAuthPrompt.h"
-#include "nsICharsetAlias.h"
+#include "nsCharsetAlias.h"
#include "nsIDOMNode.h"
#include "nsIDOMDocument.h"
#include "nsIDocument.h"
#include "nsIExpatSink.h"
#include "nsIChannelEventSink.h"
#include "nsIInterfaceRequestor.h"
#include "nsILoadGroup.h"
#include "nsINameSpaceManager.h"
@@ -277,52 +277,47 @@ txStylesheetSink::OnDataAvailable(nsIReq
return mListener->OnDataAvailable(aRequest, aContext, aInputStream,
aOffset, aCount);
}
NS_IMETHODIMP
txStylesheetSink::OnStartRequest(nsIRequest *aRequest, nsISupports *aContext)
{
- nsCAutoString charset(NS_LITERAL_CSTRING("UTF-8"));
PRInt32 charsetSource = kCharsetFromDocTypeDefault;
nsCOMPtr<nsIChannel> channel = do_QueryInterface(aRequest);
// check channel's charset...
nsCAutoString charsetVal;
- nsresult rv = channel->GetContentCharset(charsetVal);
- if (NS_SUCCEEDED(rv)) {
- nsCOMPtr<nsICharsetAlias> calias =
- do_GetService(NS_CHARSETALIAS_CONTRACTID);
+ nsCAutoString charset;
+ if (NS_SUCCEEDED(channel->GetContentCharset(charsetVal))) {
+ if (NS_SUCCEEDED(nsCharsetAlias::GetPreferred(charsetVal, charset))) {
+ charsetSource = kCharsetFromChannel;
+ }
+ }
- if (calias) {
- nsCAutoString preferred;
- rv = calias->GetPreferred(charsetVal,
- preferred);
- if (NS_SUCCEEDED(rv)) {
- charset = preferred;
- charsetSource = kCharsetFromChannel;
- }
- }
+ if (charset.IsEmpty()) {
+ charset.AssignLiteral("UTF-8");
}
nsCOMPtr<nsIParser> parser = do_QueryInterface(aContext);
parser->SetDocumentCharset(charset, charsetSource);
nsCAutoString contentType;
channel->GetContentType(contentType);
// Time to sniff! Note: this should go away once file channels do
// sniffing themselves.
nsCOMPtr<nsIURI> uri;
channel->GetURI(getter_AddRefs(uri));
bool sniff;
if (NS_SUCCEEDED(uri->SchemeIs("file", &sniff)) && sniff &&
contentType.Equals(UNKNOWN_CONTENT_TYPE)) {
+ nsresult rv;
nsCOMPtr<nsIStreamConverterService> serv =
do_GetService("@mozilla.org/streamConverters;1", &rv);
if (NS_SUCCEEDED(rv)) {
nsCOMPtr<nsIStreamListener> converter;
rv = serv->AsyncConvertData(UNKNOWN_CONTENT_TYPE,
"*/*",
mListener,
aContext,
--- a/content/xslt/src/xslt/txMozillaTextOutput.cpp
+++ b/content/xslt/src/xslt/txMozillaTextOutput.cpp
@@ -40,17 +40,17 @@
#include "nsContentCID.h"
#include "nsIContent.h"
#include "nsIDocument.h"
#include "nsIDOMDocument.h"
#include "nsIDOMDocumentFragment.h"
#include "nsIDocumentTransformer.h"
#include "nsNetUtil.h"
#include "nsIParser.h"
-#include "nsICharsetAlias.h"
+#include "nsCharsetAlias.h"
#include "nsIPrincipal.h"
#include "txURIUtils.h"
#include "nsContentCreatorFunctions.h"
#include "nsContentUtils.h"
#include "nsGkAtoms.h"
using namespace mozilla::dom;
@@ -179,21 +179,19 @@ txMozillaTextOutput::createResultDocumen
// Reset and set up document
URIUtils::ResetWithSource(mDocument, aSourceDocument);
// Set the charset
if (!mOutputFormat.mEncoding.IsEmpty()) {
NS_LossyConvertUTF16toASCII charset(mOutputFormat.mEncoding);
nsCAutoString canonicalCharset;
- nsCOMPtr<nsICharsetAlias> calias =
- do_GetService("@mozilla.org/intl/charsetalias;1");
- if (calias &&
- NS_SUCCEEDED(calias->GetPreferred(charset, canonicalCharset))) {
+ if (NS_SUCCEEDED(nsCharsetAlias::GetPreferred(charset,
+ canonicalCharset))) {
mDocument->SetDocumentCharacterSetSource(kCharsetFromOtherComponent);
mDocument->SetDocumentCharacterSet(canonicalCharset);
}
}
// Notify the contentsink that the document is created
nsCOMPtr<nsITransformObserver> observer = do_QueryReferent(mObserver);
if (observer) {
--- a/content/xslt/src/xslt/txMozillaXMLOutput.cpp
+++ b/content/xslt/src/xslt/txMozillaXMLOutput.cpp
@@ -59,17 +59,17 @@
#include "nsCSSStyleSheet.h"
#include "txStringUtils.h"
#include "txURIUtils.h"
#include "nsIHTMLDocument.h"
#include "nsIStyleSheetLinkingElement.h"
#include "nsIDocumentTransformer.h"
#include "mozilla/css/Loader.h"
#include "mozilla/dom/Element.h"
-#include "nsICharsetAlias.h"
+#include "nsCharsetAlias.h"
#include "nsIHTMLContentSink.h"
#include "nsContentUtils.h"
#include "txXMLUtils.h"
#include "nsContentSink.h"
#include "nsINode.h"
#include "nsContentCreatorFunctions.h"
#include "txError.h"
@@ -852,21 +852,17 @@ txMozillaXMLOutput::createResultDocument
// Reset and set up the document
URIUtils::ResetWithSource(mDocument, aSourceDocument);
// Set the charset
if (!mOutputFormat.mEncoding.IsEmpty()) {
NS_LossyConvertUTF16toASCII charset(mOutputFormat.mEncoding);
nsCAutoString canonicalCharset;
- nsCOMPtr<nsICharsetAlias> calias =
- do_GetService("@mozilla.org/intl/charsetalias;1");
-
- if (calias &&
- NS_SUCCEEDED(calias->GetPreferred(charset, canonicalCharset))) {
+ if (NS_SUCCEEDED(nsCharsetAlias::GetPreferred(charset, canonicalCharset))) {
mDocument->SetDocumentCharacterSetSource(kCharsetFromOtherComponent);
mDocument->SetDocumentCharacterSet(canonicalCharset);
}
}
// Set the mime-type
if (!mOutputFormat.mMediaType.IsEmpty()) {
mDocument->SetContentType(mOutputFormat.mMediaType);
--- a/dom/base/nsDOMClassInfo.cpp
+++ b/dom/base/nsDOMClassInfo.cpp
@@ -1612,18 +1612,18 @@ static nsDOMClassInfoData sClassInfoData
EVENTTARGET_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(TelephonyCall, nsEventTargetSH,
EVENTTARGET_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(CallEvent, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
#endif
#ifdef MOZ_B2G_BT
- NS_DEFINE_CLASSINFO_DATA(BluetoothAdapter, nsDOMGenericSH,
- DOM_DEFAULT_SCRIPTABLE_FLAGS)
+ NS_DEFINE_CLASSINFO_DATA(BluetoothAdapter, nsEventTargetSH,
+ EVENTTARGET_SCRIPTABLE_FLAGS)
#endif
NS_DEFINE_CLASSINFO_DATA(DOMError, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(DOMRequest, nsEventTargetSH,
EVENTTARGET_SCRIPTABLE_FLAGS)
};
--- a/dom/bluetooth/BluetoothAdapter.cpp
+++ b/dom/bluetooth/BluetoothAdapter.cpp
@@ -11,151 +11,160 @@
#include "mozilla/LazyIdleThread.h"
#include "BluetoothAdapter.h"
#if defined(MOZ_WIDGET_GONK)
#include <bluedroid/bluetooth.h>
#endif
-#define POWERED_EVENT_NAME NS_LITERAL_STRING("powered")
-
-BEGIN_BLUETOOTH_NAMESPACE
+USING_BLUETOOTH_NAMESPACE
class ToggleBtResultTask : public nsRunnable
{
public:
- ToggleBtResultTask(bool result, nsRefPtr<BluetoothAdapter>& adapterPtr)
+ ToggleBtResultTask(nsRefPtr<BluetoothAdapter>& adapterPtr, bool result)
: mResult(result)
{
- MOZ_ASSERT(!NS_IsMainThread()); // This should be running on the worker thread
+ MOZ_ASSERT(!NS_IsMainThread());
mAdapterPtr.swap(adapterPtr);
}
- NS_IMETHOD Run() {
- MOZ_ASSERT(NS_IsMainThread()); // This method is supposed to run on the main thread!
+ NS_IMETHOD Run()
+ {
+ MOZ_ASSERT(NS_IsMainThread());
+
+ if (!mResult) {
+ //TODO:Bug-731361
+ NS_WARNING("BT firmware loading fails.\n");
+ }
+
+ //mAdapterPtr must be null before returning to prevent the background
+ //thread from racing to release it during the destruction of this runnable.
mAdapterPtr->FirePowered();
+ mAdapterPtr = nsnull;
return NS_OK;
}
private:
+ nsRefPtr<BluetoothAdapter> mAdapterPtr;
bool mResult;
- nsRefPtr<BluetoothAdapter> mAdapterPtr;
};
class ToggleBtTask : public nsRunnable
{
public:
- ToggleBtTask(bool onOff, BluetoothAdapter* adapterPtr)
+ ToggleBtTask(bool onOff, BluetoothAdapter* adapterPtr)
: mOnOff(onOff),
- mAdapterPtr(adapterPtr)
+ mAdapterPtr(adapterPtr)
{
- MOZ_ASSERT(NS_IsMainThread()); // The constructor should be running on the main thread.
+ MOZ_ASSERT(NS_IsMainThread());
}
- NS_IMETHOD Run() {
+ NS_IMETHOD Run()
+ {
+ MOZ_ASSERT(!NS_IsMainThread());
+
bool result;
- MOZ_ASSERT(!NS_IsMainThread()); // This should be running on the worker thread.
-
//Toggle BT here
#if defined(MOZ_WIDGET_GONK)
if (mOnOff) {
result = bt_enable();
} else {
result = bt_disable();
}
-#else
+#else
result = true;
#endif
// Create a result thread and pass it to Main Thread,
- nsCOMPtr<nsIRunnable> resultRunnable = new ToggleBtResultTask(result, mAdapterPtr);
- NS_DispatchToMainThread(resultRunnable);
+ nsCOMPtr<nsIRunnable> resultRunnable = new ToggleBtResultTask(mAdapterPtr, result);
+
+ if (NS_FAILED(NS_DispatchToMainThread(resultRunnable))) {
+ NS_WARNING("Failed to dispatch to main thread!");
+ }
return NS_OK;
}
private:
nsRefPtr<BluetoothAdapter> mAdapterPtr;
bool mOnOff;
};
-END_BLUETOOTH_NAMESPACE
-
-DOMCI_DATA(BluetoothAdapter, mozilla::dom::bluetooth::BluetoothAdapter)
-
-USING_BLUETOOTH_NAMESPACE
+DOMCI_DATA(BluetoothAdapter, BluetoothAdapter)
NS_IMPL_CYCLE_COLLECTION_CLASS(BluetoothAdapter)
-NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(BluetoothAdapter,
- nsDOMEventTargetHelper)
-NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(powered)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(BluetoothAdapter,
+ nsDOMEventTargetHelper)
+ NS_CYCLE_COLLECTION_TRAVERSE_EVENT_HANDLER(powered)
+NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
-NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(BluetoothAdapter,
- nsDOMEventTargetHelper)
-NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(powered)
- NS_IMPL_CYCLE_COLLECTION_UNLINK_END
+NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(BluetoothAdapter,
+ nsDOMEventTargetHelper)
+ NS_CYCLE_COLLECTION_UNLINK_EVENT_HANDLER(powered)
+NS_IMPL_CYCLE_COLLECTION_UNLINK_END
- NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(BluetoothAdapter)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(BluetoothAdapter)
NS_INTERFACE_MAP_ENTRY(nsIDOMBluetoothAdapter)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(BluetoothAdapter)
NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
NS_IMPL_ADDREF_INHERITED(BluetoothAdapter, nsDOMEventTargetHelper)
NS_IMPL_RELEASE_INHERITED(BluetoothAdapter, nsDOMEventTargetHelper)
-BluetoothAdapter::BluetoothAdapter() : mPower(false)
+BluetoothAdapter::BluetoothAdapter()
+ : mPower(false)
{
}
NS_IMETHODIMP
BluetoothAdapter::GetPower(bool* aPower)
{
-#if defined(MOZ_WIDGET_GONK)
- *aPower = bt_is_enabled();
-#else
*aPower = mPower;
-#endif
+
return NS_OK;
}
NS_IMETHODIMP
BluetoothAdapter::SetPower(bool aPower)
{
if (mPower != aPower) {
mPower = aPower;
- ToggleBluetoothAsync();
+ return ToggleBluetoothAsync();
}
return NS_OK;
}
-void
+nsresult
BluetoothAdapter::ToggleBluetoothAsync()
{
if (!mToggleBtThread) {
mToggleBtThread = new LazyIdleThread(15000);
}
nsCOMPtr<nsIRunnable> r = new ToggleBtTask(mPower, this);
- mToggleBtThread->Dispatch(r, 0);
+ return mToggleBtThread->Dispatch(r, NS_DISPATCH_NORMAL);
}
nsresult
BluetoothAdapter::FirePowered()
{
nsRefPtr<nsDOMEvent> event = new nsDOMEvent(nsnull, nsnull);
- nsresult rv = event->InitEvent(POWERED_EVENT_NAME, false, false);
+ nsresult rv = event->InitEvent(NS_LITERAL_STRING("powered"), false, false);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ rv = event->SetTrusted(true);
NS_ENSURE_SUCCESS(rv, rv);
bool dummy;
rv = DispatchEvent(event, &dummy);
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;
}
--- a/dom/bluetooth/BluetoothAdapter.h
+++ b/dom/bluetooth/BluetoothAdapter.h
@@ -6,20 +6,22 @@
#ifndef mozilla_dom_bluetooth_bluetoothadapter_h__
#define mozilla_dom_bluetooth_bluetoothadapter_h__
#include "BluetoothCommon.h"
#include "nsDOMEventTargetHelper.h"
#include "nsIDOMBluetoothAdapter.h"
+class nsIEventTarget;
+
BEGIN_BLUETOOTH_NAMESPACE
class BluetoothAdapter : public nsIDOMBluetoothAdapter
- ,public nsDOMEventTargetHelper
+ , public nsDOMEventTargetHelper
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIDOMBLUETOOTHADAPTER
NS_FORWARD_NSIDOMEVENTTARGET(nsDOMEventTargetHelper::)
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(BluetoothAdapter,
@@ -31,13 +33,13 @@ public:
protected:
bool mPower;
NS_DECL_EVENT_HANDLER(powered)
private:
nsCOMPtr<nsIEventTarget> mToggleBtThread;
- void ToggleBluetoothAsync();
+ nsresult ToggleBluetoothAsync();
};
END_BLUETOOTH_NAMESPACE
#endif
--- a/dom/tests/mochitest/localstorage/test_localStorageBase.html
+++ b/dom/tests/mochitest/localstorage/test_localStorageBase.html
@@ -95,17 +95,17 @@ function startTest()
localStorage.setItem("key2", "value2");
is(localStorage.length, 2, "The storage has two key-value pairs");
is(localStorage.getItem("key1"), "value1");
is(localStorage.getItem("key2"), "value2");
var firstKey = localStorage.key(0);
var secondKey = localStorage.key(1);
ok((firstKey == 'key1' && secondKey == 'key2') ||
(firstKey == 'key2' && secondKey == 'key1'),
- 'Both keys should be present.');
+ 'key() API works.');
// change the second key
localStorage.setItem("key2", "value2-2");
is(localStorage.length, 2, "The storage has two key-value pairs");
is(localStorage.key(0), firstKey); // After key value changes the order must be preserved
is(localStorage.key(1), secondKey);
checkException(function() {localStorage.key(-1);}, INDEX_SIZE_ERR);
checkException(function() {localStorage.key(2);}, INDEX_SIZE_ERR);
--- a/dom/tests/mochitest/localstorage/test_localStorageBasePrivateBrowsing.html
+++ b/dom/tests/mochitest/localstorage/test_localStorageBasePrivateBrowsing.html
@@ -114,17 +114,17 @@ function doTest()
localStorage.setItem("key2", "value2");
is(localStorage.length, 2, "The storage has two key-value pairs");
is(localStorage.getItem("key1"), "value1");
is(localStorage.getItem("key2"), "value2");
var firstKey = localStorage.key(0);
var secondKey = localStorage.key(1);
ok((firstKey == 'key1' && secondKey == 'key2') ||
(firstKey == 'key2' && secondKey == 'key1'),
- 'Both keys should be present.');
+ 'key() API works.');
// change the second key
localStorage.setItem("key2", "value2-2");
is(localStorage.length, 2, "The storage has two key-value pairs");
is(localStorage.key(0), firstKey); // After key value changes the order must be preserved
is(localStorage.key(1), secondKey);
checkException(function() {localStorage.key(-1);}, INDEX_SIZE_ERR);
checkException(function() {localStorage.key(2);}, INDEX_SIZE_ERR);
--- a/dom/tests/mochitest/localstorage/test_localStorageBaseSessionOnly.html
+++ b/dom/tests/mochitest/localstorage/test_localStorageBaseSessionOnly.html
@@ -105,17 +105,17 @@ function startTest()
localStorage.setItem("key2", "value2");
is(localStorage.length, 2, "The storage has two key-value pairs");
is(localStorage.getItem("key1"), "value1");
is(localStorage.getItem("key2"), "value2");
var firstKey = localStorage.key(0);
var secondKey = localStorage.key(1);
ok((firstKey == 'key1' && secondKey == 'key2') ||
(firstKey == 'key2' && secondKey == 'key1'),
- 'Both keys should be present.');
+ 'key() API works.');
// change the second key
localStorage.setItem("key2", "value2-2");
is(localStorage.length, 2, "The storage has two key-value pairs");
is(localStorage.key(0), firstKey); // After key value changes the order must be preserved
is(localStorage.key(1), secondKey);
checkException(function() {localStorage.key(-1);}, INDEX_SIZE_ERR);
checkException(function() {localStorage.key(2);}, INDEX_SIZE_ERR);
--- a/dom/tests/mochitest/sessionstorage/test_sessionStorageBase.html
+++ b/dom/tests/mochitest/sessionstorage/test_sessionStorageBase.html
@@ -97,17 +97,17 @@ function startTest()
sessionStorage.setItem("key2", "value2");
is(sessionStorage.length, 2, "The storage has two key-value pairs");
is(sessionStorage.getItem("key1"), "value1");
is(sessionStorage.getItem("key2"), "value2");
var firstKey = sessionStorage.key(0);
var secondKey = sessionStorage.key(1);
ok((firstKey == 'key1' && secondKey == 'key2') ||
(firstKey == 'key2' && secondKey == 'key1'),
- 'Both keys should be present.');
+ 'key() API works.');
// change the second key
sessionStorage.setItem("key2", "value2-2");
is(sessionStorage.length, 2, "The storage has two key-value pairs");
is(sessionStorage.key(0), firstKey); // After key value changes the order must be preserved
is(sessionStorage.key(1), secondKey);
checkException(function() {sessionStorage.key(-1);}, INDEX_SIZE_ERR);
checkException(function() {sessionStorage.key(2);}, INDEX_SIZE_ERR);
--- a/dom/workers/FileReaderSyncPrivate.cpp
+++ b/dom/workers/FileReaderSyncPrivate.cpp
@@ -40,17 +40,17 @@
#include "FileReaderSyncPrivate.h"
#include "nsCExternalHandlerService.h"
#include "nsComponentManagerUtils.h"
#include "nsCOMPtr.h"
#include "nsDOMClassInfoID.h"
#include "nsDOMError.h"
#include "nsIDOMFile.h"
-#include "nsICharsetAlias.h"
+#include "nsCharsetAlias.h"
#include "nsICharsetDetector.h"
#include "nsIConverterInputStream.h"
#include "nsIInputStream.h"
#include "nsIPlatformCharset.h"
#include "nsISeekableStream.h"
#include "nsISupportsImpl.h"
#include "nsISupportsImpl.h"
#include "nsNetUtil.h"
@@ -130,22 +130,18 @@ FileReaderSyncPrivate::ReadAsText(nsIDOM
// Seek to 0 because guessing the charset advances the stream.
rv = seekable->Seek(nsISeekableStream::NS_SEEK_SET, 0);
NS_ENSURE_SUCCESS(rv, rv);
} else {
CopyUTF16toUTF8(aEncoding, charsetGuess);
}
- nsCOMPtr<nsICharsetAlias> alias =
- do_GetService(NS_CHARSETALIAS_CONTRACTID, &rv);
- NS_ENSURE_SUCCESS(rv, rv);
-
nsCString charset;
- rv = alias->GetPreferred(charsetGuess, charset);
+ rv = nsCharsetAlias::GetPreferred(charsetGuess, charset);
NS_ENSURE_SUCCESS(rv, rv);
return ConvertStream(stream, charset.get(), aResult);
}
nsresult
FileReaderSyncPrivate::ReadAsDataURL(nsIDOMBlob* aBlob, nsAString& aResult)
{
--- a/extensions/spellcheck/src/mozEnglishWordUtils.cpp
+++ b/extensions/spellcheck/src/mozEnglishWordUtils.cpp
@@ -31,17 +31,16 @@
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "mozEnglishWordUtils.h"
-#include "nsICharsetAlias.h"
#include "nsReadableUtils.h"
#include "nsIServiceManager.h"
#include "nsUnicharUtils.h"
#include "nsUnicharUtilCIID.h"
#include "nsUnicodeProperties.h"
#include "nsCRT.h"
NS_IMPL_CYCLE_COLLECTING_ADDREF(mozEnglishWordUtils)
--- a/extensions/spellcheck/src/mozPersonalDictionary.cpp
+++ b/extensions/spellcheck/src/mozPersonalDictionary.cpp
@@ -36,17 +36,16 @@
* ***** END LICENSE BLOCK ***** */
#include "mozPersonalDictionary.h"
#include "nsIUnicharInputStream.h"
#include "nsReadableUtils.h"
#include "nsIFile.h"
#include "nsAppDirectoryServiceDefs.h"
#include "nsICharsetConverterManager.h"
-#include "nsICharsetAlias.h"
#include "nsIObserverService.h"
#include "nsIPrefService.h"
#include "nsIPrefBranch.h"
#include "nsIWeakReference.h"
#include "nsCRT.h"
#include "nsNetUtil.h"
#include "nsStringEnumerator.h"
#include "nsUnicharInputStream.h"
--- a/extensions/universalchardet/src/xpcom/nsUniversalCharDetModule.cpp
+++ b/extensions/universalchardet/src/xpcom/nsUniversalCharDetModule.cpp
@@ -32,17 +32,16 @@
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "mozilla/ModuleUtils.h"
-#include "nsICharsetAlias.h"
#include "nsCOMPtr.h"
#include "nspr.h"
#include "nsString.h"
#include "pratom.h"
#include "nsUniversalCharDetDll.h"
#include "nsISupports.h"
#include "nsICategoryManager.h"
--- a/gfx/angle/angle-castrate-bug-241.patch
+++ b/gfx/angle/angle-castrate-bug-241.patch
@@ -21,17 +21,35 @@ diff --git a/gfx/angle/README.mozilla b/
== How to update this ANGLE copy ==
1. Unapply patches
2. Apply diff with new ANGLE version
3. Reapply patches.
diff --git a/gfx/angle/src/compiler/Types.h b/gfx/angle/src/compiler/Types.h
--- a/gfx/angle/src/compiler/Types.h
+++ b/gfx/angle/src/compiler/Types.h
-@@ -203,17 +203,17 @@ public:
+@@ -5,16 +5,17 @@
+ //
+
+ #ifndef _TYPES_INCLUDED
+ #define _TYPES_INCLUDED
+
+ #include "compiler/BaseTypes.h"
+ #include "compiler/Common.h"
+ #include "compiler/compilerdebug.h"
++#include <cstdlib>
+
+ //
+ // Need to have association of line numbers to types in a list for building structs.
+ //
+ class TType;
+ struct TTypeLine {
+ TType* type;
+ int line;
+@@ -203,17 +204,17 @@ public:
bool isVector() const { return size > 1 && !matrix; }
bool isScalar() const { return size == 1 && !matrix && !structure; }
TTypeList* getStruct() const { return structure; }
void setStruct(TTypeList* s) { structure = s; computeDeepestStructNesting(); }
const TString& getTypeName() const
{
--- a/gfx/angle/src/compiler/Types.h
+++ b/gfx/angle/src/compiler/Types.h
@@ -5,16 +5,17 @@
//
#ifndef _TYPES_INCLUDED
#define _TYPES_INCLUDED
#include "compiler/BaseTypes.h"
#include "compiler/Common.h"
#include "compiler/compilerdebug.h"
+#include <cstdlib>
//
// Need to have association of line numbers to types in a list for building structs.
//
class TType;
struct TTypeLine {
TType* type;
int line;
--- a/gfx/gl/GLContextProviderEGL.cpp
+++ b/gfx/gl/GLContextProviderEGL.cpp
@@ -34,16 +34,17 @@
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
+#include "mozilla/Preferences.h"
#include "mozilla/Util.h"
#if defined(XP_UNIX)
#ifdef MOZ_WIDGET_GTK2
#include <gdk/gdkx.h>
// we're using default display for now
#define GET_NATIVE_WINDOW(aWidget) (EGLNativeWindowType)GDK_WINDOW_XID((GdkWindow *) aWidget->GetNativeData(NS_NATIVE_WINDOW))
@@ -64,16 +65,22 @@
#endif
#if defined(ANDROID)
/* from widget */
#if defined(MOZ_WIDGET_ANDROID)
#include "AndroidBridge.h"
#endif
#include <android/log.h>
+
+// We only need to explicitly dlopen egltrace
+// on android as we can use LD_PRELOAD or other tricks
+// on other platforms. We look for it in /data/local
+// as that's writeable by all users
+#define APITRACE_LIB "/data/local/egltrace.so"
#endif
#define EGL_LIB "libEGL.so"
#define GLES2_LIB "libGLESv2.so"
#define EGL_LIB1 "libEGL.so.1"
#define GLES2_LIB2 "libGLESv2.so.2"
typedef void *EGLNativeDisplayType;
@@ -222,16 +229,48 @@ static EGLint gContextAttribs[] = {
static EGLint gContextAttribsRobustness[] = {
LOCAL_EGL_CONTEXT_CLIENT_VERSION, 2,
//LOCAL_EGL_CONTEXT_ROBUST_ACCESS_EXT, LOCAL_EGL_TRUE,
LOCAL_EGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_EXT, LOCAL_EGL_LOSE_CONTEXT_ON_RESET_EXT,
LOCAL_EGL_NONE
};
+static PRLibrary* LoadApitraceLibrary()
+{
+ static PRLibrary* sApitraceLibrary = NULL;
+
+ if (sApitraceLibrary)
+ return sApitraceLibrary;
+
+#if defined(ANDROID)
+ nsCString logFile = Preferences::GetCString("gfx.apitrace.logfile");
+
+ if (logFile.IsEmpty()) {
+ logFile = "firefox.trace";
+ }
+
+ // The firefox process can't write to /data/local, but it can write
+ // to $GRE_HOME/
+ nsCAutoString logPath;
+ logPath.AppendPrintf("%s/%s", getenv("GRE_HOME"), logFile.get());
+
+ // apitrace uses the TRACE_FILE environment variable to determine where
+ // to log trace output to
+ printf_stderr("Logging GL tracing output to %s", logPath.get());
+ setenv("TRACE_FILE", logPath.get(), false);
+
+ printf_stderr("Attempting load of %s\n", APITRACE_LIB);
+
+ sApitraceLibrary = PR_LoadLibrary(APITRACE_LIB);
+#endif
+
+ return sApitraceLibrary;
+}
+
static int
next_power_of_two(int v)
{
v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
@@ -645,22 +684,27 @@ public:
break;
eglFile->Append(NS_LITERAL_STRING("libEGL.dll"));
eglFile->Load(&mEGLLibrary);
} while (false);
#endif
if (!mEGLLibrary) {
- mEGLLibrary = PR_LoadLibrary(EGL_LIB);
-#if defined(XP_UNIX)
+ mEGLLibrary = LoadApitraceLibrary();
+
if (!mEGLLibrary) {
- mEGLLibrary = PR_LoadLibrary(EGL_LIB1);
+ printf_stderr("Attempting load of %s\n", EGL_LIB);
+ mEGLLibrary = PR_LoadLibrary(EGL_LIB);
+#if defined(XP_UNIX)
+ if (!mEGLLibrary) {
+ mEGLLibrary = PR_LoadLibrary(EGL_LIB1);
+ }
+#endif
}
-#endif
}
if (!mEGLLibrary) {
NS_WARNING("Couldn't load EGL LIB.");
return false;
}
#define SYMBOL(name) \
@@ -1014,24 +1058,29 @@ public:
}
GLContextType GetContextType() {
return ContextTypeEGL;
}
bool Init()
{
- if (!OpenLibrary(GLES2_LIB)) {
+#if defined(ANDROID)
+ // We can't use LoadApitraceLibrary here because the GLContext
+ // expects its own handle to the GL library
+ if (!OpenLibrary(APITRACE_LIB))
+#endif
+ if (!OpenLibrary(GLES2_LIB)) {
#if defined(XP_UNIX)
- if (!OpenLibrary(GLES2_LIB2)) {
- NS_WARNING("Couldn't load EGL LIB.");
+ if (!OpenLibrary(GLES2_LIB2)) {
+ NS_WARNING("Couldn't load GLES2 LIB.");
+ return false;
+ }
+#endif
}
-#endif
- return false;
- }
bool current = MakeCurrent();
if (!current) {
gfx::LogFailure(NS_LITERAL_CSTRING(
"Couldn't get device attachments for device."));
return false;
}
--- a/image/decoders/icon/nsIconURI.cpp
+++ b/image/decoders/icon/nsIconURI.cpp
@@ -93,17 +93,17 @@ nsMozIconURI::~nsMozIconURI()
}
NS_IMPL_THREADSAFE_ISUPPORTS2(nsMozIconURI, nsIMozIconURI, nsIURI)
#define MOZICON_SCHEME "moz-icon:"
#define MOZICON_SCHEME_LEN (sizeof(MOZICON_SCHEME) - 1)
////////////////////////////////////////////////////////////////////////////////
-// nsURI methods:
+// nsIURI methods:
NS_IMETHODIMP
nsMozIconURI::GetSpec(nsACString &aSpec)
{
aSpec = MOZICON_SCHEME;
if (mIconURL)
{
--- a/intl/build/nsI18nModule.cpp
+++ b/intl/build/nsI18nModule.cpp
@@ -84,17 +84,16 @@ NS_DEFINE_NAMED_CID(NS_ENTITYCONVERTER_C
NS_DEFINE_NAMED_CID(NS_SAVEASCHARSET_CID);
NS_DEFINE_NAMED_CID(NS_UNICODE_NORMALIZER_CID);
NS_DEFINE_NAMED_CID(NS_STRINGBUNDLESERVICE_CID);
NS_DEFINE_NAMED_CID(NS_STRINGBUNDLETEXTOVERRIDE_CID);
NS_DEFINE_NAMED_CID(NS_LOCALESERVICE_CID);
NS_DEFINE_NAMED_CID(NS_COLLATIONFACTORY_CID);
NS_DEFINE_NAMED_CID(NS_SCRIPTABLEDATEFORMAT_CID);
NS_DEFINE_NAMED_CID(NS_LANGUAGEATOMSERVICE_CID);
-NS_DEFINE_NAMED_CID(NS_CHARSETALIAS_CID);
NS_DEFINE_NAMED_CID(NS_PLATFORMCHARSET_CID);
#ifdef XP_WIN
NS_DEFINE_NAMED_CID(NS_COLLATION_CID);
NS_DEFINE_NAMED_CID(NS_DATETIMEFORMAT_CID);
#endif
#ifdef USE_UNIX_LOCALE
NS_DEFINE_NAMED_CID(NS_COLLATION_CID);
NS_DEFINE_NAMED_CID(NS_DATETIMEFORMAT_CID);
@@ -119,17 +118,16 @@ static const mozilla::Module::CIDEntry k
{ &kNS_SAVEASCHARSET_CID, false, NULL, nsSaveAsCharsetConstructor },
{ &kNS_UNICODE_NORMALIZER_CID, false, NULL, nsUnicodeNormalizerConstructor },
{ &kNS_STRINGBUNDLESERVICE_CID, false, NULL, nsStringBundleServiceConstructor },
{ &kNS_STRINGBUNDLETEXTOVERRIDE_CID, false, NULL, nsStringBundleTextOverrideConstructor },
{ &kNS_LOCALESERVICE_CID, false, NULL, CreateLocaleService },
{ &kNS_COLLATIONFACTORY_CID, false, NULL, nsCollationFactoryConstructor },
{ &kNS_SCRIPTABLEDATEFORMAT_CID, false, NULL, NS_NewScriptableDateFormat },
{ &kNS_LANGUAGEATOMSERVICE_CID, false, NULL, nsLanguageAtomServiceConstructor },
- { &kNS_CHARSETALIAS_CID, false, NULL, nsCharsetAlias2Constructor },
{ &kNS_PLATFORMCHARSET_CID, false, NULL, nsPlatformCharsetConstructor },
#ifdef XP_WIN
{ &kNS_COLLATION_CID, false, NULL, nsCollationWinConstructor },
{ &kNS_DATETIMEFORMAT_CID, false, NULL, nsDateTimeFormatWinConstructor },
#endif
#ifdef USE_UNIX_LOCALE
{ &kNS_COLLATION_CID, false, NULL, nsCollationUnixConstructor },
{ &kNS_DATETIMEFORMAT_CID, false, NULL, nsDateTimeFormatUnixConstructor },
@@ -156,17 +154,16 @@ static const mozilla::Module::ContractID
{ NS_SAVEASCHARSET_CONTRACTID, &kNS_SAVEASCHARSET_CID },
{ NS_UNICODE_NORMALIZER_CONTRACTID, &kNS_UNICODE_NORMALIZER_CID },
{ NS_STRINGBUNDLE_CONTRACTID, &kNS_STRINGBUNDLESERVICE_CID },
{ NS_STRINGBUNDLETEXTOVERRIDE_CONTRACTID, &kNS_STRINGBUNDLETEXTOVERRIDE_CID },
{ NS_LOCALESERVICE_CONTRACTID, &kNS_LOCALESERVICE_CID },
{ NS_COLLATIONFACTORY_CONTRACTID, &kNS_COLLATIONFACTORY_CID },
{ NS_SCRIPTABLEDATEFORMAT_CONTRACTID, &kNS_SCRIPTABLEDATEFORMAT_CID },
{ NS_LANGUAGEATOMSERVICE_CONTRACTID, &kNS_LANGUAGEATOMSERVICE_CID },
- { NS_CHARSETALIAS_CONTRACTID, &kNS_CHARSETALIAS_CID },
{ NS_PLATFORMCHARSET_CONTRACTID, &kNS_PLATFORMCHARSET_CID },
#ifdef XP_WIN
{ NS_COLLATION_CONTRACTID, &kNS_COLLATION_CID },
{ NS_DATETIMEFORMAT_CONTRACTID, &kNS_DATETIMEFORMAT_CID },
#endif
#ifdef USE_UNIX_LOCALE
{ NS_COLLATION_CONTRACTID, &kNS_COLLATION_CID },
{ NS_DATETIMEFORMAT_CONTRACTID, &kNS_DATETIMEFORMAT_CID },
--- a/intl/chardet/src/nsCharDetConstructors.h
+++ b/intl/chardet/src/nsCharDetConstructors.h
@@ -42,17 +42,16 @@
*/
#ifndef nsCharDetConstructors_h__
#define nsCharDetConstructors_h__
// chardet
#include "nsISupports.h"
#include "nsICharsetDetector.h"
-#include "nsICharsetAlias.h"
#include "nsICharsetDetectionObserver.h"
#include "nsIStringCharsetDetector.h"
#include "nsCyrillicDetector.h"
NS_GENERIC_FACTORY_CONSTRUCTOR(nsRUProbDetector)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsUKProbDetector)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsRUStringProbDetector)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsUKStringProbDetector)
--- a/intl/locale/public/Makefile.in
+++ b/intl/locale/public/Makefile.in
@@ -47,15 +47,15 @@ MODULE = locale
EXPORTS = \
nsCollationCID.h \
nsDateTimeFormatCID.h \
nsIDateTimeFormat.h \
nsILanguageAtomService.h \
nsPosixLocale.h \
nsIOS2Locale.h \
nsWin32Locale.h \
- nsICharsetAlias.h \
+ nsCharsetAlias.h \
nsIPlatformCharset.h \
nsLocaleCID.h \
$(NULL)
include $(topsrcdir)/config/rules.mk
rename from intl/locale/public/nsICharsetAlias.h
rename to intl/locale/public/nsCharsetAlias.h
--- a/intl/locale/public/nsICharsetAlias.h
+++ b/intl/locale/public/nsCharsetAlias.h
@@ -30,40 +30,22 @@
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
-#ifndef nsICharsetAlias_h___
-#define nsICharsetAlias_h___
+#ifndef nsCharsetAlias_h___
+#define nsCharsetAlias_h___
#include "nscore.h"
#include "nsStringGlue.h"
-#include "nsISupports.h"
-/* 0b4028d6-7473-4958-9b3c-4dee46bf68cb */
-#define NS_ICHARSETALIAS_IID \
-{ 0x0b4028d6, \
- 0x7473, \
- 0x4958, \
- {0x9b, 0x3c, 0x4d, 0xee, 0x46, 0xbf, 0x68, 0xcb} }
-
-// {98D41C21-CCF3-11d2-B3B1-00805F8A6670}
-#define NS_CHARSETALIAS_CID \
-{ 0x98d41c21, 0xccf3, 0x11d2, { 0xb3, 0xb1, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 }}
-
-#define NS_CHARSETALIAS_CONTRACTID "@mozilla.org/intl/charsetalias;1"
-
-class nsICharsetAlias : public nsISupports
+class nsCharsetAlias
{
public:
- NS_DECLARE_STATIC_IID_ACCESSOR(NS_ICHARSETALIAS_IID)
-
- NS_IMETHOD GetPreferred(const nsACString& aAlias, nsACString& aResult) = 0;
- NS_IMETHOD Equals(const nsACString& aCharset1, const nsACString& aCharset2, bool* aResult) = 0;
+ static nsresult GetPreferred(const nsACString& aAlias, nsACString& aResult);
+ static nsresult Equals(const nsACString& aCharset1, const nsACString& aCharset2, bool* aResult);
};
-NS_DEFINE_STATIC_IID_ACCESSOR(nsICharsetAlias, NS_ICHARSETALIAS_IID)
-
-#endif /* nsICharsetAlias_h___ */
+#endif /* nsCharsetAlias_h___ */
--- a/intl/locale/src/Makefile.in
+++ b/intl/locale/src/Makefile.in
@@ -62,17 +62,17 @@ OS_INCLUDES += $(MOZ_QT_CFLAGS)
endif
CPPSRCS = \
nsCollation.cpp \
nsScriptableDateFormat.cpp \
nsLanguageAtomService.cpp \
nsLocale.cpp \
nsLocaleService.cpp \
- nsCharsetAliasImp.cpp \
+ nsCharsetAlias.cpp \
nsUConvPropertySearch.cpp \
$(NULL)
EXPORTS = \
nsCollation.h \
$(NULL)
EXPORT_RESOURCE = \
@@ -84,17 +84,17 @@ EXTRA_JS_MODULES = \
PluralForm.jsm \
$(NULL)
# we don't want the shared lib, but we want to force the creation of a static lib.
FORCE_STATIC_LIB = 1
include $(topsrcdir)/config/rules.mk
-nsCharsetAliasImp.$(OBJ_SUFFIX): charsetalias.properties.h
+nsCharsetAlias.$(OBJ_SUFFIX): charsetalias.properties.h
charsetalias.properties.h: props2arrays.py charsetalias.properties
$(PYTHON) $^ $@
GARBAGE += \
charsetalias.properties.h \
$(NULL)
rename from intl/locale/src/nsCharsetAliasImp.cpp
rename to intl/locale/src/nsCharsetAlias.cpp
--- a/intl/locale/src/nsCharsetAliasImp.cpp
+++ b/intl/locale/src/nsCharsetAlias.cpp
@@ -32,84 +32,72 @@
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "mozilla/Util.h"
-#include "nsICharsetAlias.h"
+#include "nsCharsetAlias.h"
#include "pratom.h"
// for NS_IMPL_IDS only
#include "nsIPlatformCharset.h"
#include "nsReadableUtils.h"
#include "nsUnicharUtils.h"
#include "nsUConvPropertySearch.h"
-#include "nsCharsetAlias.h"
using namespace mozilla;
-//--------------------------------------------------------------
-NS_IMPL_THREADSAFE_ISUPPORTS1(nsCharsetAlias2, nsICharsetAlias)
-
-//--------------------------------------------------------------
-nsCharsetAlias2::nsCharsetAlias2()
-{
-}
-//--------------------------------------------------------------
-nsCharsetAlias2::~nsCharsetAlias2()
-{
-}
-
//
static const char* kAliases[][3] = {
#include "charsetalias.properties.h"
};
//--------------------------------------------------------------
-NS_IMETHODIMP nsCharsetAlias2::GetPreferred(const nsACString& aAlias,
- nsACString& oResult)
+// static
+nsresult
+nsCharsetAlias::GetPreferred(const nsACString& aAlias,
+ nsACString& oResult)
{
if (aAlias.IsEmpty()) return NS_ERROR_NULL_POINTER;
nsCAutoString key(aAlias);
ToLowerCase(key);
- nsresult rv = nsUConvPropertySearch::SearchPropertyValue(kAliases,
+ return nsUConvPropertySearch::SearchPropertyValue(kAliases,
ArrayLength(kAliases), key, oResult);
-
- return rv;
}
//--------------------------------------------------------------
-NS_IMETHODIMP
-nsCharsetAlias2::Equals(const nsACString& aCharset1,
- const nsACString& aCharset2, bool* oResult)
+// static
+nsresult
+nsCharsetAlias::Equals(const nsACString& aCharset1,
+ const nsACString& aCharset2, bool* oResult)
{
nsresult res = NS_OK;
if(aCharset1.Equals(aCharset2, nsCaseInsensitiveCStringComparator())) {
*oResult = true;
return res;
}
if(aCharset1.IsEmpty() || aCharset2.IsEmpty()) {
*oResult = false;
return res;
}
*oResult = false;
nsCAutoString name1;
+ res = GetPreferred(aCharset1, name1);
+ if (NS_FAILED(res))
+ return res;
+
nsCAutoString name2;
- res = this->GetPreferred(aCharset1, name1);
- if(NS_SUCCEEDED(res)) {
- res = this->GetPreferred(aCharset2, name2);
- if(NS_SUCCEEDED(res)) {
- *oResult = name1.Equals(name2);
- }
- }
-
- return res;
+ res = GetPreferred(aCharset2, name2);
+ if (NS_FAILED(res))
+ return res;
+
+ *oResult = name1.Equals(name2);
+ return NS_OK;
}
-
deleted file mode 100644
--- a/intl/locale/src/nsCharsetAlias.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-#ifndef nsCharsetAlias_h__
-#define nsCharsetAlias_h__
-
-#include "nsICharsetAlias.h"
-
-//==============================================================
-class nsCharsetAlias2 : public nsICharsetAlias
-{
- NS_DECL_ISUPPORTS
-
-public:
-
- nsCharsetAlias2();
- virtual ~nsCharsetAlias2();
-
- NS_IMETHOD GetPreferred(const nsACString& aAlias, nsACString& aResult);
-
- NS_IMETHOD Equals(const nsACString& aCharset1, const nsACString& aCharset2, bool* oResult) ;
-
-};
-
-#endif // nsCharsetAlias_h__
-
-
--- a/intl/locale/src/nsLocaleConstructors.h
+++ b/intl/locale/src/nsLocaleConstructors.h
@@ -41,17 +41,16 @@
#include "nsCollationCID.h"
#include "nsDateTimeFormatCID.h"
#include "mozilla/ModuleUtils.h"
#include "nsILocaleService.h"
#include "nsIScriptableDateFormat.h"
#include "nsIServiceManager.h"
#include "nsLanguageAtomService.h"
-#include "nsCharsetAlias.h"
#include "nsPlatformCharset.h"
#include "nsLocaleCID.h"
#if defined(XP_MACOSX)
#define USE_MAC_LOCALE
#endif
#if defined(XP_UNIX) && !defined(XP_MACOSX)
@@ -95,17 +94,16 @@ ctor_(nsISupports* aOuter, REFNSIID aIID
return rv; \
}
NSLOCALE_MAKE_CTOR(CreateLocaleService, nsILocaleService, NS_NewLocaleService)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsCollationFactory)
//NS_GENERIC_FACTORY_CONSTRUCTOR(nsScriptableDateTimeFormat)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsLanguageAtomService)
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsCharsetAlias2)
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPlatformCharset, Init)
#ifdef XP_WIN
NS_GENERIC_FACTORY_CONSTRUCTOR(nsCollationWin)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsDateTimeFormatWin)
#endif
#ifdef USE_UNIX_LOCALE
--- a/intl/uconv/src/nsCharsetConverterManager.cpp
+++ b/intl/uconv/src/nsCharsetConverterManager.cpp
@@ -35,17 +35,17 @@
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsCOMPtr.h"
#include "nsString.h"
#include "nsReadableUtils.h"
#include "nsUnicharUtils.h"
-#include "nsICharsetAlias.h"
+#include "nsCharsetAlias.h"
#include "nsIServiceManager.h"
#include "nsICategoryManager.h"
#include "nsICharsetConverterManager.h"
#include "nsEncoderDecoderUtils.h"
#include "nsIStringBundle.h"
#include "prmem.h"
#include "nsCRT.h"
#include "nsTArray.h"
@@ -303,20 +303,18 @@ NS_IMETHODIMP
nsCharsetConverterManager::GetCharsetAlias(const char * aCharset,
nsACString& aResult)
{
NS_ENSURE_ARG_POINTER(aCharset);
// We try to obtain the preferred name for this charset from the charset
// aliases.
nsresult rv;
- nsCOMPtr<nsICharsetAlias> csAlias(do_GetService(NS_CHARSETALIAS_CONTRACTID, &rv));
- NS_ENSURE_SUCCESS(rv, rv);
- rv = csAlias->GetPreferred(nsDependentCString(aCharset), aResult);
+ rv = nsCharsetAlias::GetPreferred(nsDependentCString(aCharset), aResult);
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;
}
NS_IMETHODIMP
nsCharsetConverterManager::GetCharsetTitle(const char * aCharset,
--- a/intl/uconv/tests/nsconv.cpp
+++ b/intl/uconv/tests/nsconv.cpp
@@ -41,18 +41,16 @@
#include "nscore.h"
#include "nsString.h"
#include "nsIServiceManager.h"
#include "nsICharsetConverterManager.h"
#include "nsIUnicodeEncoder.h"
#include "nsIUnicodeDecoder.h"
-#include "nsICharsetAlias.h"
-
static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CID);
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void usage()
{
printf(
@@ -85,38 +83,29 @@ int main(int argc, const char** argv)
nsCOMPtr<nsICharsetConverterManager> ccMain =
do_GetService(kCharsetConverterManagerCID, &res);
if(NS_FAILED(res))
{
fprintf(stderr, "Cannot get Character Converter Manager %x\n", res);
return -1;
}
- // Get the charset alias manager
- nsCOMPtr<nsICharsetAlias> aliasmgr =
- do_GetService(NS_CHARSETALIAS_CONTRACTID, &res);
- if (NS_FAILED(res))
- {
- fprintf(stderr, "Cannot get Charset Alias Manager %x\n", res);
- return -1;
- }
-
int i;
if(argc > 4)
{
for(i =0; i < argc; i++)
{
if(strcmp(argv[i], "-f") == 0)
{
// User has specified the charset to convert from
nsCAutoString str;
// First check if a charset alias was given,
// and convert to the canonical name
- res = aliasmgr->GetPreferred(nsDependentCString(argv[i+1]), str);
+ res = ccMain->GetCharsetAlias(argv[i+1], str);
if (NS_FAILED(res))
{
fprintf(stderr, "Cannot get charset alias for %s %x\n",
argv[i+1], res);
goto error_exit;
}
// Finally create the decoder
@@ -131,17 +120,17 @@ int main(int argc, const char** argv)
if(strcmp(argv[i], "-t") == 0)
{
// User has specified which charset to convert to
nsCAutoString str;
// First check if a charset alias was given,
// and convert to the canonical name
- res = aliasmgr->GetPreferred(nsDependentCString(argv[i+1]), str);
+ res = ccMain->GetCharsetAlias(argv[i+1], str);
if (NS_FAILED(res))
{
fprintf(stderr, "Cannot get charset alias for %s %x\n",
argv[i+1], res);
goto error_exit;
}
// Finally create the encoder
--- a/layout/style/Loader.cpp
+++ b/layout/style/Loader.cpp
@@ -57,17 +57,16 @@
#include "nsCOMPtr.h"
#include "nsCOMArray.h"
#include "nsString.h"
#include "nsIContent.h"
#include "nsIDocument.h"
#include "nsIDOMNode.h"
#include "nsIDOMDocument.h"
#include "nsIDOMWindow.h"
-#include "nsICharsetAlias.h"
#include "nsHashtable.h"
#include "nsIURI.h"
#include "nsIServiceManager.h"
#include "nsNetUtil.h"
#include "nsContentUtils.h"
#include "nsCRT.h"
#include "nsIScriptSecurityManager.h"
#include "nsContentPolicyUtils.h"
new file mode 100644
--- /dev/null
+++ b/media/libtheora/bug468275-r18219.patch
@@ -0,0 +1,22 @@
+diff --git a/media/libtheora/lib/state.c b/media/libtheora/lib/state.c
+--- a/media/libtheora/lib/state.c
++++ b/media/libtheora/lib/state.c
+@@ -583,17 +583,17 @@ static int oc_state_ref_bufs_init(oc_the
+ ref_frame_sz<yplane_sz||ref_frame_data_sz/_nrefs!=ref_frame_sz){
+ return TH_EIMPL;
+ }
+ ref_frame_data=oc_aligned_malloc(ref_frame_data_sz,16);
+ frag_buf_offs=_state->frag_buf_offs=
+ _ogg_malloc(_state->nfrags*sizeof(*frag_buf_offs));
+ if(ref_frame_data==NULL||frag_buf_offs==NULL){
+ _ogg_free(frag_buf_offs);
+- _ogg_free(ref_frame_data);
++ oc_aligned_free(ref_frame_data);
+ return TH_EFAULT;
+ }
+ /*Set up the width, height and stride for the image buffers.*/
+ _state->ref_frame_bufs[0][0].width=info->frame_width;
+ _state->ref_frame_bufs[0][0].height=info->frame_height;
+ _state->ref_frame_bufs[0][0].stride=yhstride;
+ _state->ref_frame_bufs[0][1].width=_state->ref_frame_bufs[0][2].width=
+ info->frame_width>>hdec;
--- a/media/libtheora/lib/state.c
+++ b/media/libtheora/lib/state.c
@@ -583,17 +583,17 @@ static int oc_state_ref_bufs_init(oc_the
ref_frame_sz<yplane_sz||ref_frame_data_sz/_nrefs!=ref_frame_sz){
return TH_EIMPL;
}
ref_frame_data=oc_aligned_malloc(ref_frame_data_sz,16);
frag_buf_offs=_state->frag_buf_offs=
_ogg_malloc(_state->nfrags*sizeof(*frag_buf_offs));
if(ref_frame_data==NULL||frag_buf_offs==NULL){
_ogg_free(frag_buf_offs);
- _ogg_free(ref_frame_data);
+ oc_aligned_free(ref_frame_data);
return TH_EFAULT;
}
/*Set up the width, height and stride for the image buffers.*/
_state->ref_frame_bufs[0][0].width=info->frame_width;
_state->ref_frame_bufs[0][0].height=info->frame_height;
_state->ref_frame_bufs[0][0].stride=yhstride;
_state->ref_frame_bufs[0][1].width=_state->ref_frame_bufs[0][2].width=
info->frame_width>>hdec;
--- a/media/libtheora/update.sh
+++ b/media/libtheora/update.sh
@@ -74,8 +74,9 @@ cp $1/lib/x86_vc/x86cpu.c ./lib/x86_vc/
cp $1/lib/x86_vc/x86cpu.h ./lib/x86_vc/
cp $1/lib/x86_vc/x86int.h ./lib/x86_vc/
cp $1/lib/x86_vc/x86state.c ./lib/x86_vc/
cp $1/include/theora/theora.h ./include/theora/theora.h
cp $1/include/theora/theoradec.h ./include/theora/theoradec.h
cp $1/include/theora/theoraenc.h ./include/theora/theoraenc.h
cp $1/include/theora/codec.h ./include/theora/codec.h
patch -p3 < ./bug625773-r17780.patch
+patch -p3 < ./bug468275-r18219.patch
--- a/mfbt/sources.mk
+++ b/mfbt/sources.mk
@@ -1,3 +1,3 @@
-CPPSRCS += \
- Assertions.cpp \
- $(NULL)
+CPPSRCS += \
+ Assertions.cpp \
+ $(NULL)
--- a/netwerk/base/src/nsSimpleURI.cpp
+++ b/netwerk/base/src/nsSimpleURI.cpp
@@ -76,16 +76,17 @@ nsSimpleURI::~nsSimpleURI()
NS_IMPL_ADDREF(nsSimpleURI)
NS_IMPL_RELEASE(nsSimpleURI)
NS_INTERFACE_TABLE_HEAD(nsSimpleURI)
NS_INTERFACE_TABLE5(nsSimpleURI, nsIURI, nsISerializable, nsIIPCSerializable, nsIClassInfo, nsIMutable)
NS_INTERFACE_TABLE_TO_MAP_SEGUE
if (aIID.Equals(kThisSimpleURIImplementationCID))
foundInterface = static_cast<nsIURI*>(this);
else
+ NS_INTERFACE_MAP_ENTRY(nsISizeOf)
NS_INTERFACE_MAP_END
////////////////////////////////////////////////////////////////////////////////
// nsISerializable methods:
NS_IMETHODIMP
nsSimpleURI::Read(nsIObjectInputStream* aStream)
{
@@ -651,8 +652,26 @@ nsSimpleURI::GetMutable(bool *value)
NS_IMETHODIMP
nsSimpleURI::SetMutable(bool value)
{
NS_ENSURE_ARG(mMutable || !value);
mMutable = value;
return NS_OK;
}
+
+//----------------------------------------------------------------------------
+// nsSimpleURI::nsISizeOf
+//----------------------------------------------------------------------------
+
+size_t
+nsSimpleURI::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const
+{
+ return mScheme.SizeOfExcludingThisIfUnshared(aMallocSizeOf) +
+ mPath.SizeOfExcludingThisIfUnshared(aMallocSizeOf) +
+ mRef.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
+}
+
+size_t
+nsSimpleURI::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf) const {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
--- a/netwerk/base/src/nsSimpleURI.h
+++ b/netwerk/base/src/nsSimpleURI.h
@@ -40,44 +40,56 @@
#include "nsIURL.h"
#include "nsAgg.h"
#include "nsISerializable.h"
#include "nsIIPCSerializable.h"
#include "nsString.h"
#include "nsIClassInfo.h"
#include "nsIMutable.h"
+#include "nsISizeOf.h"
#define NS_THIS_SIMPLEURI_IMPLEMENTATION_CID \
{ /* 0b9bb0c2-fee6-470b-b9b9-9fd9462b5e19 */ \
0x0b9bb0c2, \
0xfee6, \
0x470b, \
{0xb9, 0xb9, 0x9f, 0xd9, 0x46, 0x2b, 0x5e, 0x19} \
}
class nsSimpleURI : public nsIURI,
public nsISerializable,
public nsIIPCSerializable,
public nsIClassInfo,
- public nsIMutable
+ public nsIMutable,
+ public nsISizeOf
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIURI
NS_DECL_NSISERIALIZABLE
NS_DECL_NSIIPCSERIALIZABLE
NS_DECL_NSICLASSINFO
NS_DECL_NSIMUTABLE
// nsSimpleURI methods:
nsSimpleURI();
virtual ~nsSimpleURI();
+ // nsISizeOf
+ // Among the sub-classes that inherit (directly or indirectly) from
+ // nsSimpleURI, measurement of the following members may be added later if
+ // DMD finds it is worthwhile:
+ // - nsJSURI: mBaseURI
+ // - nsSimpleNestedURI: mInnerURI
+ // - nsBlobURI: mPrincipal
+ virtual size_t SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const;
+ virtual size_t SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf) const;
+
protected:
// enum used in a few places to specify how .ref attribute should be handled
enum RefHandlingEnum {
eIgnoreRef,
eHonorRef
};
// Helper to share code between Equals methods.
--- a/netwerk/base/src/nsStandardURL.cpp
+++ b/netwerk/base/src/nsStandardURL.cpp
@@ -973,16 +973,17 @@ NS_INTERFACE_MAP_BEGIN(nsStandardURL)
NS_INTERFACE_MAP_ENTRY(nsISerializable)
NS_INTERFACE_MAP_ENTRY(nsIIPCSerializable)
NS_INTERFACE_MAP_ENTRY(nsIClassInfo)
NS_INTERFACE_MAP_ENTRY(nsIMutable)
// see nsStandardURL::Equals
if (aIID.Equals(kThisImplCID))
foundInterface = static_cast<nsIURI *>(this);
else
+ NS_INTERFACE_MAP_ENTRY(nsISizeOf)
NS_INTERFACE_MAP_END
//----------------------------------------------------------------------------
// nsStandardURL::nsIURI
//----------------------------------------------------------------------------
// result may contain unescaped UTF-8 characters
NS_IMETHODIMP
@@ -3063,8 +3064,31 @@ nsStandardURL::GetFlags(PRUint32 *aFlags
}
NS_IMETHODIMP
nsStandardURL::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
{
*aClassIDNoAlloc = kStandardURLCID;
return NS_OK;
}
+
+//----------------------------------------------------------------------------
+// nsStandardURL::nsISizeOf
+//----------------------------------------------------------------------------
+
+size_t
+nsStandardURL::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const
+{
+ return mSpec.SizeOfExcludingThisIfUnshared(aMallocSizeOf) +
+ mOriginCharset.SizeOfExcludingThisIfUnshared(aMallocSizeOf) +
+ aMallocSizeOf(mHostA);
+
+ // Measurement of the following members may be added later if DMD finds it is
+ // worthwhile:
+ // - mParser
+ // - mFile
+}
+
+size_t
+nsStandardURL::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf) const {
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
--- a/netwerk/base/src/nsStandardURL.h
+++ b/netwerk/base/src/nsStandardURL.h
@@ -49,16 +49,17 @@
#include "nsIFile.h"
#include "nsIURLParser.h"
#include "nsIUnicodeEncoder.h"
#include "nsIObserver.h"
#include "nsIIOService.h"
#include "nsCOMPtr.h"
#include "nsURLHelper.h"
#include "nsIClassInfo.h"
+#include "nsISizeOf.h"
#include "prclist.h"
#ifdef NS_BUILD_REFCNT_LOGGING
#define DEBUG_DUMP_URLS_AT_SHUTDOWN
#endif
class nsIBinaryInputStream;
class nsIBinaryOutputStream;
@@ -70,28 +71,33 @@ class nsIPrefBranch;
// standard URL implementation
//-----------------------------------------------------------------------------
class nsStandardURL : public nsIFileURL
, public nsIStandardURL
, public nsISerializable
, public nsIIPCSerializable
, public nsIClassInfo
+ , public nsISizeOf
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIURI
NS_DECL_NSIURL
NS_DECL_NSIFILEURL
NS_DECL_NSISTANDARDURL
NS_DECL_NSISERIALIZABLE
NS_DECL_NSIIPCSERIALIZABLE
NS_DECL_NSICLASSINFO
NS_DECL_NSIMUTABLE
+ // nsISizeOf
+ virtual size_t SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const;
+ virtual size_t SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf) const;
+
nsStandardURL(bool aSupportsFileURL = false);
virtual ~nsStandardURL();
static void InitGlobalObjects();
static void ShutdownGlobalObjects();
public: /* internal -- HPUX compiler can't handle this being private */
//
@@ -110,17 +116,16 @@ public: /* internal -- HPUX compiler can
// is 'bar'.
void Merge(const nsCString &spec, const char separator, const URLSegment &right) {
if (mLen >= 0 &&
*(spec.get() + mPos + mLen) == separator &&
mPos + mLen + 1 == right.mPos) {
mLen += 1 + right.mLen;
}
}
-
};
//
// Pref observer
//
class nsPrefObserver : public nsIObserver
{
public:
--- a/parser/html/nsHtml5MetaScannerCppSupplement.h
+++ b/parser/html/nsHtml5MetaScannerCppSupplement.h
@@ -32,21 +32,20 @@
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsICharsetConverterManager.h"
#include "nsServiceManagerUtils.h"
-#include "nsICharsetAlias.h"
+#include "nsCharsetAlias.h"
#include "nsEncoderDecoderUtils.h"
#include "nsTraceRefcnt.h"
-static NS_DEFINE_CID(kCharsetAliasCID, NS_CHARSETALIAS_CID);
void
nsHtml5MetaScanner::sniff(nsHtml5ByteReadable* bytes, nsIUnicodeDecoder** decoder, nsACString& charset)
{
readable = bytes;
stateLoop(stateSave);
readable = nsnull;
if (mUnicodeDecoder) {
@@ -77,22 +76,17 @@ nsHtml5MetaScanner::tryCharset(nsString*
res = convManager->GetUnicodeDecoderRaw(mCharset.get(), getter_AddRefs(mUnicodeDecoder));
if (NS_FAILED(res)) {
NS_ERROR("Could not get decoder for UTF-8.");
return false;
}
return true;
}
nsCAutoString preferred;
- nsCOMPtr<nsICharsetAlias> calias(do_GetService(kCharsetAliasCID, &res));
- if (NS_FAILED(res)) {
- NS_ERROR("Could not get CharsetAlias service.");
- return false;
- }
- res = calias->GetPreferred(encoding, preferred);
+ res = nsCharsetAlias::GetPreferred(encoding, preferred);
if (NS_FAILED(res)) {
return false;
}
if (preferred.LowerCaseEqualsLiteral("utf-16") ||
preferred.LowerCaseEqualsLiteral("utf-16be") ||
preferred.LowerCaseEqualsLiteral("utf-16le") ||
preferred.LowerCaseEqualsLiteral("utf-7") ||
preferred.LowerCaseEqualsLiteral("jis_x0212-1990") ||
--- a/parser/html/nsHtml5Parser.cpp
+++ b/parser/html/nsHtml5Parser.cpp
@@ -37,17 +37,16 @@
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsCompatibility.h"
#include "nsScriptLoader.h"
#include "nsNetUtil.h"
#include "nsIStyleSheetLinkingElement.h"
-#include "nsICharsetAlias.h"
#include "nsIWebShellServices.h"
#include "nsIDocShell.h"
#include "nsEncoderDecoderUtils.h"
#include "nsContentUtils.h"
#include "nsICharsetDetector.h"
#include "nsIScriptElement.h"
#include "nsIMarkupDocumentViewer.h"
#include "nsIDocShellTreeItem.h"
--- a/parser/html/nsHtml5StreamParser.cpp
+++ b/parser/html/nsHtml5StreamParser.cpp
@@ -35,17 +35,17 @@
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsHtml5StreamParser.h"
#include "nsICharsetConverterManager.h"
-#include "nsICharsetAlias.h"
+#include "nsCharsetAlias.h"
#include "nsServiceManagerUtils.h"
#include "nsEncoderDecoderUtils.h"
#include "nsContentUtils.h"
#include "nsHtml5Tokenizer.h"
#include "nsIHttpChannel.h"
#include "nsHtml5Parser.h"
#include "nsHtml5TreeBuilder.h"
#include "nsHtml5AtomTable.h"
@@ -55,17 +55,16 @@
#include "mozilla/Preferences.h"
#include "nsHtml5Highlighter.h"
#include "expat_config.h"
#include "expat.h"
#include "nsINestedURI.h"
using namespace mozilla;
-static NS_DEFINE_CID(kCharsetAliasCID, NS_CHARSETALIAS_CID);
PRInt32 nsHtml5StreamParser::sTimerInitialDelay = 120;
PRInt32 nsHtml5StreamParser::sTimerSubsequentDelay = 120;
// static
void
nsHtml5StreamParser::InitializeStatics()
{
@@ -1166,38 +1165,33 @@ nsHtml5StreamParser::PreferredForInterna
newEncoding.Trim(" \t\r\n\f");
if (newEncoding.LowerCaseEqualsLiteral("utf-16") ||
newEncoding.LowerCaseEqualsLiteral("utf-16be") ||
newEncoding.LowerCaseEqualsLiteral("utf-16le")) {
newEncoding.Assign("UTF-8");
}
nsresult rv = NS_OK;
- nsCOMPtr<nsICharsetAlias> calias(do_GetService(kCharsetAliasCID, &rv));
- if (NS_FAILED(rv)) {
- NS_NOTREACHED("Charset alias service not available.");
- return false;
- }
bool eq;
- rv = calias->Equals(newEncoding, mCharset, &eq);
+ rv = nsCharsetAlias::Equals(newEncoding, mCharset, &eq);
if (NS_FAILED(rv)) {
NS_NOTREACHED("Charset name equality check failed.");
return false;
}
if (eq) {
mCharsetSource = kCharsetFromMetaTag; // become confident
mFeedChardet = false; // don't feed chardet when confident
return false;
}
// XXX check HTML5 non-IANA aliases here
nsCAutoString preferred;
- rv = calias->GetPreferred(newEncoding, preferred);
+ rv = nsCharsetAlias::GetPreferred(newEncoding, preferred);
if (NS_FAILED(rv)) {
// the encoding name is bogus
return false;
}
if (preferred.LowerCaseEqualsLiteral("utf-16") ||
preferred.LowerCaseEqualsLiteral("utf-16be") ||
preferred.LowerCaseEqualsLiteral("utf-16le") ||
--- a/parser/html/nsHtml5StreamParser.h
+++ b/parser/html/nsHtml5StreamParser.h
@@ -43,17 +43,16 @@
#include "nsCOMPtr.h"
#include "nsIStreamListener.h"
#include "nsICharsetDetectionObserver.h"
#include "nsHtml5MetaScanner.h"
#include "nsIUnicodeDecoder.h"
#include "nsHtml5TreeOpExecutor.h"
#include "nsHtml5OwningUTF16Buffer.h"
#include "nsIInputStream.h"
-#include "nsICharsetAlias.h"
#include "mozilla/Mutex.h"
#include "nsHtml5AtomTable.h"
#include "nsHtml5Speculation.h"
#include "nsITimer.h"
#include "nsICharsetDetector.h"
class nsHtml5Parser;
--- a/parser/htmlparser/src/nsParser.cpp
+++ b/parser/htmlparser/src/nsParser.cpp
@@ -42,17 +42,17 @@
#include "nsString.h"
#include "nsCRT.h"
#include "nsScanner.h"
#include "plstr.h"
#include "nsIStringStream.h"
#include "nsIChannel.h"
#include "nsICachingChannel.h"
#include "nsICacheEntryDescriptor.h"
-#include "nsICharsetAlias.h"
+#include "nsCharsetAlias.h"
#include "nsICharsetConverterManager.h"
#include "nsIInputStream.h"
#include "CNavDTD.h"
#include "prenv.h"
#include "prlock.h"
#include "prcvar.h"
#include "nsParserCIID.h"
#include "nsReadableUtils.h"
@@ -156,50 +156,43 @@ public:
{
mParser->HandleParserContinueEvent(this);
return NS_OK;
}
};
//-------------- End ParseContinue Event Definition ------------------------
-nsICharsetAlias* nsParser::sCharsetAliasService = nsnull;
nsICharsetConverterManager* nsParser::sCharsetConverterManager = nsnull;
/**
* This gets called when the htmlparser module is initialized.
*/
// static
nsresult
nsParser::Init()
{
nsresult rv;
- nsCOMPtr<nsICharsetAlias> charsetAlias =
- do_GetService(NS_CHARSETALIAS_CONTRACTID, &rv);
- NS_ENSURE_SUCCESS(rv, rv);
-
nsCOMPtr<nsICharsetConverterManager> charsetConverter =
do_GetService(NS_CHARSETCONVERTERMANAGER_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
- charsetAlias.swap(sCharsetAliasService);
charsetConverter.swap(sCharsetConverterManager);
return NS_OK;
}
/**
* This gets called when the htmlparser module is shutdown.
*/
// static
void nsParser::Shutdown()
{
- NS_IF_RELEASE(sCharsetAliasService);
NS_IF_RELEASE(sCharsetConverterManager);
}
#ifdef DEBUG
static bool gDumpContent=false;
#endif
/**
@@ -2059,18 +2052,17 @@ ParserWriteFunc(nsIInputStream* in,
nsCAutoString guess;
nsCAutoString preferred;
pws->mNeedCharsetCheck = false;
if (pws->mParser->DetectMetaTag(buf, theNumRead, guess, guessSource) ||
((count >= 4) &&
DetectByteOrderMark((const unsigned char*)buf,
theNumRead, guess, guessSource))) {
- nsCOMPtr<nsICharsetAlias> alias(do_GetService(NS_CHARSETALIAS_CONTRACTID));
- result = alias->GetPreferred(guess, preferred);
+ result = nsCharsetAlias::GetPreferred(guess, preferred);
// Only continue if it's a recognized charset and not
// one of a designated set that we ignore.
if (NS_SUCCEEDED(result) &&
((kCharsetFromByteOrderMark == guessSource) ||
(!preferred.EqualsLiteral("UTF-16") &&
!preferred.EqualsLiteral("UTF-16BE") &&
!preferred.EqualsLiteral("UTF-16LE")))) {
guess = preferred;
--- a/parser/htmlparser/src/nsParser.h
+++ b/parser/htmlparser/src/nsParser.h
@@ -84,17 +84,16 @@
#include "nsDTDUtils.h"
#include "nsThreadUtils.h"
#include "nsIContentSink.h"
#include "nsCOMArray.h"
#include "nsCycleCollectionParticipant.h"
#include "nsWeakReference.h"
class nsICharsetConverterManager;
-class nsICharsetAlias;
class nsIDTD;
class nsScanner;
class nsIThreadPool;
#ifdef _MSC_VER
#pragma warning( disable : 4275 )
#endif
@@ -352,20 +351,16 @@ class nsParser : public nsIParser,
nsresult PostContinueEvent();
/**
* Fired when the continue parse event is triggered.
* @update kmcclusk 5/18/98
*/
void HandleParserContinueEvent(class nsParserContinueEvent *);
- static nsICharsetAlias* GetCharsetAliasService() {
- return sCharsetAliasService;
- }
-
static nsICharsetConverterManager* GetCharsetConverterManager() {
return sCharsetConverterManager;
}
virtual void Reset() {
Cleanup();
Initialize();
}
@@ -460,14 +455,13 @@ protected:
PRUint16 mFlags;
nsString mUnusedInput;
nsCString mCharset;
nsCString mCommandStr;
bool mProcessingNetworkData;
- static nsICharsetAlias* sCharsetAliasService;
static nsICharsetConverterManager* sCharsetConverterManager;
};
#endif
--- a/parser/htmlparser/src/nsScanner.cpp
+++ b/parser/htmlparser/src/nsScanner.cpp
@@ -37,17 +37,17 @@
* ***** END LICENSE BLOCK ***** */
//#define __INCREMENTAL 1
#include "nsScanner.h"
#include "nsDebug.h"
#include "nsIServiceManager.h"
#include "nsICharsetConverterManager.h"
-#include "nsICharsetAlias.h"
+#include "nsCharsetAlias.h"
#include "nsReadableUtils.h"
#include "nsIInputStream.h"
#include "nsILocalFile.h"
#include "nsNetUtil.h"
#include "nsUTF8Utils.h" // for LossyConvertEncoding
#include "nsCRT.h"
#include "nsParser.h"
@@ -149,33 +149,30 @@ nsScanner::nsScanner(nsString& aFilename
SetDocumentCharset(aCharset, aSource);
}
nsresult nsScanner::SetDocumentCharset(const nsACString& aCharset , PRInt32 aSource)
{
if (aSource < mCharsetSource) // priority is lower the the current one , just
return NS_OK;
- nsICharsetAlias* calias = nsParser::GetCharsetAliasService();
- NS_ASSERTION(calias, "Must have the charset alias service!");
-
nsresult res = NS_OK;
if (!mCharset.IsEmpty())
{
bool same;
- res = calias->Equals(aCharset, mCharset, &same);
+ res = nsCharsetAlias::Equals(aCharset, mCharset, &same);
if(NS_SUCCEEDED(res) && same)
{
return NS_OK; // no difference, don't change it
}
}
// different, need to change it
nsCString charsetName;
- res = calias->GetPreferred(aCharset, charsetName);
+ res = nsCharsetAlias::GetPreferred(aCharset, charsetName);
if(NS_FAILED(res) && (mCharsetSource == kCharsetUninitialized))
{
// failed - unknown alias , fallback to ISO-8859-1
mCharset.AssignLiteral("ISO-8859-1");
}
else
{
--- a/parser/xml/src/nsSAXXMLReader.cpp
+++ b/parser/xml/src/nsSAXXMLReader.cpp
@@ -34,17 +34,17 @@
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsIInputStream.h"
#include "nsNetCID.h"
#include "nsNetUtil.h"
-#include "nsICharsetAlias.h"
+#include "nsCharsetAlias.h"
#include "nsParserCIID.h"
#include "nsStreamUtils.h"
#include "nsStringStream.h"
#include "nsIScriptError.h"
#include "nsSAXAttributes.h"
#include "nsSAXLocator.h"
#include "nsSAXXMLReader.h"
@@ -643,27 +643,21 @@ nsSAXXMLReader::TryChannelCharset(nsICha
{
if (aCharsetSource >= kCharsetFromChannel)
return true;
if (aChannel) {
nsCAutoString charsetVal;
nsresult rv = aChannel->GetContentCharset(charsetVal);
if (NS_SUCCEEDED(rv)) {
- nsCOMPtr<nsICharsetAlias>
- calias(do_GetService(NS_CHARSETALIAS_CONTRACTID));
- if (calias) {
- nsCAutoString preferred;
- rv = calias->GetPreferred(charsetVal, preferred);
- if (NS_SUCCEEDED(rv)) {
- aCharset = preferred;
- aCharsetSource = kCharsetFromChannel;
- return true;
- }
- }
+ if (NS_FAILED(nsCharsetAlias::GetPreferred(charsetVal, aCharset)))
+ return false;
+
+ aCharsetSource = kCharsetFromChannel;
+ return true;
}
}
return false;
}
nsresult
nsSAXXMLReader::EnsureBaseURI()
--- a/toolkit/components/places/tests/cpp/mock_Link.h
+++ b/toolkit/components/places/tests/cpp/mock_Link.h
@@ -69,16 +69,21 @@ public:
{
// Notify our callback function.
mHandler(aState);
// Break the cycle so the object can be destroyed.
mDeathGrip = 0;
}
+ virtual size_t SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const
+ {
+ return 0; // the value shouldn't matter
+ }
+
~mock_Link() {
// Run the next test if we are supposed to.
if (mRunNextTest) {
run_next_test();
}
}
private:
@@ -130,12 +135,19 @@ Link::ResetLinkState(bool aNotify)
already_AddRefed<nsIURI>
Link::GetURI() const
{
NS_NOTREACHED("Unexpected call to Link::GetURI");
return nsnull; // suppress compiler warning
}
+size_t
+Link::SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const
+{
+ NS_NOTREACHED("Unexpected call to Link::SizeOfExcludingThis");
+ return 0;
+}
+
} // namespace dom
} // namespace mozilla
#endif // mock_Link_h__
--- a/xpcom/base/Makefile.in
+++ b/xpcom/base/Makefile.in
@@ -83,16 +83,17 @@ endif
EXPORTS = \
nsAgg.h \
nsAutoRef.h \
nsCom.h \
nsDebugImpl.h \
nsIAllocator.h \
nsIID.h \
+ nsISizeOf.h \
nsISupportsObsolete.h \
nsStackWalk.h \
nsTraceRefcntImpl.h \
nsWeakPtr.h \
nsInterfaceRequestorAgg.h \
dmd.h \
$(NULL)
new file mode 100644
--- /dev/null
+++ b/xpcom/base/nsISizeOf.h
@@ -0,0 +1,66 @@
+/* -*- Mode: C++; tab-width: 50; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * mozilla.org
+ * Portions created by the Initial Developer are Copyright (C) 2012
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Nicholas Nethercote <nnethercote@mozilla.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#ifndef nsISizeOf_h___
+#define nsISizeOf_h___
+
+#include "nsISupports.h"
+
+#define NS_ISIZEOF_IID \
+ {0x61d05579, 0xd7ec, 0x485c, \
+ { 0xa4, 0x0c, 0x31, 0xc7, 0x9a, 0x5c, 0xf9, 0xf3 }}
+
+class nsISizeOf : public nsISupports
+{
+public:
+ NS_DECLARE_STATIC_IID_ACCESSOR(NS_ISIZEOF_IID)
+
+ /**
+ * Measures the size of the things pointed to by the object.
+ */
+ virtual size_t SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf) const = 0;
+
+ /**
+ * Like SizeOfExcludingThis, but also includes the size of the object itself.
+ */
+ virtual size_t SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf) const = 0;
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(nsISizeOf, NS_ISIZEOF_IID)
+
+#endif /* nsISizeOf_h___ */
--- a/xpcom/components/ManifestParser.cpp
+++ b/xpcom/components/ManifestParser.cpp
@@ -1,687 +1,687 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Mozilla Firefox
- *
- * The Initial Developer of the Original Code is
- * the Mozilla Foundation <http://www.mozilla.org/>.
- * Portions created by the Initial Developer are Copyright (C) 2010
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- * Philipp Kewisch <mozilla@kewis.ch>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#include "mozilla/Util.h"
-
-#include "ManifestParser.h"
-
-#include <string.h>
-
-#include "prio.h"
-#include "prprf.h"
-#if defined(XP_WIN)
-#include <windows.h>
-#elif defined(MOZ_WIDGET_COCOA)
-#include <CoreServices/CoreServices.h>
-#elif defined(MOZ_WIDGET_GTK2)
-#include <gtk/gtk.h>
-#endif
-
-#ifdef MOZ_WIDGET_ANDROID
-#include "AndroidBridge.h"
-#endif
-
-#include "mozilla/Services.h"
-
-#include "nsConsoleMessage.h"
-#include "nsTextFormatter.h"
-#include "nsVersionComparator.h"
-#include "nsXPCOMCIDInternal.h"
-
-#include "nsIConsoleService.h"
-#include "nsIScriptError.h"
-#include "nsIXULAppInfo.h"
-#include "nsIXULRuntime.h"
-
-using namespace mozilla;
-
-struct ManifestDirective
-{
- const char* directive;
- int argc;
-
- // Some directives should only be delivered for NS_COMPONENT_LOCATION
- // manifests.
- bool componentonly;
-
- bool ischrome;
-
- bool allowbootstrap;
-
- // The platform/contentaccessible flags only apply to content directives.
- bool contentflags;
-
- // Function to handle this directive. This isn't a union because C++ still
- // hasn't learned how to initialize unions in a sane way.
- void (nsComponentManagerImpl::*mgrfunc)
- (nsComponentManagerImpl::ManifestProcessingContext& cx,
- int lineno, char *const * argv);
- void (nsChromeRegistry::*regfunc)
- (nsChromeRegistry::ManifestProcessingContext& cx,
- int lineno, char *const *argv,
- bool platform, bool contentaccessible);
-
- bool isContract;
-};
-static const ManifestDirective kParsingTable[] = {
- { "manifest", 1, false, true, true, false,
- &nsComponentManagerImpl::ManifestManifest, NULL },
- { "binary-component", 1, true, false, false, false,
- &nsComponentManagerImpl::ManifestBinaryComponent, NULL },
- { "interfaces", 1, true, false, false, false,
- &nsComponentManagerImpl::ManifestXPT, NULL },
- { "component", 2, true, false, false, false,
- &nsComponentManagerImpl::ManifestComponent, NULL },
- { "contract", 2, true, false, false, false,
- &nsComponentManagerImpl::ManifestContract, NULL, true},
- { "category", 3, true, false, false, false,
- &nsComponentManagerImpl::ManifestCategory, NULL },
- { "content", 2, true, true, true, true,
- NULL, &nsChromeRegistry::ManifestContent },
- { "locale", 3, true, true, true, false,
- NULL, &nsChromeRegistry::ManifestLocale },
- { "skin", 3, false, true, true, false,
- NULL, &nsChromeRegistry::ManifestSkin },
- { "overlay", 2, true, true, false, false,
- NULL, &nsChromeRegistry::ManifestOverlay },
- { "style", 2, false, true, false, false,
- NULL, &nsChromeRegistry::ManifestStyle },
- { "override", 2, true, true, true, false,
- NULL, &nsChromeRegistry::ManifestOverride },
- { "resource", 2, true, true, false, false,
- NULL, &nsChromeRegistry::ManifestResource }
-};
-
-static const char kWhitespace[] = "\t ";
-
-static bool IsNewline(char c)
-{
- return c == '\n' || c == '\r';
-}
-
-namespace {
-struct AutoPR_smprintf_free
-{
- AutoPR_smprintf_free(char* buf)
- : mBuf(buf)
- {
- }
-
- ~AutoPR_smprintf_free()
- {
- if (mBuf)
- PR_smprintf_free(mBuf);
- }
-
- operator char*() const {
- return mBuf;
- }
-
- char* mBuf;
-};
-
-} // anonymous namespace
-
-void LogMessage(const char* aMsg, ...)
-{
- nsCOMPtr<nsIConsoleService> console =
- do_GetService(NS_CONSOLESERVICE_CONTRACTID);
- if (!console)
- return;
-
- va_list args;
- va_start(args, aMsg);
- AutoPR_smprintf_free formatted(PR_vsmprintf(aMsg, args));
- va_end(args);
-
- nsCOMPtr<nsIConsoleMessage> error =
- new nsConsoleMessage(NS_ConvertUTF8toUTF16(formatted).get());
- console->LogMessage(error);
-}
-
-void LogMessageWithContext(FileLocation &aFile,
- PRUint32 aLineNumber, const char* aMsg, ...)
-{
- va_list args;
- va_start(args, aMsg);
- AutoPR_smprintf_free formatted(PR_vsmprintf(aMsg, args));
- va_end(args);
- if (!formatted)
- return;
-
- nsCString file;
- aFile.GetURIString(file);
-
- nsCOMPtr<nsIScriptError> error =
- do_CreateInstance(NS_SCRIPTERROR_CONTRACTID);
- if (!error) {
- // This can happen early in component registration. Fall back to a
- // generic console message.
- LogMessage("Warning: in '%s', line %i: %s", file.get(),
- aLineNumber, (char*) formatted);
- return;
- }
-
- nsCOMPtr<nsIConsoleService> console =
- do_GetService(NS_CONSOLESERVICE_CONTRACTID);
- if (!console)
- return;
-
- nsresult rv = error->Init(NS_ConvertUTF8toUTF16(formatted).get(),
- NS_ConvertUTF8toUTF16(file).get(), NULL,
- aLineNumber, 0, nsIScriptError::warningFlag,
- "chrome registration");
- if (NS_FAILED(rv))
- return;
-
- console->LogMessage(error);
-}
-
-/**
- * Check for a modifier flag of the following forms:
- * "flag" (same as "true")
- * "flag=yes|true|1"
- * "flag="no|false|0"
- * @param aFlag The flag to compare.
- * @param aData The tokenized data to check; this is lowercased
- * before being passed in.
- * @param aResult If the flag is found, the value is assigned here.
- * @return Whether the flag was handled.
- */
-static bool
-CheckFlag(const nsSubstring& aFlag, const nsSubstring& aData, bool& aResult)
-{
- if (!StringBeginsWith(aData, aFlag))
- return false;
-
- if (aFlag.Length() == aData.Length()) {
- // the data is simply "flag", which is the same as "flag=yes"
- aResult = true;
- return true;
- }
-
- if (aData.CharAt(aFlag.Length()) != '=') {
- // the data is "flag2=", which is not anything we care about
- return false;
- }
-
- if (aData.Length() == aFlag.Length() + 1) {
- aResult = false;
- return true;
- }
-
- switch (aData.CharAt(aFlag.Length() + 1)) {
- case '1':
- case 't': //true
- case 'y': //yes
- aResult = true;
- return true;
-
- case '0':
- case 'f': //false
- case 'n': //no
- aResult = false;
- return true;
- }
-
- return false;
-}
-
-enum TriState {
- eUnspecified,
- eBad,
- eOK
-};
-
-/**
- * Check for a modifier flag of the following form:
- * "flag=string"
- * "flag!=string"
- * @param aFlag The flag to compare.
- * @param aData The tokenized data to check; this is lowercased
- * before being passed in.
- * @param aValue The value that is expected.
- * @param aResult If this is "ok" when passed in, this is left alone.
- * Otherwise if the flag is found it is set to eBad or eOK.
- * @return Whether the flag was handled.
- */
-static bool
-CheckStringFlag(const nsSubstring& aFlag, const nsSubstring& aData,
- const nsSubstring& aValue, TriState& aResult)
-{
- if (aData.Length() < aFlag.Length() + 1)
- return false;
-
- if (!StringBeginsWith(aData, aFlag))
- return false;
-
- bool comparison = true;
- if (aData[aFlag.Length()] != '=') {
- if (aData[aFlag.Length()] == '!' &&
- aData.Length() >= aFlag.Length() + 2 &&
- aData[aFlag.Length() + 1] == '=')
- comparison = false;
- else
- return false;
- }
-
- if (aResult != eOK) {
- nsDependentSubstring testdata = Substring(aData, aFlag.Length() + (comparison ? 1 : 2));
- if (testdata.Equals(aValue))
- aResult = comparison ? eOK : eBad;
- else
- aResult = comparison ? eBad : eOK;
- }
-
- return true;
-}
-
-/**
- * Check for a modifier flag of the following form:
- * "flag=version"
- * "flag<=version"
- * "flag<version"
- * "flag>=version"
- * "flag>version"
- * @param aFlag The flag to compare.
- * @param aData The tokenized data to check; this is lowercased
- * before being passed in.
- * @param aValue The value that is expected. If this is empty then no
- * comparison will match.
- * @param aResult If this is eOK when passed in, this is left alone.
- * Otherwise if the flag is found it is set to eBad or eOK.
- * @return Whether the flag was handled.
- */
-
-#define COMPARE_EQ 1 << 0
-#define COMPARE_LT 1 << 1
-#define COMPARE_GT 1 << 2
-
-static bool
-CheckVersionFlag(const nsString& aFlag, const nsString& aData,
- const nsString& aValue, TriState& aResult)
-{
- if (aData.Length() < aFlag.Length() + 2)
- return false;
-
- if (!StringBeginsWith(aData, aFlag))
- return false;
-
- if (aValue.Length() == 0) {
- if (aResult != eOK)
- aResult = eBad;
- return true;
- }
-
- PRUint32 comparison;
- nsAutoString testdata;
-
- switch (aData[aFlag.Length()]) {
- case '=':
- comparison = COMPARE_EQ;
- testdata = Substring(aData, aFlag.Length() + 1);
- break;
-
- case '<':
- if (aData[aFlag.Length() + 1] == '=') {
- comparison = COMPARE_EQ | COMPARE_LT;
- testdata = Substring(aData, aFlag.Length() + 2);
- }
- else {
- comparison = COMPARE_LT;
- testdata = Substring(aData, aFlag.Length() + 1);
- }
- break;
-
- case '>':
- if (aData[aFlag.Length() + 1] == '=') {
- comparison = COMPARE_EQ | COMPARE_GT;
- testdata = Substring(aData, aFlag.Length() + 2);
- }
- else {
- comparison = COMPARE_GT;
- testdata = Substring(aData, aFlag.Length() + 1);
- }
- break;
-
- default:
- return false;
- }
-
- if (testdata.Length() == 0)
- return false;
-
- if (aResult != eOK) {
- PRInt32 c = NS_CompareVersions(NS_ConvertUTF16toUTF8(aValue).get(),
- NS_ConvertUTF16toUTF8(testdata).get());
- if ((c == 0 && comparison & COMPARE_EQ) ||
- (c < 0 && comparison & COMPARE_LT) ||
- (c > 0 && comparison & COMPARE_GT))
- aResult = eOK;
- else
- aResult = eBad;
- }
-
- return true;
-}
-
-// In-place conversion of ascii characters to lower case
-static void
-ToLowerCase(char* token)
-{
- for (; *token; ++token)
- *token = NS_ToLower(*token);
-}
-
-namespace {
-
-struct CachedDirective
-{
- int lineno;
- char* argv[4];
-};
-
-} // anonymous namespace
-
-
-void
-ParseManifest(NSLocationType type, FileLocation &file, char* buf, bool aChromeOnly)
-{
- nsComponentManagerImpl::ManifestProcessingContext mgrcx(type, file, aChromeOnly);
- nsChromeRegistry::ManifestProcessingContext chromecx(type, file);
- nsresult rv;
-
- NS_NAMED_LITERAL_STRING(kPlatform, "platform");
- NS_NAMED_LITERAL_STRING(kContentAccessible, "contentaccessible");
- NS_NAMED_LITERAL_STRING(kApplication, "application");
- NS_NAMED_LITERAL_STRING(kAppVersion, "appversion");
- NS_NAMED_LITERAL_STRING(kGeckoVersion, "platformversion");
- NS_NAMED_LITERAL_STRING(kOs, "os");
- NS_NAMED_LITERAL_STRING(kOsVersion, "osversion");
- NS_NAMED_LITERAL_STRING(kABI, "abi");
-#if defined(MOZ_WIDGET_ANDROID)
- NS_NAMED_LITERAL_STRING(kTablet, "tablet");
-#endif
-
- // Obsolete
- NS_NAMED_LITERAL_STRING(kXPCNativeWrappers, "xpcnativewrappers");
-
- nsAutoString appID;
- nsAutoString appVersion;
- nsAutoString geckoVersion;
- nsAutoString osTarget;
- nsAutoString abi;
-
- nsCOMPtr<nsIXULAppInfo> xapp (do_GetService(XULAPPINFO_SERVICE_CONTRACTID));
- if (xapp) {
- nsCAutoString s;
- rv = xapp->GetID(s);
- if (NS_SUCCEEDED(rv))
- CopyUTF8toUTF16(s, appID);
-
- rv = xapp->GetVersion(s);
- if (NS_SUCCEEDED(rv))
- CopyUTF8toUTF16(s, appVersion);
-
- rv = xapp->GetPlatformVersion(s);
- if (NS_SUCCEEDED(rv))
- CopyUTF8toUTF16(s, geckoVersion);
-
- nsCOMPtr<nsIXULRuntime> xruntime (do_QueryInterface(xapp));
- if (xruntime) {
- rv = xruntime->GetOS(s);
- if (NS_SUCCEEDED(rv)) {
- ToLowerCase(s);
- CopyUTF8toUTF16(s, osTarget);
- }
-
- rv = xruntime->GetXPCOMABI(s);
- if (NS_SUCCEEDED(rv) && osTarget.Length()) {
- ToLowerCase(s);
- CopyUTF8toUTF16(s, abi);
- abi.Insert(PRUnichar('_'), 0);
- abi.Insert(osTarget, 0);
- }
- }
- }
-
- nsAutoString osVersion;
-#if defined(XP_WIN)
- OSVERSIONINFO info = { sizeof(OSVERSIONINFO) };
- if (GetVersionEx(&info)) {
- nsTextFormatter::ssprintf(osVersion, NS_LITERAL_STRING("%ld.%ld").get(),
- info.dwMajorVersion,
- info.dwMinorVersion);
- }
-#elif defined(MOZ_WIDGET_COCOA)
- SInt32 majorVersion, minorVersion;
- if ((Gestalt(gestaltSystemVersionMajor, &majorVersion) == noErr) &&
- (Gestalt(gestaltSystemVersionMinor, &minorVersion) == noErr)) {
- nsTextFormatter::ssprintf(osVersion, NS_LITERAL_STRING("%ld.%ld").get(),
- majorVersion,
- minorVersion);
- }
-#elif defined(MOZ_WIDGET_GTK2)
- nsTextFormatter::ssprintf(osVersion, NS_LITERAL_STRING("%ld.%ld").get(),
- gtk_major_version,
- gtk_minor_version);
-#elif defined(MOZ_WIDGET_ANDROID)
- bool isTablet = false;
- if (mozilla::AndroidBridge::Bridge()) {
- mozilla::AndroidBridge::Bridge()->GetStaticStringField("android/os/Build$VERSION", "RELEASE", osVersion);
- isTablet = mozilla::AndroidBridge::Bridge()->IsTablet();
- }
-#endif
-
- // Because contracts must be registered after CIDs, we save and process them
- // at the end.
- nsTArray<CachedDirective> contracts;
-
- char *token;
- char *newline = buf;
- PRUint32 line = 0;
-
- // outer loop tokenizes by newline
- while (*newline) {
- while (*newline && IsNewline(*newline)) {
- ++newline;
- ++line;
- }
- if (!*newline)
- break;
-
- token = newline;
- while (*newline && !IsNewline(*newline))
- ++newline;
-
- if (*newline) {
- *newline = '\0';
- ++newline;
- }
- ++line;
-
- if (*token == '#') // ignore lines that begin with # as comments
- continue;
-
- char *whitespace = token;
- token = nsCRT::strtok(whitespace, kWhitespace, &whitespace);
- if (!token) continue;
-
- const ManifestDirective* directive = NULL;
- for (const ManifestDirective* d = kParsingTable;
- d < ArrayEnd(kParsingTable);
- ++d) {
- if (!strcmp(d->directive, token)) {
- directive = d;
- break;
- }
- }
-
- if (!directive) {
- LogMessageWithContext(file, line,
- "Ignoring unrecognized chrome manifest directive '%s'.",
- token);
- continue;
- }
-
- if (!directive->allowbootstrap && NS_BOOTSTRAPPED_LOCATION == type) {
- LogMessageWithContext(file, line,
- "Bootstrapped manifest not allowed to use '%s' directive.",
- token);
- continue;
- }
-
- if (directive->componentonly && NS_SKIN_LOCATION == type) {
- LogMessageWithContext(file, line,
- "Skin manifest not allowed to use '%s' directive.",
- token);
- continue;
- }
-
- NS_ASSERTION(directive->argc < 4, "Need to reset argv array length");
- char* argv[4];
- for (int i = 0; i < directive->argc; ++i)
- argv[i] = nsCRT::strtok(whitespace, kWhitespace, &whitespace);
-
- if (!argv[directive->argc - 1]) {
- LogMessageWithContext(file, line,
- "Not enough arguments for chrome manifest directive '%s', expected %i.",
- token, directive->argc);
- continue;
- }
-
- bool ok = true;
- TriState stAppVersion = eUnspecified;
- TriState stGeckoVersion = eUnspecified;
- TriState stApp = eUnspecified;
- TriState stOsVersion = eUnspecified;
- TriState stOs = eUnspecified;
- TriState stABI = eUnspecified;
-#if defined(MOZ_WIDGET_ANDROID)
- TriState stTablet = eUnspecified;
-#endif
- bool platform = false;
- bool contentAccessible = false;
-
- while (NULL != (token = nsCRT::strtok(whitespace, kWhitespace, &whitespace)) && ok) {
- ToLowerCase(token);
- NS_ConvertASCIItoUTF16 wtoken(token);
-
- if (CheckStringFlag(kApplication, wtoken, appID, stApp) ||
- CheckStringFlag(kOs, wtoken, osTarget, stOs) ||
- CheckStringFlag(kABI, wtoken, abi, stABI) ||
- CheckVersionFlag(kOsVersion, wtoken, osVersion, stOsVersion) ||
- CheckVersionFlag(kAppVersion, wtoken, appVersion, stAppVersion) ||
- CheckVersionFlag(kGeckoVersion, wtoken, geckoVersion, stGeckoVersion))
- continue;
-
-#if defined(MOZ_WIDGET_ANDROID)
- bool tablet = false;
- if (CheckFlag(kTablet, wtoken, tablet)) {
- stTablet = (tablet == isTablet) ? eOK : eBad;
- continue;
- }
-#endif
-
- if (directive->contentflags &&
- (CheckFlag(kPlatform, wtoken, platform) ||
- CheckFlag(kContentAccessible, wtoken, contentAccessible)))
- continue;
-
- bool xpcNativeWrappers = true; // Dummy for CheckFlag.
- if (CheckFlag(kXPCNativeWrappers, wtoken, xpcNativeWrappers)) {
- LogMessageWithContext(file, line,
- "Ignoring obsolete chrome registration modifier '%s'.",
- token);
- continue;
- }
-
- LogMessageWithContext(file, line,
- "Unrecognized chrome manifest modifier '%s'.",
- token);
- ok = false;
- }
-
- if (!ok ||
- stApp == eBad ||
- stAppVersion == eBad ||
- stGeckoVersion == eBad ||
- stOs == eBad ||
- stOsVersion == eBad ||
-#ifdef MOZ_WIDGET_ANDROID
- stTablet == eBad ||
-#endif
- stABI == eBad)
- continue;
-
- if (directive->regfunc) {
- if (GeckoProcessType_Default != XRE_GetProcessType())
- continue;
-
- if (!nsChromeRegistry::gChromeRegistry) {
- nsCOMPtr<nsIChromeRegistry> cr =
- mozilla::services::GetChromeRegistryService();
- if (!nsChromeRegistry::gChromeRegistry) {
- LogMessageWithContext(file, line,
- "Chrome registry isn't available yet.");
- continue;
- }
- }
-
- (nsChromeRegistry::gChromeRegistry->*(directive->regfunc))
- (chromecx, line, argv, platform, contentAccessible);
- }
- else if (directive->ischrome || !aChromeOnly) {
- if (directive->isContract) {
- CachedDirective* cd = contracts.AppendElement();
- cd->lineno = line;
- cd->argv[0] = argv[0];
- cd->argv[1] = argv[1];
- }
- else
- (nsComponentManagerImpl::gComponentManager->*(directive->mgrfunc))
- (mgrcx, line, argv);
- }
- }
-
- for (PRUint32 i = 0; i < contracts.Length(); ++i) {
- CachedDirective& d = contracts[i];
- nsComponentManagerImpl::gComponentManager->ManifestContract
- (mgrcx, d.lineno, d.argv);
- }
-}
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla Firefox
+ *
+ * The Initial Developer of the Original Code is
+ * the Mozilla Foundation <http://www.mozilla.org/>.
+ * Portions created by the Initial Developer are Copyright (C) 2010
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Philipp Kewisch <mozilla@kewis.ch>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "mozilla/Util.h"
+
+#include "ManifestParser.h"
+
+#include <string.h>
+
+#include "prio.h"
+#include "prprf.h"
+#if defined(XP_WIN)
+#include <windows.h>
+#elif defined(MOZ_WIDGET_COCOA)
+#include <CoreServices/CoreServices.h>
+#elif defined(MOZ_WIDGET_GTK2)
+#include <gtk/gtk.h>
+#endif
+
+#ifdef MOZ_WIDGET_ANDROID
+#include "AndroidBridge.h"
+#endif
+
+#include "mozilla/Services.h"
+
+#include "nsConsoleMessage.h"
+#include "nsTextFormatter.h"
+#include "nsVersionComparator.h"
+#include "nsXPCOMCIDInternal.h"
+
+#include "nsIConsoleService.h"
+#include "nsIScriptError.h"
+#include "nsIXULAppInfo.h"
+#include "nsIXULRuntime.h"
+
+using namespace mozilla;
+
+struct ManifestDirective
+{
+ const char* directive;
+ int argc;
+
+ // Some directives should only be delivered for NS_COMPONENT_LOCATION
+ // manifests.
+ bool componentonly;
+
+ bool ischrome;
+
+ bool allowbootstrap;
+
+ // The platform/contentaccessible flags only apply to content directives.
+ bool contentflags;
+
+ // Function to handle this directive. This isn't a union because C++ still
+ // hasn't learned how to initialize unions in a sane way.
+ void (nsComponentManagerImpl::*mgrfunc)
+ (nsComponentManagerImpl::ManifestProcessingContext& cx,
+ int lineno, char *const * argv);
+ void (nsChromeRegistry::*regfunc)
+ (nsChromeRegistry::ManifestProcessingContext& cx,
+ int lineno, char *const *argv,
+ bool platform, bool contentaccessible);
+
+ bool isContract;
+};
+static const ManifestDirective kParsingTable[] = {
+ { "manifest", 1, false, true, true, false,
+ &nsComponentManagerImpl::ManifestManifest, NULL },
+ { "binary-component", 1, true, false, false, false,
+ &nsComponentManagerImpl::ManifestBinaryComponent, NULL },
+ { "interfaces", 1, true, false, false, false,
+ &nsComponentManagerImpl::ManifestXPT, NULL },
+ { "component", 2, true, false, false, false,
+ &nsComponentManagerImpl::ManifestComponent, NULL },
+ { "contract", 2, true, false, false, false,
+ &nsComponentManagerImpl::ManifestContract, NULL, true},
+ { "category", 3, true, false, false, false,
+ &nsComponentManagerImpl::ManifestCategory, NULL },
+ { "content", 2, true, true, true, true,
+ NULL, &nsChromeRegistry::ManifestContent },
+ { "locale", 3, true, true, true, false,
+ NULL, &nsChromeRegistry::ManifestLocale },
+ { "skin", 3, false, true, true, false,
+ NULL, &nsChromeRegistry::ManifestSkin },
+ { "overlay", 2, true, true, false, false,
+ NULL, &nsChromeRegistry::ManifestOverlay },
+ { "style", 2, false, true, false, false,
+ NULL, &nsChromeRegistry::ManifestStyle },
+ { "override", 2, true, true, true, false,
+ NULL, &nsChromeRegistry::ManifestOverride },
+ { "resource", 2, true, true, false, false,
+ NULL, &nsChromeRegistry::ManifestResource }
+};
+
+static const char kWhitespace[] = "\t ";
+
+static bool IsNewline(char c)
+{
+ return c == '\n' || c == '\r';
+}
+
+namespace {
+struct AutoPR_smprintf_free
+{
+ AutoPR_smprintf_free(char* buf)
+ : mBuf(buf)
+ {
+ }
+
+ ~AutoPR_smprintf_free()
+ {
+ if (mBuf)
+ PR_smprintf_free(mBuf);
+ }
+
+ operator char*() const {
+ return mBuf;
+ }
+
+ char* mBuf;
+};
+
+} // anonymous namespace
+
+void LogMessage(const char* aMsg, ...)
+{
+ nsCOMPtr<nsIConsoleService> console =
+ do_GetService(NS_CONSOLESERVICE_CONTRACTID);
+ if (!console)
+ return;
+
+ va_list args;
+ va_start(args, aMsg);
+ AutoPR_smprintf_free formatted(PR_vsmprintf(aMsg, args));
+ va_end(args);
+
+ nsCOMPtr<nsIConsoleMessage> error =
+ new nsConsoleMessage(NS_ConvertUTF8toUTF16(formatted).get());
+ console->LogMessage(error);
+}
+
+void LogMessageWithContext(FileLocation &aFile,
+ PRUint32 aLineNumber, const char* aMsg, ...)
+{
+ va_list args;
+ va_start(args, aMsg);
+ AutoPR_smprintf_free formatted(PR_vsmprintf(aMsg, args));
+ va_end(args);
+ if (!formatted)
+ return;
+
+ nsCString file;
+ aFile.GetURIString(file);
+
+ nsCOMPtr<nsIScriptError> error =
+ do_CreateInstance(NS_SCRIPTERROR_CONTRACTID);
+ if (!error) {
+ // This can happen early in component registration. Fall back to a
+ // generic console message.
+ LogMessage("Warning: in '%s', line %i: %s", file.get(),
+ aLineNumber, (char*) formatted);
+ return;
+ }
+
+ nsCOMPtr<nsIConsoleService> console =
+ do_GetService(NS_CONSOLESERVICE_CONTRACTID);
+ if (!console)
+ return;
+
+ nsresult rv = error->Init(NS_ConvertUTF8toUTF16(formatted).get(),
+ NS_ConvertUTF8toUTF16(file).get(), NULL,
+ aLineNumber, 0, nsIScriptError::warningFlag,
+ "chrome registration");
+ if (NS_FAILED(rv))
+ return;
+
+ console->LogMessage(error);
+}
+
+/**
+ * Check for a modifier flag of the following forms:
+ * "flag" (same as "true")
+ * "flag=yes|true|1"
+ * "flag="no|false|0"
+ * @param aFlag The flag to compare.
+ * @param aData The tokenized data to check; this is lowercased
+ * before being passed in.
+ * @param aResult If the flag is found, the value is assigned here.
+ * @return Whether the flag was handled.
+ */
+static bool
+CheckFlag(const nsSubstring& aFlag, const nsSubstring& aData, bool& aResult)
+{
+ if (!StringBeginsWith(aData, aFlag))
+ return false;
+
+ if (aFlag.Length() == aData.Length()) {
+ // the data is simply "flag", which is the same as "flag=yes"
+ aResult = true;
+ return true;
+ }
+
+ if (aData.CharAt(aFlag.Length()) != '=') {
+ // the data is "flag2=", which is not anything we care about
+ return false;
+ }
+
+ if (aData.Length() == aFlag.Length() + 1) {
+ aResult = false;
+ return true;
+ }
+
+ switch (aData.CharAt(aFlag.Length() + 1)) {
+ case '1':
+ case 't': //true
+ case 'y': //yes
+ aResult = true;
+ return true;
+
+ case '0':
+ case 'f': //false
+ case 'n': //no
+ aResult = false;
+ return true;
+ }
+
+ return false;
+}
+
+enum TriState {
+ eUnspecified,
+ eBad,
+ eOK
+};
+
+/**
+ * Check for a modifier flag of the following form:
+ * "flag=string"
+ * "flag!=string"
+ * @param aFlag The flag to compare.
+ * @param aData The tokenized data to check; this is lowercased
+ * before being passed in.
+ * @param aValue The value that is expected.
+ * @param aResult If this is "ok" when passed in, this is left alone.
+ * Otherwise if the flag is found it is set to eBad or eOK.
+ * @return Whether the flag was handled.
+ */
+static bool
+CheckStringFlag(const nsSubstring& aFlag, const nsSubstring& aData,
+ const nsSubstring& aValue, TriState& aResult)
+{
+ if (aData.Length() < aFlag.Length() + 1)
+ return false;
+
+ if (!StringBeginsWith(aData, aFlag))
+ return false;
+
+ bool comparison = true;
+ if (aData[aFlag.Length()] != '=') {
+ if (aData[aFlag.Length()] == '!' &&
+ aData.Length() >= aFlag.Length() + 2 &&
+ aData[aFlag.Length() + 1] == '=')
+ comparison = false;
+ else
+ return false;
+ }
+
+ if (aResult != eOK) {
+ nsDependentSubstring testdata = Substring(aData, aFlag.Length() + (comparison ? 1 : 2));
+ if (testdata.Equals(aValue))
+ aResult = comparison ? eOK : eBad;
+ else
+ aResult = comparison ? eBad : eOK;
+ }
+
+ return true;
+}
+
+/**
+ * Check for a modifier flag of the following form:
+ * "flag=version"
+ * "flag<=version"
+ * "flag<version"
+ * "flag>=version"
+ * "flag>version"
+ * @param aFlag The flag to compare.
+ * @param aData The tokenized data to check; this is lowercased
+ * before being passed in.
+ * @param aValue The value that is expected. If this is empty then no
+ * comparison will match.
+ * @param aResult If this is eOK when passed in, this is left alone.
+ * Otherwise if the flag is found it is set to eBad or eOK.
+ * @return Whether the flag was handled.
+ */
+
+#define COMPARE_EQ 1 << 0
+#define COMPARE_LT 1 << 1
+#define COMPARE_GT 1 << 2
+
+static bool
+CheckVersionFlag(const nsString& aFlag, const nsString& aData,
+ const nsString& aValue, TriState& aResult)
+{
+ if (aData.Length() < aFlag.Length() + 2)
+ return false;
+
+ if (!StringBeginsWith(aData, aFlag))
+ return false;
+
+ if (aValue.Length() == 0) {
+ if (aResult != eOK)
+ aResult = eBad;
+ return true;
+ }
+
+ PRUint32 comparison;
+ nsAutoString testdata;
+
+ switch (aData[aFlag.Length()]) {
+ case '=':
+ comparison = COMPARE_EQ;
+ testdata = Substring(aData, aFlag.Length() + 1);
+ break;
+
+ case '<':
+ if (aData[aFlag.Length() + 1] == '=') {
+ comparison = COMPARE_EQ | COMPARE_LT;
+ testdata = Substring(aData, aFlag.Length() + 2);
+ }
+ else {
+ comparison = COMPARE_LT;
+ testdata = Substring(aData, aFlag.Length() + 1);
+ }
+ break;
+
+ case '>':
+ if (aData[aFlag.Length() + 1] == '=') {
+ comparison = COMPARE_EQ | COMPARE_GT;
+ testdata = Substring(aData, aFlag.Length() + 2);
+ }
+ else {
+ comparison = COMPARE_GT;
+ testdata = Substring(aData, aFlag.Length() + 1);
+ }
+ break;
+
+ default:
+ return false;
+ }
+
+ if (testdata.Length() == 0)
+ return false;
+
+ if (aResult != eOK) {
+ PRInt32 c = NS_CompareVersions(NS_ConvertUTF16toUTF8(aValue).get(),
+ NS_ConvertUTF16toUTF8(testdata).get());
+ if ((c == 0 && comparison & COMPARE_EQ) ||
+ (c < 0 && comparison & COMPARE_LT) ||
+ (c > 0 && comparison & COMPARE_GT))
+ aResult = eOK;
+ else
+ aResult = eBad;
+ }
+
+ return true;
+}
+
+// In-place conversion of ascii characters to lower case
+static void
+ToLowerCase(char* token)
+{
+ for (; *token; ++token)
+ *token = NS_ToLower(*token);
+}
+
+namespace {
+
+struct CachedDirective
+{
+ int lineno;
+ char* argv[4];
+};
+
+} // anonymous namespace
+
+
+void
+ParseManifest(NSLocationType type, FileLocation &file, char* buf, bool aChromeOnly)
+{
+ nsComponentManagerImpl::ManifestProcessingContext mgrcx(type, file, aChromeOnly);
+ nsChromeRegistry::ManifestProcessingContext chromecx(type, file);
+ nsresult rv;
+
+ NS_NAMED_LITERAL_STRING(kPlatform, "platform");
+ NS_NAMED_LITERAL_STRING(kContentAccessible, "contentaccessible");
+ NS_NAMED_LITERAL_STRING(kApplication, "application");
+ NS_NAMED_LITERAL_STRING(kAppVersion, "appversion");
+ NS_NAMED_LITERAL_STRING(kGeckoVersion, "platformversion");
+ NS_NAMED_LITERAL_STRING(kOs, "os");
+ NS_NAMED_LITERAL_STRING(kOsVersion, "osversion");
+ NS_NAMED_LITERAL_STRING(kABI, "abi");
+#if defined(MOZ_WIDGET_ANDROID)
+ NS_NAMED_LITERAL_STRING(kTablet, "tablet");
+#endif
+
+ // Obsolete
+ NS_NAMED_LITERAL_STRING(kXPCNativeWrappers, "xpcnativewrappers");
+
+ nsAutoString appID;
+ nsAutoString appVersion;
+ nsAutoString geckoVersion;
+ nsAutoString osTarget;
+ nsAutoString abi;
+
+ nsCOMPtr<nsIXULAppInfo> xapp (do_GetService(XULAPPINFO_SERVICE_CONTRACTID));
+ if (xapp) {
+ nsCAutoString s;
+ rv = xapp->GetID(s);
+ if (NS_SUCCEEDED(rv))
+ CopyUTF8toUTF16(s, appID);
+
+ rv = xapp->GetVersion(s);
+ if (NS_SUCCEEDED(rv))
+ CopyUTF8toUTF16(s, appVersion);
+
+ rv = xapp->GetPlatformVersion(s);
+ if (NS_SUCCEEDED(rv))
+ CopyUTF8toUTF16(s, geckoVersion);
+
+ nsCOMPtr<nsIXULRuntime> xruntime (do_QueryInterface(xapp));
+ if (xruntime) {
+ rv = xruntime->GetOS(s);
+ if (NS_SUCCEEDED(rv)) {
+ ToLowerCase(s);
+ CopyUTF8toUTF16(s, osTarget);
+ }
+
+ rv = xruntime->GetXPCOMABI(s);
+ if (NS_SUCCEEDED(rv) && osTarget.Length()) {
+ ToLowerCase(s);
+ CopyUTF8toUTF16(s, abi);
+ abi.Insert(PRUnichar('_'), 0);
+ abi.Insert(osTarget, 0);
+ }
+ }
+ }
+
+ nsAutoString osVersion;
+#if defined(XP_WIN)
+ OSVERSIONINFO info = { sizeof(OSVERSIONINFO) };
+ if (GetVersionEx(&info)) {
+ nsTextFormatter::ssprintf(osVersion, NS_LITERAL_STRING("%ld.%ld").get(),
+ info.dwMajorVersion,
+ info.dwMinorVersion);
+ }
+#elif defined(MOZ_WIDGET_COCOA)
+ SInt32 majorVersion, minorVersion;
+ if ((Gestalt(gestaltSystemVersionMajor, &majorVersion) == noErr) &&
+ (Gestalt(gestaltSystemVersionMinor, &minorVersion) == noErr)) {
+ nsTextFormatter::ssprintf(osVersion, NS_LITERAL_STRING("%ld.%ld").get(),
+ majorVersion,
+ minorVersion);
+ }
+#elif defined(MOZ_WIDGET_GTK2)
+ nsTextFormatter::ssprintf(osVersion, NS_LITERAL_STRING("%ld.%ld").get(),
+ gtk_major_version,
+ gtk_minor_version);
+#elif defined(MOZ_WIDGET_ANDROID)
+ bool isTablet = false;
+ if (mozilla::AndroidBridge::Bridge()) {
+ mozilla::AndroidBridge::Bridge()->GetStaticStringField("android/os/Build$VERSION", "RELEASE", osVersion);
+ isTablet = mozilla::AndroidBridge::Bridge()->IsTablet();
+ }
+#endif
+
+ // Because contracts must be registered after CIDs, we save and process them
+ // at the end.
+ nsTArray<CachedDirective> contracts;
+
+ char *token;
+ char *newline = buf;
+ PRUint32 line = 0;
+
+ // outer loop tokenizes by newline
+ while (*newline) {
+ while (*newline && IsNewline(*newline)) {
+ ++newline;
+ ++line;
+ }
+ if (!*newline)
+ break;
+
+ token = newline;
+ while (*newline && !IsNewline(*newline))
+ ++newline;
+
+ if (*newline) {
+ *newline = '\0';
+ ++newline;
+ }
+ ++line;
+
+ if (*token == '#') // ignore lines that begin with # as comments
+ continue;
+
+ char *whitespace = token;
+ token = nsCRT::strtok(whitespace, kWhitespace, &whitespace);
+ if (!token) continue;
+
+ const ManifestDirective* directive = NULL;
+ for (const ManifestDirective* d = kParsingTable;
+ d < ArrayEnd(kParsingTable);
+ ++d) {
+ if (!strcmp(d->directive, token)) {
+ directive = d;
+ break;
+ }
+ }
+
+ if (!directive) {
+ LogMessageWithContext(file, line,
+ "Ignoring unrecognized chrome manifest directive '%s'.",
+ token);
+ continue;
+ }
+
+ if (!directive->allowbootstrap && NS_BOOTSTRAPPED_LOCATION == type) {
+ LogMessageWithContext(file, line,
+ "Bootstrapped manifest not allowed to use '%s' directive.",
+ token);
+ continue;
+ }
+
+ if (directive->componentonly && NS_SKIN_LOCATION == type) {
+ LogMessageWithContext(file, line,
+ "Skin manifest not allowed to use '%s' directive.",
+ token);
+ continue;
+ }
+
+ NS_ASSERTION(directive->argc < 4, "Need to reset argv array length");
+ char* argv[4];
+ for (int i = 0; i < directive->argc; ++i)
+ argv[i] = nsCRT::strtok(whitespace, kWhitespace, &whitespace);
+
+ if (!argv[directive->argc - 1]) {
+ LogMessageWithContext(file, line,
+ "Not enough arguments for chrome manifest directive '%s', expected %i.",
+ token, directive->argc);
+ continue;
+ }
+
+ bool ok = true;
+ TriState stAppVersion = eUnspecified;
+ TriState stGeckoVersion = eUnspecified;
+ TriState stApp = eUnspecified;
+ TriState stOsVersion = eUnspecified;
+ TriState stOs = eUnspecified;
+ TriState stABI = eUnspecified;
+#if defined(MOZ_WIDGET_ANDROID)
+ TriState stTablet = eUnspecified;
+#endif
+ bool platform = false;
+ bool contentAccessible = false;
+
+ while (NULL != (token = nsCRT::strtok(whitespace, kWhitespace, &whitespace)) && ok) {
+ ToLowerCase(token);
+ NS_ConvertASCIItoUTF16 wtoken(token);
+
+ if (CheckStringFlag(kApplication, wtoken, appID, stApp) ||
+ CheckStringFlag(kOs, wtoken, osTarget, stOs) ||
+ CheckStringFlag(kABI, wtoken, abi, stABI) ||
+ CheckVersionFlag(kOsVersion, wtoken, osVersion, stOsVersion) ||
+ CheckVersionFlag(kAppVersion, wtoken, appVersion, stAppVersion) ||
+ CheckVersionFlag(kGeckoVersion, wtoken, geckoVersion, stGeckoVersion))
+ continue;
+
+#if defined(MOZ_WIDGET_ANDROID)
+ bool tablet = false;
+ if (CheckFlag(kTablet, wtoken, tablet)) {
+ stTablet = (tablet == isTablet) ? eOK : eBad;
+ continue;
+ }
+#endif
+
+ if (directive->contentflags &&
+ (CheckFlag(kPlatform, wtoken, platform) ||
+ CheckFlag(kContentAccessible, wtoken, contentAccessible)))
+ continue;
+
+ bool xpcNativeWrappers = true; // Dummy for CheckFlag.
+ if (CheckFlag(kXPCNativeWrappers, wtoken, xpcNativeWrappers)) {
+ LogMessageWithContext(file, line,
+ "Ignoring obsolete chrome registration modifier '%s'.",
+ token);
+ continue;
+ }
+
+ LogMessageWithContext(file, line,
+ "Unrecognized chrome manifest modifier '%s'.",
+ token);
+ ok = false;
+ }
+
+ if (!ok ||
+ stApp == eBad ||
+ stAppVersion == eBad ||
+ stGeckoVersion == eBad ||
+ stOs == eBad ||
+ stOsVersion == eBad ||
+#ifdef MOZ_WIDGET_ANDROID
+ stTablet == eBad ||
+#endif
+ stABI == eBad)
+ continue;
+
+ if (directive->regfunc) {
+ if (GeckoProcessType_Default != XRE_GetProcessType())
+ continue;
+
+ if (!nsChromeRegistry::gChromeRegistry) {
+ nsCOMPtr<nsIChromeRegistry> cr =
+ mozilla::services::GetChromeRegistryService();
+ if (!nsChromeRegistry::gChromeRegistry) {
+ LogMessageWithContext(file, line,
+ "Chrome registry isn't available yet.");
+ continue;
+ }
+ }
+
+ (nsChromeRegistry::gChromeRegistry->*(directive->regfunc))
+ (chromecx, line, argv, platform, contentAccessible);
+ }
+ else if (directive->ischrome || !aChromeOnly) {
+ if (directive->isContract) {
+ CachedDirective* cd = contracts.AppendElement();
+ cd->lineno = line;
+ cd->argv[0] = argv[0];
+ cd->argv[1] = argv[1];
+ }
+ else
+ (nsComponentManagerImpl::gComponentManager->*(directive->mgrfunc))
+ (mgrcx, line, argv);
+ }
+ }
+
+ for (PRUint32 i = 0; i < contracts.Length(); ++i) {
+ CachedDirective& d = contracts[i];
+ nsComponentManagerImpl::gComponentManager->ManifestContract
+ (mgrcx, d.lineno, d.argv);
+ }
+}