Merge m-c to fx-team.
2
CLOBBER
@ -17,4 +17,4 @@
|
||||
#
|
||||
# Modifying this file will now automatically clobber the buildbot machines \o/
|
||||
#
|
||||
Bug 858014 broke Windows builds.
|
||||
Bug 856349 broke Windows b2g builds.
|
||||
|
@ -12,7 +12,6 @@ include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
LIBRARY_NAME = accessibility
|
||||
EXPORT_LIBRARY = 1
|
||||
SHORT_LIBNAME = access
|
||||
IS_COMPONENT = 1
|
||||
MODULE_NAME = nsAccessibilityModule
|
||||
LIBXUL_LIBRARY = 1
|
||||
|
@ -18,7 +18,12 @@ namespace a11y {
|
||||
class sdnAccessible MOZ_FINAL : public ISimpleDOMNode
|
||||
{
|
||||
public:
|
||||
sdnAccessible(nsINode* aNode) : mNode(aNode) { }
|
||||
sdnAccessible(nsINode* aNode) :
|
||||
mNode(aNode)
|
||||
{
|
||||
if (!mNode)
|
||||
MOZ_CRASH();
|
||||
}
|
||||
~sdnAccessible() { }
|
||||
|
||||
/**
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/actions
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/attributes
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/bounds
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/editabletext
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/elm
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/events
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -97,7 +97,7 @@
|
||||
{
|
||||
gQueue = new eventQueue();
|
||||
|
||||
var url = "http://mochi.test:8888/a11y/accessible/events/scroll.html#link1";
|
||||
var url = "http://mochi.test:8888/a11y/accessible/tests/mochitest/events/scroll.html#link1";
|
||||
gQueue.push(new loadTab(url));
|
||||
gQueue.push(new loadTabInBackground(url));
|
||||
gQueue.push(new switchToBackgroundTab());
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/focus
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/hittest
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -8,6 +8,8 @@
|
||||
|
||||
<script type="application/javascript"
|
||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
||||
<script type="application/javascript"
|
||||
src="chrome://mochikit/content/chrome-harness.js" />
|
||||
|
||||
<script type="application/javascript"
|
||||
src="../treeview.js" />
|
||||
@ -77,7 +79,7 @@
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
openBrowserWindow(prepareTest,
|
||||
"chrome://mochitests/content/a11y/accessible/hittest/zoom_tree.xul",
|
||||
getRootDirectory(window.location.href) + "zoom_tree.xul",
|
||||
{ left: 100, top: 100 });
|
||||
]]>
|
||||
</script>
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/hyperlink
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/hypertext
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/jsat
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
@ -15,4 +15,4 @@ MOCHITEST_A11Y_FILES =\
|
||||
test_utterance_order.html \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/name
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/pivot
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -8,6 +8,9 @@
|
||||
<script type="application/javascript"
|
||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js">
|
||||
</script>
|
||||
<script type="application/javascript"
|
||||
src="chrome://mochikit/content/chrome-harness.js">
|
||||
</script>
|
||||
|
||||
<script type="application/javascript" src="../common.js"></script>
|
||||
<script type="application/javascript" src="../browser.js"></script>
|
||||
@ -102,7 +105,7 @@
|
||||
document. */
|
||||
openBrowserWindow(
|
||||
doTest,
|
||||
"chrome://mochitests/content/a11y/accessible/pivot/doc_virtualcursor.html");
|
||||
getRootDirectory(window.location.href) + "doc_virtualcursor.html");
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/relations
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -6,7 +6,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/role
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/scroll
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/selectable
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/states
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -74,6 +74,6 @@
|
||||
<pre id="test">
|
||||
</pre>
|
||||
|
||||
<a id="link" href="http://example.com/a11y/accessible/dumbfile.xpi">a file</a>
|
||||
<a id="link" href="http://example.com/a11y/accessible/tests/mochitest/dumbfile.xpi">a file</a>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/table
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/text
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/textattrs
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/textcaret
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/textselection
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/tree
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/treeupdate
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -7,7 +7,7 @@ DEPTH = @DEPTH@
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
relativesrcdir = accessible/value
|
||||
relativesrcdir = @relativesrcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
|
@ -184,7 +184,6 @@ pref("dom.ipc.plugins.enabled", true);
|
||||
pref("breakpad.reportURL", "https://crash-stats.mozilla.com/report/index/");
|
||||
pref("app.releaseNotesURL", "http://www.mozilla.com/%LOCALE%/b2g/%VERSION%/releasenotes/");
|
||||
pref("app.support.baseURL", "http://support.mozilla.com/b2g");
|
||||
pref("app.feedbackURL", "http://input.mozilla.com/feedback/");
|
||||
pref("app.privacyURL", "http://www.mozilla.com/%LOCALE%/m/privacy.html");
|
||||
pref("app.creditsURL", "http://www.mozilla.org/credits/");
|
||||
pref("app.featuresURL", "http://www.mozilla.com/%LOCALE%/b2g/features/");
|
||||
|
@ -66,6 +66,10 @@ ifdef MOZ_LINKER
|
||||
LIBS += $(MOZ_ZLIB_LIBS)
|
||||
endif
|
||||
|
||||
ifdef HAVE_CLOCK_MONOTONIC
|
||||
LIBS += $(REALTIME_LIBS)
|
||||
endif
|
||||
|
||||
ifndef MOZ_WINCONSOLE
|
||||
ifdef MOZ_DEBUG
|
||||
MOZ_WINCONSOLE = 1
|
||||
|
@ -13,12 +13,13 @@
|
||||
#include <io.h>
|
||||
#include <fcntl.h>
|
||||
#elif defined(XP_UNIX)
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef XP_MACOSX
|
||||
#include <mach/mach_time.h>
|
||||
#include "MacQuirks.h"
|
||||
#endif
|
||||
|
||||
@ -388,25 +389,80 @@ static int do_main(int argc, char* argv[], nsIFile *xreDirectory)
|
||||
return 255;
|
||||
}
|
||||
|
||||
/* Local implementation of PR_Now, since the executable can't depend on NSPR */
|
||||
static PRTime _PR_Now()
|
||||
{
|
||||
#ifdef XP_WIN
|
||||
MOZ_STATIC_ASSERT(sizeof(PRTime) == sizeof(FILETIME), "PRTime must have the same size as FILETIME");
|
||||
FILETIME ft;
|
||||
GetSystemTimeAsFileTime(&ft);
|
||||
PRTime now;
|
||||
CopyMemory(&now, &ft, sizeof(PRTime));
|
||||
#ifdef __GNUC__
|
||||
return (now - 116444736000000000LL) / 10LL;
|
||||
#else
|
||||
return (now - 116444736000000000i64) / 10i64;
|
||||
|
||||
/**
|
||||
* Used only when GetTickCount64 is not available on the platform.
|
||||
* Last result of GetTickCount call. Kept in [ms].
|
||||
*/
|
||||
static DWORD sLastGTCResult = 0;
|
||||
|
||||
/**
|
||||
* Higher part of the 64-bit value of MozGetTickCount64,
|
||||
* incremented atomically.
|
||||
*/
|
||||
static DWORD sLastGTCRollover = 0;
|
||||
|
||||
/**
|
||||
* Function protecting GetTickCount result from rolling over. The original
|
||||
* code comes from the Windows implementation of the TimeStamp class minus the
|
||||
* locking harness which isn't needed here.
|
||||
*
|
||||
* @returns The current time in milliseconds
|
||||
*/
|
||||
static ULONGLONG WINAPI
|
||||
MozGetTickCount64()
|
||||
{
|
||||
DWORD GTC = ::GetTickCount();
|
||||
|
||||
/* Pull the rollover counter forward only if new value of GTC goes way
|
||||
* down under the last saved result */
|
||||
if ((sLastGTCResult > GTC) && ((sLastGTCResult - GTC) > (1UL << 30)))
|
||||
++sLastGTCRollover;
|
||||
|
||||
sLastGTCResult = GTC;
|
||||
return (ULONGLONG)sLastGTCRollover << 32 | sLastGTCResult;
|
||||
}
|
||||
|
||||
typedef ULONGLONG (WINAPI* GetTickCount64_t)();
|
||||
static GetTickCount64_t sGetTickCount64 = nullptr;
|
||||
|
||||
#endif
|
||||
|
||||
#else
|
||||
struct timeval tm;
|
||||
gettimeofday(&tm, 0);
|
||||
return (((PRTime)tm.tv_sec * 1000000LL) + (PRTime)tm.tv_usec);
|
||||
/**
|
||||
* Local TimeStamp::Now()-compatible implementation used to record timestamps
|
||||
* which will be passed to XRE_StartupTimelineRecord().
|
||||
*/
|
||||
static uint64_t
|
||||
TimeStamp_Now()
|
||||
{
|
||||
#ifdef XP_WIN
|
||||
LARGE_INTEGER freq;
|
||||
::QueryPerformanceFrequency(&freq);
|
||||
|
||||
HMODULE kernelDLL = GetModuleHandleW(L"kernel32.dll");
|
||||
sGetTickCount64 = reinterpret_cast<GetTickCount64_t>
|
||||
(GetProcAddress(kernelDLL, "GetTickCount64"));
|
||||
|
||||
if (!sGetTickCount64) {
|
||||
/* If the platform does not support the GetTickCount64 (Windows XP doesn't),
|
||||
* then use our fallback implementation based on GetTickCount. */
|
||||
sGetTickCount64 = MozGetTickCount64;
|
||||
}
|
||||
|
||||
return sGetTickCount64() * freq.QuadPart;
|
||||
#elif defined(XP_MACOSX)
|
||||
return mach_absolute_time();
|
||||
#elif defined(HAVE_CLOCK_MONOTONIC)
|
||||
struct timespec ts;
|
||||
int rv = clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||
|
||||
if (rv != 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64_t baseNs = (uint64_t)ts.tv_sec * 1000000000;
|
||||
return baseNs + (uint64_t)ts.tv_nsec;
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -528,7 +584,7 @@ int main(int argc, char* argv[])
|
||||
#ifdef DEBUG_delay_start_metro
|
||||
Sleep(5000);
|
||||
#endif
|
||||
PRTime start = _PR_Now();
|
||||
uint64_t start = TimeStamp_Now();
|
||||
|
||||
#ifdef XP_MACOSX
|
||||
TriggerQuirks();
|
||||
|
@ -933,19 +933,11 @@ SocialToolbar = {
|
||||
SharedFrame.updateURL(notificationFrameId, icon.contentPanel);
|
||||
}
|
||||
|
||||
let toolbarButtonContainerId = "social-notification-container-" + icon.name;
|
||||
let toolbarButtonId = "social-notification-icon-" + icon.name;
|
||||
let toolbarButtonContainer = document.getElementById(toolbarButtonContainerId);
|
||||
let toolbarButton = document.getElementById(toolbarButtonId);
|
||||
if (!toolbarButtonContainer) {
|
||||
// The container is used to fix an issue with position:absolute on
|
||||
// generated content not being constrained to the bounding box of a
|
||||
// parent toolbarbutton that has position:relative.
|
||||
toolbarButtonContainer = document.createElement("toolbaritem");
|
||||
toolbarButtonContainer.classList.add("social-notification-container");
|
||||
toolbarButtonContainer.setAttribute("id", toolbarButtonContainerId);
|
||||
|
||||
if (!toolbarButton) {
|
||||
toolbarButton = document.createElement("toolbarbutton");
|
||||
toolbarButton.setAttribute("type", "badged");
|
||||
toolbarButton.classList.add("toolbarbutton-1");
|
||||
toolbarButton.setAttribute("id", toolbarButtonId);
|
||||
toolbarButton.setAttribute("notificationFrameId", notificationFrameId);
|
||||
@ -954,8 +946,7 @@ SocialToolbar = {
|
||||
SocialToolbar.showAmbientPopup(toolbarButton);
|
||||
});
|
||||
|
||||
toolbarButtonContainer.appendChild(toolbarButton);
|
||||
toolbarButtons.appendChild(toolbarButtonContainer);
|
||||
toolbarButtons.appendChild(toolbarButton);
|
||||
}
|
||||
|
||||
toolbarButton.style.listStyleImage = "url(" + icon.iconURL + ")";
|
||||
@ -1049,7 +1040,7 @@ SocialToolbar = {
|
||||
let navBar = document.getElementById("nav-bar");
|
||||
let anchor = navBar.getAttribute("mode") == "text" ?
|
||||
document.getAnonymousElementByAttribute(aToolbarButton, "class", "toolbarbutton-text") :
|
||||
document.getAnonymousElementByAttribute(aToolbarButton, "class", "toolbarbutton-icon");
|
||||
document.getAnonymousElementByAttribute(aToolbarButton, "class", "toolbarbutton-badge-container");
|
||||
// Bug 849216 - open the popup in a setTimeout so we avoid the auto-rollup
|
||||
// handling from preventing it being opened in some cases.
|
||||
setTimeout(function() {
|
||||
|
@ -608,10 +608,14 @@ html|*#gcli-output-frame,
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.social-notification-container > .toolbarbutton-1[badge]:not([badge=""])::after {
|
||||
.toolbarbutton-badge[badge]:not([badge=""])::after {
|
||||
content: attr(badge);
|
||||
}
|
||||
|
||||
toolbarbutton[type="badged"] {
|
||||
-moz-binding: url("chrome://browser/content/urlbarBindings.xml#toolbarbutton-badged");
|
||||
}
|
||||
|
||||
chatbox {
|
||||
-moz-binding: url("chrome://browser/content/socialchat.xml#chatbox");
|
||||
}
|
||||
|
@ -28,10 +28,10 @@ var tests = {
|
||||
}
|
||||
|
||||
function triggerIconPanel() {
|
||||
let statusIcon = document.querySelector("#social-toolbar-item > .social-notification-container > .toolbarbutton-1");
|
||||
let statusIcon = document.getElementById("social-provider-button").nextSibling;
|
||||
info("status icon is " + statusIcon);
|
||||
waitForCondition(function() {
|
||||
statusIcon = document.querySelector("#social-toolbar-item > .social-notification-container > .toolbarbutton-1");
|
||||
statusIcon = document.getElementById("social-provider-button").nextSibling;
|
||||
info("status icon is " + statusIcon);
|
||||
return !!statusIcon;
|
||||
}, function() {
|
||||
|
@ -103,9 +103,9 @@ var tests = {
|
||||
Social.provider.setAmbientNotification(ambience2);
|
||||
Social.provider.setAmbientNotification(ambience3);
|
||||
|
||||
let statusIcon = document.querySelector("#social-toolbar-item > .social-notification-container > .toolbarbutton-1");
|
||||
let statusIcon = document.getElementById("social-provider-button").nextSibling;
|
||||
waitForCondition(function() {
|
||||
statusIcon = document.querySelector("#social-toolbar-item > .social-notification-container > .toolbarbutton-1");
|
||||
statusIcon = document.getElementById("social-provider-button").nextSibling;
|
||||
return !!statusIcon;
|
||||
}, function () {
|
||||
let badge = statusIcon.getAttribute("badge");
|
||||
|
@ -1812,4 +1812,17 @@
|
||||
</implementation>
|
||||
</binding>
|
||||
|
||||
<binding id="toolbarbutton-badged" display="xul:button"
|
||||
extends="chrome://global/content/bindings/toolbarbutton.xml#toolbarbutton">
|
||||
<content>
|
||||
<children includes="observes|template|menupopup|panel|tooltip"/>
|
||||
<xul:hbox class="toolbarbutton-badge-container" align="start" pack="end" flex="1">
|
||||
<xul:hbox class="toolbarbutton-badge" xbl:inherits="badge"/>
|
||||
<xul:image class="toolbarbutton-icon" xbl:inherits="validate,src=image,label"/>
|
||||
</xul:hbox>
|
||||
<xul:label class="toolbarbutton-text" crop="right" flex="1"
|
||||
xbl:inherits="value=label,accesskey,crop"/>
|
||||
</content>
|
||||
</binding>
|
||||
|
||||
</bindings>
|
||||
|
@ -538,6 +538,10 @@ const DownloadsIndicatorView = {
|
||||
let name = {};
|
||||
let url = browserDragAndDrop.drop(aEvent, name);
|
||||
if (url) {
|
||||
if (url.startsWith("about:")) {
|
||||
return;
|
||||
}
|
||||
|
||||
let sourceDoc = dt.mozSourceNode ? dt.mozSourceNode.ownerDocument : document;
|
||||
saveURL(url, name.value, null, true, true, null, sourceDoc);
|
||||
aEvent.preventDefault();
|
||||
|
@ -267,10 +267,23 @@
|
||||
]]></body>
|
||||
</method>
|
||||
|
||||
<method name="setIcon">
|
||||
<parameter name="element"/>
|
||||
<parameter name="uri"/>
|
||||
<body><![CDATA[
|
||||
if (uri) {
|
||||
let size = Math.round(16 * window.devicePixelRatio);
|
||||
if (!uri.contains("#"))
|
||||
uri += "#-moz-resolution=" + size + "," + size;
|
||||
}
|
||||
element.setAttribute("src", uri);
|
||||
]]></body>
|
||||
</method>
|
||||
|
||||
<method name="updateDisplay">
|
||||
<body><![CDATA[
|
||||
var uri = this.currentEngine.iconURI;
|
||||
this.setAttribute("src", uri ? uri.spec : "");
|
||||
this.setIcon(this, uri ? uri.spec : "");
|
||||
|
||||
var name = this.currentEngine.name;
|
||||
var text = this._stringBundle.getFormattedString("searchtip", [name]);
|
||||
@ -334,7 +347,7 @@
|
||||
menuitem.setAttribute("tooltiptext", engineInfo.uri);
|
||||
menuitem.setAttribute("uri", engineInfo.uri);
|
||||
if (engineInfo.icon)
|
||||
menuitem.setAttribute("src", engineInfo.icon);
|
||||
this.setIcon(menuitem, engineInfo.icon);
|
||||
menuitem.setAttribute("title", engineInfo.title);
|
||||
popup.insertBefore(menuitem, insertLocation);
|
||||
}
|
||||
@ -373,7 +386,7 @@
|
||||
var tooltip = this._stringBundle.getFormattedString("searchtip", [name]);
|
||||
menuitem.setAttribute("tooltiptext", tooltip);
|
||||
if (engines[i].iconURI)
|
||||
menuitem.setAttribute("src", engines[i].iconURI.spec);
|
||||
this.setIcon(menuitem, engines[i].iconURI.spec);
|
||||
popup.insertBefore(menuitem, popup.firstChild);
|
||||
menuitem.engine = engines[i];
|
||||
}
|
||||
|
@ -94,7 +94,7 @@ function test() {
|
||||
type: Ci.nsISearchEngine.TYPE_MOZSEARCH,
|
||||
hidden: false,
|
||||
wrappedJSObject: {
|
||||
"_iconURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACuUlEQVRYw8VX60sUURSffybWv6MloxeV0Jug+hJB0YMoCCII1E3LnlYKlVkkUZKaRFEGFlgfMntYhlopVpaP1HXuPPbOzOmcOw/XZbed3ZndvXBYlr17zu+8fudcaWmlLKEsQWlFmUOBAsucY4tsSmQ8gjJTBMOpQjYjkoMGSiStUpHCnknmpXz+uLdJgY5eDsN/TJA1C9KdkUkTjraoWXXlBGDNaQZd/VwoP3xHhbVnGOxvVuHLL1MY5QZArEODbfUMllX70+kbACl8N2qAxgE2XmCLfltZI8O3CRtEXLVg00Xm2ynfAOoeacLA2+9G2t8P3lK98Lf3JsIH8OmH7eEzTEGmO6NT9p3JuBU+ADUB/40ASdsb+5KiFxAAw6pfHkt/p/G5Lu6MTZvhAyDP3VPdrqW90/zSRnmjWw8fwLG7C0VGOV5/dnGll2OXfEVeoFpZcUoOHwBJ0wvdA0FtdwS5YF0dg93XFHg1ZMDrYQNW17KcSC1nJtx3U4XH77nwdui3CaZDhAM/TSiP5c6qUhAu33qJeRFp6UnkpSMQgC1JAKZlC3Y1KsUFQEJ5dw/1/8kHWuEARKtk2HNdgctPdTENewYN0fPJxypUG1Zh74/PWsDQS2K8E/c12NmgQMU5BhXYksT/yaehSw8PgEuxn7HSUydhKkjuZIQ+N5xnwQEcv2cTkIGR3uxjzNY81LwoVLZpwQF0D3ChjCad33RRqujQchIYgDuG/2KbRX0CcDckP22ZFUBnH/dCWtuZ3SMqygTmv3/MCKcIt19RvFHMTbu6M1Eu7Yh9IwbMMEt0SGhdcOi2ClPzC9vvLBp48oELMLSq1SMv0HfakD+i5zuuKuHzwCqccmSMph6NY1pOqdWoNgbHTcEDB3AvjOZBxSV/mJT8aVZWwsdpmeQ8zyNOJOJFMBx3bJFN6R++on7RvMlpZAAAAABJRU5ErkJggg==",
|
||||
"_iconURL": "data:image/x-icon;base64,AAABAAIAEBAAAAAAAAB9AQAAJgAAACAgAAAAAAAA8gIAAKMBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAFESURBVDjLpZNJSwNBEIXnt4lE4kHxovgT9BDwJHqPy0HEEOJBiAuCRg+KUdC4QS4KrpC4gCBGE3NQ48JsnZ6eZ3UOM6gjaePhQU93v6+qq2q0pqgeJj2S8EdJT1hr0OxBtKCD5iEd8QxDYpvhvOBAuMDKURX9C9aPu4GA1GEVkzvMg10UBfYveWAWgYAP00V01fa+R9M2bA51wJvhIn3qR+ybt3D3JNQBE5sMjCIOLFpoHzOwdsLRO22qA6R6kiZiWwxUvy/PUQZIhYZ1vFM9cvcOOsYNdcBgysISdSJBnZjJMlR0Fw8vAp0xoz5gao/h+NZBy4i/10XGwrPA+hmvDyhVRG2Avu/LwcrkFADZa16L1h330w1RNgc3DiJzCpPYRm1bpveXX11clQR28xwblHpk1vq1iP/5mcoS0CoXDZiL0vsJ+dzfl+3T/VYAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAAK5SURBVFjDxVfrSxRRFJ9/Jta/oyWjF5XQm6D6EkHRgygIIgjUTcueVgqVWSRRkppEUQYWWB8ye1iGWilWlo/Ude489s7M6Zw7D9dlt53dmd29cFiWvXvO77x+51xpaaUsoSxBaUWZQ4ECy5xji2xKZDyCMlMEw6lCNiOSgwZKJK1SkcKeSealfP64t0mBjl4Ow39MkDUL0p2RSROOtqhZdeUEYM1pBl39XCg/fEeFtWcY7G9W4csvUxjlBkCsQ4Nt9QyWVfvT6RsAKXw3aoDGATZeYIt+W1kjw7cJG0RctWDTRebbKd8A6h5pwsDb70ba3w/eUr3wt/cmwgfw6Yft4TNMQaY7o1P2ncm4FT4ANQH/jQBJ2xv7kqIXEADDql8eS3+n8bku7oxNm+EDIM/dU92upb3T/NJGeaNbDx/AsbsLRUY5Xn92caWXY5d8RV6gWllxSg4fAEnTC90DQW13BLlgXR2D3dcUeDVkwOthA1bXspxILWcm3HdThcfvufB26LcJpkOEAz9NKI/lzqpSEC7feol5EWnpSeSlIxCALUkApmULdjUqxQVAQnl3D/X/yQda4QBEq2TYc12By091MQ17Bg3R88nHKlQbVmHvj89awNBLYrwT9zXY2aBAxTkGFdiSxP/Jp6FLDw+AS7GfsdJTJ2EqSO5khD43nGfBARy/ZxOQgZHe7GPM1jzUvChUtmnBAXQPcKGMJp3fdFGq6NByEhiAO4b/YptFfQJwNyQ/bZkVQGcf90Ja25ndIyrKBOa/f8wIpwi3X1G8UcxNu7ozUS7tiH0jBswwS3RIaF1w6LYKU/ML2+8sGnjygQswtKrVIy/Qd9qQP6LnO64q4fPAKpxyZIymHo1jWk6p1ag2BsdNwQMHcC+M5kHFJX+YlPxpVlbCx2mZ5DzPI04k4kUwHHdskU3pH76iftG8yWlkAAAAAElFTkSuQmCC",
|
||||
_urls : [
|
||||
{
|
||||
type: "application/x-suggestions+json",
|
||||
|
@ -117,6 +117,9 @@ MOCHITEST_BROWSER_FILES = \
|
||||
browser_netpanel_longstring_expand.js \
|
||||
browser_repeated_messages_accuracy.js \
|
||||
head.js \
|
||||
browser_webconsole_bug_821877_csp_errors.js \
|
||||
test-bug-821877-csperrors.html \
|
||||
test-bug-821877-csperrors.html^headers^ \
|
||||
$(NULL)
|
||||
|
||||
ifeq ($(OS_ARCH), Darwin)
|
||||
|
@ -8,6 +8,7 @@
|
||||
// Tests that the Web Console CSP messages are displayed
|
||||
|
||||
const TEST_VIOLATION = "https://example.com/browser/browser/devtools/webconsole/test/test_bug_770099_violation.html";
|
||||
const CSP_VIOLATION_MSG = "CSP WARN: Directive default-src https://example.com:443 violated by http://some.example.com/test.png"
|
||||
|
||||
let hud = undefined;
|
||||
|
||||
@ -34,22 +35,12 @@ function onLoad(aEvent) {
|
||||
function testViolationMessage(){
|
||||
let aOutputNode = hud.outputNode;
|
||||
|
||||
waitForSuccess(
|
||||
{
|
||||
waitForSuccess({
|
||||
name: "CSP policy URI warning displayed successfully",
|
||||
validatorFn: function() {
|
||||
return aOutputNode.querySelector(".webconsole-msg-warn");
|
||||
return hud.outputNode.textContent.indexOf(CSP_VIOLATION_MSG) > -1;
|
||||
},
|
||||
|
||||
successFn: function() {
|
||||
//tests on the urlnode
|
||||
let node = aOutputNode.querySelector(".webconsole-msg-warn");
|
||||
isnot(node.textContent.indexOf("violated"), -1,
|
||||
"CSP violation message found");
|
||||
finishTest();
|
||||
},
|
||||
|
||||
successFn: finishTest,
|
||||
failureFn: finishTest,
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
@ -0,0 +1,25 @@
|
||||
// Tests that CSP errors from nsDocument::InitCSP are logged to the Web Console
|
||||
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
const TEST_URI = "https://example.com/browser/browser/devtools/webconsole/test/test-bug-821877-csperrors.html";
|
||||
const CSP_DEPRECATED_HEADER_MSG = "The X-Content-Security-Policy and X-Content-Security-Report-Only headers will be deprecated in the future. Please use the Content-Security-Policy and Content-Security-Report-Only headers with CSP spec compliant syntax instead.";
|
||||
|
||||
function test()
|
||||
{
|
||||
addTab(TEST_URI);
|
||||
browser.addEventListener("load", function onLoad(aEvent) {
|
||||
browser.removeEventListener(aEvent.type, onLoad, true);
|
||||
openConsole(null, function testCSPErrorLogged (hud) {
|
||||
waitForSuccess({
|
||||
name: "CSP error displayed successfully",
|
||||
validatorFn: function () {
|
||||
return hud.outputNode.textContent.indexOf(CSP_DEPRECATED_HEADER_MSG) > -1;
|
||||
},
|
||||
successFn: finishTest,
|
||||
failureFn: finishTest,
|
||||
});
|
||||
});
|
||||
}, true);
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf8">
|
||||
<title>Bug 821877 - Log CSP Errors to Web Console</title>
|
||||
<!-- Any copyright is dedicated to the Public Domain.
|
||||
- http://creativecommons.org/publicdomain/zero/1.0/ -->
|
||||
</head>
|
||||
<body>
|
||||
<p>This page is served with a deprecated CSP header.</p>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1 @@
|
||||
X-Content-Security-Policy: default-src *; options inline-script
|
@ -342,33 +342,9 @@ Section "-Application" APP_IDX
|
||||
"${AppRegName} Document" ""
|
||||
${AddDisabledDDEHandlerValues} "FirefoxURL" "$2" "$8,1" "${AppRegName} URL" \
|
||||
"true"
|
||||
${If} ${AtLeastWin8}
|
||||
!ifdef MOZ_METRO
|
||||
${CleanupMetroBrowserHandlerValues} ${DELEGATE_EXECUTE_HANDLER_ID}
|
||||
${AddMetroBrowserHandlerValues} ${DELEGATE_EXECUTE_HANDLER_ID} \
|
||||
"$INSTDIR\CommandExecuteHandler.exe" \
|
||||
$AppUserModelID \
|
||||
"FirefoxURL" \
|
||||
"FirefoxHTML"
|
||||
!endif
|
||||
; Set the Start Menu Internet and Vista Registered App HKCU registry keys.
|
||||
${SetStartMenuInternet} "HKCU"
|
||||
${FixShellIconHandler} "HKCU"
|
||||
|
||||
; If we create either the desktop or start menu shortcuts, then
|
||||
; set IconsVisible to 1 otherwise to 0.
|
||||
${StrFilter} "${FileMainEXE}" "+" "" "" $R9
|
||||
StrCpy $0 "Software\Clients\StartMenuInternet\$R9\InstallInfo"
|
||||
${If} $AddDesktopSC == 1
|
||||
${OrIf} $AddStartMenuSC == 1
|
||||
WriteRegDWORD HKCU "$0" "IconsVisible" 1
|
||||
${Else}
|
||||
WriteRegDWORD HKCU "$0" "IconsVisible" 0
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
|
||||
; The following keys should only be set if we can write to HKLM for pre win8
|
||||
; For post win8 we set the keys above in HKCU in addition to below in HKLM.
|
||||
; For pre win8, the following keys should only be set if we can write to HKLM.
|
||||
; For post win8, the keys below get set in both HKLM and HKCU.
|
||||
${If} $TmpVal == "HKLM"
|
||||
; Set the Start Menu Internet and Vista Registered App HKLM registry keys.
|
||||
${SetStartMenuInternet} "HKLM"
|
||||
@ -386,6 +362,31 @@ Section "-Application" APP_IDX
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
|
||||
${If} ${AtLeastWin8}
|
||||
; Set the Start Menu Internet and Vista Registered App HKCU registry keys.
|
||||
${SetStartMenuInternet} "HKCU"
|
||||
${FixShellIconHandler} "HKCU"
|
||||
|
||||
; If we create either the desktop or start menu shortcuts, then
|
||||
; set IconsVisible to 1 otherwise to 0.
|
||||
${StrFilter} "${FileMainEXE}" "+" "" "" $R9
|
||||
StrCpy $0 "Software\Clients\StartMenuInternet\$R9\InstallInfo"
|
||||
${If} $AddDesktopSC == 1
|
||||
${OrIf} $AddStartMenuSC == 1
|
||||
WriteRegDWORD HKCU "$0" "IconsVisible" 1
|
||||
${Else}
|
||||
WriteRegDWORD HKCU "$0" "IconsVisible" 0
|
||||
${EndIf}
|
||||
!ifdef MOZ_METRO
|
||||
${CleanupMetroBrowserHandlerValues} ${DELEGATE_EXECUTE_HANDLER_ID}
|
||||
${AddMetroBrowserHandlerValues} ${DELEGATE_EXECUTE_HANDLER_ID} \
|
||||
"$INSTDIR\CommandExecuteHandler.exe" \
|
||||
$AppUserModelID \
|
||||
"FirefoxURL" \
|
||||
"FirefoxHTML"
|
||||
!endif
|
||||
${EndIf}
|
||||
|
||||
!ifdef MOZ_MAINTENANCE_SERVICE
|
||||
; If the maintenance service page was displayed then a value was already
|
||||
; explicitly selected for installing the maintenance service and
|
||||
|
@ -6,7 +6,7 @@
|
||||
<ShortName>Amazon.com</ShortName>
|
||||
<Description>Amazon.com Search</Description>
|
||||
<InputEncoding>ISO-8859-1</InputEncoding>
|
||||
<Image width="16" height="16">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHgSURBVHjalFM9TNtQEP4cB7PwM1RITUXIgsRaYEEVEyKZwhiyZAQyd0BhpFOlIjoBqhjSqVQMoVMLLAjEwECCQJkSkBqJYDOAFOMKFSf28d7DTUxiUDnp/Pzeu/vuu7t3ICKF6SLTMv2/lB0fRWKfjwDm4JJisYh0Oo3fpZLYT0SjSCQS8JAFMADNDZ3NZsnf1taiqVTKi4nGASruk5lkkmTmMB6JUKFQqO+DfX1eABWeQoVR6f7HSdM0obqu48Yw8G1tDT82NsRd1TSbU9BbGPCog8PDj+jLzurFoAVgMh4XxoNDQ6SqKi0tL9eBvAB8zZwymYxYY7EYAoEA8vm82BNTg6XUIs0MeGTZoR1mhXSnwNl4pmAbjU7mcjkKhkL1ynMnntZ4OEw3VyrV8utk7s5TdW++0QXz+1i3P7IK36t+PCfVn1OQOoOA0gXr5DPak+cPXbBK+/T3S69AtY3LJ98vZ1or/iLr+pTuvr59/A6s003UdqZFJF/PCKQ3o5CUznoBST2AfbEF/9iqYEDaIfwj73VJPEfgNTe0tWNYR0uwy9uOW0OkrgHI7z5ADo2C7v48nLV3XHKAT+x/1m1sX58xsBxg8rZJrDYD8DHHp4aJj/MK09sXjPOt46PcCzAACXY8/u34wN0AAAAASUVORK5CYII=</Image>
|
||||
<Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAC0AQAAJgAAACAgAAAAAAAA6QIAANoBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAF7SURBVDjLlZPLasJAFIaFRF+iVV+h6hO0GF+gVB9AaHwDt64qCG03tQgtdCFIuyhUelmGli66MXThSt24kNiFBUlAYi6ezjnNxSuawB/ITP7v/HNmJgQAEaZzpgHs/gwcTyTEXuXl2U6nA8ViEbK5HKler28CVRAwnB9ptVrAh8MrQuCaZ4iA8fzIqSgCxwzpTIaSuN/RWGwdYLwCUBQFZFkGSZLgqdmEE7YEN8VOAKyaSKUW4nNBAFmnYiKZpDRX1WqwBBzP089n5f/NEQsFL4WqqtsBWJlzDAJr5PwSMM1awEzzdxIbGI3Hvc6jCZeVFgRQRwpY7Qcw3ktgfpR8wLRxCPaot/X4GS95MppfF6DX9n2A3f+kAZycaT8bAZjU6r6B/duD6d3BYg9wQq/tkYzHY1blEiz5lmQyGc95mrO6r2CxgpjCBXgNsJVviolpXJiraeOIjJRE10juUa4sR8V+mO17VvmGqtuOcdNlwut8zTQJcJ0njifyB2bgTdKh6w4BAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACsElEQVRYw71XQWsTURBe2LQgeNKLB+tVemt6txcteNSD/QGC6VEIGDx5s+eKPQqFgJhLNdFLBWMP7cU0oSAWjB70koC9WHbVQ5SO8+XtS14mr7svyaYDH9m87Jv55puZt1nPi4yIzjMeMj7T9OwjI88455nGC1cZX+nsDESumJmPFDwIAqrX6z00Gg1qt9vjkJgFgUeuO16Vy3RjeZkyMzM9+MY1fsM9I9h9zyV7ZAznZrA4FAoFVwJ1z+WuOysrg1lnMolkHJX4k0igzI5sARYWF7vEZEk0rvO6iyUSuJfLJUqM7zYSqRDIra4OOUZPmNZsNrsl8UVTpkJAjh1GzmaSpJ8mAWmYeZB5urHRhW5SNOfUCCDo47W1bvPZsp2qAhipy3Nz1kaLG8dUCEBqM5AvpgElqFar01NgIZsdco7Zb7VasU2YigIYL5tjqCL7Q5YkFQXKlcqQ7DbHthIALk/IWAKor82xPIhshxWABCYioDMz51sexcVi0XoG4DPLIyvJjkTArK3scDQnRvO0MdTrUHGiKZCP4tNgO6BAEI08EQH9Z2Qow0hyPypJGIa9p6JWKCn4SA8jSKmJIDgyRvPJkcRxjfUwNGr/i8+Mo32iHzWiThBD4NM60bet9P77/ubA728RlTjMiwiH6zEEfvIrwdZFtQmMJ7W/ofIDBZD5m3mVZGwJcOP2kmILIlCkE45HoPWurwCSg0+UQRD4ZyXxId+T7gQb9+4q9sioY5ltrOG3L5vqXiiJffDx/aUi83ZJ7jr2ohcEu8Hh6/m+I7OWGiVxbWKHsz+O3vSOakqFQdsFgQeJUiKD7Wv9YKXBgCeSUC3v2kM5EJhlHDh3NcgcPlG1BXZu98sDmTuBa4fsMnz9fniJUaGzs+eMC540XuR0aDO2L8Y3qPyMcdOM+R/8XcqRA3qp9gAAAABJRU5ErkJggg==</Image>
|
||||
<Url type="text/html" method="GET" template="http://www.amazon.com/exec/obidos/external-search/">
|
||||
<Param name="field-keywords" value="{searchTerms}"/>
|
||||
<Param name="mode" value="blended"/>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<ShortName>Bing</ShortName>
|
||||
<Description>Bing. Search by Microsoft.</Description>
|
||||
<InputEncoding>UTF-8</InputEncoding>
|
||||
<Image width="16" height="16" type="image/x-icon">data:image/x-icon;base64,AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAAAABMLAAATCwAAAAAAAAAAAAAVpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8ysf97zf+24//F6f/F6f/F6f+K0/9QvP8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8krP+Z2P/////////w+f/F6f/F6f/i9P/////////T7v9Bt/8Vpv8Vpv8Vpv8Vpv/T7v/////w+f97zf8Vpv8Vpv8Vpv8Vpv9QvP/T7v/////w+f9Bt/8Vpv8Vpv97zf////////9QvP8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8krP/i9P/////i9P8Vpv8Vpv+24//////i9P8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv+K0/////////8Vpv8Vpv/F6f////////8krP8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv+n3v/////w+f8Vpv8Vpv/F6f////////+n3v8krP8Vpv8Vpv8Vpv8Vpv8Vpv9tx/////////+Z2P8Vpv8Vpv/F6f/////////////i9P+K0/9QvP9QvP9tx//F6f////////+n3v8Vpv8Vpv8Vpv/F6f/////T7v+Z2P/i9P////////////////////+24/9QvP8Vpv8Vpv8Vpv8Vpv/F6f/////F6f8Vpv8Vpv8krP9QvP9QvP9Bt/8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv/F6f/////F6f8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv9Bt/9QvP9Bt/8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8Vpv8AAHBsAABhdAAAbiAAAHJ0AABsaQAAdGkAACBDAABlbgAAUEEAAEVYAAAuQwAAOy4AAEU7AABBVAAAQ00AAC5W</Image>
|
||||
<Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAD/AAAAJgAAACAgAAAAAAAA+AMAACUBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAADGSURBVDjLY/i/TPQ/JZiBOgZsd/z/f08AhCbLgJdH/4MBiKaaAWtUIK4i4DJUA95d/v//xsz//788+o8VPN4GMRCnATAAMuByF8IFx3NR1dxbjscAkCTI+dicDDIIBkAuxWoALs0wDLIABH5+QDIA5DeY0wmFPMhrMAA34Gw1QhAtkFAwyHWwAIZahkiJoBiAOQ1kILpmkMHIaqBRy4BiOihgYACkCBQ2IIwcrSBDkNIFZl7YaARxAShcYAaAMCxaaZOZKMAAOzkOfhyf540AAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAAO/SURBVFjDxZRJTxRBFMfrJiC7enKJ28nEGL+AXo2J+gFcrkr0C4gLKjCAoILKIgKyjSZG40FFMephHERcLm4XVzTRi7I4DHRPL8/3qqq7q6d7ZIgRO/mFzlT1+/3fq6ZZ8lzB9smq3JGxQwtgPhmvyHk1XpO3kZF8/EgOjB2eX8hJbkY3/4WjOTBRkQuMbuaVCsHEsVwOoxTzhpROHs8TnMjDAMe8hX/KcQFJOZVIFQaYPEE//mMqBb9QyKlGInmQiFCASpkG0WPVoF7m5xio63OmSvCreqEgIkjUILVEPjCeRhIWQF2fCwmCZI5QSqeIunyYOilg7iZEf5QWYDQG6nrW1OQLaj08aQFM1RdAskHApmhRkopHAgHU9ayp84RJop6Q0lMFME2cRs4UYoA674HQAHIt2bgUtNt7+R76PYzUUAS0gb2QbF8npA35rjTpSKV4urEQZhopQL0YCUEFfAG+xEC7s4//netFz+iDZZA8XSiEUsrFTUUwc1bAnHRE6nEk6+K012U4AtbX8JD25Cjo17e6wplzRaAR55FmCnAG5RIqlOnihQb3wXTLMnf/tAp11roc9HtlfG/6lbpf5ko5LcWgI2xGngVhPKkJ7/hNP2hYXN3LaZLjVEZKaO0rwHwbDdQx7uzkUr2VKIFUWwkGOItFJMZIMID54SaoewRFvpH6xup2WQzWx1v+YtoE6G1CnLqAtGMA9yHEfBoMoPesB3WPdr5Y0OyhN4txujgdRjcEG7q3i4uNi6UcphYyn9YGHlDXOS0enkzSVsw71J0OkfTLelEHRkepoBMDqMnN+MHgBMJEUpZSueBJeYe8y5AAT8rBRDGniwLIxDx12MiGyr11pTNV5iLHysEOreHyYL2rG1G8CMxLApZe0PqU9uLoE2Bc2+TvTOlQFTpQd9aNzfxZ37/y6G0utYhuAfN1QHSvBPvHy0AI6kYIJYqQztJwxkrykfKg/OcrsC6vdsVWj4D5Cjn0rgL7Wzz4QUiMgv26FayBbWD2r+JnyOnHwgPbwX7TyvcEPmLf42BdWe1KrZ7FYPUKmJM+DCu2P7Rg1lfiC9jxA5641xPbRB8FwBeCMDNB5/VgN9jvLmcXhqTvr4D9cI9P6Ir7/DDnbcyEe2YOeI72XRz3YDo7cMxrgl2GSDn9AmZiUZWAsOcPhHWYSahIVRh/IWYjrKvZZBmlSwTRJQAISxdk7CobWYYuXXHUA5wARlfJkD1XyawyD1Bk6Rhdpc+Z1lG4Fm+G/1bkEhX8SczlnaXP8Juz5TddEmZvDz4eOQAAAABJRU5ErkJggg==</Image>
|
||||
<Url type="application/x-suggestions+json" template="http://api.bing.com/osjson.aspx">
|
||||
<Param name="query" value="{searchTerms}"/>
|
||||
<Param name="form" value="OSDJAS"/>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<ShortName>eBay</ShortName>
|
||||
<Description>eBay - Online auctions</Description>
|
||||
<InputEncoding>ISO-8859-1</InputEncoding>
|
||||
<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABaklEQVQ4jc2TO0hbYQBGz42pMVDrINQuGvrCpZOSoQ4WoZoOxVk7FISCQxy6BEUtSIeCIBTsYCl0cHEQV0GU0lcIIkrpUEGNVYdi6qOtiTH+ubn3c4iTOPSaxbOfM30fkuokzUoy+n/MqVOHpDkP4lk+WpIMUM7FcCxJuqAMgK8U+dzAp5Us9QOr3gJm6RvbLRG2WyI4v3dIH7vcf7VO8/BP9jI2ZqGD3HQN6R/9zCz3AuCqwIeVIfwAf2L9BB+1ocwhtS96cBtGiPfdYnLxgMejmySivRSCtbDxlp3qML/+LbGfXSOV/l4MYNsEwo1cuXObTGcXgfEjynwWNdf8OPkDTLyVQNM0ztZ7Hoae8Tk5TM7+y5PwVDFQFXtO+vUb5LqkooNY1lUaXiaRxMTTIL7dB5hEO2U3u7lReQ+Y5O71CBX+KvC6nPmNMb2LN8sUDiVJl2MH+RJ8xwd8KSHwFRXvPCdvd86fOqETu2NuOELmXqEAAAAASUVORK5CYII=</Image>
|
||||
<Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAB6AQAAJgAAACAgAAAAAAAAQgMAAKABAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAFBSURBVDjLtZPdK0MBGIf3J5Babhx3rinFBWuipaUskX9DYvkopqgV90q5UJpyp0OKrUWM2VrRsS9D0zZKHGaOnW1nj4vtypVtPPe/533r9746QAAOAJXfo5Yzgg44pHrcugon/6Sgo0b+XuAOZ2iZiVQmyPoDpIwmUkYTzqM7GsdDdC7F6Lbf8pzOkfWOouzqeZem2b+2AqAV8zjD8yVBqqcf2b7C66yNiMGMfixIQSvi8Mp0LEbR5ADq1QSKWM+Gx0RC9nOZ2GLzwlIWdPWiuNzk4w/EpThNkyEAXKEP2ud8KGId2sspilhPMrmNwzfCuqePr/xbSfC5I/I0MMSj2YJ3z49gDdO2cEOrLUowJpE9G0QRG1ClKbR0EIdvmOPYcnUtnN+vsnZiQC1k/qnGagQ1n3LNzySUJZVskitnmr8BlQG7T2hvgxsAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAAMJSURBVFjD7ZddSFNhGMeHXXQTZFFCWfR1pRhUECQlBdWVToo+6KYu1KigtDASG5qUfZgFZvahEDosECPDktKZS1FL+1DRnEvdUptjug91X2dnZzv/3vO6OZbWnR4v9sADL+fs7P97/s/znu2VAJD4UkpSSdKG+QubTyPBr+sXz8XCR64fIAHihVTis0SsUAoAVhEBrBKIHCGAEMB/ARi3F5LkbpS2WMRzYEEBXC2tsD6T03R9agsCGLNyqPw6CXmrBT06JvhbPHZwmkdwtR0B138PPKOHgzXD5jLAy3tmibo4K9weZwDAazJj/FQKRnfugfHMeRiTz0K3Ixam1HQKcPC+Fisu9NK1P08Uj4DleHgMdXC+WQ7nu3UEOhFMfTQcVUvQ1H4IN2sj8H2k7K+2TqCc3GseyA8AmDOzMBq7D9bS8sAr6nEJdNt3UbHVF1XQGtmZew8bTPT6tWoD3KpsUvlR8NxUoEICMvl6KQo+xqCwcRs4T8Ax5c8bFExjbAgAjO7aS8VsLypgq3g5nWStjztAhWRVhqAqeB6IuKTClkw1eNYEbrCQQBwD8yGGOsAooogLYejQPKBi7UPF9DkH+ezd+o141ZkUPAOC+L9SAMivNc7q46YMNSLTe4n1kaQF4XD3ZIDTPgU3XEYciKcAHrsGJS1xKFBGgyVzouiT4VbdGhjt/cEA5isyKsaz7jl3we7bg7Rqf6j0LoSldON4wWcqJDgQNGTN++l13vELA+MK6kKd6iryFOvxtidt9i5gO7owdjKJQliflNAU1pas6xQgnAzg1ux+lJEdILixNr0Pq9JUUA8NwVG9DM73G0jlcnh+V4BpjIWzJmIGQIjnXw5TiDuKSEwxurm3ITc8DNO51BnrLbIcsrW0dNA6RxgUKU1UdGVqLy5X6qGzTLvlnewiBZyGs3Yz6X8UeaYI3olvZDhzwLumZ+eHvooCCC0Q5VUsb4unwycM4YIDqA01tPqmgbzQr2EIYPECiPm33LYoDiZSsY9moh9O/Znoa4d9HkXtPg2pX/cPKCoRQ+ocZa4AAAAASUVORK5CYII=</Image>
|
||||
<Url type="application/x-suggestions+json" method="GET" template="http://anywhere.ebay.com/services/suggest/">
|
||||
<Param name="s" value="0"/>
|
||||
<Param name="q" value="{searchTerms}"/>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<ShortName>Google</ShortName>
|
||||
<Description>Google Search</Description>
|
||||
<InputEncoding>UTF-8</InputEncoding>
|
||||
<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACuUlEQVRYw8VX60sUURSffybWv6MloxeV0Jug+hJB0YMoCCII1E3LnlYKlVkkUZKaRFEGFlgfMntYhlopVpaP1HXuPPbOzOmcOw/XZbed3ZndvXBYlr17zu+8fudcaWmlLKEsQWlFmUOBAsucY4tsSmQ8gjJTBMOpQjYjkoMGSiStUpHCnknmpXz+uLdJgY5eDsN/TJA1C9KdkUkTjraoWXXlBGDNaQZd/VwoP3xHhbVnGOxvVuHLL1MY5QZArEODbfUMllX70+kbACl8N2qAxgE2XmCLfltZI8O3CRtEXLVg00Xm2ynfAOoeacLA2+9G2t8P3lK98Lf3JsIH8OmH7eEzTEGmO6NT9p3JuBU+ADUB/40ASdsb+5KiFxAAw6pfHkt/p/G5Lu6MTZvhAyDP3VPdrqW90/zSRnmjWw8fwLG7C0VGOV5/dnGll2OXfEVeoFpZcUoOHwBJ0wvdA0FtdwS5YF0dg93XFHg1ZMDrYQNW17KcSC1nJtx3U4XH77nwdui3CaZDhAM/TSiP5c6qUhAu33qJeRFp6UnkpSMQgC1JAKZlC3Y1KsUFQEJ5dw/1/8kHWuEARKtk2HNdgctPdTENewYN0fPJxypUG1Zh74/PWsDQS2K8E/c12NmgQMU5BhXYksT/yaehSw8PgEuxn7HSUydhKkjuZIQ+N5xnwQEcv2cTkIGR3uxjzNY81LwoVLZpwQF0D3ChjCad33RRqujQchIYgDuG/2KbRX0CcDckP22ZFUBnH/dCWtuZ3SMqygTmv3/MCKcIt19RvFHMTbu6M1Eu7Yh9IwbMMEt0SGhdcOi2ClPzC9vvLBp48oELMLSq1SMv0HfakD+i5zuuKuHzwCqccmSMph6NY1pOqdWoNgbHTcEDB3AvjOZBxSV/mJT8aVZWwsdpmeQ8zyNOJOJFMBx3bJFN6R++on7RvMlpZAAAAABJRU5ErkJggg==</Image>
|
||||
<Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAB9AQAAJgAAACAgAAAAAAAA8gIAAKMBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAFESURBVDjLpZNJSwNBEIXnt4lE4kHxovgT9BDwJHqPy0HEEOJBiAuCRg+KUdC4QS4KrpC4gCBGE3NQ48JsnZ6eZ3UOM6gjaePhQU93v6+qq2q0pqgeJj2S8EdJT1hr0OxBtKCD5iEd8QxDYpvhvOBAuMDKURX9C9aPu4GA1GEVkzvMg10UBfYveWAWgYAP00V01fa+R9M2bA51wJvhIn3qR+ybt3D3JNQBE5sMjCIOLFpoHzOwdsLRO22qA6R6kiZiWwxUvy/PUQZIhYZ1vFM9cvcOOsYNdcBgysISdSJBnZjJMlR0Fw8vAp0xoz5gao/h+NZBy4i/10XGwrPA+hmvDyhVRG2Avu/LwcrkFADZa16L1h330w1RNgc3DiJzCpPYRm1bpveXX11clQR28xwblHpk1vq1iP/5mcoS0CoXDZiL0vsJ+dzfl+3T/VYAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAAK5SURBVFjDxVfrSxRRFJ9/Jta/oyWjF5XQm6D6EkHRgygIIgjUTcueVgqVWSRRkppEUQYWWB8ye1iGWilWlo/Ude489s7M6Zw7D9dlt53dmd29cFiWvXvO77x+51xpaaUsoSxBaUWZQ4ECy5xji2xKZDyCMlMEw6lCNiOSgwZKJK1SkcKeSealfP64t0mBjl4Ow39MkDUL0p2RSROOtqhZdeUEYM1pBl39XCg/fEeFtWcY7G9W4csvUxjlBkCsQ4Nt9QyWVfvT6RsAKXw3aoDGATZeYIt+W1kjw7cJG0RctWDTRebbKd8A6h5pwsDb70ba3w/eUr3wt/cmwgfw6Yft4TNMQaY7o1P2ncm4FT4ANQH/jQBJ2xv7kqIXEADDql8eS3+n8bku7oxNm+EDIM/dU92upb3T/NJGeaNbDx/AsbsLRUY5Xn92caWXY5d8RV6gWllxSg4fAEnTC90DQW13BLlgXR2D3dcUeDVkwOthA1bXspxILWcm3HdThcfvufB26LcJpkOEAz9NKI/lzqpSEC7feol5EWnpSeSlIxCALUkApmULdjUqxQVAQnl3D/X/yQda4QBEq2TYc12By091MQ17Bg3R88nHKlQbVmHvj89awNBLYrwT9zXY2aBAxTkGFdiSxP/Jp6FLDw+AS7GfsdJTJ2EqSO5khD43nGfBARy/ZxOQgZHe7GPM1jzUvChUtmnBAXQPcKGMJp3fdFGq6NByEhiAO4b/YptFfQJwNyQ/bZkVQGcf90Ja25ndIyrKBOa/f8wIpwi3X1G8UcxNu7ozUS7tiH0jBswwS3RIaF1w6LYKU/ML2+8sGnjygQswtKrVIy/Qd9qQP6LnO64q4fPAKpxyZIymHo1jWk6p1ag2BsdNwQMHcC+M5kHFJX+YlPxpVlbCx2mZ5DzPI04k4kUwHHdskU3pH76iftG8yWlkAAAAAElFTkSuQmCC</Image>
|
||||
<Url type="application/x-suggestions+json" method="GET" template="https://www.google.com/complete/search?client=firefox&q={searchTerms}"/>
|
||||
<Url type="text/html" method="GET" template="https://www.google.com/search">
|
||||
<Param name="q" value="{searchTerms}"/>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<ShortName>Twitter</ShortName>
|
||||
<Description>Realtime Twitter Search</Description>
|
||||
<InputEncoding>UTF-8</InputEncoding>
|
||||
<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAABZWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNC40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFjb3JuIHZlcnNpb24gMy4zPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgqo9EsfAAACMUlEQVQ4jX2TMWtTURTHf+e+l1CTtCapLuLgoIuOolPB+AlqDekgpeDSufoFmoIfwNmtCKKmtYNUcJAGQcVBQSyFKuImOthE+9q0zXv37/ASWxvwwB3Ouefc8z/87jFJmGEAEuKImWHUmwFUPOcbBjVYT/M0h0cSkgAZdbm+LwkkO+wfPUgWAliTUCIGZE1CVYjNsL4iW25PI38NaCO7y6/kK6PBGY2XPjoANluTtvhzAUAVYrv3LsMzsgC21LrDSHGBY8MTDJdvgl4zYu/p+nGAEACvU5wenbbFVpHQ3dbMxS8Adv9HnlxmliiCeG8PnBFm8khnSeJtAJOELW1eAF5RKB4nau+APcHxCPkMsoeYy4IXwjOUD9jdfqlq+cqBAlQAPhG1L+GCHLmRKXwyRWerx8YDGCCCDMB3AGs0gvQBcyfIFy/R+Q2JT4ha6gEMeoX/cMXYSJ0azsB0vbTCVmueON4FuVSZgh7fvgkI6WyBtALAetMcDVISiX+A2Q7ZIQN8v9/frtClUIKk+0LV0bcGRv1q4pjsJTt9A3vO/i4D/1HsE2azRK0Y52YBaOAkyfU/i2onI1VLNzBu4ayL8IgukJAbzuITMFfVRGnN5puhaiQHGJdbYyQaxxhDXCZXcOnEISQxdKI1HDOaKL+x+WaouUrcF5dSiDMbBN3PiHOY/0AnChDbGBs495RqeVkgaxAcLu4POLAwrK6GgzENxHoLJajLsaqQxwqOXKbx/2zlH1DoZhoGHT3iAAAAAElFTkSuQmCC</Image>
|
||||
<Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAALAgAAJgAAACAgAAAAAAAAQQQAADECAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAHSSURBVDjLfVO/axRREP6SS0ihlv4FQpoYWxHyHxgCsUxhmToBS4tF7NLZWaiIEHLv7d5dJNEQ0tgYEAmIjeAfYC57++7MGbzLjxu/Nxt27zZrBoadnZnvm3kz7wEqMpZqmdAfBBMIZBzGVGCkorbXq4kFp/yPtBgPZCJzZvYQuNZ+jKhVo75G2LyHVz9uoeFmc6bILaHaepv9v/w6iRcypXbonmNPBB9OBbv82tYfmPgn7NHTnKAaP8E+g8Ztot68k/nXDm8ooNEVhHEP1vXROBbUf/M/Wc0Jwl8zsEkHOxcMtE6Y+A42nodpLtLfR9QWRMmA9jm2eh78aXQY4eF9VvjCgKDWEewM2PIZQc4nD9Sf6hk+sohNqorzW0kN91BBdYKtO9dE/00JZITA50XxsxTHlWarqMYBh/O3UPGqrednx7ox3o+UhbIRT7O1BO9PfIsXI5V9J34WvrqN94buwFi+b3N0k0nrCjAFAp1+Nz1Czd3N2y8Tm6ywYk9JTHKqk/cD9cM17YW89WExbo6Ja1zhvgK3+4Itql+rt8PkO1f6oBysBN3brLrMVhs84wHJvpHoMwnf8CI9ygZd3nbJgymrMvxeSoLjmlCsIJf+a17lP6juZmUWkMzvAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAECElEQVRYw+1XS2gTURS9ia0/EMSCCC4siCIKrly4UVwIrgRR3KgbXQmCCiIiCha7EQRR6cIupHShSeZjf6lttdWFgqBRBPGDKIqF1mQ+1Wp/SZvnvXfmTWfMpJ3U0pUPHplJ3rv33HO/Afi/5nPViTjuKm8rYlFlAoSI8a500R1SGLYUZRH+Hvee6+qqygvxW1KJ1XLd+74aUuY+0OzjoHw/BElj4zQQHxv0HDBUvjR9WQlNYmnJhSjK9dxFUC0LOsYE3M8LSI8LUKw8AmoG5ecqPtP8vgZ04zKeO+jqjUtBDi2qWY+71xPaKKpnpF0uzUpCnxDQOixQ+BSo9iR/3vsh4CF+r5of8D3F75r9udQAKUwx++AJXkhZCe9QBkGEuUSC1swTjhK0VrUmEYzw7SKCyUPrLwEP8IxufQN9aCfKPwCJwdq/lCPluvUG2n4jhQW8bD6Hu+amABvSd/LOTbEENOMjdIyicLuA1om/ADhbMqIZn/DMOMq+7iqPBanUzWfQOUGUjUFnnj5H0WdnQOlfFoxssdix3tjGgnWbrCuGKvdA4LmuSQJ6s9SN0zFwg6lS7Qmms+WngK4pEvAVg+w83MltCAAhAHSGFMwEgGQRq2quwZe2cShJkaYvtey39hEHMfsQL7cjxd1F4dBnPWUKVeMwaLmTkRggGd1oiJI9GxLcLg2NA8s5DTXzCKePbjtBJAVoVoGjmFxEwsgiCi5tFuoDDFinHcb9xWg6CBcjpS9ReReCeF9GOL5TsCEYhRkSs26HmSLXh2R2f8DlJS7Q7BZOwyhWzeZ3P2hijtJRG9wSXuQkIj27m1OKKKPUiQIiCv1ptF4x33rUh/Yb+aVqN8BjIf07HwDy0EPFzU2/ck0rgCpln8MgtOcBgOOiFizRSWt7aQCWA0GHdesSBuOAm+fFOQIoOFXVeBRqaGnvlsGIed5LwWiO/LP11KASg7tmt97fnRoz1Xj5NXc4WQP0Sliw6d4EN6mUdStyew8cbB6uQWGdXL+pPHMrjQLCVe40tHdo1NJoQ47X5XBnfKUykduBQ0U9+jEbKR5IOTc0IwfJb+tnjvwoq+3DCmxEV1iwvzyHtlzbSTnVHMRKuTm6crK8AcelDrGc/a/0r4WUsRcF3ebWzC4YCqt8Rbdo5XmO4IZj9IGSW+PFUuSVyu7BeeABIrdZMNFIfiSrCQQFouwDNHxQLyBQdK6nSPOfgftUSXWtaOlD67BkXkCLXrFV1IYJBAUifcpnspQHFjyjmi+4y8nBs6KIL1cJuRZkt6K1xzCYrvFAqdtptDCNz3dxX8V91Gsufqvn8r/CByJemd/kvJiprui/RAQkMaZR/r1i4W6a0rP/N/gXi6OvmDvBLoiyBV1/AN29Cs9hVFoUAAAAAElFTkSuQmCC</Image>
|
||||
<SearchForm>https://twitter.com/search/</SearchForm>
|
||||
<Url type="text/html" method="GET" template="https://twitter.com/search">
|
||||
<Param name="q" value="{searchTerms}"/>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<ShortName>Wikipedia (en)</ShortName>
|
||||
<Description>Wikipedia, the free encyclopedia</Description>
|
||||
<InputEncoding>UTF-8</InputEncoding>
|
||||
<Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAEAgQAhIOEAMjHyABIR0gA6ejpAGlqaQCpqKkAKCgoAPz9%2FAAZGBkAmJiYANjZ2ABXWFcAent6ALm6uQA8OjwAiIiIiIiIiIiIiI4oiL6IiIiIgzuIV4iIiIhndo53KIiIiB%2FWvXoYiIiIfEZfWBSIiIEGi%2FfoqoiIgzuL84i9iIjpGIoMiEHoiMkos3FojmiLlUipYliEWIF%2BiDe0GoRa7D6GPbjcu1yIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</Image>
|
||||
<Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAA4AQAAJgAAACAgAAAAAAAAJAMAAGQBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAEFSURBVDjLxZPRDYJAEESJoQjpgBoM/9IBtoAl4KcUQQlSAjYgJWAH0gPmyNtkzEEuxkQTPzawc3Ozc3MQTc/JfVPR/wW6a+eKQ+Hyfe54B2wvrfXVqXLDfTCMd3j0VHksrTcH9bl2aZq+BCgEwCCPj9E4TdPYGj0C9CYAKdkmBrIIxiIYbvpbb2sSl8AiA+ywAbJE5YLpCImLU/WRDyIAWRgu4k1s4v50ODru4haYSCk4ntkuM0wcMAINXiPKTJQ9CfgB40phBr8DyFjGKkKEhYhCY4iCDgpAYAM2EZBlhJnsZxQUYBNkSkfBvjDd0ttPeR0mxREQ+OhfYOJ6EmL+l/qzn2kGli9cAF3BOfkAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAAIKSURBVFjD7ZdBSgNRDIYLguAB7FLwAkXwBl0JgiDYjQcY8ARduBJKu3I5C0EoWDxAT9AL9AK9QBeCIHQlCM/3DZOSmeZNZ2r1bQyEGV7yXv7kJZlJq6XIOXfs+crzwPPTnvnR863n05ZFufDD/T595Q4eauM37u/pWYwfeX53cegcABcuHg0AkEQE8AKAu4gAXv8BrAEMh0PXbrddt9t1vV4v406nk62laeqm02n2LjKYIuK5WCyyfeiLDF32yLn6TJ5mBFarlev3+9nBMMqsabkYhmezWcEd2ctTE/tYBwhgt14BhtmAV2VaLpdrAHioCW+VdwWy9IMAUBQjJcQFTwGqvcTD+Xy+oc8askZJyAYrnKEokCeWLpQkSSZvBIANYgSDVVEQQJaeyHQu1QIgiQNb6AmrTtaQ9+RFSLa1D4iXgfsrVITloeSFFZlaAEjAUMaXo2DJWQtVRe1OKF5aJUkf0NdglXO5VzQGoI2USwwD3LEl590CtdO3QBoT5WSFV+Q63Oha17ITgMlkslGSGBWPdeNiDR2SL1B6zQFINmOAkFOW5eTSURCdvX6OdUlapaWjsKX0dgOg26/VWHSUKhrPz35ISKwq76R9Wx+kKgC1f0o5mISsypUG3kPj2L/lDzKYvEUwzoh2JtPRdQQAo1jD6afne88H1oTMeH6ZK+x7PB/lQ/CJtvkNEgDh1dr/bVYAAAAASUVORK5CYII=</Image>
|
||||
<Url type="application/x-suggestions+json" method="GET" template="http://en.wikipedia.org/w/api.php">
|
||||
<Param name="action" value="opensearch"/>
|
||||
<Param name="search" value="{searchTerms}"/>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<ShortName>Yahoo</ShortName>
|
||||
<Description>Yahoo Search</Description>
|
||||
<InputEncoding>UTF-8</InputEncoding>
|
||||
<Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgJqAIoCdgCaAnoAnhKCAKYijgCuLpIAskKeALpSpgC+Yq4AzHy8ANqezgDmvt4A7tLqAPz5+wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKlRFIoABWAKERERE6ADcKMzzu2hOgAAhERK8REWCWBERE36ERMHMEREvo6iEgY6hEn6Pu0mAzqkz/xjMzoDNwpERERDoAMzAKlERIoAAzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AADAOQAAgBkAAAAPAAAACQAAAAkAAAAIAAAACAAAAAgAAIAYAADAOAAA//8AAP//AAD//wAA</Image>
|
||||
<Image width="16" height="16">data:image/x-icon;base64,AAABAAIAEBAAAAAAAAANAQAAJgAAACAgAAAAAAAA/AMAADMBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAADUSURBVDjLY2AYPmBPzZn/65L2/W8SmoeClwXt+g+SQ1ZbxTTrPwzDNaNrRMYghciGoBgA03xv37P/MABiT9Jb9x9ZIbIhMP48p03/GUBOhNkE8gIIgBSCFPz++QeMX11697+MqQtsKLIBYAPRnXtu3i2wJpDBIBqkCKQ5iykPTIMMgLkOqwEgDLIR5hKQRhiGBRrI6fAARPYCDIM0ggCyZhCGeQHkVRibAeZfGAYFILLfYa5AjwmMNIBuG7rT0aMRHAPYElKf0jK4RlwJCaQG7oWhDwAW40nUCGVbdgAAAABJRU5ErkJggolQTkcNChoKAAAADUlIRFIAAAAgAAAAIAgGAAAAc3p69AAAA8NJREFUWMPtVmtsDFEU3j+IR7s7d4SISEMi6pUQ/CIRjyAVhBDxChJtvRptbXdn1iMtjbfW7s7caQmNRxVRVLWVVCtCEQklS6mttI3Eo+GPCvHKce5sdzqdndn10489ycnMnLn33O9+59xzrs0Wl7jE5X+X7Q4pyc3R+QJPRZHQPA+Rc5mKnJwuEt8Yp+1w/1g+xAR/sofQXzj/ucjTUoGXdwicvEKwKzOtJzmUNTih1sMrEE1ForQzYC5eHm3lS3AoE03nE9oWOZijGxHl+1gLW4A5n2Ur6Gv06UqgoywAnOi5a0LLQ44oCKhuImvKvpk9Jgiefs1J9I7ssSk7HWEC9qmbKHO1QYjmUrcTBXKIBE7ih+3Ep6qbger6J8Zm4rdzgDIo7Ntp9w83GVPksh1MCCEk8nJmxCfkJ5VAU9Ub+Nz2BdofvYNgfTs01bTCi+pWeFAcUEFkcV7I5I5pyr4ZSEHHEDLxKAwgiy8YGsmUvCREOyelsOwMU7978HE4tagCrm67A3opT70NxyZdhG1cIRRNvwJV7ga4nF4H5RvroNrTALV7HsLR8aXqJsKLuDl5msawAUCGzdeni3rlSk9qqLqrVMdBKBhbpgEIXAui7QCkoZ6YXQHPLge1f50d3yBwvQUOJZ/FUEk6X7LXFIA++/GjySyOLPE2OQ5BSUqlttBN4T6sTdwL6+z7oFpoUG2VOXchG0OQ4Tiq5okhIZ+YAUC7pM/85+bZHErENPt+qMy6p4E4vaAGGsua1XcWCgbSieNE8xMRNAMg8NLibgZ4+soqm1lSZWNybXUcgUBFiwbi+5cfcGD4GdiMdhcyJVqeBvrMDACrrt0M8LTS+kwruIAE6Rh374RLGoALq2phvT1f3bkQ/TgWGQGg7a2h5NKFuNBLKycsDBswDIW6hCyZdwNWJ+5R2YlaE+zSrAgGCK2OrPs8XWtBIewaeBz2J5+GKqE7D+56G6E45SocHn3OsjqiPaBfgxUm1tSMVTJqKBjFvikX4WPTJ+ho/gzNt9rhNRamV7Vt0Hb/HZSurFFPixmAbCIP03qB3T/ZwynjevQHrIJptrRepr1ArzsHFkPekJNqrMNlOSdK4iHFfzCs0w2bC+obFmvHrPRj0ZoTyQShmWah0Dcny8ZE6A0xQeL1/pbZcnsbfBX+00UELxwuHPwQEf+M0Xha8YJykl1OzPxkEF8iMlCPx72zqzou/ScArFZ7HPIMVk5x4mN00oG0fwgp/Yi2Fnyewf+pmf0Kh0TfjH+qh6NbRI76jLkQl7jE5S+qIPrIdKZBVAAAAABJRU5ErkJggg==</Image>
|
||||
<Url type="application/x-suggestions+json" method="GET"
|
||||
template="http://ff.search.yahoo.com/gossip?output=fxjson&command={searchTerms}" />
|
||||
<Url type="text/html" method="GET" template="http://search.yahoo.com/search">
|
||||
|
@ -385,13 +385,51 @@ var BrowserUI = {
|
||||
this.newTab(aURI, aOwner);
|
||||
},
|
||||
|
||||
setOnTabAnimationEnd: function setOnTabAnimationEnd(aCallback) {
|
||||
Elements.tabs.addEventListener("animationend", function onAnimationEnd() {
|
||||
Elements.tabs.removeEventListener("animationend", onAnimationEnd);
|
||||
aCallback();
|
||||
});
|
||||
},
|
||||
|
||||
closeTab: function closeTab(aTab) {
|
||||
// If we only have one tab, open a new one
|
||||
if (Browser.tabs.length == 1)
|
||||
if (Browser.tabs.length === 1 && !StartUI.isStartURI())
|
||||
Browser.addTab(Browser.getHomePage());
|
||||
|
||||
// We only have the start tab
|
||||
if (Browser.tabs.length === 1)
|
||||
return;
|
||||
|
||||
// If no tab is passed in, assume the current tab
|
||||
Browser.closeTab(aTab || Browser.selectedTab);
|
||||
let tab = aTab || Browser.selectedTab;
|
||||
let tabToClose = tab instanceof XULElement ? Browser.getTabFromChrome(tab) : tab;
|
||||
|
||||
if (this.isTabsOnly) {
|
||||
Browser.closeTab(tabToClose);
|
||||
} else {
|
||||
let nextTab = Browser.getNextTab(tabToClose);
|
||||
|
||||
if (!nextTab)
|
||||
return;
|
||||
|
||||
if (nextTab)
|
||||
Browser.selectedTab = nextTab;
|
||||
|
||||
// Trigger closing animation
|
||||
tabToClose.chromeTab.setAttribute("closing", "true");
|
||||
|
||||
let wasCollapsed = !ContextUI.isExpanded;
|
||||
if (wasCollapsed) {
|
||||
ContextUI.displayTabs();
|
||||
}
|
||||
|
||||
this.setOnTabAnimationEnd(function() {
|
||||
Browser.closeTab(tabToClose);
|
||||
if (wasCollapsed)
|
||||
ContextUI.dismissWithDelay(kNewTabAnimationDelayMsec);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
@ -614,16 +652,17 @@ var BrowserUI = {
|
||||
_urlbarClicked: function _urlbarClicked() {
|
||||
// If the urlbar is not already focused, focus it and select the contents.
|
||||
if (Elements.urlbarState.getAttribute("mode") != "edit")
|
||||
this._editURI();
|
||||
this._editURI(true);
|
||||
},
|
||||
|
||||
_editURI: function _editURI() {
|
||||
_editURI: function _editURI(aShouldDismiss) {
|
||||
this._edit.focus();
|
||||
this._edit.select();
|
||||
|
||||
Elements.urlbarState.setAttribute("mode", "edit");
|
||||
StartUI.show();
|
||||
ContextUI.dismissTabs();
|
||||
if (aShouldDismiss)
|
||||
ContextUI.dismissTabs();
|
||||
},
|
||||
|
||||
_urlbarBlurred: function _urlbarBlurred() {
|
||||
@ -986,7 +1025,7 @@ var BrowserUI = {
|
||||
break;
|
||||
case "cmd_openLocation":
|
||||
ContextUI.displayNavbar();
|
||||
this._editURI();
|
||||
this._editURI(true);
|
||||
break;
|
||||
case "cmd_addBookmark":
|
||||
Elements.appbar.show();
|
||||
@ -1014,7 +1053,7 @@ var BrowserUI = {
|
||||
break;
|
||||
case "cmd_newTab":
|
||||
this.newTab();
|
||||
this._editURI();
|
||||
this._editURI(false);
|
||||
break;
|
||||
case "cmd_closeTab":
|
||||
this.closeTab();
|
||||
@ -1154,14 +1193,17 @@ var ContextUI = {
|
||||
|
||||
/** Briefly show the tab bar and then hide it */
|
||||
peekTabs: function peekTabs() {
|
||||
if (this.isExpanded)
|
||||
return;
|
||||
if (this.isExpanded) {
|
||||
setTimeout(function () {
|
||||
ContextUI.dismissWithDelay(kNewTabAnimationDelayMsec);
|
||||
}, 0);
|
||||
} else {
|
||||
BrowserUI.setOnTabAnimationEnd(function () {
|
||||
ContextUI.dismissWithDelay(kNewTabAnimationDelayMsec);
|
||||
});
|
||||
|
||||
Elements.tabs.addEventListener("animationend", function onAnimationEnd() {
|
||||
Elements.tabs.removeEventListener("animationend", onAnimationEnd);
|
||||
ContextUI.dismissWithDelay(kNewTabAnimationDelayMsec);
|
||||
});
|
||||
this.displayTabs();
|
||||
this.displayTabs();
|
||||
}
|
||||
},
|
||||
|
||||
// Dismiss all context UI.
|
||||
|
@ -453,7 +453,7 @@ var Browser = {
|
||||
|
||||
closeTab: function closeTab(aTab, aOptions) {
|
||||
let tab = aTab instanceof XULElement ? this.getTabFromChrome(aTab) : aTab;
|
||||
if (!tab || !this._getNextTab(tab))
|
||||
if (!tab || !this.getNextTab(tab))
|
||||
return;
|
||||
|
||||
if (aOptions && "forceClose" in aOptions && aOptions.forceClose) {
|
||||
@ -469,7 +469,7 @@ var Browser = {
|
||||
},
|
||||
|
||||
_doCloseTab: function _doCloseTab(aTab) {
|
||||
let nextTab = this._getNextTab(aTab);
|
||||
let nextTab = this.getNextTab(aTab);
|
||||
if (!nextTab)
|
||||
return;
|
||||
|
||||
@ -495,14 +495,28 @@ var Browser = {
|
||||
container.dispatchEvent(event);
|
||||
},
|
||||
|
||||
_getNextTab: function _getNextTab(aTab) {
|
||||
getNextTab: function getNextTab(aTab) {
|
||||
let tabIndex = this._tabs.indexOf(aTab);
|
||||
if (tabIndex == -1)
|
||||
return null;
|
||||
|
||||
let nextTab = this._selectedTab;
|
||||
if (nextTab == aTab) {
|
||||
nextTab = this.getTabAtIndex(tabIndex + 1) || this.getTabAtIndex(tabIndex - 1);
|
||||
if (this._selectedTab == aTab || this._selectedTab.chromeTab.hasAttribute("closing")) {
|
||||
let nextTabIndex = tabIndex + 1;
|
||||
let nextTab = null;
|
||||
|
||||
while (nextTabIndex < this._tabs.length && (!nextTab || nextTab.chromeTab.hasAttribute("closing"))) {
|
||||
nextTab = this.getTabAtIndex(nextTabIndex);
|
||||
nextTabIndex++;
|
||||
}
|
||||
|
||||
nextTabIndex = tabIndex - 1;
|
||||
while (nextTabIndex >= 0 && (!nextTab || nextTab.chromeTab.hasAttribute("closing"))) {
|
||||
nextTab = this.getTabAtIndex(nextTabIndex);
|
||||
nextTabIndex--;
|
||||
}
|
||||
|
||||
if (!nextTab || nextTab.chromeTab.hasAttribute("closing"))
|
||||
return null;
|
||||
|
||||
// If the next tab is not a sibling, switch back to the parent.
|
||||
if (aTab.owner && nextTab.owner != aTab.owner)
|
||||
@ -510,9 +524,11 @@ var Browser = {
|
||||
|
||||
if (!nextTab)
|
||||
return null;
|
||||
|
||||
return nextTab;
|
||||
}
|
||||
|
||||
return nextTab;
|
||||
return this._selectedTab;
|
||||
},
|
||||
|
||||
get selectedTab() {
|
||||
@ -535,7 +551,6 @@ var Browser = {
|
||||
|
||||
let isFirstTab = this._selectedTab == null;
|
||||
let lastTab = this._selectedTab;
|
||||
let oldBrowser = lastTab ? lastTab._browser : null;
|
||||
let browser = tab.browser;
|
||||
|
||||
this._selectedTab = tab;
|
||||
|
@ -291,12 +291,13 @@ var ContextMenuHandler = {
|
||||
|
||||
// Don't include "copy" for password fields.
|
||||
if (!(elem instanceof Ci.nsIDOMHTMLInputElement) || elem.mozIsTextField(true)) {
|
||||
// If there is a selection add cut and copy
|
||||
if (selectionStart != selectionEnd) {
|
||||
state.types.push("cut");
|
||||
state.types.push("copy");
|
||||
state.string = elem.value.slice(selectionStart, selectionEnd);
|
||||
}
|
||||
if (elem.value && (selectionStart > 0 || selectionEnd < elem.textLength)) {
|
||||
} else if (elem.value && elem.textLength) {
|
||||
// There is text and it is not selected so add selectable items
|
||||
state.types.push("selectable");
|
||||
state.string = elem.value;
|
||||
}
|
||||
|
@ -31,6 +31,7 @@ BROWSER_TESTS = \
|
||||
text-block.html \
|
||||
browser_sanitize_ui.js \
|
||||
browser_topsites.js \
|
||||
browser_tabs.js \
|
||||
$(NULL)
|
||||
|
||||
BROWSER_TEST_RESOURCES = \
|
||||
|
@ -175,9 +175,7 @@ gTests.push({
|
||||
ok(ContextMenuUI._menuPopup._visible, "is visible");
|
||||
|
||||
checkContextUIMenuItemVisibility(["context-cut",
|
||||
"context-copy",
|
||||
"context-select",
|
||||
"context-select-all"]);
|
||||
"context-copy"]);
|
||||
|
||||
let menuItem = document.getElementById("context-copy");
|
||||
let popupPromise = waitForEvent(document, "popuphidden");
|
||||
@ -230,7 +228,9 @@ gTests.push({
|
||||
// selected text context:
|
||||
checkContextUIMenuItemVisibility(["context-cut",
|
||||
"context-copy",
|
||||
"context-paste"]);
|
||||
"context-paste",
|
||||
"context-select",
|
||||
"context-select-all"]);
|
||||
|
||||
promise = waitForEvent(document, "popuphidden");
|
||||
ContextMenuUI.hide();
|
||||
@ -254,9 +254,7 @@ gTests.push({
|
||||
ok(ContextMenuUI._menuPopup._visible, "is visible");
|
||||
|
||||
checkContextUIMenuItemVisibility(["context-cut",
|
||||
"context-copy",
|
||||
"context-select",
|
||||
"context-select-all"]);
|
||||
"context-copy"]);
|
||||
|
||||
let menuItem = document.getElementById("context-cut");
|
||||
let popupPromise = waitForEvent(document, "popuphidden");
|
||||
|
72
browser/metro/base/tests/mochitest/browser_tabs.js
Normal file
@ -0,0 +1,72 @@
|
||||
// -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; js2-basic-offset: 2; js2-skip-preprocessor-directives: t; -*-
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
let mockTab = function(aName, aIsClosing) {
|
||||
this.name = aName;
|
||||
this.isClosing = aIsClosing;
|
||||
};
|
||||
|
||||
mockTab.prototype = {
|
||||
get chromeTab () {
|
||||
let getAttribute = () => this.isClosing;
|
||||
return {
|
||||
hasAttribute: getAttribute
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let getMockBrowserTabs = function(aTestTabs, aSelected) {
|
||||
let result = {
|
||||
_tabs: aTestTabs,
|
||||
_selectedTab: aTestTabs[aSelected || 0],
|
||||
getTabAtIndex: function(i) this._tabs[i]
|
||||
};
|
||||
|
||||
return [result, Browser.getNextTab.bind(result)];
|
||||
};
|
||||
|
||||
gTests.push({
|
||||
desc: "Test Browser.getNextTab",
|
||||
run: function() {
|
||||
let [lonlyTab, fakeGetNextTab] = getMockBrowserTabs(
|
||||
[new mockTab("a", false)]);
|
||||
|
||||
ok(fakeGetNextTab(lonlyTab._selectedTab) == null, "null when only 1 tab left");
|
||||
ok(fakeGetNextTab(new mockTab("x", false)) == null, "null when tab doesnt exist");
|
||||
|
||||
let [twoTabs, fakeGetNextTab] = getMockBrowserTabs(
|
||||
[new mockTab("a", false), new mockTab("b", false)]);
|
||||
ok(fakeGetNextTab(twoTabs._selectedTab).name == "b", "get next tab");
|
||||
ok(fakeGetNextTab(twoTabs._tabs[1]).name == "a", "get selected tab");
|
||||
|
||||
let [twoTabsSecondSelected, fakeGetNextTab] = getMockBrowserTabs(
|
||||
[new mockTab("a", false), new mockTab("b", false)], 1);
|
||||
ok(fakeGetNextTab(twoTabsSecondSelected._selectedTab).name == "a", "get previous tab");
|
||||
|
||||
let [twoTabsOneClosing, fakeGetNextTab] = getMockBrowserTabs(
|
||||
[new mockTab("a", false), new mockTab("b", true)]);
|
||||
ok(fakeGetNextTab(twoTabsOneClosing._selectedTab) == null, "can't select closing tab");
|
||||
ok(fakeGetNextTab(twoTabsOneClosing._tabs[1]).name == "a", "get previous tab");
|
||||
|
||||
let [twoTabsBothClosing, fakeGetNextTab] = getMockBrowserTabs(
|
||||
[new mockTab("a", true), new mockTab("b", true)]);
|
||||
ok(fakeGetNextTab(twoTabsBothClosing._selectedTab) == null, "can't select closing tab");
|
||||
ok(fakeGetNextTab(twoTabsBothClosing._tabs[1]) == null, "can't select closing tab");
|
||||
|
||||
let [fiveTabsLastNotClosing, fakeGetNextTab] = getMockBrowserTabs(
|
||||
[new mockTab("a", false), new mockTab("b", true), new mockTab("c", true), new mockTab("d", true), new mockTab("e", false)]);
|
||||
ok(fakeGetNextTab(fiveTabsLastNotClosing._selectedTab).name == "e", "get next non-closing tab");
|
||||
|
||||
let [fiveTabsLastNotClosingLastSelected, fakeGetNextTab] = getMockBrowserTabs(
|
||||
[new mockTab("a", false), new mockTab("b", true), new mockTab("c", true), new mockTab("d", true), new mockTab("e", false)], 4);
|
||||
ok(fakeGetNextTab(fiveTabsLastNotClosingLastSelected._selectedTab).name == "a", "get previous non-closing tab");
|
||||
}
|
||||
});
|
||||
|
||||
function test() {
|
||||
runTests();
|
||||
}
|
@ -127,10 +127,25 @@
|
||||
}
|
||||
}
|
||||
|
||||
#tray:not([tabsonly]) documenttab > .documenttab-container {
|
||||
animation: open-documenttab;
|
||||
animation-duration: 0.4s;
|
||||
animation-timing-function: ease-out;
|
||||
@-moz-keyframes close-documenttab {
|
||||
0% {
|
||||
opacity: 1;
|
||||
transform: scale(1, 1);
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 0;
|
||||
transform: scale(0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
#tray:not([tabsonly]) .documenttab-container {
|
||||
animation: open-documenttab 0.4s ease-out;
|
||||
}
|
||||
|
||||
#tray:not([tabsonly]) documenttab[closing] > .documenttab-container {
|
||||
animation: close-documenttab 0.4s ease-out;
|
||||
animation-fill-mode: forwards;
|
||||
}
|
||||
|
||||
#tray:not([tabsonly]) .documenttab-favicon {
|
||||
|
@ -32,10 +32,8 @@ EXTRA_PP_JS_MODULES = \
|
||||
|
||||
ifeq ($(MOZ_WIDGET_TOOLKIT),windows)
|
||||
EXTRA_JS_MODULES += \
|
||||
WindowsPreviewPerTab.jsm \
|
||||
$(NULL)
|
||||
EXTRA_PP_JS_MODULES += \
|
||||
WindowsJumpLists.jsm \
|
||||
WindowsPreviewPerTab.jsm \
|
||||
$(NULL)
|
||||
endif
|
||||
|
||||
|
@ -2118,24 +2118,20 @@ toolbar[mode="text"] toolbarbutton.chevron > .toolbarbutton-icon {
|
||||
-moz-margin-end: 2px;
|
||||
}
|
||||
|
||||
#social-toolbar-item > .toolbarbutton-1 > .toolbarbutton-icon,
|
||||
.social-notification-container > .toolbarbutton-1 > .toolbarbutton-icon {
|
||||
margin: 5px 3px;
|
||||
}
|
||||
|
||||
#social-provider-button > .toolbarbutton-menu-dropmarker {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.social-notification-container {
|
||||
/* position:relative on .toolbarbutton-1 does not get position:absolute
|
||||
to work as expected on .toolbarbutton-1 generated content. Placing a
|
||||
simple container outside of .toolbarbutton-1 and setting position:relative
|
||||
on the simple container however will work. */
|
||||
.toolbarbutton-badge-container {
|
||||
margin: 5px 3px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.social-notification-container > .toolbarbutton-1[badge]:not([badge=""])::after {
|
||||
toolbar[iconsize="small"] .toolbarbutton-badge-container {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.toolbarbutton-badge[badge]:not([badge=""])::after {
|
||||
/* The |content| property is set in the content stylesheet. */
|
||||
font-size: 9px;
|
||||
font-weight: bold;
|
||||
@ -2146,20 +2142,20 @@ toolbar[mode="text"] toolbarbutton.chevron > .toolbarbutton-icon {
|
||||
border-radius: 2px;
|
||||
box-shadow: 0 1px 0 rgba(0,39,121,0.77);
|
||||
position: absolute;
|
||||
top: 2px;
|
||||
right: 2px;
|
||||
top: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.social-notification-container > .toolbarbutton-1[badge]:not([badge=""]):-moz-locale-dir(rtl)::after {
|
||||
.toolbarbutton-badge[badge]:not([badge=""]):-moz-locale-dir(rtl)::after {
|
||||
left: 2px;
|
||||
right: auto;
|
||||
}
|
||||
|
||||
.popup-notification-icon[popupid="servicesInstall"] {
|
||||
list-style-image: url("chrome://global/skin/icons/information-64.png");
|
||||
list-style-image: url(chrome://browser/skin/social/services-64.png);
|
||||
}
|
||||
#servicesInstall-notification-icon {
|
||||
list-style-image: url(chrome://global/skin/icons/information-16.png);
|
||||
list-style-image: url(chrome://browser/skin/social/services-16.png);
|
||||
}
|
||||
#social-undoactivation-button,
|
||||
#servicesInstall-learnmore-link {
|
||||
|
@ -102,7 +102,8 @@ browser.jar:
|
||||
skin/classic/browser/preferences/in-content/preferences.css (preferences/in-content/preferences.css)
|
||||
skin/classic/browser/preferences/applications.css (preferences/applications.css)
|
||||
skin/classic/browser/preferences/aboutPermissions.css (preferences/aboutPermissions.css)
|
||||
skin/classic/browser/social/social.png (social/social.png)
|
||||
skin/classic/browser/social/services-16.png (social/services-16.png)
|
||||
skin/classic/browser/social/services-64.png (social/services-64.png)
|
||||
skin/classic/browser/social/chat-close.png (social/chat-close.png)
|
||||
skin/classic/browser/tabbrowser/connecting.png (tabbrowser/connecting.png)
|
||||
skin/classic/browser/tabbrowser/loading.png (tabbrowser/loading.png)
|
||||
|
BIN
browser/themes/linux/social/services-16.png
Normal file
After Width: | Height: | Size: 937 B |
BIN
browser/themes/linux/social/services-64.png
Normal file
After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 1.6 KiB |
@ -3601,40 +3601,59 @@ toolbarbutton.chevron > .toolbarbutton-menu-dropmarker {
|
||||
|
||||
/* === social toolbar button === */
|
||||
|
||||
toolbar[mode="icons"] > *|* > .social-notification-container {
|
||||
-moz-appearance: toolbarbutton;
|
||||
}
|
||||
|
||||
.social-notification-container > .toolbarbutton-1 {
|
||||
-moz-appearance: none;
|
||||
#social-toolbar-item > .toolbarbutton-1 {
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
border-top-left-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
border-top-right-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
|
||||
#social-toolbar-item {
|
||||
margin: 0 4px;
|
||||
#social-toolbar-item > .toolbarbutton-1:-moz-locale-dir(ltr) {
|
||||
-moz-border-end-width: 0;
|
||||
}
|
||||
#social-toolbar-item > .toolbarbutton-1:last-child:-moz-locale-dir(ltr) {
|
||||
-moz-border-end-width: 1px;
|
||||
}
|
||||
#social-toolbar-item > .toolbarbutton-1:-moz-locale-dir(rtl) {
|
||||
-moz-border-start-width: 0;
|
||||
}
|
||||
#social-toolbar-item > .toolbarbutton-1:first-child:-moz-locale-dir(rtl) {
|
||||
-moz-border-start-width: 1px;
|
||||
}
|
||||
|
||||
#social-toolbar-item > .toolbarbutton-1:-moz-locale-dir(ltr):first-child,
|
||||
#social-toolbar-item > .toolbarbutton-1:-moz-locale-dir(rtl):last-child {
|
||||
margin-left: 4px;
|
||||
border-top-left-radius: 3px;
|
||||
border-bottom-left-radius: 3px;
|
||||
}
|
||||
#social-toolbar-item > .toolbarbutton-1:-moz-locale-dir(rtl):first-child,
|
||||
#social-toolbar-item > .toolbarbutton-1:-moz-locale-dir(ltr):last-child {
|
||||
margin-right: 4px;
|
||||
border-top-right-radius: 3px;
|
||||
border-bottom-right-radius: 3px;
|
||||
}
|
||||
|
||||
#social-provider-button {
|
||||
-moz-image-region: rect(0, 16px, 16px, 0);
|
||||
/* Needed to make the adjacent buttons combine */
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
#social-provider-button > .toolbarbutton-menu-dropmarker {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.social-notification-container {
|
||||
/* position:relative on .toolbarbutton-1 does not get position:absolute
|
||||
to work as expected on .toolbarbutton-1 generated content. Placing a
|
||||
simple container outside of .toolbarbutton-1 and setting position:relative
|
||||
on the simple container however will work. */
|
||||
.toolbarbutton-badge-container {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
position: relative;
|
||||
}
|
||||
.toolbarbutton-badge-container > .toolbarbutton-icon {
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
.social-notification-container > .toolbarbutton-1[badge]:not([badge=""])::after {
|
||||
.toolbarbutton-badge[badge]:not([badge=""])::after {
|
||||
/* The |content| property is set in the content stylesheet. */
|
||||
font-size: 9px;
|
||||
font-weight: bold;
|
||||
@ -3645,29 +3664,39 @@ toolbar[mode="icons"] > *|* > .social-notification-container {
|
||||
border-radius: 2px;
|
||||
box-shadow: 0 1px 0 rgba(0,39,121,0.77);
|
||||
position: absolute;
|
||||
top: 2px;
|
||||
top: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.social-notification-container > .toolbarbutton-1[badge]:not([badge=""]):-moz-locale-dir(rtl)::after {
|
||||
.toolbarbutton-badge[badge]:not([badge=""]):-moz-locale-dir(rtl)::after {
|
||||
left: 0;
|
||||
right: auto;
|
||||
}
|
||||
|
||||
toolbar[mode="icons"] > *|* > .social-notification-container > .toolbarbutton-1[badge]:not([badge=""])::after {
|
||||
toolbar[mode="icons"] > *|* > .toolbarbutton-badge[badge]:not([badge=""])::after {
|
||||
right: -2px;
|
||||
}
|
||||
|
||||
toolbar[mode="icons"] > *|* > .social-notification-container > .toolbarbutton-1[badge]:not([badge=""]):-moz-locale-dir(rtl)::after {
|
||||
toolbar[mode="icons"] > *|* > .toolbarbutton-badge[badge]:not([badge=""]):-moz-locale-dir(rtl)::after {
|
||||
left: -2px;
|
||||
}
|
||||
|
||||
.popup-notification-icon[popupid="servicesInstall"] {
|
||||
list-style-image: url("chrome://global/skin/icons/information-64.png");
|
||||
list-style-image: url(chrome://browser/skin/social/services-64.png);
|
||||
}
|
||||
#servicesInstall-notification-icon {
|
||||
list-style-image: url(chrome://global/skin/icons/information-16.png);
|
||||
list-style-image: url(chrome://browser/skin/social/services-16.png);
|
||||
}
|
||||
|
||||
@media (min-resolution: 2dppx) {
|
||||
.popup-notification-icon[popupid="servicesInstall"] {
|
||||
list-style-image: url(chrome://browser/skin/social/services-64@2x.png);
|
||||
}
|
||||
#servicesInstall-notification-icon {
|
||||
list-style-image: url(chrome://browser/skin/social/services-16@2x.png);
|
||||
}
|
||||
}
|
||||
|
||||
#social-undoactivation-button,
|
||||
#servicesInstall-learnmore-link {
|
||||
-moz-margin-start: 0; /* override default label margin to match description margin */
|
||||
|
@ -163,7 +163,10 @@ browser.jar:
|
||||
skin/classic/browser/preferences/in-content/preferences.css (preferences/in-content/preferences.css)
|
||||
skin/classic/browser/preferences/applications.css (preferences/applications.css)
|
||||
skin/classic/browser/preferences/aboutPermissions.css (preferences/aboutPermissions.css)
|
||||
skin/classic/browser/social/social.png (social/social.png)
|
||||
skin/classic/browser/social/services-16.png (social/services-16.png)
|
||||
skin/classic/browser/social/services-16@2x.png (social/services-16@2x.png)
|
||||
skin/classic/browser/social/services-64.png (social/services-64.png)
|
||||
skin/classic/browser/social/services-64@2x.png (social/services-64@2x.png)
|
||||
skin/classic/browser/social/chat-close.png (social/chat-close.png)
|
||||
skin/classic/browser/tabbrowser/alltabs-box-bkgnd-icon.png (tabbrowser/alltabs-box-bkgnd-icon.png)
|
||||
skin/classic/browser/tabbrowser/newtab.png (tabbrowser/newtab.png)
|
||||
|
BIN
browser/themes/osx/social/services-16.png
Normal file
After Width: | Height: | Size: 937 B |
BIN
browser/themes/osx/social/services-16@2x.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
browser/themes/osx/social/services-64.png
Normal file
After Width: | Height: | Size: 5.5 KiB |
BIN
browser/themes/osx/social/services-64@2x.png
Normal file
After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 1.6 KiB |
@ -72,8 +72,7 @@
|
||||
}
|
||||
|
||||
.chatbar-button {
|
||||
/* XXX get a real image for this */
|
||||
list-style-image: url("chrome://browser/skin/social/social.png");
|
||||
list-style-image: url("chrome://browser/skin/social/services-16.png");
|
||||
border: none;
|
||||
margin: 0;
|
||||
padding: 2px;
|
||||
@ -83,6 +82,12 @@
|
||||
-moz-border-end: 1px solid #ccc;
|
||||
}
|
||||
|
||||
@media (min-resolution: 2dppx) {
|
||||
.chatbar-button {
|
||||
list-style-image: url("chrome://browser/skin/social/services-16@2x.png");
|
||||
}
|
||||
}
|
||||
|
||||
.chatbar-button > menupopup > .menuitem-iconic > .menu-iconic-left > .menu-iconic-icon {
|
||||
width: auto;
|
||||
height: auto;
|
||||
|
@ -339,6 +339,76 @@
|
||||
ThreeDLightShadow 27px, ThreeDHighlight 27px,
|
||||
ThreeDHighlight 28px, #f1f5fb 28px);
|
||||
}
|
||||
|
||||
/* Hi-DPI overrides of the menu backgrounds, to adjust where the gutter line falls */
|
||||
@media (min-resolution: 1.25dppx) {
|
||||
#appmenuPrimaryPane menupopup {
|
||||
background-image: linear-gradient(to right, white 22.4px, ThreeDLightShadow 22.4px,
|
||||
ThreeDLightShadow 23.2px, ThreeDHighlight 23.2px,
|
||||
ThreeDHighlight 24px, white 24px);
|
||||
}
|
||||
#appmenuSecondaryPane menupopup {
|
||||
background-image: linear-gradient(to right, #f1f5fb 22.4px, ThreeDLightShadow 22.4px,
|
||||
ThreeDLightShadow 23.2px, ThreeDHighlight 23.2px,
|
||||
ThreeDHighlight 24px, #f1f5fb 24px);
|
||||
}
|
||||
#appmenuPrimaryPane menupopup:-moz-locale-dir(rtl) {
|
||||
background-image: linear-gradient(to left, white 22.4px, ThreeDLightShadow 22.4px,
|
||||
ThreeDLightShadow 23.2px, ThreeDHighlight 23.2px,
|
||||
ThreeDHighlight 24px, white 24px);
|
||||
}
|
||||
#appmenuSecondaryPane menupopup:-moz-locale-dir(rtl) {
|
||||
background-image: linear-gradient(to left, #f1f5fb 22.4px, ThreeDLightShadow 22.4px,
|
||||
ThreeDLightShadow 23.2px, ThreeDHighlight 23.2px,
|
||||
ThreeDHighlight 24px, #f1f5fb 24px);
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-resolution: 1.5dppx) {
|
||||
#appmenuPrimaryPane menupopup {
|
||||
background-image: linear-gradient(to right, white 20.6667px, ThreeDLightShadow 20.6667px,
|
||||
ThreeDLightShadow 21.3333px, ThreeDHighlight 21.3333px,
|
||||
ThreeDHighlight 22px, white 22px);
|
||||
}
|
||||
#appmenuSecondaryPane menupopup {
|
||||
background-image: linear-gradient(to right, #f1f5fb 20.6667px, ThreeDLightShadow 20.6667px,
|
||||
ThreeDLightShadow 21.3333px, ThreeDHighlight 21.3333px,
|
||||
ThreeDHighlight 22px, #f1f5fb 22px);
|
||||
}
|
||||
#appmenuPrimaryPane menupopup:-moz-locale-dir(rtl) {
|
||||
background-image: linear-gradient(to left, white 20.6667px, ThreeDLightShadow 20.6667px,
|
||||
ThreeDLightShadow 21.3333px, ThreeDHighlight 21.3333px,
|
||||
ThreeDHighlight 22px, white 22px);
|
||||
}
|
||||
#appmenuSecondaryPane menupopup:-moz-locale-dir(rtl) {
|
||||
background-image: linear-gradient(to left, #f1f5fb 20.6667px, ThreeDLightShadow 20.6667px,
|
||||
ThreeDLightShadow 21.3333px, ThreeDHighlight 21.3333px,
|
||||
ThreeDHighlight 22px, #f1f5fb 22px);
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-resolution: 2dppx) {
|
||||
#appmenuPrimaryPane menupopup {
|
||||
background-image: linear-gradient(to right, white 19.5px, ThreeDLightShadow 19.5px,
|
||||
ThreeDLightShadow 20px, ThreeDHighlight 20px,
|
||||
ThreeDHighlight 20.5px, white 20.5px);
|
||||
}
|
||||
#appmenuSecondaryPane menupopup {
|
||||
background-image: linear-gradient(to right, #f1f5fb 19.5px, ThreeDLightShadow 19.5px,
|
||||
ThreeDLightShadow 20px, ThreeDHighlight 20px,
|
||||
ThreeDHighlight 20.5px, #f1f5fb 20.5px);
|
||||
}
|
||||
#appmenuPrimaryPane menupopup:-moz-locale-dir(rtl) {
|
||||
background-image: linear-gradient(to left, white 19.5px, ThreeDLightShadow 19.5px,
|
||||
ThreeDLightShadow 20px, ThreeDHighlight 20px,
|
||||
ThreeDHighlight 20.5px, white 20.5px);
|
||||
}
|
||||
#appmenuSecondaryPane menupopup:-moz-locale-dir(rtl) {
|
||||
background-image: linear-gradient(to left, #f1f5fb 19.5px, ThreeDLightShadow 19.5px,
|
||||
ThreeDLightShadow 20px, ThreeDHighlight 20px,
|
||||
ThreeDHighlight 20.5px, #f1f5fb 20.5px);
|
||||
}
|
||||
}
|
||||
%endif
|
||||
|
||||
.appmenu-menuseparator {
|
||||
@ -355,6 +425,24 @@
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
%ifdef WINDOWS_AERO
|
||||
@media (min-resolution: 1.25dppx) {
|
||||
.appmenu-menuseparator {
|
||||
-moz-margin-start: 25px;
|
||||
}
|
||||
}
|
||||
@media (min-resolution: 1.5dppx) {
|
||||
.appmenu-menuseparator {
|
||||
-moz-margin-start: 24px;
|
||||
}
|
||||
}
|
||||
@media (min-resolution: 2dppx) {
|
||||
.appmenu-menuseparator {
|
||||
-moz-margin-start: 22px;
|
||||
}
|
||||
}
|
||||
%endif
|
||||
|
||||
.appmenu-edit-button:not([disabled]):hover {
|
||||
border: 1px solid #b8d6fb;
|
||||
box-shadow: inset 0 0 1px white;
|
||||
@ -421,10 +509,23 @@
|
||||
list-style-image: url("chrome://browser/skin/Privacy-16.png");
|
||||
}
|
||||
|
||||
@media (min-resolution: 1.25dppx) {
|
||||
#appmenu_privateBrowsing,
|
||||
#appmenu_newPrivateWindow {
|
||||
list-style-image: url("chrome://browser/skin/Privacy-32.png");
|
||||
}
|
||||
}
|
||||
|
||||
#appmenu_addons {
|
||||
list-style-image: url("chrome://mozapps/skin/extensions/extensionGeneric-16.png");
|
||||
}
|
||||
|
||||
@media (min-resolution: 1.25dppx) {
|
||||
#appmenu_addons {
|
||||
list-style-image: url("chrome://mozapps/skin/extensions/extensionGeneric.png");
|
||||
}
|
||||
}
|
||||
|
||||
#BMB_bookmarkThisPage,
|
||||
#appmenu_bookmarkThisPage {
|
||||
list-style-image: url("chrome://browser/skin/places/bookmark.png");
|
||||
@ -690,6 +791,7 @@ toolbar[mode=full] .toolbarbutton-1 > .toolbarbutton-menubutton-button {
|
||||
}
|
||||
|
||||
@navbarLargeIcons@ .toolbarbutton-1 > .toolbarbutton-icon,
|
||||
@navbarLargeIcons@ .toolbarbutton-1 > .toolbarbutton-badge-container,
|
||||
@navbarLargeIcons@ .toolbarbutton-1 > .toolbarbutton-menubutton-button > .toolbarbutton-icon,
|
||||
@navbarLargeIcons@ .toolbarbutton-1 > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon {
|
||||
padding: 2px 6px;
|
||||
@ -705,6 +807,7 @@ toolbar[mode=full] .toolbarbutton-1 > .toolbarbutton-menubutton-button {
|
||||
}
|
||||
|
||||
@navbarLargeIcons@ .toolbarbutton-1:not(:-moz-any(@primaryToolbarButtons@)) > .toolbarbutton-icon,
|
||||
@navbarLargeIcons@ .toolbarbutton-1:not(:-moz-any(@primaryToolbarButtons@)) > .toolbarbutton-badge-container,
|
||||
@navbarLargeIcons@ .toolbarbutton-1:not(:-moz-any(@primaryToolbarButtons@)) > .toolbarbutton-menubutton-button > .toolbarbutton-icon {
|
||||
padding: 3px 7px;
|
||||
}
|
||||
@ -757,6 +860,7 @@ toolbar[mode=full] .toolbarbutton-1 > .toolbarbutton-menubutton-button {
|
||||
@navbarLargeIcons@ .toolbarbutton-1:not([disabled]):-moz-any(:hover,[open]) > .toolbarbutton-menubutton-button > .toolbarbutton-icon,
|
||||
@navbarLargeIcons@ .toolbarbutton-1:not([disabled]):hover > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon,
|
||||
@navbarLargeIcons@ .toolbarbutton-1:not([disabled]):not([checked]):not([open]):not(:active):hover > .toolbarbutton-icon,
|
||||
@navbarLargeIcons@ .toolbarbutton-1:not([disabled]):not([checked]):not([open]):not(:active):hover > .toolbarbutton-badge-container,
|
||||
@conditionalForwardWithUrlbar@ > .toolbarbutton-1:-moz-any([disabled],:not([open]):not([disabled]):not(:active)) > .toolbarbutton-icon {
|
||||
background-image: linear-gradient(hsla(0,0%,100%,.6), hsla(0,0%,100%,.1));
|
||||
border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.2) hsla(210,54%,20%,.25);
|
||||
@ -776,7 +880,8 @@ toolbar[mode=full] .toolbarbutton-1 > .toolbarbutton-menubutton-button {
|
||||
|
||||
@navbarLargeIcons@ .toolbarbutton-1 > .toolbarbutton-menubutton-button:not([disabled]):hover:active > .toolbarbutton-icon,
|
||||
@navbarLargeIcons@ .toolbarbutton-1[open] > .toolbarbutton-menubutton-dropmarker:not([disabled]) > .dropmarker-icon,
|
||||
@navbarLargeIcons@ .toolbarbutton-1:not([disabled]):-moz-any([open],[checked],:hover:active) > .toolbarbutton-icon {
|
||||
@navbarLargeIcons@ .toolbarbutton-1:not([disabled]):-moz-any([open],[checked],:hover:active) > .toolbarbutton-icon,
|
||||
@navbarLargeIcons@ .toolbarbutton-1:not([disabled]):-moz-any([open],[checked],:hover:active) > .toolbarbutton-badge-container {
|
||||
background-image: linear-gradient(hsla(0,0%,100%,.6), hsla(0,0%,100%,.1));
|
||||
background-color: hsla(210,54%,20%,.15);
|
||||
border-color: hsla(210,54%,20%,.3) hsla(210,54%,20%,.35) hsla(210,54%,20%,.4);
|
||||
@ -2691,26 +2796,25 @@ toolbarbutton.bookmark-item[dragover="true"][open="true"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@navbarLargeIcons@ > #social-toolbar-item > .toolbarbutton-1,
|
||||
@navbarLargeIcons@ > #social-toolbar-item > .social-notification-container > .toolbarbutton-1 {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
@navbarLargeIcons@ > #social-toolbar-item {
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.social-notification-container {
|
||||
/* position:relative on .toolbarbutton-1 does not get position:absolute
|
||||
to work as expected on .toolbarbutton-1 generated content. Placing a
|
||||
simple container outside of .toolbarbutton-1 and setting position:relative
|
||||
on the simple container however will work. */
|
||||
.toolbarbutton-badge-container {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.social-notification-container > .toolbarbutton-1[badge]:not([badge=""])::after {
|
||||
@navbarLargeIcons@ .toolbarbutton-1 > .toolbarbutton-badge-container {
|
||||
padding: 2px 5px;
|
||||
}
|
||||
|
||||
.toolbarbutton-1 > .toolbarbutton-badge-container > .toolbar-icon {
|
||||
position: absolute;
|
||||
top: 2px;
|
||||
right: 2px;
|
||||
}
|
||||
.toolbarbutton-badge[badge=""] {
|
||||
display: none;
|
||||
}
|
||||
.toolbarbutton-badge[badge]:not([badge=""])::after {
|
||||
/* The |content| property is set in the content stylesheet. */
|
||||
font-size: 9px;
|
||||
font-weight: bold;
|
||||
@ -2721,24 +2825,30 @@ toolbarbutton.bookmark-item[dragover="true"][open="true"] {
|
||||
border-radius: 2px;
|
||||
box-shadow: 0 1px 0 rgba(0,39,121,0.77);
|
||||
position: absolute;
|
||||
top: 2px;
|
||||
right: 2px;
|
||||
top: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
@navbarLargeIcons@ > *|* > .social-notification-container > .toolbarbutton-1[badge]:not([badge=""])::after {
|
||||
top: 7px;
|
||||
@navbarLargeIcons@ *|* > .toolbarbutton-badge[badge]:not([badge=""])::after {
|
||||
top: 1px;
|
||||
right: 5px;
|
||||
}
|
||||
|
||||
.social-notification-container > .toolbarbutton-1[badge]:not([badge=""]):-moz-locale-dir(rtl)::after {
|
||||
left: 2px;
|
||||
.toolbarbutton-badge[badge]:not([badge=""]):-moz-locale-dir(rtl)::after {
|
||||
left: 0;
|
||||
right: auto;
|
||||
}
|
||||
|
||||
@navbarLargeIcons@ *|* > .toolbarbutton-badge[badge]:not([badge=""]):-moz-locale-dir(rtl)::after {
|
||||
left: 5px;
|
||||
right: auto;
|
||||
}
|
||||
|
||||
.popup-notification-icon[popupid="servicesInstall"] {
|
||||
list-style-image: url("chrome://global/skin/icons/information-64.png");
|
||||
list-style-image: url(chrome://browser/skin/social/services-64.png);
|
||||
}
|
||||
#servicesInstall-notification-icon {
|
||||
list-style-image: url(chrome://global/skin/icons/information-16.png);
|
||||
list-style-image: url(chrome://browser/skin/social/services-16.png);
|
||||
}
|
||||
#social-undoactivation-button,
|
||||
#servicesInstall-learnmore-link {
|
||||
|
@ -50,6 +50,7 @@ browser.jar:
|
||||
skin/classic/browser/pointerLock-16.png
|
||||
skin/classic/browser/pointerLock-64.png
|
||||
skin/classic/browser/Privacy-16.png
|
||||
skin/classic/browser/Privacy-32.png
|
||||
skin/classic/browser/Privacy-48.png
|
||||
skin/classic/browser/privatebrowsing-light.png
|
||||
skin/classic/browser/privatebrowsing-dark.png
|
||||
@ -121,7 +122,8 @@ browser.jar:
|
||||
skin/classic/browser/preferences/in-content/preferences.css (preferences/in-content/preferences.css)
|
||||
skin/classic/browser/preferences/applications.css (preferences/applications.css)
|
||||
skin/classic/browser/preferences/aboutPermissions.css (preferences/aboutPermissions.css)
|
||||
skin/classic/browser/social/social.png (social/social.png)
|
||||
skin/classic/browser/social/services-16.png (social/services-16.png)
|
||||
skin/classic/browser/social/services-64.png (social/services-64.png)
|
||||
skin/classic/browser/social/chat-close.png (social/chat-close.png)
|
||||
skin/classic/browser/tabbrowser/newtab.png (tabbrowser/newtab.png)
|
||||
skin/classic/browser/tabbrowser/newtab-inverted.png (tabbrowser/newtab-inverted.png)
|
||||
@ -291,6 +293,7 @@ browser.jar:
|
||||
skin/classic/aero/browser/pointerLock-16.png (pointerLock-16.png)
|
||||
skin/classic/aero/browser/pointerLock-64.png (pointerLock-64.png)
|
||||
skin/classic/aero/browser/Privacy-16.png (Privacy-16-aero.png)
|
||||
skin/classic/aero/browser/Privacy-32.png (Privacy-32-aero.png)
|
||||
skin/classic/aero/browser/Privacy-48.png (Privacy-48-aero.png)
|
||||
skin/classic/aero/browser/privatebrowsing-light.png
|
||||
skin/classic/aero/browser/privatebrowsing-dark.png
|
||||
@ -362,7 +365,8 @@ browser.jar:
|
||||
skin/classic/aero/browser/preferences/in-content/preferences.css (preferences/in-content/preferences.css)
|
||||
skin/classic/aero/browser/preferences/applications.css (preferences/applications.css)
|
||||
skin/classic/aero/browser/preferences/aboutPermissions.css (preferences/aboutPermissions.css)
|
||||
skin/classic/aero/browser/social/social.png (social/social.png)
|
||||
skin/classic/aero/browser/social/services-16.png (social/services-16.png)
|
||||
skin/classic/aero/browser/social/services-64.png (social/services-64.png)
|
||||
skin/classic/aero/browser/social/chat-close.png (social/chat-close.png)
|
||||
skin/classic/aero/browser/tabbrowser/newtab.png (tabbrowser/newtab.png)
|
||||
skin/classic/aero/browser/tabbrowser/newtab-inverted.png (tabbrowser/newtab-inverted.png)
|
||||
|
BIN
browser/themes/windows/social/services-16.png
Normal file
After Width: | Height: | Size: 937 B |
BIN
browser/themes/windows/social/services-64.png
Normal file
After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 1.6 KiB |
@ -306,7 +306,8 @@ else
|
||||
endif
|
||||
|
||||
check-clobber:
|
||||
$(PYTHON) $(TOPSRCDIR)/python/mozbuild/mozbuild/controller/clobber.py $(TOPSRCDIR) $(OBJDIR)
|
||||
$(PYTHON) $(TOPSRCDIR)/config/pythonpath.py -I $(TOPSRCDIR)/testing/mozbase/mozfile \
|
||||
$(TOPSRCDIR)/python/mozbuild/mozbuild/controller/clobber.py $(TOPSRCDIR) $(OBJDIR)
|
||||
|
||||
configure-files: $(CONFIGURES)
|
||||
|
||||
|
@ -246,7 +246,9 @@ $(error Component makefile does not specify MODULE_NAME.)
|
||||
endif
|
||||
endif
|
||||
FORCE_STATIC_LIB=1
|
||||
SHORT_LIBNAME=
|
||||
ifneq ($(SHORT_LIBNAME),)
|
||||
$(error SHORT_LIBNAME is $(SHORT_LIBNAME) but SHORT_LIBNAME is not compatable with LIBXUL_LIBRARY)
|
||||
endif
|
||||
endif
|
||||
|
||||
# If we are building this component into an extension/xulapp, it cannot be
|
||||
|
50
configure.in
@ -5274,6 +5274,31 @@ if test -n "$MOZ_WEBRTC"; then
|
||||
esac
|
||||
fi
|
||||
|
||||
# target_arch is from {ia32|x64|arm|ppc}
|
||||
case "$CPU_ARCH" in
|
||||
x86_64 | ia64)
|
||||
WEBRTC_TARGET_ARCH=x64
|
||||
;;
|
||||
|
||||
arm*)
|
||||
WEBRTC_TARGET_ARCH=arm
|
||||
;;
|
||||
|
||||
x86)
|
||||
WEBRTC_TARGET_ARCH=ia32
|
||||
;;
|
||||
|
||||
ppc*)
|
||||
WEBRTC_TARGET_ARCH=ppc
|
||||
;;
|
||||
*)
|
||||
# unsupported arch for webrtc
|
||||
WEBRTC_TARGET_ARCH=unknown
|
||||
MOZ_WEBRTC=
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
dnl ========================================================
|
||||
dnl = Disable WebRTC code
|
||||
dnl ========================================================
|
||||
@ -9064,31 +9089,6 @@ case "$host" in
|
||||
;;
|
||||
esac
|
||||
|
||||
# target_arch is from {ia32|x64|arm|ppc}
|
||||
case "$CPU_ARCH" in
|
||||
x86_64 | ia64)
|
||||
WEBRTC_TARGET_ARCH=x64
|
||||
;;
|
||||
|
||||
arm*)
|
||||
WEBRTC_TARGET_ARCH=arm
|
||||
;;
|
||||
|
||||
x86)
|
||||
WEBRTC_TARGET_ARCH=ia32
|
||||
;;
|
||||
|
||||
ppc*)
|
||||
WEBRTC_TARGET_ARCH=ppc
|
||||
;;
|
||||
*)
|
||||
# unsupported arch for webrtc
|
||||
WEBRTC_TARGET_ARCH=unknown
|
||||
MOZ_WEBRTC=
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
# Generate Makefiles for WebRTC directly from .gyp files
|
||||
if test "${OS_TARGET}" = "WINNT"; then
|
||||
if test "$HAVE_64BIT_OS"; then
|
||||
|
@ -211,20 +211,22 @@ DOMImplementation::CreateHTMLDocument(const nsAString& aTitle,
|
||||
rv = root->AppendChildTo(head, false);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<nsIContent> title;
|
||||
rv = doc->CreateElem(NS_LITERAL_STRING("title"), nullptr, kNameSpaceID_XHTML,
|
||||
getter_AddRefs(title));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = head->AppendChildTo(title, false);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
if (!DOMStringIsNull(aTitle)) {
|
||||
nsCOMPtr<nsIContent> title;
|
||||
rv = doc->CreateElem(NS_LITERAL_STRING("title"), nullptr,
|
||||
kNameSpaceID_XHTML, getter_AddRefs(title));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = head->AppendChildTo(title, false);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<nsIContent> titleText;
|
||||
rv = NS_NewTextNode(getter_AddRefs(titleText), doc->NodeInfoManager());
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = titleText->SetText(aTitle, false);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = title->AppendChildTo(titleText, false);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
nsCOMPtr<nsIContent> titleText;
|
||||
rv = NS_NewTextNode(getter_AddRefs(titleText), doc->NodeInfoManager());
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = titleText->SetText(aTitle, false);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = title->AppendChildTo(titleText, false);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIContent> body;
|
||||
rv = doc->CreateElem(NS_LITERAL_STRING("body"), nullptr, kNameSpaceID_XHTML,
|
||||
@ -241,12 +243,14 @@ DOMImplementation::CreateHTMLDocument(const nsAString& aTitle,
|
||||
}
|
||||
|
||||
already_AddRefed<nsIDocument>
|
||||
DOMImplementation::CreateHTMLDocument(const nsAString& aTitle,
|
||||
DOMImplementation::CreateHTMLDocument(const Optional<nsAString>& aTitle,
|
||||
ErrorResult& aRv)
|
||||
{
|
||||
nsCOMPtr<nsIDocument> document;
|
||||
nsCOMPtr<nsIDOMDocument> domDocument;
|
||||
aRv = CreateHTMLDocument(aTitle, getter_AddRefs(document),
|
||||
aRv = CreateHTMLDocument(aTitle.WasPassed() ? aTitle.Value()
|
||||
: NullString(),
|
||||
getter_AddRefs(document),
|
||||
getter_AddRefs(domDocument));
|
||||
return document.forget();
|
||||
}
|
||||
|
@ -73,7 +73,7 @@ public:
|
||||
ErrorResult& aRv);
|
||||
|
||||
already_AddRefed<nsIDocument>
|
||||
CreateHTMLDocument(const nsAString& aTitle, ErrorResult& aRv);
|
||||
CreateHTMLDocument(const Optional<nsAString>& aTitle, ErrorResult& aRv);
|
||||
|
||||
private:
|
||||
nsresult CreateDocument(const nsAString& aNamespaceURI,
|
||||
|
@ -477,10 +477,7 @@ nsDOMMutationObserver::Observe(nsINode& aTarget,
|
||||
aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
|
||||
return;
|
||||
}
|
||||
if (!filters.SetCapacity(len)) {
|
||||
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
|
||||
return;
|
||||
}
|
||||
filters.SetCapacity(len);
|
||||
|
||||
for (uint32_t i = 0; i < len; ++i) {
|
||||
nsCOMPtr<nsIAtom> a = do_GetAtom(filtersAsString[i]);
|
||||
|
@ -66,7 +66,7 @@
|
||||
|
||||
#include "nsContentCID.h"
|
||||
#include "nsError.h"
|
||||
#include "nsIPresShell.h"
|
||||
#include "nsPresShell.h"
|
||||
#include "nsPresContext.h"
|
||||
#include "nsIJSON.h"
|
||||
#include "nsThreadUtils.h"
|
||||
@ -2361,6 +2361,24 @@ nsDocument::StartDocumentLoad(const char* aCommand, nsIChannel* aChannel,
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
CSPErrorQueue::Add(const char* aMessageName)
|
||||
{
|
||||
mErrors.AppendElement(aMessageName);
|
||||
}
|
||||
|
||||
void
|
||||
CSPErrorQueue::Flush(nsIDocument* aDocument)
|
||||
{
|
||||
for (uint32_t i = 0; i < mErrors.Length(); i++) {
|
||||
nsContentUtils::ReportToConsole(nsIScriptError::warningFlag,
|
||||
"CSP", aDocument,
|
||||
nsContentUtils::eDOM_PROPERTIES,
|
||||
mErrors[i]);
|
||||
}
|
||||
mErrors.Clear();
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDocument::InitCSP(nsIChannel* aChannel)
|
||||
{
|
||||
@ -2519,6 +2537,9 @@ nsDocument::InitCSP(nsIChannel* aChannel)
|
||||
nsContentUtils::eDOM_PROPERTIES,
|
||||
"OldCSPHeaderDeprecated");
|
||||
|
||||
// Additionally log deprecated warning to Web Console.
|
||||
mCSPWebConsoleErrorQueue.Add("OldCSPHeaderDeprecated");
|
||||
|
||||
// Also, if the new headers AND the old headers were present, warn
|
||||
// that the old headers will be ignored.
|
||||
if (cspSpecCompliant) {
|
||||
@ -2526,6 +2547,8 @@ nsDocument::InitCSP(nsIChannel* aChannel)
|
||||
"CSP", this,
|
||||
nsContentUtils::eDOM_PROPERTIES,
|
||||
"BothCSPHeadersPresent");
|
||||
// Additionally log to Web Console.
|
||||
mCSPWebConsoleErrorQueue.Add("BothCSPHeadersPresent");
|
||||
}
|
||||
}
|
||||
|
||||
@ -2565,6 +2588,8 @@ nsDocument::InitCSP(nsIChannel* aChannel)
|
||||
"CSP", this,
|
||||
nsContentUtils::eDOM_PROPERTIES,
|
||||
"ReportOnlyCSPIgnored");
|
||||
// Additionally log to Web Console.
|
||||
mCSPWebConsoleErrorQueue.Add("ReportOnlyCSPIgnored");
|
||||
#ifdef PR_LOGGING
|
||||
PR_LOG(gCspPRLog, PR_LOG_DEBUG,
|
||||
("Skipped report-only CSP init for document %p because another, enforced policy is set", this));
|
||||
@ -3322,13 +3347,8 @@ nsDocument::doCreateShell(nsPresContext* aContext,
|
||||
|
||||
FillStyleSet(aStyleSet);
|
||||
|
||||
nsCOMPtr<nsIPresShell> shell;
|
||||
nsresult rv = NS_NewPresShell(getter_AddRefs(shell));
|
||||
if (NS_FAILED(rv)) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
rv = shell->Init(this, aContext, aViewManager, aStyleSet, aCompatMode);
|
||||
nsRefPtr<PresShell> shell = new PresShell;
|
||||
nsresult rv = shell->Init(this, aContext, aViewManager, aStyleSet, aCompatMode);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// Note: we don't hold a ref to the shell (it holds a ref to us)
|
||||
@ -3338,7 +3358,7 @@ nsDocument::doCreateShell(nsPresContext* aContext,
|
||||
|
||||
MaybeRescheduleAnimationFrameNotifications();
|
||||
|
||||
shell.swap(*aInstancePtrResult);
|
||||
shell.forget(aInstancePtrResult);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
@ -4140,6 +4160,10 @@ nsDocument::SetScriptGlobalObject(nsIScriptGlobalObject *aScriptGlobalObject)
|
||||
nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(mScriptGlobalObject);
|
||||
mWindow = window;
|
||||
|
||||
// Now that we know what our window is, we can flush the CSP errors to the
|
||||
// Web Console.
|
||||
FlushCSPWebConsoleErrorQueue();
|
||||
|
||||
// Set our visibility state, but do not fire the event. This is correct
|
||||
// because either we're coming out of bfcache (in which case IsVisible() will
|
||||
// still test false at this point and no state change will happen) or we're
|
||||
@ -6502,80 +6526,6 @@ private:
|
||||
nsCOMPtr<nsIDocument> mOwnerDoc;
|
||||
};
|
||||
|
||||
/**
|
||||
* Get a scope from aNewDocument. Also get a context through the scope of one
|
||||
* of the documents, from the stack or the safe context.
|
||||
*
|
||||
* @param aOldDocument The document to try to get a context from.
|
||||
* @param aNewDocument The document to get aNewScope from.
|
||||
* @param aCx [out] Context gotten through one of the scopes, from the stack
|
||||
* or the safe context.
|
||||
* @param aNewScope [out] Scope gotten from aNewDocument.
|
||||
*/
|
||||
static nsresult
|
||||
GetContextAndScope(nsIDocument* aOldDocument, nsIDocument* aNewDocument,
|
||||
nsCxPusher& aPusher,
|
||||
JSContext** aCx, JSObject** aNewScope)
|
||||
{
|
||||
MOZ_ASSERT(aOldDocument);
|
||||
MOZ_ASSERT(aNewDocument);
|
||||
|
||||
*aCx = nullptr;
|
||||
*aNewScope = nullptr;
|
||||
|
||||
JSObject* newScope = aNewDocument->GetWrapper();
|
||||
JSObject* global;
|
||||
if (!newScope) {
|
||||
nsIGlobalObject *newSGO = aNewDocument->GetScopeObject();
|
||||
|
||||
if (!newSGO || !(global = newSGO->GetGlobalJSObject())) {
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
JSContext* cx = nsContentUtils::GetContextFromDocument(aOldDocument);
|
||||
if (!cx) {
|
||||
cx = nsContentUtils::GetContextFromDocument(aNewDocument);
|
||||
|
||||
if (!cx) {
|
||||
// No context reachable from the old or new document, use the
|
||||
// calling context, or the safe context if no caller can be
|
||||
// found.
|
||||
|
||||
nsIThreadJSContextStack* stack = nsContentUtils::ThreadJSContextStack();
|
||||
stack->Peek(&cx);
|
||||
|
||||
if (!cx) {
|
||||
cx = stack->GetSafeJSContext();
|
||||
|
||||
if (!cx) {
|
||||
// No safe context reachable, bail.
|
||||
NS_WARNING("No context reachable in GetContextAndScopes()!");
|
||||
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (cx) {
|
||||
aPusher.Push(cx);
|
||||
}
|
||||
if (!newScope && cx) {
|
||||
JS::Value v;
|
||||
nsresult rv = nsContentUtils::WrapNative(cx, global, aNewDocument,
|
||||
aNewDocument, &v);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
newScope = JSVAL_TO_OBJECT(v);
|
||||
}
|
||||
|
||||
*aCx = cx;
|
||||
*aNewScope = newScope;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDocument::AdoptNode(nsIDOMNode *aAdoptedNode, nsIDOMNode **aResult)
|
||||
{
|
||||
@ -6692,19 +6642,29 @@ nsIDocument::AdoptNode(nsINode& aAdoptedNode, ErrorResult& rv)
|
||||
nsCOMPtr<nsIDocument> oldDocument = adoptedNode->OwnerDoc();
|
||||
bool sameDocument = oldDocument == this;
|
||||
|
||||
JSContext *cx = nullptr;
|
||||
AutoJSContext cx;
|
||||
JSObject *newScope = nullptr;
|
||||
nsCxPusher pusher;
|
||||
if (!sameDocument) {
|
||||
rv = GetContextAndScope(oldDocument, this, pusher, &cx, &newScope);
|
||||
if (rv.Failed()) {
|
||||
return nullptr;
|
||||
newScope = GetWrapper();
|
||||
if (!newScope && GetScopeObject() && GetScopeObject()->GetGlobalJSObject()) {
|
||||
// We need to pass some sort of scope object to WrapNative. It's kind of
|
||||
// irrelevant, given that we're passing aAllowWrapping = false, and
|
||||
// documents should always insist on being wrapped in an canonical
|
||||
// scope. But we try to pass something sane anyway.
|
||||
JSObject *global = GetScopeObject()->GetGlobalJSObject();
|
||||
|
||||
JS::Value v;
|
||||
rv = nsContentUtils::WrapNative(cx, global, this, this, &v, nullptr,
|
||||
/* aAllowWrapping = */ false);
|
||||
if (rv.Failed())
|
||||
return nullptr;
|
||||
newScope = &v.toObject();
|
||||
}
|
||||
}
|
||||
|
||||
nsCOMArray<nsINode> nodesWithProperties;
|
||||
rv = nsNodeUtils::Adopt(adoptedNode, sameDocument ? nullptr : mNodeInfoManager,
|
||||
cx, newScope, nodesWithProperties);
|
||||
newScope, nodesWithProperties);
|
||||
if (rv.Failed()) {
|
||||
// Disconnect all nodes from their parents, since some have the old document
|
||||
// as their ownerDocument and some have this as their ownerDocument.
|
||||
|
@ -463,6 +463,29 @@ protected:
|
||||
bool mHaveShutDown;
|
||||
};
|
||||
|
||||
class CSPErrorQueue
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Note this was designed to be passed string literals. If you give it
|
||||
* a dynamically allocated string, it is your responsibility to make sure
|
||||
* it never dies and is properly freed!
|
||||
*/
|
||||
void Add(const char* aMessageName);
|
||||
void Flush(nsIDocument* aDocument);
|
||||
|
||||
CSPErrorQueue()
|
||||
{
|
||||
}
|
||||
|
||||
~CSPErrorQueue()
|
||||
{
|
||||
}
|
||||
|
||||
private:
|
||||
nsAutoTArray<const char*,5> mErrors;
|
||||
};
|
||||
|
||||
// Base class for our document implementations.
|
||||
//
|
||||
// Note that this class *implements* nsIDOMXMLDocument, but it's not
|
||||
@ -1320,6 +1343,11 @@ private:
|
||||
nsresult CheckFrameOptions();
|
||||
nsresult InitCSP(nsIChannel* aChannel);
|
||||
|
||||
void FlushCSPWebConsoleErrorQueue()
|
||||
{
|
||||
mCSPWebConsoleErrorQueue.Flush(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the (non-anonymous) content in this document for aFrame. It will
|
||||
* be aFrame's content node if that content is in this document and not
|
||||
@ -1418,6 +1446,8 @@ private:
|
||||
nsrefcnt mStackRefCnt;
|
||||
bool mNeedsReleaseAfterStackRefCntRelease;
|
||||
|
||||
CSPErrorQueue mCSPWebConsoleErrorQueue;
|
||||
|
||||
#ifdef DEBUG
|
||||
protected:
|
||||
bool mWillReparent;
|
||||
|
@ -1326,34 +1326,21 @@ nsImageLoadingContent::UntrackImage(imgIRequest* aImage, uint32_t aFlags /* = 0
|
||||
MOZ_ASSERT(aImage == mCurrentRequest || aImage == mPendingRequest,
|
||||
"Why haven't we heard of this request?");
|
||||
|
||||
// We may not be in the document. If we're not in the document because it
|
||||
// has already been unlinked that's fine; the document empties out the tracker
|
||||
// and unlocks all locked images on destruction. If we were really not in the
|
||||
// document we may need to force discarding the image here, since this is the
|
||||
// only chance we have, even though we couldn't possibly have been in the
|
||||
// tracker.
|
||||
// If GetOurDocument() returns null here, we've outlived our document.
|
||||
// That's fine, because the document empties out the tracker and unlocks
|
||||
// all locked images on destruction.
|
||||
nsIDocument* doc = GetOurCurrentDoc();
|
||||
if (aImage == mCurrentRequest) {
|
||||
if (doc && (mCurrentRequestFlags & REQUEST_IS_TRACKED)) {
|
||||
if (doc) {
|
||||
if (aImage == mCurrentRequest && (mCurrentRequestFlags & REQUEST_IS_TRACKED)) {
|
||||
mCurrentRequestFlags &= ~REQUEST_IS_TRACKED;
|
||||
doc->RemoveImage(mCurrentRequest,
|
||||
(aFlags & REQUEST_DISCARD) ? nsIDocument::REQUEST_DISCARD : 0);
|
||||
}
|
||||
else if (aFlags & REQUEST_DISCARD) {
|
||||
// If we're not in the document we may still need to be discarded.
|
||||
aImage->RequestDiscard();
|
||||
}
|
||||
}
|
||||
if (aImage == mPendingRequest) {
|
||||
if (doc && (mPendingRequestFlags & REQUEST_IS_TRACKED)) {
|
||||
if (aImage == mPendingRequest && (mPendingRequestFlags & REQUEST_IS_TRACKED)) {
|
||||
mPendingRequestFlags &= ~REQUEST_IS_TRACKED;
|
||||
doc->RemoveImage(mPendingRequest,
|
||||
(aFlags & REQUEST_DISCARD) ? nsIDocument::REQUEST_DISCARD : 0);
|
||||
}
|
||||
else if (aFlags & REQUEST_DISCARD) {
|
||||
// If we're not in the document we may still need to be discarded.
|
||||
aImage->RequestDiscard();
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "mozilla/dom/HTMLTemplateElement.h"
|
||||
|
||||
using namespace mozilla::dom;
|
||||
using mozilla::AutoJSContext;
|
||||
|
||||
// This macro expects the ownerDocument of content_ to be in scope as
|
||||
// |nsIDocument* doc|
|
||||
@ -383,14 +384,13 @@ nsNodeUtils::CloneNodeImpl(nsINode *aNode, bool aDeep,
|
||||
nsresult
|
||||
nsNodeUtils::CloneAndAdopt(nsINode *aNode, bool aClone, bool aDeep,
|
||||
nsNodeInfoManager *aNewNodeInfoManager,
|
||||
JSContext *aCx, JSObject *aNewScope,
|
||||
JSObject *aReparentScope,
|
||||
nsCOMArray<nsINode> &aNodesWithProperties,
|
||||
nsINode *aParent, nsINode **aResult)
|
||||
{
|
||||
NS_PRECONDITION((!aClone && aNewNodeInfoManager) || !aCx,
|
||||
NS_PRECONDITION((!aClone && aNewNodeInfoManager) || !aReparentScope,
|
||||
"If cloning or not getting a new nodeinfo we shouldn't "
|
||||
"rewrap");
|
||||
NS_PRECONDITION(!aCx || aNewScope, "Must have new scope");
|
||||
NS_PRECONDITION(!aParent || aNode->IsNodeOfType(nsINode::eCONTENT),
|
||||
"Can't insert document or attribute nodes into a parent");
|
||||
|
||||
@ -400,12 +400,13 @@ nsNodeUtils::CloneAndAdopt(nsINode *aNode, bool aClone, bool aDeep,
|
||||
// if aDeep is true, deal with aNode's children (and recurse into their
|
||||
// attributes and children).
|
||||
|
||||
AutoJSContext cx;
|
||||
nsresult rv;
|
||||
JSObject *wrapper;
|
||||
bool isDOMBinding;
|
||||
if (aCx && (wrapper = aNode->GetWrapper()) &&
|
||||
if (aReparentScope && (wrapper = aNode->GetWrapper()) &&
|
||||
!(isDOMBinding = IsDOMObject(wrapper))) {
|
||||
rv = xpc_MorphSlimWrapper(aCx, aNode);
|
||||
rv = xpc_MorphSlimWrapper(cx, aNode);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
@ -528,13 +529,13 @@ nsNodeUtils::CloneAndAdopt(nsINode *aNode, bool aClone, bool aDeep,
|
||||
elem->RecompileScriptEventListeners();
|
||||
}
|
||||
|
||||
if (aCx && wrapper) {
|
||||
if (aReparentScope && wrapper) {
|
||||
if (isDOMBinding) {
|
||||
rv = ReparentWrapper(aCx, wrapper);
|
||||
rv = ReparentWrapper(cx, wrapper);
|
||||
} else {
|
||||
nsIXPConnect *xpc = nsContentUtils::XPConnect();
|
||||
if (xpc) {
|
||||
rv = xpc->ReparentWrappedNativeIfFound(aCx, wrapper, aNewScope, aNode);
|
||||
rv = xpc->ReparentWrappedNativeIfFound(cx, wrapper, aReparentScope, aNode);
|
||||
}
|
||||
}
|
||||
if (NS_FAILED(rv)) {
|
||||
@ -557,7 +558,7 @@ nsNodeUtils::CloneAndAdopt(nsINode *aNode, bool aClone, bool aDeep,
|
||||
cloneChild = cloneChild->GetNextSibling()) {
|
||||
nsCOMPtr<nsINode> child;
|
||||
rv = CloneAndAdopt(cloneChild, aClone, true, nodeInfoManager,
|
||||
aCx, aNewScope, aNodesWithProperties, clone,
|
||||
aReparentScope, aNodesWithProperties, clone,
|
||||
getter_AddRefs(child));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
@ -580,7 +581,7 @@ nsNodeUtils::CloneAndAdopt(nsINode *aNode, bool aClone, bool aDeep,
|
||||
cloneChild = cloneChild->GetNextSibling()) {
|
||||
nsCOMPtr<nsINode> child;
|
||||
rv = CloneAndAdopt(cloneChild, aClone, aDeep, ownerNodeInfoManager,
|
||||
aCx, aNewScope, aNodesWithProperties, cloneContent,
|
||||
aReparentScope, aNodesWithProperties, cloneContent,
|
||||
getter_AddRefs(child));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
@ -152,7 +152,7 @@ public:
|
||||
nsCOMArray<nsINode> &aNodesWithProperties,
|
||||
nsINode **aResult)
|
||||
{
|
||||
return CloneAndAdopt(aNode, true, aDeep, aNewNodeInfoManager, nullptr,
|
||||
return CloneAndAdopt(aNode, true, aDeep, aNewNodeInfoManager,
|
||||
nullptr, aNodesWithProperties, nullptr, aResult);
|
||||
}
|
||||
|
||||
@ -162,14 +162,14 @@ public:
|
||||
static nsresult Clone(nsINode *aNode, bool aDeep, nsINode **aResult)
|
||||
{
|
||||
nsCOMArray<nsINode> dummyNodeWithProperties;
|
||||
return CloneAndAdopt(aNode, true, aDeep, nullptr, nullptr, nullptr,
|
||||
return CloneAndAdopt(aNode, true, aDeep, nullptr, nullptr,
|
||||
dummyNodeWithProperties, aNode->GetParent(), aResult);
|
||||
}
|
||||
|
||||
/**
|
||||
* Walks aNode, its attributes and descendant nodes. If aNewNodeInfoManager is
|
||||
* not null, it is used to create new nodeinfos for the nodes. Also reparents
|
||||
* the XPConnect wrappers for the nodes in aNewScope if aCx is not null.
|
||||
* the XPConnect wrappers for the nodes into aReparentScope if non-null.
|
||||
* aNodesWithProperties will be filled with all the nodes that have
|
||||
* properties.
|
||||
*
|
||||
@ -178,20 +178,18 @@ public:
|
||||
* nodeinfos for aNode and its attributes and
|
||||
* descendants. May be null if the nodeinfos
|
||||
* shouldn't be changed.
|
||||
* @param aCx Context to use for reparenting the wrappers, or null if no
|
||||
* reparenting should be done. Must be null if aNewNodeInfoManager
|
||||
* is null.
|
||||
* @param aNewScope New scope for the wrappers. May be null if aCx is null.
|
||||
* @param aReparentScope New scope for the wrappers, or null if no reparenting
|
||||
* should be done.
|
||||
* @param aNodesWithProperties All nodes (from amongst aNode and its
|
||||
* descendants) with properties.
|
||||
*/
|
||||
static nsresult Adopt(nsINode *aNode, nsNodeInfoManager *aNewNodeInfoManager,
|
||||
JSContext *aCx, JSObject *aNewScope,
|
||||
JSObject *aReparentScope,
|
||||
nsCOMArray<nsINode> &aNodesWithProperties)
|
||||
{
|
||||
nsCOMPtr<nsINode> node;
|
||||
nsresult rv = CloneAndAdopt(aNode, false, true, aNewNodeInfoManager,
|
||||
aCx, aNewScope, aNodesWithProperties,
|
||||
aReparentScope, aNodesWithProperties,
|
||||
nullptr, getter_AddRefs(node));
|
||||
|
||||
nsMutationGuard::DidMutate();
|
||||
@ -269,7 +267,7 @@ private:
|
||||
* Walks aNode, its attributes and, if aDeep is true, its descendant nodes.
|
||||
* If aClone is true the nodes will be cloned. If aNewNodeInfoManager is
|
||||
* not null, it is used to create new nodeinfos for the nodes. Also reparents
|
||||
* the XPConnect wrappers for the nodes in aNewScope if aCx is not null.
|
||||
* the XPConnect wrappers for the nodes into aReparentScope if non-null.
|
||||
* aNodesWithProperties will be filled with all the nodes that have
|
||||
* properties.
|
||||
*
|
||||
@ -282,10 +280,8 @@ private:
|
||||
* nodeinfos for aNode and its attributes and
|
||||
* descendants. May be null if the nodeinfos
|
||||
* shouldn't be changed.
|
||||
* @param aCx Context to use for reparenting the wrappers, or null if no
|
||||
* reparenting should be done. Must be null if aClone is true or
|
||||
* if aNewNodeInfoManager is null.
|
||||
* @param aNewScope New scope for the wrappers. May be null if aCx is null.
|
||||
* @param aReparentScope Scope into which wrappers should be reparented, or
|
||||
* null if no reparenting should be done.
|
||||
* @param aNodesWithProperties All nodes (from amongst aNode and its
|
||||
* descendants) with properties. If aClone is
|
||||
* true every node will be followed by its
|
||||
@ -298,7 +294,7 @@ private:
|
||||
*/
|
||||
static nsresult CloneAndAdopt(nsINode *aNode, bool aClone, bool aDeep,
|
||||
nsNodeInfoManager *aNewNodeInfoManager,
|
||||
JSContext *aCx, JSObject *aNewScope,
|
||||
JSObject *aReparentScope,
|
||||
nsCOMArray<nsINode> &aNodesWithProperties,
|
||||
nsINode *aParent, nsINode **aResult);
|
||||
};
|
||||
|
@ -33,7 +33,6 @@
|
||||
#include "nsFrameSelection.h"
|
||||
#include "nsPIDOMWindow.h"
|
||||
#include "nsPIWindowRoot.h"
|
||||
#include "nsIEnumerator.h"
|
||||
#include "nsIWebNavigation.h"
|
||||
#include "nsIContentViewer.h"
|
||||
#include <algorithm>
|
||||
|
@ -1748,6 +1748,7 @@ SourceMediaStream::AdvanceKnownTracksTime(StreamTime aKnownTime)
|
||||
void
|
||||
SourceMediaStream::FinishWithLockHeld()
|
||||
{
|
||||
mMutex.AssertCurrentThreadOwns();
|
||||
mUpdateFinished = true;
|
||||
if (!mDestroyed) {
|
||||
GraphImpl()->EnsureNextIteration();
|
||||
@ -1757,12 +1758,10 @@ SourceMediaStream::FinishWithLockHeld()
|
||||
void
|
||||
SourceMediaStream::EndAllTrackAndFinish()
|
||||
{
|
||||
{
|
||||
MutexAutoLock lock(mMutex);
|
||||
for (uint32_t i = 0; i < mUpdateTracks.Length(); ++i) {
|
||||
SourceMediaStream::TrackData* data = &mUpdateTracks[i];
|
||||
data->mCommands |= TRACK_END;
|
||||
}
|
||||
MutexAutoLock lock(mMutex);
|
||||
for (uint32_t i = 0; i < mUpdateTracks.Length(); ++i) {
|
||||
SourceMediaStream::TrackData* data = &mUpdateTracks[i];
|
||||
data->mCommands |= TRACK_END;
|
||||
}
|
||||
FinishWithLockHeld();
|
||||
// we will call NotifyFinished() to let GetUserMedia know
|
||||
|
@ -28,7 +28,6 @@ MediaOmxReader::MediaOmxReader(AbstractMediaDecoder *aDecoder) :
|
||||
mHasAudio(false),
|
||||
mVideoSeekTimeUs(-1),
|
||||
mAudioSeekTimeUs(-1),
|
||||
mLastVideoFrame(nullptr),
|
||||
mSkipCount(0)
|
||||
{
|
||||
}
|
||||
@ -114,10 +113,6 @@ nsresult MediaOmxReader::ResetDecode()
|
||||
container->ClearCurrentFrame();
|
||||
}
|
||||
|
||||
if (mLastVideoFrame) {
|
||||
delete mLastVideoFrame;
|
||||
mLastVideoFrame = nullptr;
|
||||
}
|
||||
mOmxDecoder.clear();
|
||||
return NS_OK;
|
||||
}
|
||||
@ -130,12 +125,6 @@ bool MediaOmxReader::DecodeVideoFrame(bool &aKeyframeSkip,
|
||||
uint32_t parsed = 0, decoded = 0;
|
||||
AbstractMediaDecoder::AutoNotifyDecoded autoNotify(mDecoder, parsed, decoded);
|
||||
|
||||
// Throw away the currently buffered frame if we are seeking.
|
||||
if (mLastVideoFrame && mVideoSeekTimeUs != -1) {
|
||||
delete mLastVideoFrame;
|
||||
mLastVideoFrame = nullptr;
|
||||
}
|
||||
|
||||
bool doSeek = mVideoSeekTimeUs != -1;
|
||||
if (doSeek) {
|
||||
aTimeThreshold = mVideoSeekTimeUs;
|
||||
@ -147,18 +136,6 @@ bool MediaOmxReader::DecodeVideoFrame(bool &aKeyframeSkip,
|
||||
frame.mGraphicBuffer = nullptr;
|
||||
frame.mShouldSkip = false;
|
||||
if (!mOmxDecoder->ReadVideo(&frame, aTimeThreshold, aKeyframeSkip, doSeek)) {
|
||||
// We reached the end of the video stream. If we have a buffered
|
||||
// video frame, push it the video queue using the total duration
|
||||
// of the video as the end time.
|
||||
if (mLastVideoFrame) {
|
||||
int64_t durationUs;
|
||||
mOmxDecoder->GetDuration(&durationUs);
|
||||
mLastVideoFrame->mEndTime = (durationUs > mLastVideoFrame->mTime)
|
||||
? durationUs
|
||||
: mLastVideoFrame->mTime;
|
||||
mVideoQueue.Push(mLastVideoFrame);
|
||||
mLastVideoFrame = nullptr;
|
||||
}
|
||||
mVideoQueue.Finish();
|
||||
return false;
|
||||
}
|
||||
@ -244,28 +221,7 @@ bool MediaOmxReader::DecodeVideoFrame(bool &aKeyframeSkip,
|
||||
decoded++;
|
||||
NS_ASSERTION(decoded <= parsed, "Expect to decode fewer frames than parsed in MediaPlugin...");
|
||||
|
||||
// Seeking hack
|
||||
if (mLastVideoFrame && mLastVideoFrame->mTime > v->mTime) {
|
||||
delete mLastVideoFrame;
|
||||
mLastVideoFrame = v;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Since MPAPI doesn't give us the end time of frames, we keep one frame
|
||||
// buffered in MediaOmxReader and push it into the queue as soon
|
||||
// we read the following frame so we can use that frame's start time as
|
||||
// the end time of the buffered frame.
|
||||
if (!mLastVideoFrame) {
|
||||
mLastVideoFrame = v;
|
||||
continue;
|
||||
}
|
||||
|
||||
mLastVideoFrame->mEndTime = v->mTime;
|
||||
|
||||
mVideoQueue.Push(mLastVideoFrame);
|
||||
|
||||
// Buffer the current frame we just decoded.
|
||||
mLastVideoFrame = v;
|
||||
mVideoQueue.Push(v);
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -31,7 +31,6 @@ class MediaOmxReader : public MediaDecoderReader
|
||||
nsIntSize mInitialFrame;
|
||||
int64_t mVideoSeekTimeUs;
|
||||
int64_t mAudioSeekTimeUs;
|
||||
VideoData *mLastVideoFrame;
|
||||
int32_t mSkipCount;
|
||||
public:
|
||||
MediaOmxReader(AbstractMediaDecoder* aDecoder);
|
||||
|
@ -21,7 +21,7 @@ protected:
|
||||
// OMXCodec will crash.
|
||||
// So we need few enough buffers in the queue that all buffers will be
|
||||
// returned before OMXCodec begins shutdown.
|
||||
uint32_t GetAmpleVideoFrames() { return 2; }
|
||||
uint32_t GetAmpleVideoFrames() { return 1; }
|
||||
};
|
||||
|
||||
} // namespace mozilla
|
||||
|