diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
index f89a8abda58..49946f5f9e3 100644
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -282,6 +282,7 @@ pref("browser.urlbar.doubleClickSelectsAll", true);
pref("browser.urlbar.doubleClickSelectsAll", false);
#endif
pref("browser.urlbar.autoFill", false);
+pref("browser.urlbar.autoFill.typed", true);
// 0: Match anywhere (e.g., middle of words)
// 1: Match on word boundaries and then try matching anywhere
// 2: Match only on word boundaries (e.g., after / or .)
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 3adbc57d129..f9040ea410d 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -9053,7 +9053,14 @@ XPCOMUtils.defineLazyGetter(Scratchpad, "ScratchpadManager", function() {
var StyleEditor = {
prefEnabledName: "devtools.styleeditor.enabled",
- openChrome: function SE_openChrome()
+ /**
+ * Opens the style editor. If the UI is already open, it will be focused.
+ *
+ * @param {CSSStyleSheet} [aSelectedStyleSheet] default Stylesheet.
+ * @param {Number} [aLine] Line to which the caret should be moved (one-indexed).
+ * @param {Number} [aCol] Column to which the caret should be moved (one-indexed).
+ */
+ openChrome: function SE_openChrome(aSelectedStyleSheet, aLine, aCol)
{
const CHROME_URL = "chrome://browser/content/styleeditor.xul";
const CHROME_WINDOW_TYPE = "Tools:StyleEditor";
@@ -9067,14 +9074,23 @@ var StyleEditor = {
while (enumerator.hasMoreElements()) {
var win = enumerator.getNext();
if (win.styleEditorChrome.contentWindowID == contentWindowID) {
+ if (aSelectedStyleSheet) {
+ win.styleEditorChrome.selectStyleSheet(aSelectedStyleSheet, aLine, aCol);
+ }
win.focus();
return win;
}
}
+ let args = {
+ contentWindow: contentWindow,
+ selectedStyleSheet: aSelectedStyleSheet,
+ line: aLine,
+ col: aCol
+ };
+ args.wrappedJSObject = args;
let chromeWindow = Services.ww.openWindow(null, CHROME_URL, "_blank",
- CHROME_WINDOW_FLAGS,
- contentWindow);
+ CHROME_WINDOW_FLAGS, args);
chromeWindow.focus();
return chromeWindow;
}
diff --git a/browser/base/content/browser.xul b/browser/base/content/browser.xul
index 64c99679b3f..3ac55cb125d 100644
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -90,6 +90,7 @@
lightweightthemes="true"
lightweightthemesfooter="browser-bottombox"
windowtype="navigator:browser"
+ macanimationtype="document"
screenX="4" screenY="4"
browsingmode="normal"
persist="screenX screenY width height sizemode">
diff --git a/browser/base/content/tabbrowser.xml b/browser/base/content/tabbrowser.xml
index 90aa31dba5d..0eeb0276abd 100644
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -1266,6 +1266,12 @@
else {
t._animStartTime = Date.now();
t.setAttribute("fadein", "true");
+
+ // This call to adjustTabstrip is redundant but needed so that
+ // when opening a second tab, the first tab's close buttons
+ // appears immediately rather than when the transition ends.
+ if (tabContainer.childNodes.length == 2)
+ tabContainer.adjustTabstrip();
}
}, 0, this.tabContainer);
}
@@ -1365,7 +1371,8 @@
// pretend the user typed this so it'll be available till
// the document successfully loads
- b.userTypedValue = aURI;
+ if (!isBlankPageURL(aURI))
+ b.userTypedValue = aURI;
let flags = Ci.nsIWebNavigation.LOAD_FLAGS_NONE;
if (aAllowThirdPartyFixup)
@@ -1557,15 +1564,26 @@
diff --git a/browser/devtools/sourceeditor/source-editor-orion.jsm b/browser/devtools/sourceeditor/source-editor-orion.jsm
index fb6d485072f..5cb4b0693df 100644
--- a/browser/devtools/sourceeditor/source-editor-orion.jsm
+++ b/browser/devtools/sourceeditor/source-editor-orion.jsm
@@ -78,6 +78,9 @@ const ORION_EVENTS = {
Selection: "Selection",
Focus: "Focus",
Blur: "Blur",
+ MouseOver: "MouseOver",
+ MouseOut: "MouseOut",
+ MouseMove: "MouseMove",
};
/**
diff --git a/browser/devtools/sourceeditor/source-editor.jsm b/browser/devtools/sourceeditor/source-editor.jsm
index e38ac0e2ef2..85d07c85955 100644
--- a/browser/devtools/sourceeditor/source-editor.jsm
+++ b/browser/devtools/sourceeditor/source-editor.jsm
@@ -161,6 +161,30 @@ SourceEditor.EVENTS = {
* The blur event is fired when the editor goes out of focus.
*/
BLUR: "Blur",
+
+ /**
+ * The MouseMove event is sent when the user moves the mouse over a line
+ * annotation. The event object properties:
+ * - event - the DOM mousemove event object.
+ * - x and y - the mouse coordinates relative to the document being edited.
+ */
+ MOUSE_MOVE: "MouseMove",
+
+ /**
+ * The MouseOver event is sent when the mouse pointer enters a line
+ * annotation. The event object properties:
+ * - event - the DOM mouseover event object.
+ * - x and y - the mouse coordinates relative to the document being edited.
+ */
+ MOUSE_OVER: "MouseOver",
+
+ /**
+ * This MouseOut event is sent when the mouse pointer exits a line
+ * annotation. The event object properties:
+ * - event - the DOM mouseout event object.
+ * - x and y - the mouse coordinates relative to the document being edited.
+ */
+ MOUSE_OUT: "MouseOut",
};
/**
diff --git a/browser/devtools/sourceeditor/test/Makefile.in b/browser/devtools/sourceeditor/test/Makefile.in
index f8f390b0bee..081dc57dcbf 100644
--- a/browser/devtools/sourceeditor/test/Makefile.in
+++ b/browser/devtools/sourceeditor/test/Makefile.in
@@ -55,6 +55,7 @@ _BROWSER_TEST_FILES = \
browser_bug687160_line_api.js \
browser_bug650345_find.js \
browser_bug703692_focus_blur.js \
+ browser_bug725388_mouse_events.js \
head.js \
libs:: $(_BROWSER_TEST_FILES)
diff --git a/browser/devtools/sourceeditor/test/browser_bug725388_mouse_events.js b/browser/devtools/sourceeditor/test/browser_bug725388_mouse_events.js
new file mode 100644
index 00000000000..07959127161
--- /dev/null
+++ b/browser/devtools/sourceeditor/test/browser_bug725388_mouse_events.js
@@ -0,0 +1,97 @@
+/* vim: set ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+let tempScope = {};
+Cu.import("resource:///modules/source-editor.jsm", tempScope);
+let SourceEditor = tempScope.SourceEditor;
+
+let testWin;
+let editor;
+
+function test()
+{
+ waitForExplicitFinish();
+
+ const windowUrl = "data:text/xml," +
+ "";
+ const windowFeatures = "chrome,titlebar,toolbar,centerscreen,resizable,dialog=no";
+
+ testWin = Services.ww.openWindow(null, windowUrl, "_blank", windowFeatures, null);
+ testWin.addEventListener("load", function onWindowLoad() {
+ testWin.removeEventListener("load", onWindowLoad, false);
+ waitForFocus(initEditor, testWin);
+ }, false);
+}
+
+function initEditor()
+{
+ let hbox = testWin.document.querySelector("hbox");
+
+ editor = new SourceEditor();
+ editor.init(hbox, {}, editorLoaded);
+}
+
+function editorLoaded()
+{
+ let text = "BrowserBug - 725388";
+ editor.setText(text);
+
+ let target = editor.editorElement;
+ let targetWin = target.ownerDocument.defaultView;
+
+ let mMoveHandler = function(aEvent) {
+ editor.removeEventListener(SourceEditor.EVENTS.MOUSE_MOVE, mMoveHandler);
+
+ is(aEvent.event.type, "mousemove", "MouseMove event fired.");
+
+ editor.addEventListener(SourceEditor.EVENTS.MOUSE_OVER, mOverHandler);
+ waitForFocus(function() {
+ EventUtils.synthesizeMouse(target, 10, 10, {type: "mouseover"},
+ targetWin);
+ });
+ };
+
+ let mOverHandler = function(aEvent) {
+ editor.removeEventListener(SourceEditor.EVENTS.MOUSE_OVER, mOverHandler);
+
+ is(aEvent.event.type, "mouseover", "MouseOver event fired.");
+
+ editor.addEventListener(SourceEditor.EVENTS.MOUSE_OUT, mOutHandler);
+ waitForFocus(function() {
+ EventUtils.synthesizeMouse(target, -10, -10, {type: "mouseout"},
+ targetWin);
+ }, targetWin);
+ };
+
+ let mOutHandler = function(aEvent) {
+ editor.removeEventListener(SourceEditor.EVENTS.MOUSE_OUT, mOutHandler);
+
+ is(aEvent.event.type, "mouseout", "MouseOut event fired.");
+ executeSoon(testEnd);
+ };
+
+ editor.addEventListener(SourceEditor.EVENTS.MOUSE_MOVE, mMoveHandler);
+
+ editor.focus();
+ waitForFocus(function() {
+ EventUtils.synthesizeMouse(target, 1, 1, {type: "mousemove"},
+ targetWin);
+ }, targetWin);
+}
+
+function testEnd()
+{
+ if (editor) {
+ editor.destroy();
+ }
+ if (testWin) {
+ testWin.close();
+ }
+ testWin = editor = null;
+
+ waitForFocus(finish, window);
+}
diff --git a/browser/devtools/styleeditor/StyleEditor.jsm b/browser/devtools/styleeditor/StyleEditor.jsm
index 4eb8241eee2..ff492cb056f 100644
--- a/browser/devtools/styleeditor/StyleEditor.jsm
+++ b/browser/devtools/styleeditor/StyleEditor.jsm
@@ -146,7 +146,7 @@ StyleEditor.prototype = {
*/
get styleSheet()
{
- assert(this._styleSheet, "StyleSheet must be loaded first.")
+ assert(this._styleSheet, "StyleSheet must be loaded first.");
return this._styleSheet;
},
@@ -921,9 +921,11 @@ StyleEditor.prototype = {
aArgs.unshift(this);
}
+ // copy the list of listeners to allow adding/removing listeners in handlers
+ let listeners = this._actionListeners.concat();
// trigger all listeners that have this action handler
- for (let i = 0; i < this._actionListeners.length; ++i) {
- let listener = this._actionListeners[i];
+ for (let i = 0; i < listeners.length; ++i) {
+ let listener = listeners[i];
let actionHandler = listener["on" + aName];
if (actionHandler) {
actionHandler.apply(listener, aArgs);
diff --git a/browser/devtools/styleeditor/StyleEditorChrome.jsm b/browser/devtools/styleeditor/StyleEditorChrome.jsm
index ca57f0208ce..0873941cb44 100644
--- a/browser/devtools/styleeditor/StyleEditorChrome.jsm
+++ b/browser/devtools/styleeditor/StyleEditorChrome.jsm
@@ -270,9 +270,11 @@ StyleEditorChrome.prototype = {
aArgs.unshift(this);
}
- // trigger all listeners that have this named handler
- for (let i = 0; i < this._listeners.length; ++i) {
- let listener = this._listeners[i];
+ // copy the list of listeners to allow adding/removing listeners in handlers
+ let listeners = this._listeners.concat();
+ // trigger all listeners that have this named handler.
+ for (let i = 0; i < listeners.length; i++) {
+ let listener = listeners[i];
let handler = listener["on" + aName];
if (handler) {
handler.apply(listener, aArgs);
@@ -329,10 +331,10 @@ StyleEditorChrome.prototype = {
{
this._resetChrome();
- this._document.title = _("chromeWindowTitle",
- this.contentDocument.title || this.contentDocument.location.href);
-
let document = this.contentDocument;
+ this._document.title = _("chromeWindowTitle",
+ document.title || document.location.href);
+
for (let i = 0; i < document.styleSheets.length; ++i) {
let styleSheet = document.styleSheets[i];
@@ -352,6 +354,79 @@ StyleEditorChrome.prototype = {
}, this);
},
+ /**
+ * selects a stylesheet and optionally moves the cursor to a selected line
+ *
+ * @param {CSSStyleSheet} [aSheet]
+ * Stylesheet that should be selected. If a stylesheet is not passed
+ * and the editor is not initialized we focus the first stylesheet. If
+ * a stylesheet is not passed and the editor is initialized we ignore
+ * the call.
+ * @param {Number} [aLine]
+ * Line to which the caret should be moved (one-indexed).
+ * @param {Number} [aCol]
+ * Column to which the caret should be moved (one-indexed).
+ */
+ selectStyleSheet: function SEC_selectSheet(aSheet, aLine, aCol)
+ {
+ let select = function DEC_select(aEditor) {
+ let summary = aSheet ? this.getSummaryElementForEditor(aEditor)
+ : this._view.getSummaryElementByOrdinal(0);
+ let setCaret = false;
+
+ if (aLine || aCol) {
+ aLine = aLine || 1;
+ aCol = aCol || 1;
+ setCaret = true;
+ }
+ if (!aEditor.sourceEditor) {
+ // If a line or column was specified we move the caret appropriately.
+ if (setCaret) {
+ aEditor.addActionListener({
+ onAttach: function SEC_selectSheet_onAttach()
+ {
+ aEditor.removeActionListener(this);
+ aEditor.sourceEditor.setCaretPosition(aLine - 1, aCol - 1);
+ }
+ });
+ }
+ this._view.activeSummary = summary;
+ } else {
+ this._view.activeSummary = summary;
+
+ // If a line or column was specified we move the caret appropriately.
+ if (setCaret) {
+ aEditor.sourceEditor.setCaretPosition(aLine - 1, aCol - 1);
+ }
+ }
+ }.bind(this);
+
+ if (!this.editors.length) {
+ // We are in the main initialization phase so we wait for the editor
+ // containing the target stylesheet to be added and select the target
+ // stylesheet, optionally moving the cursor to a selected line.
+ this.addChromeListener({
+ onEditorAdded: function SEC_selectSheet_onEditorAdded(aChrome, aEditor) {
+ if ((!aSheet && aEditor.styleSheetIndex == 0) ||
+ aEditor.styleSheet == aSheet) {
+ aChrome.removeChromeListener(this);
+ select(aEditor);
+ }
+ }
+ });
+ } else if (aSheet) {
+ // We are already initialized and a stylesheet has been specified. Here
+ // we iterate through the editors and select the one containing the target
+ // stylesheet, optionally moving the cursor to a selected line.
+ for each (let editor in this.editors) {
+ if (editor.styleSheet == aSheet) {
+ select(editor);
+ break;
+ }
+ }
+ }
+ },
+
/**
* Disable all UI, effectively making editors read-only.
* This is automatically called when no content window is attached.
@@ -455,9 +530,8 @@ StyleEditorChrome.prototype = {
}
}, false);
- // autofocus the first or new stylesheet
- if (editor.styleSheetIndex == 0 ||
- editor.hasFlag(StyleEditorFlags.NEW)) {
+ // autofocus new stylesheets
+ if (editor.hasFlag(StyleEditorFlags.NEW)) {
this._view.activeSummary = aSummary;
}
diff --git a/browser/devtools/styleeditor/styleeditor.xul b/browser/devtools/styleeditor/styleeditor.xul
index f10ae6deda2..e84df003c0f 100644
--- a/browser/devtools/styleeditor/styleeditor.xul
+++ b/browser/devtools/styleeditor/styleeditor.xul
@@ -132,8 +132,10 @@
diff --git a/browser/devtools/styleeditor/test/Makefile.in b/browser/devtools/styleeditor/test/Makefile.in
index f8dcecf7e8f..0b411622473 100644
--- a/browser/devtools/styleeditor/test/Makefile.in
+++ b/browser/devtools/styleeditor/test/Makefile.in
@@ -51,6 +51,7 @@ _BROWSER_TEST_FILES = \
browser_styleeditor_init.js \
browser_styleeditor_loading.js \
browser_styleeditor_new.js \
+ browser_styleeditor_passedinsheet.js \
browser_styleeditor_pretty.js \
browser_styleeditor_readonly.js \
browser_styleeditor_reopen.js \
diff --git a/browser/devtools/styleeditor/test/browser_styleeditor_passedinsheet.js b/browser/devtools/styleeditor/test/browser_styleeditor_passedinsheet.js
new file mode 100644
index 00000000000..05b37019e49
--- /dev/null
+++ b/browser/devtools/styleeditor/test/browser_styleeditor_passedinsheet.js
@@ -0,0 +1,61 @@
+/* vim: set ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+const TESTCASE_URI = TEST_BASE + "simple.html";
+const LINE = 6;
+const COL = 2;
+
+let editor = null;
+let sheet = null;
+
+function test()
+{
+ waitForExplicitFinish();
+ gBrowser.selectedBrowser.addEventListener("load", function () {
+ gBrowser.selectedBrowser.removeEventListener("load", arguments.callee, true);
+ run();
+ }, true);
+ content.location = TESTCASE_URI;
+}
+
+function run()
+{
+ sheet = content.document.styleSheets[1];
+ launchStyleEditorChrome(function attachListeners(aChrome) {
+ aChrome.addChromeListener({
+ onEditorAdded: checkSourceEditor
+ });
+ }, sheet, LINE, COL);
+}
+
+function checkSourceEditor(aChrome, aEditor)
+{
+ if (!aEditor.sourceEditor) {
+ aEditor.addActionListener({
+ onAttach: function (aEditor) {
+ aEditor.removeActionListener(this);
+ validate(aEditor);
+ }
+ });
+ } else {
+ validate(aEditor);
+ }
+}
+
+function validate(aEditor)
+{
+ info("validating style editor");
+ let sourceEditor = aEditor.sourceEditor;
+ let caretPosition = sourceEditor.getCaretPosition();
+ is(caretPosition.line, LINE - 1, "caret row is correct"); // index based
+ is(caretPosition.col, COL - 1, "caret column is correct");
+ is(aEditor.styleSheet, sheet, "loaded stylesheet matches document stylesheet");
+ finishUp();
+}
+
+function finishUp()
+{
+ editor = sheet = null;
+ finish();
+}
diff --git a/browser/devtools/styleeditor/test/head.js b/browser/devtools/styleeditor/test/head.js
index f1bfbfbacd9..bc4267a6962 100644
--- a/browser/devtools/styleeditor/test/head.js
+++ b/browser/devtools/styleeditor/test/head.js
@@ -19,9 +19,9 @@ function cleanup()
}
}
-function launchStyleEditorChrome(aCallback)
+function launchStyleEditorChrome(aCallback, aSheet, aLine, aCol)
{
- gChromeWindow = StyleEditor.openChrome();
+ gChromeWindow = StyleEditor.openChrome(aSheet, aLine, aCol);
if (gChromeWindow.document.readyState != "complete") {
gChromeWindow.addEventListener("load", function onChromeLoad() {
gChromeWindow.removeEventListener("load", onChromeLoad, true);
@@ -34,12 +34,12 @@ function launchStyleEditorChrome(aCallback)
}
}
-function addTabAndLaunchStyleEditorChromeWhenLoaded(aCallback)
+function addTabAndLaunchStyleEditorChromeWhenLoaded(aCallback, aSheet, aLine, aCol)
{
gBrowser.selectedTab = gBrowser.addTab();
gBrowser.selectedBrowser.addEventListener("load", function onLoad() {
gBrowser.selectedBrowser.removeEventListener("load", onLoad, true);
- launchStyleEditorChrome(aCallback);
+ launchStyleEditorChrome(aCallback, aSheet, aLine, aCol);
}, true);
}
diff --git a/browser/devtools/styleinspector/CssHtmlTree.jsm b/browser/devtools/styleinspector/CssHtmlTree.jsm
index 7e121e1fac4..4915b3f2794 100644
--- a/browser/devtools/styleinspector/CssHtmlTree.jsm
+++ b/browser/devtools/styleinspector/CssHtmlTree.jsm
@@ -273,6 +273,7 @@ CssHtmlTree.prototype = {
this._matchedProperties = null;
if (this.htmlComplete) {
+ this.refreshSourceFilter();
this.refreshPanel();
} else {
if (this._refreshProcess) {
@@ -281,6 +282,9 @@ CssHtmlTree.prototype = {
CssHtmlTree.processTemplate(this.templateRoot, this.root, this);
+ // Refresh source filter ... this must be done after templateRoot has been
+ // processed.
+ this.refreshSourceFilter();
this.numVisibleProperties = 0;
let fragment = this.doc.createDocumentFragment();
this._refreshProcess = new UpdateProcess(this.win, CssHtmlTree.propertyNames, {
@@ -362,21 +366,28 @@ CssHtmlTree.prototype = {
},
/**
- * The change event handler for the onlyUserStyles checkbox. When
- * onlyUserStyles.checked is true we do not display properties that have no
- * matched selectors, and we do not display UA styles. If .checked is false we
- * do display even properties with no matched selectors, and we include the UA
- * styles.
+ * The change event handler for the onlyUserStyles checkbox.
*
* @param {Event} aEvent the DOM Event object.
*/
onlyUserStylesChanged: function CssHtmltree_onlyUserStylesChanged(aEvent)
+ {
+ this.refreshSourceFilter();
+ this.refreshPanel();
+ },
+
+ /**
+ * When onlyUserStyles.checked is true we only display properties that have
+ * matched selectors and have been included by the document or one of the
+ * document's stylesheets. If .checked is false we display all properties
+ * including those that come from UA stylesheets.
+ */
+ refreshSourceFilter: function CssHtmlTree_setSourceFilter()
{
this._matchedProperties = null;
this.cssLogic.sourceFilter = this.showOnlyUserStyles ?
CssLogic.FILTER.ALL :
CssLogic.FILTER.UA;
- this.refreshPanel();
},
/**
@@ -974,4 +985,24 @@ SelectorView.prototype = {
return result;
},
+
+ /**
+ * When a css link is clicked this method is called in order to either:
+ * 1. Open the link in view source (for element style attributes).
+ * 2. Open the link in the style editor.
+ *
+ * @param aEvent The click event
+ */
+ openStyleEditor: function(aEvent)
+ {
+ if (this.selectorInfo.selector._cssRule._cssSheet) {
+ let styleSheet = this.selectorInfo.selector._cssRule._cssSheet.domSheet;
+ let line = this.selectorInfo.ruleLine;
+
+ this.tree.win.StyleEditor.openChrome(styleSheet, line);
+ } else {
+ let href = this.selectorInfo.sourceElement.ownerDocument.location.href;
+ this.tree.win.openUILinkIn("view-source:" + href, "window");
+ }
+ },
};
diff --git a/browser/devtools/styleinspector/CssLogic.jsm b/browser/devtools/styleinspector/CssLogic.jsm
index d4b03d1c2a4..67e37810071 100644
--- a/browser/devtools/styleinspector/CssLogic.jsm
+++ b/browser/devtools/styleinspector/CssLogic.jsm
@@ -232,7 +232,7 @@ CssLogic.prototype = {
// Update the CssSheet objects.
this.forEachSheet(function(aSheet) {
aSheet._sheetAllowed = -1;
- if (!aSheet.systemSheet && aSheet.sheetAllowed) {
+ if (aSheet.contentSheet && aSheet.sheetAllowed) {
ruleCount += aSheet.ruleCount;
}
}, this);
@@ -345,7 +345,7 @@ CssLogic.prototype = {
let sheets = [];
this.forEachSheet(function (aSheet) {
- if (!aSheet.systemSheet) {
+ if (aSheet.contentSheet) {
sheets.push(aSheet);
}
}, this);
@@ -395,7 +395,7 @@ CssLogic.prototype = {
}
sheet = new CssSheet(this, aDomSheet, aIndex);
- if (sheet.sheetAllowed && !sheet.systemSheet) {
+ if (sheet.sheetAllowed && sheet.contentSheet) {
this._ruleCount += sheet.ruleCount;
}
@@ -569,7 +569,7 @@ CssLogic.prototype = {
this.forEachSheet(function (aSheet) {
// We do not show unmatched selectors from system stylesheets
- if (aSheet.systemSheet || aSheet.disabled || !aSheet.mediaMatches) {
+ if (!aSheet.contentSheet || aSheet.disabled || !aSheet.mediaMatches) {
return;
}
@@ -664,7 +664,7 @@ CssLogic.prototype = {
sheet._passId = this._passId;
}
- if (filter !== CssLogic.FILTER.UA && sheet.systemSheet) {
+ if (filter === CssLogic.FILTER.ALL && !sheet.contentSheet) {
continue;
}
@@ -710,7 +710,7 @@ CssLogic.prototype = {
let result = {};
this.forSomeSheets(function (aSheet) {
- if (aSheet.systemSheet || aSheet.disabled || !aSheet.mediaMatches) {
+ if (!aSheet.contentSheet || aSheet.disabled || !aSheet.mediaMatches) {
return false;
}
@@ -865,29 +865,23 @@ XPCOMUtils.defineLazyGetter(CssLogic, "_strings", function() Services.strings
.createBundle("chrome://browser/locale/devtools/styleinspector.properties"));
/**
- * Is the given property sheet a system (user agent) stylesheet?
+ * Is the given property sheet a content stylesheet?
*
* @param {CSSStyleSheet} aSheet a stylesheet
- * @return {boolean} true if the given stylesheet is a system stylesheet or
+ * @return {boolean} true if the given stylesheet is a content stylesheet,
* false otherwise.
*/
-CssLogic.isSystemStyleSheet = function CssLogic_isSystemStyleSheet(aSheet)
+CssLogic.isContentStylesheet = function CssLogic_isContentStylesheet(aSheet)
{
- if (!aSheet) {
+ // All sheets with owner nodes have been included by content.
+ if (aSheet.ownerNode) {
return true;
}
- let url = aSheet.href;
-
- if (!url) return false;
- if (url.length === 0) return true;
-
- // Check for http[s]
- if (url[0] === 'h') return false;
- if (url.substr(0, 9) === "resource:") return true;
- if (url.substr(0, 7) === "chrome:") return true;
- if (url === "XPCSafeJSObjectWrapper.cpp") return true;
- if (url.substr(0, 6) === "about:") return true;
+ // If the sheet has a CSSImportRule we need to check the parent stylesheet.
+ if (aSheet.ownerRule instanceof Ci.nsIDOMCSSImportRule) {
+ return CssLogic.isContentStylesheet(aSheet.parentStyleSheet);
+ }
return false;
};
@@ -942,7 +936,7 @@ function CssSheet(aCssLogic, aDomSheet, aIndex)
{
this._cssLogic = aCssLogic;
this.domSheet = aDomSheet;
- this.index = this.systemSheet ? -100 * aIndex : aIndex;
+ this.index = this.contentSheet ? aIndex : -100 * aIndex;
// Cache of the sheets href. Cached by the getter.
this._href = null;
@@ -960,21 +954,21 @@ function CssSheet(aCssLogic, aDomSheet, aIndex)
CssSheet.prototype = {
_passId: null,
- _systemSheet: null,
+ _contentSheet: null,
_mediaMatches: null,
/**
* Tells if the stylesheet is provided by the browser or not.
*
- * @return {boolean} true if this is a browser-provided stylesheet, or false
+ * @return {boolean} false if this is a browser-provided stylesheet, or true
* otherwise.
*/
- get systemSheet()
+ get contentSheet()
{
- if (this._systemSheet === null) {
- this._systemSheet = CssLogic.isSystemStyleSheet(this.domSheet);
+ if (this._contentSheet === null) {
+ this._contentSheet = CssLogic.isContentStylesheet(this.domSheet);
}
- return this._systemSheet;
+ return this._contentSheet;
},
/**
@@ -1048,7 +1042,7 @@ CssSheet.prototype = {
this._sheetAllowed = true;
let filter = this._cssLogic.sourceFilter;
- if (filter === CssLogic.FILTER.ALL && this.systemSheet) {
+ if (filter === CssLogic.FILTER.ALL && !this.contentSheet) {
this._sheetAllowed = false;
}
if (filter !== CssLogic.FILTER.ALL && filter !== CssLogic.FILTER.UA) {
@@ -1202,13 +1196,13 @@ function CssRule(aCssSheet, aDomRule, aElement)
this.line = this._cssSheet._cssLogic.domUtils.getRuleLine(this._domRule);
this.source = this._cssSheet.shortSource + ":" + this.line;
this.href = this._cssSheet.href;
- this.systemRule = this._cssSheet.systemSheet;
+ this.contentRule = this._cssSheet.contentSheet;
} else if (aElement) {
this._selectors = [ new CssSelector(this, "@element.style") ];
this.line = -1;
this.source = CssLogic.l10n("rule.sourceElement");
this.href = "#";
- this.systemRule = false;
+ this.contentRule = true;
this.sourceElement = aElement;
}
}
@@ -1396,12 +1390,12 @@ CssSelector.prototype = {
/**
* Check if the selector comes from a browser-provided stylesheet.
*
- * @return {boolean} true if the selector comes from a browser-provided
+ * @return {boolean} true if the selector comes from a content-provided
* stylesheet, or false otherwise.
*/
- get systemRule()
+ get contentRule()
{
- return this._cssRule.systemRule;
+ return this._cssRule.contentRule;
},
/**
@@ -1794,12 +1788,12 @@ function CssSelectorInfo(aSelector, aProperty, aValue, aStatus)
4 important
5 inline important
*/
- let scorePrefix = this.systemRule ? 0 : 2;
+ let scorePrefix = this.contentRule ? 2 : 0;
if (this.elementStyle) {
scorePrefix++;
}
if (this.important) {
- scorePrefix += this.systemRule ? 1 : 2;
+ scorePrefix += this.contentRule ? 2 : 1;
}
this.specificityScore = "" + scorePrefix + this.specificity.ids +
@@ -1902,9 +1896,9 @@ CssSelectorInfo.prototype = {
* @return {boolean} true if the selector comes from a browser-provided
* stylesheet, or false otherwise.
*/
- get systemRule()
+ get contentRule()
{
- return this.selector.systemRule;
+ return this.selector.contentRule;
},
/**
@@ -1916,8 +1910,8 @@ CssSelectorInfo.prototype = {
*/
compareTo: function CssSelectorInfo_compareTo(aThat)
{
- if (this.systemRule && !aThat.systemRule) return 1;
- if (!this.systemRule && aThat.systemRule) return -1;
+ if (!this.contentRule && aThat.contentRule) return 1;
+ if (this.contentRule && !aThat.contentRule) return -1;
if (this.elementStyle && !aThat.elementStyle) {
if (!this.important && aThat.important) return 1;
diff --git a/browser/devtools/styleinspector/CssRuleView.jsm b/browser/devtools/styleinspector/CssRuleView.jsm
index c12a160e216..f001b49f9d6 100644
--- a/browser/devtools/styleinspector/CssRuleView.jsm
+++ b/browser/devtools/styleinspector/CssRuleView.jsm
@@ -38,7 +38,7 @@
*
* ***** END LICENSE BLOCK ***** */
-"use strict"
+"use strict";
const Cc = Components.classes;
const Ci = Components.interfaces;
@@ -181,8 +181,8 @@ ElementStyle.prototype = {
let domRule = domRules.GetElementAt(i);
// XXX: Optionally provide access to system sheets.
- let systemSheet = CssLogic.isSystemStyleSheet(domRule.parentStyleSheet);
- if (systemSheet) {
+ let contentSheet = CssLogic.isContentStylesheet(domRule.parentStyleSheet);
+ if (!contentSheet) {
continue;
}
@@ -324,7 +324,7 @@ ElementStyle.prototype = {
aProp.overridden = overridden;
return dirty;
}
-}
+};
/**
* A single style rule or declaration.
@@ -358,11 +358,9 @@ Rule.prototype = {
if (this._title) {
return this._title;
}
- let sheet = this.domRule ? this.domRule.parentStyleSheet : null;
- this._title = CssLogic.shortSource(sheet);
+ this._title = CssLogic.shortSource(this.sheet);
if (this.domRule) {
- let line = this.elementStyle.domUtils.getRuleLine(this.domRule);
- this._title += ":" + line;
+ this._title += ":" + this.ruleLine;
}
if (this.inherited) {
@@ -378,6 +376,26 @@ Rule.prototype = {
return this._title;
},
+ /**
+ * The rule's stylesheet.
+ */
+ get sheet()
+ {
+ return this.domRule ? this.domRule.parentStyleSheet : null;
+ },
+
+ /**
+ * The rule's line within a stylesheet
+ */
+ get ruleLine()
+ {
+ if (!this.sheet) {
+ // No stylesheet, no ruleLine
+ return null;
+ }
+ return this.elementStyle.domUtils.getRuleLine(this.domRule);
+ },
+
/**
* Create a new TextProperty to include in the rule.
*
@@ -530,7 +548,7 @@ Rule.prototype = {
this.textProps.push(textProp);
}
},
-}
+};
/**
* A single property in a rule's cssText.
@@ -618,7 +636,7 @@ TextProperty.prototype = {
{
this.rule.removeProperty(this);
}
-}
+};
/**
@@ -643,7 +661,7 @@ TextProperty.prototype = {
* apply to a given element. After construction, the 'element'
* property will be available with the user interface.
*
- * @param Document aDocument
+ * @param Document aDoc
* The document that will contain the rule view.
* @param object aStore
* The CSS rule view can use this object to store metadata
@@ -655,7 +673,6 @@ function CssRuleView(aDoc, aStore)
{
this.doc = aDoc;
this.store = aStore;
-
this.element = this.doc.createElementNS(XUL_NS, "vbox");
this.element.setAttribute("tabindex", "0");
this.element.classList.add("ruleview");
@@ -768,6 +785,14 @@ RuleEditor.prototype = {
class: "ruleview-rule-source",
textContent: this.rule.title
});
+ source.addEventListener("click", function() {
+ let rule = this.rule;
+ let evt = this.doc.createEvent("CustomEvent");
+ evt.initCustomEvent("CssRuleViewCSSLinkClicked", true, false, {
+ rule: rule,
+ });
+ this.element.dispatchEvent(evt);
+ }.bind(this));
let code = createChild(this.element, "div", {
class: "ruleview-code"
@@ -1094,8 +1119,6 @@ TextPropertyEditor.prototype = {
_parseValue: function TextPropertyEditor_parseValue(aValue)
{
let pieces = aValue.split("!", 2);
- let value = pieces[0];
- let priority = pieces.length > 1 ? pieces[1] : "";
return {
value: pieces[0].trim(),
priority: (pieces.length > 1 ? pieces[1].trim() : "")
diff --git a/browser/devtools/styleinspector/csshtmltree.xul b/browser/devtools/styleinspector/csshtmltree.xul
index e5c3bcc5a4c..1e4eee123ad 100644
--- a/browser/devtools/styleinspector/csshtmltree.xul
+++ b/browser/devtools/styleinspector/csshtmltree.xul
@@ -114,7 +114,7 @@ To visually debug the templates without running firefox, alter the display:none
${selector.humanReadableText(__element)}
- ${selector.selectorInfo.source}
|
diff --git a/browser/devtools/styleinspector/test/Makefile.in b/browser/devtools/styleinspector/test/Makefile.in
index a4665bddc3d..e77fb1a6e2b 100644
--- a/browser/devtools/styleinspector/test/Makefile.in
+++ b/browser/devtools/styleinspector/test/Makefile.in
@@ -59,11 +59,19 @@ _BROWSER_TEST_FILES = \
browser_ruleview_manipulation.js \
browser_ruleview_override.js \
browser_ruleview_ui.js \
+ browser_bug705707_is_content_stylesheet.js \
head.js \
$(NULL)
_BROWSER_TEST_PAGES = \
browser_bug683672.html \
+ browser_bug705707_is_content_stylesheet.html \
+ browser_bug705707_is_content_stylesheet_imported.css \
+ browser_bug705707_is_content_stylesheet_imported2.css \
+ browser_bug705707_is_content_stylesheet_linked.css \
+ browser_bug705707_is_content_stylesheet_script.css \
+ browser_bug705707_is_content_stylesheet.xul \
+ browser_bug705707_is_content_stylesheet_xul.css \
$(NULL)
libs:: $(_BROWSER_TEST_FILES)
diff --git a/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet.html b/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet.html
new file mode 100644
index 00000000000..96ef5b6e9e9
--- /dev/null
+++ b/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet.html
@@ -0,0 +1,33 @@
+
+
+ test
+
+
+
+
+
+
+
+
+
+
+
diff --git a/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet.js b/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet.js
new file mode 100644
index 00000000000..fec06cf5620
--- /dev/null
+++ b/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet.js
@@ -0,0 +1,100 @@
+/* vim: set ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// Tests that the correct stylesheets origins are identified in HTML & XUL
+// stylesheets
+
+let doc;
+
+const TEST_URI = "http://example.com/browser/browser/devtools/styleinspector/" +
+ "test/browser_bug705707_is_content_stylesheet.html";
+const TEST_URI2 = "http://example.com/browser/browser/devtools/styleinspector/" +
+ "test/browser_bug705707_is_content_stylesheet.xul";
+const XUL_URI = Cc["@mozilla.org/network/io-service;1"]
+ .getService(Ci.nsIIOService)
+ .newURI(TEST_URI2, null, null);
+
+let tempScope = {};
+Cu.import("resource:///modules/devtools/CssLogic.jsm", tempScope);
+let CssLogic = tempScope.CssLogic;
+
+function test()
+{
+ waitForExplicitFinish();
+ addTab(TEST_URI);
+ browser.addEventListener("load", htmlLoaded, true);
+}
+
+function htmlLoaded()
+{
+ browser.removeEventListener("load", htmlLoaded, true);
+ doc = content.document;
+ testFromHTML()
+}
+
+function testFromHTML()
+{
+ let target = doc.querySelector("#target");
+
+ executeSoon(function() {
+ checkSheets(target);
+ gBrowser.removeCurrentTab();
+ openXUL();
+ });
+}
+
+function openXUL()
+{
+ Cc["@mozilla.org/permissionmanager;1"].getService(Ci.nsIPermissionManager)
+ .add(XUL_URI, 'allowXULXBL', Ci.nsIPermissionManager.ALLOW_ACTION);
+ addTab(TEST_URI2);
+ browser.addEventListener("load", xulLoaded, true);
+}
+
+function xulLoaded()
+{
+ browser.removeEventListener("load", xulLoaded, true);
+ doc = content.document;
+ testFromXUL()
+}
+
+function testFromXUL()
+{
+ let target = doc.querySelector("#target");
+
+ executeSoon(function() {
+ checkSheets(target);
+ finishUp();
+ });
+}
+
+function checkSheets(aTarget)
+{
+ let domUtils = Cc["@mozilla.org/inspector/dom-utils;1"]
+ .getService(Ci.inIDOMUtils);
+ let domRules = domUtils.getCSSStyleRules(aTarget);
+
+ for (let i = 0, n = domRules.Count(); i < n; i++) {
+ let domRule = domRules.GetElementAt(i);
+ let sheet = domRule.parentStyleSheet;
+ let isContentSheet = CssLogic.isContentStylesheet(sheet);
+
+ if (!sheet.href ||
+ /browser_bug705707_is_content_stylesheet_/.test(sheet.href)) {
+ ok(isContentSheet, sheet.href + " identified as content stylesheet");
+ } else {
+ ok(!isContentSheet, sheet.href + " identified as non-content stylesheet");
+ }
+ }
+}
+
+function finishUp()
+{
+ info("finishing up");
+ Cc["@mozilla.org/permissionmanager;1"].getService(Ci.nsIPermissionManager)
+ .add(XUL_URI, 'allowXULXBL', Ci.nsIPermissionManager.DENY_ACTION);
+ doc = null;
+ gBrowser.removeCurrentTab();
+ finish();
+}
diff --git a/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet.xul b/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet.xul
new file mode 100644
index 00000000000..abbd03030e8
--- /dev/null
+++ b/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet.xul
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet_imported.css b/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet_imported.css
new file mode 100644
index 00000000000..4092afeea39
--- /dev/null
+++ b/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet_imported.css
@@ -0,0 +1,5 @@
+@import url("./browser_bug705707_is_content_stylesheet_imported2.css");
+
+#target {
+ text-decoration: underline;
+}
diff --git a/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet_imported2.css b/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet_imported2.css
new file mode 100644
index 00000000000..77c73299ea9
--- /dev/null
+++ b/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet_imported2.css
@@ -0,0 +1,3 @@
+#target {
+ text-decoration: underline;
+}
diff --git a/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet_linked.css b/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet_linked.css
new file mode 100644
index 00000000000..712ba78fb6f
--- /dev/null
+++ b/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet_linked.css
@@ -0,0 +1,3 @@
+table {
+ border-collapse: collapse;
+}
diff --git a/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet_script.css b/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet_script.css
new file mode 100644
index 00000000000..bf4fc8ddcb8
--- /dev/null
+++ b/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet_script.css
@@ -0,0 +1,5 @@
+@import url("./browser_bug705707_is_content_stylesheet_imported.css");
+
+table {
+ opacity: 1;
+}
diff --git a/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet_xul.css b/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet_xul.css
new file mode 100644
index 00000000000..a14ae7f6fdb
--- /dev/null
+++ b/browser/devtools/styleinspector/test/browser_bug705707_is_content_stylesheet_xul.css
@@ -0,0 +1,3 @@
+#target {
+ font-size: 200px;
+}
diff --git a/browser/devtools/webconsole/GcliCommands.jsm b/browser/devtools/webconsole/GcliCommands.jsm
index 31532b9e0ae..07dbf13d82d 100644
--- a/browser/devtools/webconsole/GcliCommands.jsm
+++ b/browser/devtools/webconsole/GcliCommands.jsm
@@ -126,6 +126,40 @@ gcli.addCommand({
}
});
+/**
+ * 'edit' command
+ */
+gcli.addCommand({
+ name: "edit",
+ description: gcli.lookup("editDesc"),
+ manual: gcli.lookup("editManual"),
+ params: [
+ {
+ name: 'resource',
+ type: {
+ name: 'resource',
+ include: 'text/css'
+ },
+ description: gcli.lookup("editResourceDesc")
+ },
+ {
+ name: "line",
+ defaultValue: 1,
+ type: {
+ name: "number",
+ min: 1,
+ step: 10
+ },
+ description: gcli.lookup("editLineToJumpToDesc")
+ }
+ ],
+ exec: function(args, context) {
+ let hud = HUDService.getHudReferenceById(context.environment.hudId);
+ let StyleEditor = hud.gcliterm.document.defaultView.StyleEditor;
+ StyleEditor.openChrome(args.resource.element, args.line);
+ }
+});
+
let breakpoints = [];
/**
diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
index 98f687c2dac..2512344b9f7 100644
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -150,9 +150,6 @@
@BINPATH@/components/dom_system_b2g.xpt
#endif
@BINPATH@/components/dom_battery.xpt
-#ifdef MOZ_B2G_BT
-@BINPATH@/components/dom_bluetooth.xpt
-#endif
@BINPATH@/components/dom_canvas.xpt
@BINPATH@/components/dom_core.xpt
@BINPATH@/components/dom_css.xpt
diff --git a/browser/locales/en-US/chrome/browser/devtools/gclicommands.properties b/browser/locales/en-US/chrome/browser/devtools/gclicommands.properties
index bfa6a92669b..f4a1ce01820 100644
--- a/browser/locales/en-US/chrome/browser/devtools/gclicommands.properties
+++ b/browser/locales/en-US/chrome/browser/devtools/gclicommands.properties
@@ -129,3 +129,23 @@ breakdelRemoved=Breakpoint removed
# 'console close' command. This string is designed to be shown in a menu
# alongside the command name, which is why it should be as short as possible.
consolecloseDesc=Close the console
+
+# LOCALIZATION NOTE (editDesc) A very short description of the 'edit'
+# command. See editManual for a fuller description of what it does. This
+# string is designed to be shown in a menu alongside the command name, which
+# is why it should be as short as possible.
+editDesc=Tweak a page resource
+
+# LOCALIZATION NOTE (editManual) A fuller description of the 'edit' command,
+# displayed when the user asks for help on what it does.
+editManual=Edit one of the resources that is part of this page (or maybe any generic web resource?)
+
+# LOCALIZATION NOTE (editResourceDesc) A very short string to describe the
+# 'resource' parameter to the 'edit' command, which is displayed in a dialog
+# when the user is using this command.
+editResourceDesc=URL to edit
+
+# LOCALIZATION NOTE (editLineToJumpToDesc) A very short string to describe the
+# 'line' parameter to the 'edit' command, which is displayed in a dialog
+# when the user is using this command.
+editLineToJumpToDesc=Line to jump to
diff --git a/browser/makefiles.sh b/browser/makefiles.sh
index e5bc351d0ba..d76045f8cfa 100644
--- a/browser/makefiles.sh
+++ b/browser/makefiles.sh
@@ -88,6 +88,12 @@ browser/themes/Makefile
$MOZ_BRANDING_DIRECTORY/Makefile
$MOZ_BRANDING_DIRECTORY/content/Makefile
$MOZ_BRANDING_DIRECTORY/locales/Makefile
+toolkit/locales/Makefile
+extensions/spellcheck/locales/Makefile
+intl/locales/Makefile
+netwerk/locales/Makefile
+dom/locales/Makefile
+security/manager/locales/Makefile
"
if [ "$MOZ_SAFE_BROWSING" ]; then
diff --git a/browser/themes/gnomestripe/devtools/csshtmltree.css b/browser/themes/gnomestripe/devtools/csshtmltree.css
index d15f6268508..8e19dcf2920 100644
--- a/browser/themes/gnomestripe/devtools/csshtmltree.css
+++ b/browser/themes/gnomestripe/devtools/csshtmltree.css
@@ -68,6 +68,9 @@
.helplink:visited {
text-decoration: none;
}
+.link:hover {
+ text-decoration: underline;
+}
.helplink {
display: block;
@@ -135,6 +138,7 @@
.rule-link {
text-align: end;
-moz-padding-start: 10px;
+ cursor: pointer;
}
/* This rule is necessary because Templater.jsm breaks LTR TDs in RTL docs */
@@ -200,7 +204,13 @@
.ruleview-rule-source {
background-color: -moz-dialog;
+ color: #0091ff;
padding: 2px 5px;
+ cursor: pointer;
+}
+
+.ruleview-rule-source:hover {
+ text-decoration: underline;
}
.ruleview-code {
diff --git a/browser/themes/pinstripe/devtools/csshtmltree.css b/browser/themes/pinstripe/devtools/csshtmltree.css
index d5b4c32b5ae..316b6d0e530 100644
--- a/browser/themes/pinstripe/devtools/csshtmltree.css
+++ b/browser/themes/pinstripe/devtools/csshtmltree.css
@@ -68,6 +68,9 @@
.helplink:visited {
text-decoration: none;
}
+.link:hover {
+ text-decoration: underline;
+}
.helplink {
display: block;
@@ -137,6 +140,7 @@
.rule-link {
text-align: end;
-moz-padding-start: 10px;
+ cursor: pointer;
}
/* This rule is necessary because Templater.jsm breaks LTR TDs in RTL docs */
@@ -202,7 +206,13 @@
.ruleview-rule-source {
background-color: -moz-dialog;
+ color: #0091ff;
padding: 2px 5px;
+ cursor: pointer;
+}
+
+.ruleview-rule-source:hover {
+ text-decoration: underline;
}
.ruleview-code {
diff --git a/browser/themes/winstripe/devtools/csshtmltree.css b/browser/themes/winstripe/devtools/csshtmltree.css
index 1d2b8ea5dae..459a11af4c9 100644
--- a/browser/themes/winstripe/devtools/csshtmltree.css
+++ b/browser/themes/winstripe/devtools/csshtmltree.css
@@ -67,6 +67,9 @@
.helplink:visited {
text-decoration: none;
}
+.link:hover {
+ text-decoration: underline;
+}
.helplink {
display: block;
@@ -135,6 +138,7 @@
.rule-link {
text-align: end;
-moz-padding-start: 10px;
+ cursor: pointer;
}
/* This rule is necessary because Templater.jsm breaks LTR TDs in RTL docs */
@@ -200,7 +204,13 @@
.ruleview-rule-source {
background-color: -moz-dialog;
+ color: #0091ff;
padding: 2px 5px;
+ cursor: pointer;
+}
+
+.ruleview-rule-source:hover {
+ text-decoration: underline;
}
.ruleview-code {
diff --git a/build/Makefile.in b/build/Makefile.in
index 0b592470628..f50833dd8d3 100644
--- a/build/Makefile.in
+++ b/build/Makefile.in
@@ -84,7 +84,7 @@ DEFINES += -DGRE_MILESTONE=$(GRE_MILESTONE) -DAPP_BUILDID=$(APP_BUILDID)
DEFINES += -DMOZ_APP_VERSION="$(MOZ_APP_VERSION)"
APP_INI_DEPS += $(DEPTH)/config/autoconf.mk
-MOZ_SOURCE_STAMP ?= $(firstword $(shell hg -R $(topsrcdir)/$(MOZ_BUILD_APP)/.. parent --template="{node|short}\n" 2>/dev/null))
+MOZ_SOURCE_STAMP := $(firstword $(shell cd $(topsrcdir)/$(MOZ_BUILD_APP)/.. && hg parent --template="{node|short}\n" 2>/dev/null))
ifdef MOZ_SOURCE_STAMP
DEFINES += -DMOZ_SOURCE_STAMP="$(MOZ_SOURCE_STAMP)"
endif
diff --git a/build/autoconf/compiler-opts.m4 b/build/autoconf/compiler-opts.m4
new file mode 100644
index 00000000000..0c2fd2a0b1a
--- /dev/null
+++ b/build/autoconf/compiler-opts.m4
@@ -0,0 +1,13 @@
+dnl Add compiler specific options
+
+AC_DEFUN([MOZ_COMPILER_OPTS],
+[
+if test "$CLANG_CXX"; then
+ ## We disable return-type-c-linkage because jsval is defined as a C++ type but is
+ ## returned by C functions. This is possible because we use knowledge about the ABI
+ ## to typedef it to a C type with the same layout when the headers are included
+ ## from C.
+ _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-return-type-c-linkage"
+fi
+])
+
diff --git a/build/unix/build-toolchain/build-gcc.py b/build/unix/build-toolchain/build-gcc.py
index 3b46b6742e3..496e6bce939 100755
--- a/build/unix/build-toolchain/build-gcc.py
+++ b/build/unix/build-toolchain/build-gcc.py
@@ -1,5 +1,18 @@
#!/usr/bin/python
+# The directories end up in the debug info, so the easy way of getting
+# a reproducible build is to run it in a know absolute directory.
+# We use a directory in /builds/slave because the mozilla infrastructure
+# cleans it up automatically.
+base_dir = "/builds/slave/moz-toolschain"
+
+source_dir = base_dir + "/src"
+build_dir = base_dir + "/build"
+aux_inst_dir = build_dir + '/aux_inst'
+old_make = aux_inst_dir + '/bin/make'
+
+##############################################
+
import urllib
import os
import os.path
@@ -33,17 +46,21 @@ def patch(patch, plevel, srcdir):
check_run(['patch', '-d', srcdir, '-p%s' % plevel, '-i', patch, '--fuzz=0',
'-s'])
-def build_package(package_source_dir, package_build_dir, configure_args):
+def build_package(package_source_dir, package_build_dir, configure_args,
+ make = old_make):
os.mkdir(package_build_dir)
run_in(package_build_dir,
["%s/configure" % package_source_dir] + configure_args)
- run_in(package_build_dir, ["make", "-j8"])
- run_in(package_build_dir, ["make", "install"])
+ run_in(package_build_dir, [make, "-j8"])
+ run_in(package_build_dir, [make, "install"])
-def build_tar(base_dir, tar_inst_dir):
+def build_aux_tools(base_dir):
+ make_build_dir = base_dir + '/make_build'
+ build_package(make_source_dir, make_build_dir,
+ ["--prefix=%s" % aux_inst_dir], "make")
tar_build_dir = base_dir + '/tar_build'
build_package(tar_source_dir, tar_build_dir,
- ["--prefix=%s" % tar_inst_dir])
+ ["--prefix=%s" % aux_inst_dir])
def with_env(env, f):
old_env = os.environ.copy()
@@ -133,21 +150,13 @@ def build_tar_package(tar, name, base, directory):
##############################################
-# The directories end up in the debug info, so the easy way of getting
-# a reproducible build is to run it in a know absolute directory.
-# We use a directory in /builds/slave because the mozilla infrastructure
-# cleans it up automatically.
-base_dir = "/builds/slave/moz-toolschain"
-
-source_dir = base_dir + "/src"
-build_dir = base_dir + "/build"
-
def build_source_dir(prefix, version):
return source_dir + '/' + prefix + version
binutils_version = "2.21.1"
-glibc_version = "2.12.2" #FIXME: should probably use 2.5.1
+glibc_version = "2.5.1"
tar_version = "1.26"
+make_version = "3.81"
gcc_version = "4.5.2"
mpfr_version = "2.4.2"
gmp_version = "5.0.1"
@@ -159,6 +168,8 @@ glibc_source_uri = "http://ftp.gnu.org/gnu/glibc/glibc-%s.tar.bz2" % \
glibc_version
tar_source_uri = "http://ftp.gnu.org/gnu/tar/tar-%s.tar.bz2" % \
tar_version
+make_source_uri = "http://ftp.gnu.org/gnu/make/make-%s.tar.bz2" % \
+ make_version
gcc_source_uri = "http://ftp.gnu.org/gnu/gcc/gcc-%s/gcc-%s.tar.bz2" % \
(gcc_version, gcc_version)
mpfr_source_uri = "http://www.mpfr.org/mpfr-%s/mpfr-%s.tar.bz2" % \
@@ -170,6 +181,7 @@ mpc_source_uri = "http://www.multiprecision.org/mpc/download/mpc-%s.tar.gz" % \
binutils_source_tar = download_uri(binutils_source_uri)
glibc_source_tar = download_uri(glibc_source_uri)
tar_source_tar = download_uri(tar_source_uri)
+make_source_tar = download_uri(make_source_uri)
mpc_source_tar = download_uri(mpc_source_uri)
mpfr_source_tar = download_uri(mpfr_source_uri)
gmp_source_tar = download_uri(gmp_source_uri)
@@ -178,6 +190,7 @@ gcc_source_tar = download_uri(gcc_source_uri)
binutils_source_dir = build_source_dir('binutils-', binutils_version)
glibc_source_dir = build_source_dir('glibc-', glibc_version)
tar_source_dir = build_source_dir('tar-', tar_version)
+make_source_dir = build_source_dir('make-', make_version)
mpc_source_dir = build_source_dir('mpc-', mpc_version)
mpfr_source_dir = build_source_dir('mpfr-', mpfr_version)
gmp_source_dir = build_source_dir('gmp-', gmp_version)
@@ -191,6 +204,7 @@ if not os.path.exists(source_dir):
patch('glibc-deterministic.patch', 1, glibc_source_dir)
run_in(glibc_source_dir, ["autoconf"])
extract(tar_source_tar, source_dir)
+ extract(make_source_tar, source_dir)
extract(mpc_source_tar, source_dir)
extract(mpfr_source_tar, source_dir)
extract(gmp_source_tar, source_dir)
@@ -203,19 +217,18 @@ if os.path.exists(build_dir):
shutil.rmtree(build_dir)
os.makedirs(build_dir)
-tar_inst_dir = build_dir + '/tar_inst'
-build_tar(build_dir, tar_inst_dir)
+build_aux_tools(build_dir)
stage1_dir = build_dir + '/stage1'
build_one_stage({"CC": "gcc", "CXX" : "g++"}, stage1_dir, True)
stage1_tool_inst_dir = stage1_dir + '/inst'
stage2_dir = build_dir + '/stage2'
-build_one_stage({"CC" : stage1_tool_inst_dir + "/bin/gcc",
+build_one_stage({"CC" : stage1_tool_inst_dir + "/bin/gcc -fgnu89-inline",
"CXX" : stage1_tool_inst_dir + "/bin/g++",
"AR" : stage1_tool_inst_dir + "/bin/ar",
"RANLIB" : "true" },
stage2_dir, False)
-build_tar_package(tar_inst_dir + "/bin/tar",
+build_tar_package(aux_inst_dir + "/bin/tar",
"toolchain.tar", stage2_dir, "inst")
diff --git a/build/unix/build-toolchain/glibc-deterministic.patch b/build/unix/build-toolchain/glibc-deterministic.patch
index 016fbf1ea72..bc5a11f0920 100644
--- a/build/unix/build-toolchain/glibc-deterministic.patch
+++ b/build/unix/build-toolchain/glibc-deterministic.patch
@@ -1,7 +1,22 @@
diff -ru a/configure.in b/configure.in
--- a/configure.in 2011-01-17 23:34:07.000000000 -0500
+++ b/configure.in 2012-01-25 20:40:27.919485606 -0500
-@@ -2230,6 +2230,7 @@
+@@ -841,14 +841,6 @@
+ LIBC_PROG_BINUTILS
+ AC_SUBST(MIG)dnl Needed by sysdeps/mach/configure.in
+
+-# Accept binutils 2.13 or newer.
+-AC_CHECK_PROG_VER(AS, $AS, --version,
+- [GNU assembler.* \([0-9]*\.[0-9.]*\)],
+- [2.1[3-9]*], AS=: critic_missing="$critic_missing as")
+-AC_CHECK_PROG_VER(LD, $LD, --version,
+- [GNU ld.* \([0-9][0-9]*\.[0-9.]*\)],
+- [2.1[3-9]*], LD=: critic_missing="$critic_missing ld")
+-
+ # We need the physical current working directory. We cannot use the
+ # "pwd -P" shell builtin since that's not portable. Instead we try to
+ # find a pwd binary. Note that assigning to the PWD environment
+@@ -2175,6 +2167,7 @@
fi
AC_SUBST(old_glibc_headers)
@@ -12,7 +27,7 @@ diff -ru a/configure.in b/configure.in
diff -ru a/csu/Makefile b/csu/Makefile
--- a/csu/Makefile 2011-01-17 23:34:07.000000000 -0500
+++ b/csu/Makefile 2012-01-23 13:58:28.957792633 -0500
-@@ -234,8 +234,7 @@
+@@ -223,8 +223,7 @@
if [ -z "$$os" ]; then \
os=Linux; \
fi; \
@@ -22,10 +37,58 @@ diff -ru a/csu/Makefile b/csu/Makefile
*) ;; \
esac; \
files="$(all-Banner-files)"; \
+diff -ru a/elf/Makefile b/elf/Makefile
+--- a/elf/Makefile 2008-10-31 16:35:11.000000000 -0400
++++ b/elf/Makefile 2012-02-16 12:20:00.038593752 -0500
+@@ -295,18 +295,11 @@
+ z-now-yes = -Wl,-z,now
+
+ $(objpfx)ld.so: $(objpfx)librtld.os $(ld-map)
+- @rm -f $@.lds
+- $(LINK.o) -nostdlib -nostartfiles -shared $(z-now-$(bind-now)) \
+- $(LDFLAGS-rtld) -Wl,-z,defs -Wl,--verbose 2>&1 | \
+- LC_ALL=C \
+- sed -e '/^=========/,/^=========/!d;/^=========/d' \
+- -e 's/\. = 0 + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/' \
+- > $@.lds
+ $(LINK.o) -nostdlib -nostartfiles -shared -o $@ \
+ $(LDFLAGS-rtld) -Wl,-z,defs $(z-now-$(bind-now)) \
+ $(filter-out $(map-file),$^) $(load-map-file) \
+- -Wl,-soname=$(rtld-installed-name) -T $@.lds
+- rm -f $@.lds
++ -Wl,-soname=$(rtld-installed-name) \
++ -Wl,-defsym=_begin=0
+
+ # interp.c exists just to get this string into the libraries.
+ CFLAGS-interp.c = -D'RUNTIME_LINKER="$(slibdir)/$(rtld-installed-name)"' \
+diff -ru a/localedata/Makefile b/localedata/Makefile
+--- a/localedata/Makefile 2006-04-26 01:14:03.000000000 -0400
++++ b/localedata/Makefile 2012-02-17 10:31:24.592345047 -0500
+@@ -113,7 +113,7 @@
+ $(make-target-directory)
+ rm -f $(@:.gz=) $@
+ $(INSTALL_DATA) $< $(@:.gz=)
+- gzip -9 $(@:.gz=)
++ gzip -9n $(@:.gz=)
+
+ # Install the locale source files in the appropriate directory.
+ $(inst_i18ndir)/locales/%: locales/% $(+force); $(do-install)
+diff -ru a/Makeconfig b/Makeconfig
+--- a/Makeconfig 2006-07-10 17:42:27.000000000 -0400
++++ b/Makeconfig 2012-02-17 08:28:31.859584817 -0500
+@@ -674,7 +674,7 @@
+ $(foreach lib,$(libof-$(basename $(@F))) \
+ $(libof-$(= r6b
+dnl creates some (http://code.google.com/p/android/issues/detail?id=23203)
+dnl We however want to avoid these text relocations, and this can be done
+dnl by making gcc not link crtbegin and crtend. In the broken NDKs, crtend
+dnl doesn't contain anything at all, beside placeholders for some sections,
+dnl and crtbegin only contains a finalizer function that calls
+dnl __cxa_finalize. The custom linker actually takes care of calling
+dnl __cxa_finalize when the library doesn't call it itself, which makes it
+dnl safe not to link crtbegin. Besides, previous versions of the NDK didn't
+dnl link crtbegin and crtend at all.
+if test -n "$MOZ_LINKER" -a -z "$MOZ_OLD_LINKER" -a "$OS_TARGET" = "Android"; then
+ AC_CACHE_CHECK([whether the CRT objects have text relocations],
+ ac_cv_crt_has_text_relocations,
+ [echo 'int foo() { return 0; }' > conftest.cpp
+ if AC_TRY_COMMAND(${CXX-g++} -o conftest${DLL_SUFFIX} $CXXFLAGS $DSO_LDOPTS $LDFLAGS conftest.cpp $LIBS 1>&5) &&
+ test -s conftest${DLL_SUFFIX}; then
+ if readelf -d conftest${DLL_SUFFIX} | grep TEXTREL > /dev/null; then
+ ac_cv_crt_has_text_relocations=yes
+ else
+ ac_cv_crt_has_text_relocations=no
+ fi
+ else
+ AC_ERROR([couldn't compile a simple C file])
+ fi
+ rm -rf conftest*])
+ if test "$ac_cv_crt_has_text_relocations" = yes; then
+ dnl While we want libraries to skip the CRT files, we don't want
+ dnl executables to be treated the same way. We thus set the flag
+ dnl in DSO_LDOPTS and not LDFLAGS. However, to pass it to nspr,
+ dnl we need to use LDFLAGS because nspr doesn't inherit DSO_LDOPTS.
+ dnl Using LDFLAGS in nspr is safe, since we only really build
+ dnl libraries there.
+ DSO_LDOPTS="$DSO_LDOPTS -nostartfiles"
+ NSPR_LDFLAGS=-nostartfiles
+ fi
+fi
+
dnl Check for the existence of various allocation headers/functions
MALLOC_H=
@@ -4612,6 +4663,7 @@ LIBJPEG_TURBO_AS=
LIBJPEG_TURBO_ASFLAGS=
LIBJPEG_TURBO_X86_ASM=
LIBJPEG_TURBO_X64_ASM=
+LIBJPEG_TURBO_ARM_ASM=
MOZ_PANGO=1
MOZ_PERMISSIONS=1
MOZ_PLACES=1
@@ -4927,7 +4979,6 @@ cairo-gonk)
MOZ_PDF_PRINTING=1
MOZ_B2G_RIL=1
MOZ_TOUCH=1
- MOZ_B2G_BT=1
;;
esac
@@ -6171,38 +6222,51 @@ if test -n "$MOZ_LIBJPEG_TURBO"; then
LIBJPEG_TURBO_ASFLAGS="-f win64 -rnasm -pnasm -D__x86_64__ -DPIC -DWIN64 -DMSVC"
LIBJPEG_TURBO_X64_ASM=1
;;
+ *:arm*)
+ LIBJPEG_TURBO_ASFLAGS="-march=armv7-a -mfpu=neon"
+ LIBJPEG_TURBO_ARM_ASM=1
+ ;;
esac
fi
-dnl If we're on a system which supports libjpeg-turbo's asm routines and
-dnl --disable-libjpeg-turbo wasn't passed, check for yasm, and error out if it
-dnl doesn't exist or we have too old of a version.
+dnl If we're on an x86 or x64 system which supports libjpeg-turbo's asm routines
+dnl and --disable-libjpeg-turbo wasn't passed, check for Yasm, and error out if
+dnl it doesn't exist or we have too old of a version.
if test -n "$LIBJPEG_TURBO_X86_ASM" -o -n "$LIBJPEG_TURBO_X64_ASM" ; then
- AC_MSG_CHECKING([for YASM assembler])
+ AC_MSG_CHECKING([for Yasm assembler])
AC_CHECK_PROGS(LIBJPEG_TURBO_AS, yasm, "")
if test -z "$LIBJPEG_TURBO_AS" ; then
- AC_MSG_ERROR([yasm is required to build with libjpeg-turbo's optimized JPEG decoding routines, but you do not appear to have yasm installed. Either install it or configure with --disable-libjpeg-turbo to use the pure C JPEG decoder. See https://developer.mozilla.org/en/YASM for more details.])
+ AC_MSG_ERROR([Yasm is required to build with libjpeg-turbo's optimized JPEG decoding routines, but you do not appear to have Yasm installed. Either install it or configure with --disable-libjpeg-turbo to use the pure C JPEG decoder. See https://developer.mozilla.org/en/YASM for more details.])
fi
dnl Check that we have the right yasm version. We require 1.0.1 or newer
dnl on Linux and 1.1 or newer everywhere else.
if test "$OS_ARCH" = "Linux" ; then
if test "$_YASM_MAJOR_VERSION" -lt "1" -o \( "$_YASM_MAJOR_VERSION" -eq "1" -a "$_YASM_MINOR_VERSION" -eq "0" -a "$_YASM_RELEASE" -lt "1" \) ; then
- AC_MSG_ERROR([yasm 1.0.1 or greater is required to build with libjpeg-turbo's optimized JPEG decoding routines, but you appear to have version $_YASM_MAJOR_VERSION.$_YASM_MINOR_VERSION.$_YASM_RELEASE. Upgrade to the newest version or configure with --disable-libjpeg-turbo to use the pure C JPEG decoder. See https://developer.mozilla.org/en/YASM for more details.])
+ AC_MSG_ERROR([Yasm 1.0.1 or greater is required to build with libjpeg-turbo's optimized JPEG decoding routines, but you appear to have version $_YASM_MAJOR_VERSION.$_YASM_MINOR_VERSION.$_YASM_RELEASE. Upgrade to the newest version or configure with --disable-libjpeg-turbo to use the pure C JPEG decoder. See https://developer.mozilla.org/en/YASM for more details.])
fi
else
if test "$_YASM_MAJOR_VERSION" -lt "1" -o \( "$_YASM_MAJOR_VERSION" -eq "1" -a "$_YASM_MINOR_VERSION" -lt "1" \) ; then
- AC_MSG_ERROR([yasm 1.1 or greater is required to build with libjpeg-turbo's optimized JPEG decoding routines, but you appear to have version $_YASM_MAJOR_VERSION.$_YASM_MINOR_VERSION. Upgrade to the newest version or configure with --disable-libjpeg-turbo to use the pure C JPEG decoder. See https://developer.mozilla.org/en/YASM for more details.])
+ AC_MSG_ERROR([Yasm 1.1 or greater is required to build with libjpeg-turbo's optimized JPEG decoding routines, but you appear to have version $_YASM_MAJOR_VERSION.$_YASM_MINOR_VERSION. Upgrade to the newest version or configure with --disable-libjpeg-turbo to use the pure C JPEG decoder. See https://developer.mozilla.org/en/YASM for more details.])
fi
fi
fi
+dnl If we're on an ARM system which supports libjpeg-turbo's asm routines and
+dnl --disable-libjpeg-turbo wasn't passed, use the C compiler as the assembler.
+if test -n "$LIBJPEG_TURBO_ARM_ASM" ; then
+ echo "Using $AS as the assembler for ARM code."
+ LIBJPEG_TURBO_AS=$AS
+fi
+
if test -n "$LIBJPEG_TURBO_X86_ASM"; then
AC_DEFINE(LIBJPEG_TURBO_X86_ASM)
elif test -n "$LIBJPEG_TURBO_X64_ASM"; then
AC_DEFINE(LIBJPEG_TURBO_X64_ASM)
+elif test -n "$LIBJPEG_TURBO_ARM_ASM"; then
+ AC_DEFINE(LIBJPEG_TURBO_ARM_ASM)
elif test -n "$MOZ_LIBJPEG_TURBO"; then
dnl Warn if we're not building the optimized routines, even though the user
dnl didn't specify --disable-libjpeg-turbo.
@@ -7598,18 +7662,6 @@ if test -n "$MOZ_B2G_RIL"; then
fi
AC_SUBST(MOZ_B2G_RIL)
-dnl ========================================================
-dnl = Enable Bluetooth Interface for B2G (Gonk usually)
-dnl ========================================================
-MOZ_ARG_ENABLE_BOOL(b2g-bt,
-[ --enable-b2g-bt Set compile flags necessary for compiling Bluetooth API for B2G ],
- MOZ_B2G_BT=1,
- MOZ_B2G_BT= )
-if test -n "$MOZ_B2G_BT"; then
- AC_DEFINE(MOZ_B2G_BT)
-fi
-AC_SUBST(MOZ_B2G_BT)
-
dnl ========================================================
dnl = Support for demangling undefined symbols
dnl ========================================================
@@ -8585,8 +8637,6 @@ AC_SUBST(MOZ_APP_VERSION)
AC_DEFINE_UNQUOTED(MOZ_UA_FIREFOX_VERSION, "$FIREFOX_VERSION")
AC_DEFINE_UNQUOTED(FIREFOX_VERSION,$FIREFOX_VERSION)
AC_SUBST(FIREFOX_VERSION)
-AC_DEFINE_UNQUOTED(MOZ_UA_BUILDID, "$MOZ_UA_BUILDID")
-AC_SUBST(MOZ_UA_BUILDID)
# We can't use the static application.ini data when building against
# a libxul SDK.
@@ -8756,6 +8806,7 @@ AC_SUBST(LIBJPEG_TURBO_AS)
AC_SUBST(LIBJPEG_TURBO_ASFLAGS)
AC_SUBST(LIBJPEG_TURBO_X86_ASM)
AC_SUBST(LIBJPEG_TURBO_X64_ASM)
+AC_SUBST(LIBJPEG_TURBO_ARM_ASM)
AC_MSG_CHECKING([for posix_fallocate])
AC_TRY_LINK([#define _XOPEN_SOURCE 600
@@ -9090,7 +9141,11 @@ if test -z "$MOZ_NATIVE_NSPR"; then
_SAVE_CPPFLAGS="$CPPFLAGS"
export CPPFLAGS="-include $_topsrcdir/mozglue/linker/dladdr.h $CPPFLAGS"
fi
+ _SAVE_LDFLAGS="$LDFLAGS"
+ export LDFLAGS="$LDFLAGS $NSPR_LDFLAGS"
AC_OUTPUT_SUBDIRS(nsprpub)
+ unset LDFLAGS
+ LDFLAGS="$_SAVE_LDFLAGS"
if test -n "$MOZ_LINKER" -a -z "$MOZ_OLD_LINKER" -a "$ac_cv_func_dladdr" = no; then
unset CPPFLAGS
CPPFLAGS="$_SAVE_CFLAGS"
diff --git a/content/base/crashtests/700512-worker.js b/content/base/crashtests/700512-worker.js
index 83b732ab570..fcb558fcf45 100644
--- a/content/base/crashtests/700512-worker.js
+++ b/content/base/crashtests/700512-worker.js
@@ -1,7 +1,7 @@
onmessage = function(event) {
var blob = event.data;
- blob.mozSlice(1, 5);
+ blob.slice(1, 5);
postMessage("done");
}
diff --git a/content/base/public/nsIDOMFile.idl b/content/base/public/nsIDOMFile.idl
index 6d47a5fc5b8..7c9913fe203 100644
--- a/content/base/public/nsIDOMFile.idl
+++ b/content/base/public/nsIDOMFile.idl
@@ -71,9 +71,9 @@ interface nsIDOMBlob : nsISupports
// blob: protocol handler
[noscript] DOMString getInternalUrl(in nsIPrincipal principal);
- [optional_argc] nsIDOMBlob mozSlice([optional] in long long start,
- [optional] in long long end,
- [optional] in DOMString contentType);
+ [optional_argc] nsIDOMBlob slice([optional] in long long start,
+ [optional] in long long end,
+ [optional] in DOMString contentType);
// Get internal id of stored file. Returns -1 if it is not a stored file.
// Intended only for testing. It can be called on any thread.
diff --git a/content/base/src/nsContentAreaDragDrop.cpp b/content/base/src/nsContentAreaDragDrop.cpp
index 7190bb4fd37..ec8b803137b 100644
--- a/content/base/src/nsContentAreaDragDrop.cpp
+++ b/content/base/src/nsContentAreaDragDrop.cpp
@@ -48,6 +48,7 @@
#include "nsCopySupport.h"
#include "nsIDOMUIEvent.h"
#include "nsISelection.h"
+#include "nsISelectionController.h"
#include "nsIDOMNode.h"
#include "nsIDOMNodeList.h"
#include "nsIDOMEvent.h"
@@ -70,6 +71,7 @@
#include "nsIDocShell.h"
#include "nsIContent.h"
#include "nsIImageLoadingContent.h"
+#include "nsITextControlElement.h"
#include "nsUnicharUtils.h"
#include "nsIURL.h"
#include "nsIDocument.h"
@@ -84,37 +86,6 @@
#include "imgIRequest.h"
#include "nsDOMDataTransfer.h"
-// private clipboard data flavors for html copy, used by editor when pasting
-#define kHTMLContext "text/_moz_htmlcontext"
-#define kHTMLInfo "text/_moz_htmlinfo"
-
-// if aNode is null, use the selection from the window
-static nsresult
-GetTransferableForNodeOrSelection(nsIDOMWindow* aWindow,
- nsIContent* aNode,
- nsITransferable** aTransferable)
-{
- NS_ENSURE_ARG_POINTER(aWindow);
-
- nsCOMPtr domDoc;
- aWindow->GetDocument(getter_AddRefs(domDoc));
- NS_ENSURE_TRUE(domDoc, NS_ERROR_FAILURE);
- nsCOMPtr doc = do_QueryInterface(domDoc);
-
- nsresult rv;
- if (aNode) {
- rv = nsCopySupport::GetTransferableForNode(aNode, doc, aTransferable);
- } else {
- nsCOMPtr selection;
- aWindow->GetSelection(getter_AddRefs(selection));
- rv = nsCopySupport::GetTransferableForSelection(selection, doc,
- aTransferable);
- }
-
- NS_ENSURE_SUCCESS(rv, rv);
- return rv;
-}
-
class NS_STACK_CLASS DragDataProducer
{
public:
@@ -124,7 +95,7 @@ public:
bool aIsAltKeyPressed);
nsresult Produce(nsDOMDataTransfer* aDataTransfer,
bool* aCanDrag,
- bool* aDragSelection,
+ nsISelection** aSelection,
nsIContent** aDragNode);
private:
@@ -172,7 +143,7 @@ nsContentAreaDragDrop::GetDragData(nsIDOMWindow* aWindow,
bool aIsAltKeyPressed,
nsDOMDataTransfer* aDataTransfer,
bool* aCanDrag,
- bool* aDragSelection,
+ nsISelection** aSelection,
nsIContent** aDragNode)
{
NS_ENSURE_TRUE(aSelectionTargetNode, NS_ERROR_INVALID_ARG);
@@ -181,7 +152,7 @@ nsContentAreaDragDrop::GetDragData(nsIDOMWindow* aWindow,
DragDataProducer
provider(aWindow, aTarget, aSelectionTargetNode, aIsAltKeyPressed);
- return provider.Produce(aDataTransfer, aCanDrag, aDragSelection, aDragNode);
+ return provider.Produce(aDataTransfer, aCanDrag, aSelection, aDragNode);
}
@@ -412,10 +383,10 @@ DragDataProducer::GetNodeString(nsIContent* inNode,
nsresult
DragDataProducer::Produce(nsDOMDataTransfer* aDataTransfer,
bool* aCanDrag,
- bool* aDragSelection,
+ nsISelection** aSelection,
nsIContent** aDragNode)
{
- NS_PRECONDITION(aCanDrag && aDragSelection && aDataTransfer && aDragNode,
+ NS_PRECONDITION(aCanDrag && aSelection && aDataTransfer && aDragNode,
"null pointer passed to Produce");
NS_ASSERTION(mWindow, "window not set");
NS_ASSERTION(mSelectionTargetNode, "selection target node should have been set");
@@ -424,33 +395,72 @@ DragDataProducer::Produce(nsDOMDataTransfer* aDataTransfer,
nsresult rv;
nsIContent* dragNode = nsnull;
+ *aSelection = nsnull;
- // find the selection to see what we could be dragging and if
- // what we're dragging is in what is selected.
+ // Find the selection to see what we could be dragging and if what we're
+ // dragging is in what is selected. If this is an editable textbox, use
+ // the textbox's selection, otherwise use the window's selection.
nsCOMPtr selection;
- mWindow->GetSelection(getter_AddRefs(selection));
- if (!selection) {
- return NS_OK;
- }
-
- // check if the node is inside a form control. If so, dragging will be
- // handled in editor code (nsPlaintextDataTransfer::DoDrag). Don't set
- // aCanDrag to false however, as we still want to allow the drag.
- nsCOMPtr findFormNode = mSelectionTargetNode;
- nsIContent* findFormParent = findFormNode->GetParent();
- while (findFormParent) {
- nsCOMPtr form(do_QueryInterface(findFormParent));
- if (form && !form->AllowDraggableChildren()) {
- return NS_OK;
+ nsIContent* editingElement = mSelectionTargetNode->IsEditable() ?
+ mSelectionTargetNode->GetEditingHost() : nsnull;
+ nsCOMPtr textControl(do_QueryInterface(editingElement));
+ if (textControl) {
+ nsISelectionController* selcon = textControl->GetSelectionController();
+ if (selcon) {
+ selcon->GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(selection));
+ if (!selection)
+ return NS_OK;
+ }
+ }
+ else {
+ mWindow->GetSelection(getter_AddRefs(selection));
+ if (!selection)
+ return NS_OK;
+
+ // Check if the node is inside a form control. Don't set aCanDrag to false
+ //however, as we still want to allow the drag.
+ nsCOMPtr findFormNode = mSelectionTargetNode;
+ nsIContent* findFormParent = findFormNode->GetParent();
+ while (findFormParent) {
+ nsCOMPtr form(do_QueryInterface(findFormParent));
+ if (form && !form->AllowDraggableChildren()) {
+ return NS_OK;
+ }
+ findFormParent = findFormParent->GetParent();
}
- findFormParent = findFormParent->GetParent();
}
// if set, serialize the content under this node
nsCOMPtr nodeToSerialize;
- *aDragSelection = false;
- {
+ bool isChromeShell = false;
+ nsCOMPtr webnav = do_GetInterface(mWindow);
+ nsCOMPtr dsti = do_QueryInterface(webnav);
+ if (dsti) {
+ PRInt32 type = -1;
+ if (NS_SUCCEEDED(dsti->GetItemType(&type)) &&
+ type == nsIDocShellTreeItem::typeChrome) {
+ isChromeShell = true;
+ }
+ }
+
+ // In chrome shells, only allow dragging inside editable areas.
+ if (isChromeShell && !editingElement)
+ return NS_OK;
+
+ if (isChromeShell && textControl) {
+ // Only use the selection if it isn't collapsed.
+ bool isCollapsed = false;
+ selection->GetIsCollapsed(&isCollapsed);
+ if (!isCollapsed)
+ selection.swap(*aSelection);
+ }
+ else {
+ // In content shells, a number of checks are made below to determine
+ // whether an image or a link is being dragged. If so, add additional
+ // data to the data transfer. This is also done for chrome shells, but
+ // only when in a non-textbox editor.
+
bool haveSelectedContent = false;
// possible parent link node
@@ -490,7 +500,7 @@ DragDataProducer::Produce(nsDOMDataTransfer* aDataTransfer,
return NS_OK;
}
- *aDragSelection = true;
+ selection.swap(*aSelection);
} else if (selectedImageOrLinkNode) {
// an image is selected
image = do_QueryInterface(selectedImageOrLinkNode);
@@ -660,20 +670,28 @@ DragDataProducer::Produce(nsDOMDataTransfer* aDataTransfer,
}
}
- if (nodeToSerialize || *aDragSelection) {
- // if we have selected text, use it in preference to the node
- if (*aDragSelection) {
- nodeToSerialize = nsnull;
- }
-
+ if (nodeToSerialize || *aSelection) {
mHtmlString.Truncate();
mContextString.Truncate();
mInfoString.Truncate();
mTitleString.Truncate();
+
+ nsCOMPtr domDoc;
+ mWindow->GetDocument(getter_AddRefs(domDoc));
+ nsCOMPtr doc = do_QueryInterface(domDoc);
+ NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE);
+
+ // if we have selected text, use it in preference to the node
nsCOMPtr transferable;
- rv = ::GetTransferableForNodeOrSelection(mWindow, nodeToSerialize,
- getter_AddRefs(transferable));
- NS_ENSURE_SUCCESS(rv, rv);
+ if (*aSelection) {
+ rv = nsCopySupport::GetTransferableForSelection(*aSelection, doc,
+ getter_AddRefs(transferable));
+ }
+ else {
+ rv = nsCopySupport::GetTransferableForNode(nodeToSerialize, doc,
+ getter_AddRefs(transferable));
+ }
+
nsCOMPtr data;
PRUint32 dataSize;
rv = transferable->GetTransferData(kHTMLMime, getter_AddRefs(data), &dataSize);
@@ -747,15 +765,17 @@ DragDataProducer::AddStringsToDataTransfer(nsIContent* aDragNode,
AddString(aDataTransfer, NS_LITERAL_STRING("text/uri-list"), mUrlString, principal);
}
- // add a special flavor, even if we don't have html context data
- AddString(aDataTransfer, NS_LITERAL_STRING(kHTMLContext), mContextString, principal);
+ // add a special flavor for the html context data
+ if (!mContextString.IsEmpty())
+ AddString(aDataTransfer, NS_LITERAL_STRING(kHTMLContext), mContextString, principal);
// add a special flavor if we have html info data
if (!mInfoString.IsEmpty())
AddString(aDataTransfer, NS_LITERAL_STRING(kHTMLInfo), mInfoString, principal);
// add the full html
- AddString(aDataTransfer, NS_LITERAL_STRING(kHTMLMime), mHtmlString, principal);
+ if (!mHtmlString.IsEmpty())
+ AddString(aDataTransfer, NS_LITERAL_STRING(kHTMLMime), mHtmlString, principal);
// add the plain text. we use the url for text/plain data if an anchor is
// being dragged, rather than the title text of the link or the alt text for
diff --git a/content/base/src/nsContentAreaDragDrop.h b/content/base/src/nsContentAreaDragDrop.h
index 64a1ad4ba80..06482876dcf 100644
--- a/content/base/src/nsContentAreaDragDrop.h
+++ b/content/base/src/nsContentAreaDragDrop.h
@@ -78,8 +78,8 @@ public:
* aDataTransfer - the dataTransfer for the drag event.
* aCanDrag - [out] set to true if the drag may proceed, false to stop the
* drag entirely
- * aDragSelection - [out] set to true to indicate that a selection is being
- * dragged, rather than a specific node
+ * aSelection - [out] set to the selection being dragged, or null if no
+ * selection is being dragged.
* aDragNode - [out] the link, image or area being dragged, or null if the
* drag occurred on another element.
*/
@@ -89,7 +89,7 @@ public:
bool aIsAltKeyPressed,
nsDOMDataTransfer* aDataTransfer,
bool* aCanDrag,
- bool* aDragSelection,
+ nsISelection** aSelection,
nsIContent** aDragNode);
};
diff --git a/content/base/src/nsCopySupport.cpp b/content/base/src/nsCopySupport.cpp
index 6054a56603e..f6c32d25dce 100644
--- a/content/base/src/nsCopySupport.cpp
+++ b/content/base/src/nsCopySupport.cpp
@@ -91,10 +91,6 @@ static NS_DEFINE_CID(kCClipboardCID, NS_CLIPBOARD_CID);
static NS_DEFINE_CID(kCTransferableCID, NS_TRANSFERABLE_CID);
static NS_DEFINE_CID(kHTMLConverterCID, NS_HTMLFORMATCONVERTER_CID);
-// private clipboard data flavors for html copy, used by editor when pasting
-#define kHTMLContext "text/_moz_htmlcontext"
-#define kHTMLInfo "text/_moz_htmlinfo"
-
// copy string data onto the transferable
static nsresult AppendString(nsITransferable *aTransferable,
const nsAString& aString,
diff --git a/content/base/src/nsDOMBlobBuilder.cpp b/content/base/src/nsDOMBlobBuilder.cpp
index b1dab01e18f..402edddd103 100644
--- a/content/base/src/nsDOMBlobBuilder.cpp
+++ b/content/base/src/nsDOMBlobBuilder.cpp
@@ -122,9 +122,9 @@ nsDOMMultipartFile::CreateSlice(PRUint64 aStart, PRUint64 aLength,
PRUint64 upperBound = NS_MIN(l - skipStart, length);
nsCOMPtr firstBlob;
- rv = blob->MozSlice(skipStart, skipStart + upperBound,
- aContentType, 3,
- getter_AddRefs(firstBlob));
+ rv = blob->Slice(skipStart, skipStart + upperBound,
+ aContentType, 3,
+ getter_AddRefs(firstBlob));
NS_ENSURE_SUCCESS(rv, nsnull);
// Avoid wrapping a single blob inside an nsDOMMultipartFile
@@ -150,8 +150,8 @@ nsDOMMultipartFile::CreateSlice(PRUint64 aStart, PRUint64 aLength,
if (length < l) {
nsCOMPtr lastBlob;
- rv = blob->MozSlice(0, length, aContentType, 3,
- getter_AddRefs(lastBlob));
+ rv = blob->Slice(0, length, aContentType, 3,
+ getter_AddRefs(lastBlob));
NS_ENSURE_SUCCESS(rv, nsnull);
blobs.AppendElement(lastBlob);
diff --git a/content/base/src/nsDOMFile.cpp b/content/base/src/nsDOMFile.cpp
index 9c1d56d08d6..1df7d3863e0 100644
--- a/content/base/src/nsDOMFile.cpp
+++ b/content/base/src/nsDOMFile.cpp
@@ -238,9 +238,9 @@ ParseSize(PRInt64 aSize, PRInt64& aStart, PRInt64& aEnd)
}
NS_IMETHODIMP
-nsDOMFileBase::MozSlice(PRInt64 aStart, PRInt64 aEnd,
- const nsAString& aContentType, PRUint8 optional_argc,
- nsIDOMBlob **aBlob)
+nsDOMFileBase::Slice(PRInt64 aStart, PRInt64 aEnd,
+ const nsAString& aContentType, PRUint8 optional_argc,
+ nsIDOMBlob **aBlob)
{
*aBlob = nsnull;
diff --git a/content/base/src/nsGenericElement.cpp b/content/base/src/nsGenericElement.cpp
index 7c7f74107b2..e26bf228eae 100644
--- a/content/base/src/nsGenericElement.cpp
+++ b/content/base/src/nsGenericElement.cpp
@@ -1700,9 +1700,29 @@ nsINode::SetExplicitBaseURI(nsIURI* aURI)
//----------------------------------------------------------------------
+static JSObject*
+GetJSObjectChild(nsWrapperCache* aCache)
+{
+ if (aCache->PreservingWrapper()) {
+ return aCache->GetWrapperPreserveColor();
+ }
+ return aCache->GetExpandoObjectPreserveColor();
+}
+
+static bool
+NeedsScriptTraverse(nsWrapperCache* aCache)
+{
+ JSObject* o = GetJSObjectChild(aCache);
+ return o && xpc_IsGrayGCThing(o);
+}
+
+//----------------------------------------------------------------------
+
NS_IMPL_CYCLE_COLLECTING_ADDREF(nsChildContentList)
NS_IMPL_CYCLE_COLLECTING_RELEASE(nsChildContentList)
+// If nsChildContentList is changed so that any additional fields are
+// traversed by the cycle collector, then CAN_SKIP must be updated.
NS_IMPL_CYCLE_COLLECTION_CLASS(nsChildContentList)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsChildContentList)
NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
@@ -1714,6 +1734,20 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsChildContentList)
NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
NS_IMPL_CYCLE_COLLECTION_TRACE_END
+// nsChildContentList only ever has a single child, its wrapper, so if
+// the wrapper is black, the list can't be part of a garbage cycle.
+NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(nsChildContentList)
+ return !NeedsScriptTraverse(tmp);
+NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END
+
+NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_BEGIN(nsChildContentList)
+ return !NeedsScriptTraverse(tmp);
+NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END
+
+// CanSkipThis returns false to avoid problems with incomplete unlinking.
+NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(nsChildContentList)
+NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_END
+
NS_INTERFACE_TABLE_HEAD(nsChildContentList)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_NODELIST_OFFSET_AND_INTERFACE_TABLE_BEGIN(nsChildContentList)
@@ -4405,22 +4439,6 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsGenericElement)
nsINode::Trace(tmp, aCallback, aClosure);
NS_IMPL_CYCLE_COLLECTION_TRACE_END
-static JSObject*
-GetJSObjectChild(nsINode* aNode)
-{
- if (aNode->PreservingWrapper()) {
- return aNode->GetWrapperPreserveColor();
- }
- return aNode->GetExpandoObjectPreserveColor();
-}
-
-static bool
-NeedsScriptTraverse(nsINode* aNode)
-{
- JSObject* o = GetJSObjectChild(aNode);
- return o && xpc_IsGrayGCThing(o);
-}
-
void
nsGenericElement::MarkUserData(void* aObject, nsIAtom* aKey, void* aChild,
void* aData)
diff --git a/content/base/src/nsGenericElement.h b/content/base/src/nsGenericElement.h
index bfe8869d236..1417a46ce64 100644
--- a/content/base/src/nsGenericElement.h
+++ b/content/base/src/nsGenericElement.h
@@ -102,7 +102,7 @@ public:
}
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
- NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(nsChildContentList)
+ NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS(nsChildContentList)
// nsWrapperCache
virtual JSObject* WrapObject(JSContext *cx, XPCWrappedNativeScope *scope,
diff --git a/content/base/test/fileutils.js b/content/base/test/fileutils.js
index fbe6cbaa1c3..67ba18989b4 100644
--- a/content/base/test/fileutils.js
+++ b/content/base/test/fileutils.js
@@ -201,24 +201,24 @@ function testSlice(file, size, type, contents, fileType) {
ok(file instanceof File, fileType + " file is a File");
ok(file instanceof Blob, fileType + " file is also a Blob");
- var slice = file.mozSlice(0, size);
+ var slice = file.slice(0, size);
ok(slice instanceof Blob, fileType + " fullsize slice is a Blob");
ok(!(slice instanceof File), fileType + " fullsize slice is not a File");
- slice = file.mozSlice(0, 1234);
+ slice = file.slice(0, 1234);
ok(slice instanceof Blob, fileType + " sized slice is a Blob");
ok(!(slice instanceof File), fileType + " sized slice is not a File");
- slice = file.mozSlice(0, size, "foo/bar");
+ slice = file.slice(0, size, "foo/bar");
is(slice.type, "foo/bar", fileType + " fullsize slice foo/bar type");
- slice = file.mozSlice(0, 5432, "foo/bar");
+ slice = file.slice(0, 5432, "foo/bar");
is(slice.type, "foo/bar", fileType + " sized slice foo/bar type");
- is(slice.mozSlice(0, 10).type, "", fileType + " slice-slice type");
- is(slice.mozSlice(0, 10).size, 10, fileType + " slice-slice size");
- is(slice.mozSlice(0, 10, "hello/world").type, "hello/world", fileType + " slice-slice hello/world type");
- is(slice.mozSlice(0, 10, "hello/world").size, 10, fileType + " slice-slice hello/world size");
+ is(slice.slice(0, 10).type, "", fileType + " slice-slice type");
+ is(slice.slice(0, 10).size, 10, fileType + " slice-slice size");
+ is(slice.slice(0, 10, "hello/world").type, "hello/world", fileType + " slice-slice hello/world type");
+ is(slice.slice(0, 10, "hello/world").size, 10, fileType + " slice-slice hello/world size");
// Start, end, expected size
var indexes = [[0, size, size],
@@ -247,17 +247,17 @@ function testSlice(file, size, type, contents, fileType) {
var sliceContents;
var testName;
if (indexes[i][0] == undefined) {
- slice = file.mozSlice();
+ slice = file.slice();
sliceContents = contents.slice();
testName = fileType + " slice()";
}
else if (indexes[i][1] == undefined) {
- slice = file.mozSlice(indexes[i][0]);
+ slice = file.slice(indexes[i][0]);
sliceContents = contents.slice(indexes[i][0]);
testName = fileType + " slice(" + indexes[i][0] + ")";
}
else {
- slice = file.mozSlice(indexes[i][0], indexes[i][1]);
+ slice = file.slice(indexes[i][0], indexes[i][1]);
sliceContents = contents.slice(indexes[i][0], indexes[i][1]);
testName = fileType + " slice(" + indexes[i][0] + ", " + indexes[i][1] + ")";
}
@@ -268,11 +268,11 @@ function testSlice(file, size, type, contents, fileType) {
}
// Slice of slice
- var slice = file.mozSlice(0, 40000);
- testFile(slice.mozSlice(5000, 42000), contents.slice(5000, 40000), "file slice slice");
+ var slice = file.slice(0, 40000);
+ testFile(slice.slice(5000, 42000), contents.slice(5000, 40000), "file slice slice");
// ...of slice of slice
- slice = slice.mozSlice(5000, 42000).mozSlice(400, 700);
+ slice = slice.slice(5000, 42000).slice(400, 700);
SpecialPowers.gc();
testFile(slice, contents.slice(5400, 5700), "file slice slice slice");
}
diff --git a/content/base/test/test_blobbuilder.html b/content/base/test/test_blobbuilder.html
index 7b767c78245..6addb2f75f5 100644
--- a/content/base/test/test_blobbuilder.html
+++ b/content/base/test/test_blobbuilder.html
@@ -151,7 +151,7 @@ function doTest(data) {
ok(blob instanceof Blob, "Test " + testCounter + " blob is a Blob");
ok(!(blob instanceof File), "Test " + testCounter + " blob is not a File");
- let slice = blob.mozSlice(test.start, test.start + test.length);
+ let slice = blob.slice(test.start, test.start + test.length);
ok(slice, "Test " + testCounter + " got slice");
ok(slice instanceof Blob, "Test " + testCounter + " slice is a Blob");
ok(!(slice instanceof File), "Test " + testCounter + " slice is not a File");
diff --git a/content/base/test/test_fileapi_slice.html b/content/base/test/test_fileapi_slice.html
index 2b5594ce93e..9bfc6e0315c 100644
--- a/content/base/test/test_fileapi_slice.html
+++ b/content/base/test/test_fileapi_slice.html
@@ -104,7 +104,7 @@ function imageLoadHandler(event) {
var imgfile = createFileWithData(testBinaryData + fileData + testBinaryData);
is(imgfile.size, size + testBinaryData.length * 2, "correct file size (middle)");
var img = new Image;
-img.src = URL.createObjectURL(imgfile.mozSlice(testBinaryData.length, testBinaryData.length + size));
+img.src = URL.createObjectURL(imgfile.slice(testBinaryData.length, testBinaryData.length + size));
img.onload = imageLoadHandler;
expectedTestCount++;
@@ -112,7 +112,7 @@ expectedTestCount++;
var imgfile = createFileWithData(fileData + testBinaryData);
is(imgfile.size, size + testBinaryData.length, "correct file size (start)");
var img = new Image;
-img.src = URL.createObjectURL(imgfile.mozSlice(0, size));
+img.src = URL.createObjectURL(imgfile.slice(0, size));
img.onload = imageLoadHandler;
expectedTestCount++;
@@ -120,7 +120,7 @@ expectedTestCount++;
var imgfile = createFileWithData(testBinaryData + fileData);
is(imgfile.size, size + testBinaryData.length, "correct file size (end)");
var img = new Image;
-img.src = URL.createObjectURL(imgfile.mozSlice(testBinaryData.length, testBinaryData.length + size));
+img.src = URL.createObjectURL(imgfile.slice(testBinaryData.length, testBinaryData.length + size));
img.onload = imageLoadHandler;
expectedTestCount++;
@@ -128,7 +128,7 @@ expectedTestCount++;
var imgfile = createFileWithData(testBinaryData + fileData);
is(imgfile.size, size + testBinaryData.length, "correct file size (past end)");
var img = new Image;
-img.src = URL.createObjectURL(imgfile.mozSlice(testBinaryData.length, testBinaryData.length + size + 1000));
+img.src = URL.createObjectURL(imgfile.slice(testBinaryData.length, testBinaryData.length + size + 1000));
img.onload = imageLoadHandler;
expectedTestCount++;
diff --git a/content/canvas/src/WebGLContext.h b/content/canvas/src/WebGLContext.h
index 5a709d0c1ea..1b99c250bf5 100644
--- a/content/canvas/src/WebGLContext.h
+++ b/content/canvas/src/WebGLContext.h
@@ -1024,7 +1024,7 @@ struct WebGLVertexAttribData {
}
};
-class WebGLBuffer
+class WebGLBuffer MOZ_FINAL
: public nsIWebGLBuffer
, public WebGLRefCountedObject
, public WebGLContextBoundObject
@@ -1158,7 +1158,7 @@ protected:
void* mData; // in the case of an Element Array Buffer, we keep a copy.
};
-class WebGLTexture
+class WebGLTexture MOZ_FINAL
: public nsIWebGLTexture
, public WebGLRefCountedObject
, public WebGLContextBoundObject
@@ -1608,7 +1608,7 @@ public:
}
};
-class WebGLShader
+class WebGLShader MOZ_FINAL
: public nsIWebGLShader
, public WebGLRefCountedObject
, public WebGLContextBoundObject
@@ -1673,7 +1673,7 @@ protected:
WebGLMonotonicHandle mMonotonicHandle;
};
-class WebGLProgram
+class WebGLProgram MOZ_FINAL
: public nsIWebGLProgram
, public WebGLRefCountedObject
, public WebGLContextBoundObject
@@ -1795,7 +1795,7 @@ protected:
WebGLMonotonicHandle mMonotonicHandle;
};
-class WebGLRenderbuffer
+class WebGLRenderbuffer MOZ_FINAL
: public nsIWebGLRenderbuffer
, public WebGLRefCountedObject
, public WebGLRectangleObject
@@ -2001,7 +2001,7 @@ public:
}
};
-class WebGLFramebuffer
+class WebGLFramebuffer MOZ_FINAL
: public nsIWebGLFramebuffer
, public WebGLRefCountedObject
, public WebGLContextBoundObject
@@ -2296,7 +2296,7 @@ public:
WebGLMonotonicHandle mMonotonicHandle;
};
-class WebGLUniformLocation
+class WebGLUniformLocation MOZ_FINAL
: public nsIWebGLUniformLocation
, public WebGLContextBoundObject
, public WebGLRefCountedObject
@@ -2337,7 +2337,7 @@ protected:
friend class WebGLProgram;
};
-class WebGLActiveInfo
+class WebGLActiveInfo MOZ_FINAL
: public nsIWebGLActiveInfo
{
public:
@@ -2356,7 +2356,7 @@ protected:
nsString mName;
};
-class WebGLShaderPrecisionFormat
+class WebGLShaderPrecisionFormat MOZ_FINAL
: public nsIWebGLShaderPrecisionFormat
{
public:
diff --git a/content/canvas/src/WebGLContextGL.cpp b/content/canvas/src/WebGLContextGL.cpp
index c0a8fed9c8e..fd5b6fce070 100644
--- a/content/canvas/src/WebGLContextGL.cpp
+++ b/content/canvas/src/WebGLContextGL.cpp
@@ -4377,7 +4377,7 @@ WebGLContext::CompileShader(nsIWebGLShader *sobj)
// ESSL backend
compiler = ShConstructCompiler((ShShaderType) shader->ShaderType(),
SH_WEBGL_SPEC,
-#ifdef MOZ_WIDGET_ANDROID
+#ifdef ANDROID
SH_GLSL_OUTPUT,
#else
gl->IsGLES2() ? SH_ESSL_OUTPUT : SH_GLSL_OUTPUT,
diff --git a/content/canvas/src/nsCanvasRenderingContext2D.cpp b/content/canvas/src/nsCanvasRenderingContext2D.cpp
index b159d7efbf7..7b4fa8b7f3a 100644
--- a/content/canvas/src/nsCanvasRenderingContext2D.cpp
+++ b/content/canvas/src/nsCanvasRenderingContext2D.cpp
@@ -180,7 +180,7 @@ CopyContext(gfxContext* dest, gfxContext* src)
**/
#define NS_CANVASGRADIENT_PRIVATE_IID \
{ 0x491d39d8, 0x4058, 0x42bd, { 0xac, 0x76, 0x70, 0xd5, 0x62, 0x7f, 0x02, 0x10 } }
-class nsCanvasGradient : public nsIDOMCanvasGradient
+class nsCanvasGradient MOZ_FINAL : public nsIDOMCanvasGradient
{
public:
NS_DECLARE_STATIC_IID_ACCESSOR(NS_CANVASGRADIENT_PRIVATE_IID)
@@ -238,7 +238,7 @@ NS_INTERFACE_MAP_END
**/
#define NS_CANVASPATTERN_PRIVATE_IID \
{ 0xb85c6c8a, 0x0624, 0x4530, { 0xb8, 0xee, 0xff, 0xdf, 0x42, 0xe8, 0x21, 0x6d } }
-class nsCanvasPattern : public nsIDOMCanvasPattern
+class nsCanvasPattern MOZ_FINAL : public nsIDOMCanvasPattern
{
public:
NS_DECLARE_STATIC_IID_ACCESSOR(NS_CANVASPATTERN_PRIVATE_IID)
diff --git a/content/canvas/test/webgl/failing_tests_mac.txt b/content/canvas/test/webgl/failing_tests_mac.txt
index 5bc2bc7c82d..eaabd7f6f1e 100644
--- a/content/canvas/test/webgl/failing_tests_mac.txt
+++ b/content/canvas/test/webgl/failing_tests_mac.txt
@@ -7,3 +7,5 @@ conformance/more/conformance/quickCheckAPI-S_V.html
conformance/glsl/misc/attrib-location-length-limits.html
conformance/glsl/misc/uniform-location-length-limits.html
conformance/programs/program-test.html
+conformance/textures/texture-mips.html
+conformance/textures/texture-npot.html
diff --git a/content/events/src/nsDOMEvent.cpp b/content/events/src/nsDOMEvent.cpp
index 1e36b45f0b6..a80cd3159f6 100644
--- a/content/events/src/nsDOMEvent.cpp
+++ b/content/events/src/nsDOMEvent.cpp
@@ -180,8 +180,7 @@ nsDOMEvent::InitPresContextData(nsPresContext* aPresContext)
// Get the explicit original target (if it's anonymous make it null)
{
nsCOMPtr content = GetTargetFromFrame();
- mTmpRealOriginalTarget = do_QueryInterface(content);
- mExplicitOriginalTarget = mTmpRealOriginalTarget;
+ mExplicitOriginalTarget = do_QueryInterface(content);
if (content && content->IsInAnonymousSubtree()) {
mExplicitOriginalTarget = nsnull;
}
@@ -237,10 +236,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsDOMEvent)
}
}
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mPresContext);
- NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mTmpRealOriginalTarget)
- // Always set mExplicitOriginalTarget to null, when
- // mTmpRealOriginalTarget doesn't point to any object!
- tmp->mExplicitOriginalTarget = nsnull;
+ NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mExplicitOriginalTarget);
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsDOMEvent)
@@ -275,7 +271,7 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsDOMEvent)
}
}
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_MEMBER(mPresContext.get(), nsPresContext)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mTmpRealOriginalTarget)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mExplicitOriginalTarget)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
// nsIDOMEventInterface
@@ -355,18 +351,6 @@ nsDOMEvent::GetExplicitOriginalTarget(nsIDOMEventTarget** aRealEventTarget)
return GetTarget(aRealEventTarget);
}
-NS_IMETHODIMP
-nsDOMEvent::GetTmpRealOriginalTarget(nsIDOMEventTarget** aRealEventTarget)
-{
- if (mTmpRealOriginalTarget) {
- *aRealEventTarget = mTmpRealOriginalTarget;
- NS_ADDREF(*aRealEventTarget);
- return NS_OK;
- }
-
- return GetOriginalTarget(aRealEventTarget);
-}
-
NS_IMETHODIMP
nsDOMEvent::GetOriginalTarget(nsIDOMEventTarget** aOriginalTarget)
{
diff --git a/content/events/src/nsDOMEvent.h b/content/events/src/nsDOMEvent.h
index f3b53c04890..e2c2017cd58 100644
--- a/content/events/src/nsDOMEvent.h
+++ b/content/events/src/nsDOMEvent.h
@@ -267,8 +267,7 @@ protected:
nsEvent* mEvent;
nsRefPtr mPresContext;
- nsCOMPtr mTmpRealOriginalTarget;
- nsIDOMEventTarget* mExplicitOriginalTarget;
+ nsCOMPtr mExplicitOriginalTarget;
nsString mCachedType;
bool mEventIsInternal;
bool mPrivateDataDuplicated;
diff --git a/content/events/src/nsEventStateManager.cpp b/content/events/src/nsEventStateManager.cpp
index 7978989e7d2..2143c8d266b 100644
--- a/content/events/src/nsEventStateManager.cpp
+++ b/content/events/src/nsEventStateManager.cpp
@@ -2081,14 +2081,12 @@ nsEventStateManager::GenerateDragGesture(nsPresContext* aPresContext,
if (!dataTransfer)
return;
- bool isInEditor = false;
- bool isSelection = false;
+ nsCOMPtr selection;
nsCOMPtr eventContent, targetContent;
mCurrentTarget->GetContentForEvent(aEvent, getter_AddRefs(eventContent));
if (eventContent)
DetermineDragTarget(aPresContext, eventContent, dataTransfer,
- &isSelection, &isInEditor,
- getter_AddRefs(targetContent));
+ getter_AddRefs(selection), getter_AddRefs(targetContent));
// Stop tracking the drag gesture now. This should stop us from
// reentering GenerateDragGesture inside DOM event processing.
@@ -2129,9 +2127,8 @@ nsEventStateManager::GenerateDragGesture(nsPresContext* aPresContext,
// elements in an editor, only fire the draggesture event so that the
// editor code can handle it but content doesn't see a dragstart.
nsEventStatus status = nsEventStatus_eIgnore;
- if (!isInEditor)
- nsEventDispatcher::Dispatch(targetContent, aPresContext, &startEvent, nsnull,
- &status);
+ nsEventDispatcher::Dispatch(targetContent, aPresContext, &startEvent, nsnull,
+ &status);
nsDragEvent* event = &startEvent;
if (status != nsEventStatus_eConsumeNoDefault) {
@@ -2148,7 +2145,7 @@ nsEventStateManager::GenerateDragGesture(nsPresContext* aPresContext,
if (status != nsEventStatus_eConsumeNoDefault) {
bool dragStarted = DoDefaultDragStart(aPresContext, event, dataTransfer,
- targetContent, isSelection);
+ targetContent, selection);
if (dragStarted) {
sActiveESM = nsnull;
aEvent->flags |= NS_EVENT_FLAG_STOP_DISPATCH;
@@ -2173,37 +2170,27 @@ void
nsEventStateManager::DetermineDragTarget(nsPresContext* aPresContext,
nsIContent* aSelectionTarget,
nsDOMDataTransfer* aDataTransfer,
- bool* aIsSelection,
- bool* aIsInEditor,
+ nsISelection** aSelection,
nsIContent** aTargetNode)
{
*aTargetNode = nsnull;
- *aIsInEditor = false;
nsCOMPtr container = aPresContext->GetContainer();
nsCOMPtr window = do_GetInterface(container);
// GetDragData determines if a selection, link or image in the content
// should be dragged, and places the data associated with the drag in the
- // data transfer. Skip this check for chrome shells.
+ // data transfer.
+ // mGestureDownContent is the node where the mousedown event for the drag
+ // occurred, and aSelectionTarget is the node to use when a selection is used
bool canDrag;
nsCOMPtr dragDataNode;
- nsCOMPtr dsti = do_QueryInterface(container);
- if (dsti) {
- PRInt32 type = -1;
- if (NS_SUCCEEDED(dsti->GetItemType(&type)) &&
- type != nsIDocShellTreeItem::typeChrome) {
- // mGestureDownContent is the node where the mousedown event for the drag
- // occurred, and aSelectionTarget is the node to use when a selection is used
- nsresult rv =
- nsContentAreaDragDrop::GetDragData(window, mGestureDownContent,
- aSelectionTarget, mGestureDownAlt,
- aDataTransfer, &canDrag, aIsSelection,
- getter_AddRefs(dragDataNode));
- if (NS_FAILED(rv) || !canDrag)
- return;
- }
- }
+ nsresult rv = nsContentAreaDragDrop::GetDragData(window, mGestureDownContent,
+ aSelectionTarget, mGestureDownAlt,
+ aDataTransfer, &canDrag, aSelection,
+ getter_AddRefs(dragDataNode));
+ if (NS_FAILED(rv) || !canDrag)
+ return;
// if GetDragData returned a node, use that as the node being dragged.
// Otherwise, if a selection is being dragged, use the node within the
@@ -2211,7 +2198,7 @@ nsEventStateManager::DetermineDragTarget(nsPresContext* aPresContext,
nsIContent* dragContent = mGestureDownContent;
if (dragDataNode)
dragContent = dragDataNode;
- else if (*aIsSelection)
+ else if (*aSelection)
dragContent = aSelectionTarget;
nsIContent* originalDragContent = dragContent;
@@ -2220,7 +2207,7 @@ nsEventStateManager::DetermineDragTarget(nsPresContext* aPresContext,
// draggable property set. If one is found, use that as the target of the
// drag instead of the node that was clicked on. If a draggable node wasn't
// found, just use the clicked node.
- if (!*aIsSelection) {
+ if (!*aSelection) {
while (dragContent) {
nsCOMPtr htmlElement = do_QueryInterface(dragContent);
if (htmlElement) {
@@ -2245,17 +2232,6 @@ nsEventStateManager::DetermineDragTarget(nsPresContext* aPresContext,
// otherwise, it's not an HTML or XUL element, so just keep looking
}
dragContent = dragContent->GetParent();
-
- // if an editable parent is encountered, then we don't look at any
- // ancestors. This is used because the editor attaches a draggesture
- // listener to the editable element and we want to call it without
- // making the editable element draggable. This should be removed once
- // the editor is switched over to using the proper drag and drop api.
- nsCOMPtr editableElement = do_QueryInterface(dragContent);
- if (editableElement) {
- *aIsInEditor = true;
- break;
- }
}
}
@@ -2279,7 +2255,7 @@ nsEventStateManager::DoDefaultDragStart(nsPresContext* aPresContext,
nsDragEvent* aDragEvent,
nsDOMDataTransfer* aDataTransfer,
nsIContent* aDragTarget,
- bool aIsSelection)
+ nsISelection* aSelection)
{
nsCOMPtr dragService =
do_GetService("@mozilla.org/widget/dragservice;1");
@@ -2333,22 +2309,6 @@ nsEventStateManager::DoDefaultDragStart(nsPresContext* aPresContext,
PRInt32 imageX, imageY;
nsIDOMElement* dragImage = aDataTransfer->GetDragImage(&imageX, &imageY);
- // If a selection is being dragged, and no custom drag image was
- // set, get the selection so that the drag region can be created
- // from the selection area. If a custom image was set, it doesn't
- // matter what the selection is since the image will be used instead.
- nsISelection* selection = nsnull;
- if (aIsSelection && !dragImage) {
- nsIDocument* doc = aDragTarget->GetCurrentDoc();
- if (doc) {
- nsIPresShell* presShell = doc->GetShell();
- if (presShell) {
- selection = presShell->GetCurrentSelection(
- nsISelectionController::SELECTION_NORMAL);
- }
- }
- }
-
nsCOMPtr transArray;
aDataTransfer->GetTransferables(getter_AddRefs(transArray));
if (!transArray)
@@ -2363,8 +2323,13 @@ nsEventStateManager::DoDefaultDragStart(nsPresContext* aPresContext,
nsCOMPtr domDragEvent = do_QueryInterface(domEvent);
// if creating a drag event failed, starting a drag session will
// just fail.
- if (selection) {
- dragService->InvokeDragSessionWithSelection(selection, transArray,
+
+ // Use InvokeDragSessionWithSelection if a selection is being dragged,
+ // such that the image can be generated from the selected text. However,
+ // use InvokeDragSessionWithImage if a custom image was set or something
+ // other than a selection is being dragged.
+ if (!dragImage && aSelection) {
+ dragService->InvokeDragSessionWithSelection(aSelection, transArray,
action, domDragEvent,
aDataTransfer);
}
diff --git a/content/events/src/nsEventStateManager.h b/content/events/src/nsEventStateManager.h
index b6839292d8e..f831f587205 100644
--- a/content/events/src/nsEventStateManager.h
+++ b/content/events/src/nsEventStateManager.h
@@ -417,15 +417,13 @@ protected:
*
* aSelectionTarget - target to check for selection
* aDataTransfer - data transfer object that will contain the data to drag
- * aIsSelection - [out] set to true if a selection is being dragged
- * aIsInEditor - [out] set to true if the content is in an editor field
+ * aSelection - [out] set to the selection to be dragged
* aTargetNode - [out] the draggable node, or null if there isn't one
*/
void DetermineDragTarget(nsPresContext* aPresContext,
nsIContent* aSelectionTarget,
nsDOMDataTransfer* aDataTransfer,
- bool* aIsSelection,
- bool* aIsInEditor,
+ nsISelection** aSelection,
nsIContent** aTargetNode);
/*
@@ -436,13 +434,13 @@ protected:
* aDragEvent - the dragstart/draggesture event
* aDataTransfer - the data transfer that holds the data to be dragged
* aDragTarget - the target of the drag
- * aIsSelection - true if a selection is being dragged
+ * aSelection - the selection to be dragged
*/
bool DoDefaultDragStart(nsPresContext* aPresContext,
nsDragEvent* aDragEvent,
nsDOMDataTransfer* aDataTransfer,
nsIContent* aDragTarget,
- bool aIsSelection);
+ nsISelection* aSelection);
bool IsTrackingDragGesture ( ) const { return mGestureDownContent != nsnull; }
/**
diff --git a/content/media/test/Makefile.in b/content/media/test/Makefile.in
index 3abd920a883..c45e30c6481 100644
--- a/content/media/test/Makefile.in
+++ b/content/media/test/Makefile.in
@@ -109,7 +109,6 @@ _TEST_FILES = \
test_bug495300.html \
test_bug686942.html \
test_can_play_type.html \
- test_closing_connections.html \
test_constants.html \
test_controls.html \
test_currentTime.html \
@@ -176,6 +175,8 @@ endif
# test_mixed_principals.html
# Disabled since we don't play Wave files standalone, for now
# test_audioDocumentTitle.html
+# Bug 634564:
+# test_closing_connections.html \
# sample files
_TEST_FILES += \
diff --git a/content/svg/content/src/nsSVGElement.cpp b/content/svg/content/src/nsSVGElement.cpp
index 1b8d052dc59..2e6ef2b09ab 100644
--- a/content/svg/content/src/nsSVGElement.cpp
+++ b/content/svg/content/src/nsSVGElement.cpp
@@ -1486,7 +1486,8 @@ nsSVGElement::GetCtx() const
}
/* virtual */ gfxMatrix
-nsSVGElement::PrependLocalTransformTo(const gfxMatrix &aMatrix) const
+nsSVGElement::PrependLocalTransformsTo(const gfxMatrix &aMatrix,
+ TransformTypes aWhich) const
{
return aMatrix;
}
diff --git a/content/svg/content/src/nsSVGElement.h b/content/svg/content/src/nsSVGElement.h
index 92e1a451274..44a63c87abd 100644
--- a/content/svg/content/src/nsSVGElement.h
+++ b/content/svg/content/src/nsSVGElement.h
@@ -151,11 +151,36 @@ public:
// nsnull for outer