Merge m-c to m-i

This commit is contained in:
Phil Ringnalda 2016-02-05 19:42:00 -08:00
commit 3cd9dfa77b
729 changed files with 16969 additions and 16664 deletions

3
.gitignore vendored
View File

@ -10,6 +10,9 @@ ID
.DS_Store*
*.pdb
# Allow the id locale directory for loop ('ID' matches this normally)
!browser/extensions/loop/chrome/locale/id
# Vim swap files.
.*.sw[a-z]

View File

@ -2,12 +2,4 @@
"extends": [
"../toolkit/.eslintrc"
],
"rules": {
// No redeclaring variables
"no-redeclare": 2,
// Functions must always return something or nothing
"consistent-return": 2,
}
}

View File

@ -27,11 +27,11 @@ const OBSERVER_TOPICS = [
function log(msg) {
//dump("FXA: " + msg + "\n");
};
}
function error(msg) {
console.log("Firefox Account Error: " + msg + "\n");
};
}
function getPreviousAccountNameHash() {
try {

View File

@ -352,7 +352,7 @@ var PlacesCommandHook = {
var parent = aParent !== undefined ?
aParent : PlacesUtils.unfiledBookmarksFolderId;
var descAnno = { name: PlacesUIUtils.DESCRIPTION_ANNO, value: description };
var txn = new PlacesCreateBookmarkTransaction(uri, parent,
var txn = new PlacesCreateBookmarkTransaction(uri, parent,
PlacesUtils.bookmarks.DEFAULT_INDEX,
title, null, [descAnno]);
PlacesUtils.transactionManager.doTransaction(txn);
@ -414,7 +414,7 @@ var PlacesCommandHook = {
charset = aBrowser.characterSet;
}
catch (e) {
Components.utils.reportError(e);
Components.utils.reportError(e);
}
if (aShowEditUI) {
@ -433,7 +433,7 @@ var PlacesCommandHook = {
// Set the character-set
if (charset && !PrivateBrowsingUtils.isBrowserPrivate(aBrowser))
PlacesUtils.setCharsetForURI(makeURI(url.href), charset);
PlacesUtils.setCharsetForURI(makeURI(url.href), charset);
}
// Revert the contents of the location bar
@ -478,7 +478,7 @@ var PlacesCommandHook = {
},
/**
* Adds a bookmark to the page loaded in the current tab.
* Adds a bookmark to the page loaded in the current tab.
*/
bookmarkCurrentPage: function PCH_bookmarkCurrentPage(aShowEditUI, aParent) {
this.bookmarkPage(gBrowser.selectedBrowser, aParent, aShowEditUI);
@ -540,7 +540,7 @@ var PlacesCommandHook = {
},
/**
* Adds a folder with bookmarks to all of the currently open tabs in this
* Adds a folder with bookmarks to all of the currently open tabs in this
* window.
*/
bookmarkCurrentPages: function PCH_bookmarkCurrentPages() {
@ -570,7 +570,7 @@ var PlacesCommandHook = {
},
/**
* Adds a Live Bookmark to a feed associated with the current page.
* Adds a Live Bookmark to a feed associated with the current page.
* @param url
* The nsIURI of the page the feed was attached to
* @title title
@ -604,7 +604,7 @@ var PlacesCommandHook = {
}),
/**
* Opens the Places Organizer.
* Opens the Places Organizer.
* @param aLeftPaneRoot
* The query to select in the organizer window - options
* are: History, AllBookmarks, BookmarksMenu, BookmarksToolbar,
@ -615,7 +615,7 @@ var PlacesCommandHook = {
// Due to bug 528706, getMostRecentWindow can return closed windows.
if (!organizer || organizer.closed) {
// No currently open places window, so open one with the specified mode.
openDialog("chrome://browser/content/places/places.xul",
openDialog("chrome://browser/content/places/places.xul",
"", "chrome,toolbar=yes,dialog=no,resizable", aLeftPaneRoot);
}
else {
@ -826,7 +826,7 @@ var BookmarksEventHandler = {
* Handler for command event for an item in the bookmarks toolbar.
* Menus and submenus from the folder buttons bubble up to this handler.
* Opens the item.
* @param aEvent
* @param aEvent
* DOMEvent for the command
* @param aView
* The places view which aEvent should be associated with.
@ -908,7 +908,7 @@ var PlacesMenuDNDHandler = {
/**
* Called when the user enters the <menu> element during a drag.
* @param event
* The DragEnter event that spawned the opening.
* The DragEnter event that spawned the opening.
*/
onDragEnter: function PMDH_onDragEnter(event) {
// Opening menus in a Places popup is handled by the view itself.
@ -979,7 +979,7 @@ var PlacesMenuDNDHandler = {
/**
* Determines if a XUL element represents a static container.
* @returns true if the element is a container element (menu or
* @returns true if the element is a container element (menu or
*` menu-toolbarbutton), false otherwise.
*/
_isStaticContainer: function PMDH__isContainer(node) {
@ -996,7 +996,7 @@ var PlacesMenuDNDHandler = {
/**
* Called when the user drags over the <menu> element.
* @param event
* The DragOver event.
* The DragOver event.
*/
onDragOver: function PMDH_onDragOver(event) {
let ip = new InsertionPoint(PlacesUtils.bookmarksMenuFolderId,
@ -1011,7 +1011,7 @@ var PlacesMenuDNDHandler = {
/**
* Called when the user drops on the <menu> element.
* @param event
* The Drop event.
* The Drop event.
*/
onDrop: function PMDH_onDrop(event) {
// Put the item at the end of bookmark menu.

View File

@ -3029,7 +3029,7 @@ function populateMirrorTabMenu(popup) {
item.addEventListener("command", mirrorMenuItemClicked);
popup.appendChild(item);
});
};
}
function getWebNavigation()
{
@ -5501,7 +5501,7 @@ function handleDroppedLink(event, url, name)
// Keep the event from being handled by the dragDrop listeners
// built-in to gecko if they happen to be above us.
event.preventDefault();
};
}
function BrowserSetForcedCharacterSet(aCharset)
{
@ -7189,14 +7189,14 @@ function getNotificationBox(aWindow) {
if (foundBrowser)
return gBrowser.getNotificationBox(foundBrowser)
return null;
};
}
function getTabModalPromptBox(aWindow) {
var foundBrowser = gBrowser.getBrowserForDocument(aWindow.document);
if (foundBrowser)
return gBrowser.getTabModalPromptBox(foundBrowser);
return null;
};
}
/* DEPRECATED */
function getBrowser() {

View File

@ -130,7 +130,7 @@ var handleContentContextMenu = function (event) {
disableSetDesktopBg = disableSetDesktopBackground(event.target);
try {
let imageCache =
let imageCache =
Cc["@mozilla.org/image/tools;1"].getService(Ci.imgITools)
.getImgCacheForDocument(doc);
let props =

View File

@ -108,7 +108,7 @@ pageInfoTreeView.prototype = {
this,
this.data,
treecol.index,
function textComparator(a, b) { return (a || "").toLowerCase().localeCompare((b || "").toLowerCase()); },
function textComparator(a, b) { return (a || "").toLowerCase().localeCompare((b || "").toLowerCase()); },
this.sortcol,
this.sortdir
);

View File

@ -127,7 +127,7 @@ var security = {
// No mapping required
return name;
},
/**
* Open the cookie manager window
*/
@ -183,7 +183,7 @@ function securityOnLoad(uri, windowInfo) {
/* Set Identity section text */
setText("security-identity-domain-value", info.hostName);
var owner, verifier;
if (info.cert && !info.isBroken) {
// Try to pull out meaningful values. Technically these fields are optional
@ -231,7 +231,7 @@ function securityOnLoad(uri, windowInfo) {
hostHasCookies(uri) ? yesStr : noStr);
setText("security-privacy-passwords-value",
realmHasPasswords(uri) ? yesStr : noStr);
var visitCount = previousVisitCount(info.hostName);
if(visitCount > 1) {
setText("security-privacy-history-value",
@ -242,7 +242,7 @@ function securityOnLoad(uri, windowInfo) {
pageInfoBundle.getString("securityOneVisit"));
}
else {
setText("security-privacy-history-value", noStr);
setText("security-privacy-history-value", noStr);
}
/* Set the Technical Detail section messages */
@ -283,7 +283,7 @@ function securityOnLoad(uri, windowInfo) {
}
setText("security-technical-shortform", hdr);
setText("security-technical-longform1", msg1);
setText("security-technical-longform2", msg2);
setText("security-technical-longform2", msg2);
}
function setText(id, value)
@ -338,13 +338,13 @@ function realmHasPasswords(uri) {
function previousVisitCount(host, endTimeReference) {
if (!host)
return false;
var historyService = Components.classes["@mozilla.org/browser/nav-history-service;1"]
.getService(Components.interfaces.nsINavHistoryService);
var options = historyService.getNewQueryOptions();
options.resultType = options.RESULTS_AS_VISIT;
// Search for visits to this host before today
var query = historyService.getNewQuery();
query.endTimeReference = query.TIME_RELATIVE_TODAY;

View File

@ -121,7 +121,7 @@ var Change = {
_updateStatus: function Change__updateStatus(str, state) {
this._updateStatusWithString(this._str(str), state);
},
_updateStatusWithString: function Change__updateStatusWithString(string, state) {
this._statusRow.hidden = false;
this._status.value = string;

View File

@ -5380,7 +5380,7 @@
let averageInterval = 0;
for (let i = 1; i < frameCount; i++) {
averageInterval += intervals[i];
};
}
averageInterval = averageInterval / (frameCount - 1);
Services.telemetry.getHistogramById("FX_TAB_ANIM_ANY_FRAME_INTERVAL_MS").add(averageInterval);

View File

@ -7,9 +7,6 @@ var gTestBrowser = null;
var config = {};
add_task(function* () {
Services.prefs.setIntPref("media.gmp.log.level", 0);
Services.prefs.setBoolPref("extensions.logging.enabled", true);
// The test harness sets MOZ_CRASHREPORTER_NO_REPORT, which disables plugin
// crash reports. This test needs them enabled. The test also needs a mock
// report server, and fortunately one is already set up by toolkit/
@ -29,8 +26,6 @@ add_task(function* () {
Services.prefs.setIntPref("dom.ipc.plugins.timeoutSecs", 0);
registerCleanupFunction(Task.async(function*() {
Services.prefs.clearUserPref("extensions.logging.enabled");
Services.prefs.clearUserPref("media.gmp.log.level");
Services.prefs.clearUserPref("dom.ipc.plugins.timeoutSecs");
env.set("MOZ_CRASHREPORTER_NO_REPORT", noReport);
env.set("MOZ_CRASHREPORTER_URL", serverUrl);

View File

@ -1591,7 +1591,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
]]></destructor>
<field name="progressmeter" readonly="true">
document.getElementById("addon-progress-notification-progressmeter");
document.getElementById("addon-progress-notification-progressmeter");
</field>
<field name="progresstext" readonly="true">
document.getElementById("addon-progress-notification-progresstext");

View File

@ -114,8 +114,8 @@ function openUILink(url, event, aIgnoreButton, aIgnoreAlt, aAllowThirdPartyFixup
*
* Middle-clicking is the same as Ctrl+clicking (it opens a new tab).
*
* Exceptions:
* - Alt is ignored for menu items selected using the keyboard so you don't accidentally save stuff.
* Exceptions:
* - Alt is ignored for menu items selected using the keyboard so you don't accidentally save stuff.
* (Currently, the Alt isn't sent here at all for menu items, but that will change in bug 126189.)
* - Alt is hard to use in context menus, because pressing Alt closes the menu.
* - Alt can't be used on the bookmarks toolbar because Alt is used for "treat this as something draggable".
@ -416,7 +416,7 @@ function closeMenus(node)
}
// Gather all descendent text under given document node.
function gatherTextUnder ( root )
function gatherTextUnder ( root )
{
var text = "";
var node = root.firstChild;
@ -673,7 +673,7 @@ function makeURLAbsolute(aBase, aUrl)
* This will be used as the referrer. There will be no security check.
* @param [optional] aReferrerPolicy
* Referrer policy - Ci.nsIHttpChannel.REFERRER_POLICY_*.
*/
*/
function openNewTabWith(aURL, aDocument, aPostData, aEvent,
aAllowThirdPartyFixup, aReferrer, aReferrerPolicy) {
@ -728,7 +728,7 @@ function openHelpLink(aHelpTopic, aCalledFromModal, aWhere) {
}
function openPrefsHelp() {
// non-instant apply prefwindows are usually modal, so we can't open in the topmost window,
// non-instant apply prefwindows are usually modal, so we can't open in the topmost window,
// since its probably behind the window.
var instantApply = getBoolPref("browser.preferences.instantApply");

View File

@ -17,7 +17,7 @@ var panelProgressListener = {
aCurSelfProgress, aMaxSelfProgress,
aCurTotalProgress, aMaxTotalProgress) {
},
onStateChange : function(aWebProgress, aRequest, aStateFlags, aStatus)
{
if (!aRequest)
@ -27,7 +27,7 @@ var panelProgressListener = {
if (aStatus == NS_NET_STATUS_READ_FROM || aStatus == NS_NET_STATUS_WROTE_TO)
return;
if (aStateFlags & Ci.nsIWebProgressListener.STATE_START &&
if (aStateFlags & Ci.nsIWebProgressListener.STATE_START &&
aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK) {
window.parent.document.getElementById('sidebar-throbber').setAttribute("loading", "true");
}
@ -45,7 +45,7 @@ var panelProgressListener = {
onStatusChange : function(aWebProgress, aRequest, aStatus, aMessage) {
},
onSecurityChange : function(aWebProgress, aRequest, aState) {
onSecurityChange : function(aWebProgress, aRequest, aState) {
},
QueryInterface : function(aIID)

View File

@ -19,7 +19,7 @@ pref("app.update.promptWaitTime", 604800);
// attempts fail.
pref("app.update.url.manual", "https://www.mozilla.org/firefox/aurora/");
// A default value for the "More information about this update" link
// supplied in the "An update is available" page of the update wizard.
// supplied in the "An update is available" page of the update wizard.
pref("app.update.url.details", "https://www.mozilla.org/firefox/aurora/");
// The number of days a binary is permitted to be old

View File

@ -17,7 +17,7 @@ pref("app.update.promptWaitTime", 43200);
// attempts fail.
pref("app.update.url.manual", "https://nightly.mozilla.org");
// A default value for the "More information about this update" link
// supplied in the "An update is available" page of the update wizard.
// supplied in the "An update is available" page of the update wizard.
pref("app.update.url.details", "https://nightly.mozilla.org");
// The number of days a binary is permitted to be old

View File

@ -16,7 +16,7 @@ pref("app.update.promptWaitTime", 172800);
// attempts fail.
pref("app.update.url.manual", "https://www.mozilla.org/firefox/");
// A default value for the "More information about this update" link
// supplied in the "An update is available" page of the update wizard.
// supplied in the "An update is available" page of the update wizard.
pref("app.update.url.details", "https://www.mozilla.org/%LOCALE%/firefox/notes");
// The number of days a binary is permitted to be old

View File

@ -16,7 +16,7 @@ pref("app.update.promptWaitTime", 86400);
// attempts fail.
pref("app.update.url.manual", "https://nightly.mozilla.org");
// A default value for the "More information about this update" link
// supplied in the "An update is available" page of the update wizard.
// supplied in the "An update is available" page of the update wizard.
pref("app.update.url.details", "https://nightly.mozilla.org");
// The number of days a binary is permitted to be old

View File

@ -180,6 +180,15 @@ var CustomizableUIInternal = {
this._introduceNewBuiltinWidgets();
this._markObsoleteBuiltinButtonsSeen();
/**
* Please be advised that adding items to the panel by default could
* cause CART talos test regressions. This might happen when the
* number of items in the panel causes the area to become "scrollable"
* during the last phases of the transition. See bug 1230671 for an
* example of this. Be sure that what you're adding really needs to go
* into the panel by default, and if it does, consider swapping
* something out for it.
*/
let panelPlacements = [
"edit-controls",
"zoom-controls",
@ -4162,7 +4171,7 @@ OverflowableToolbar.prototype = {
this._toolbar.setAttribute("overflowing", "true");
}
child = prevChild;
};
}
let win = this._target.ownerDocument.defaultView;
win.UpdateUrlbarSearchSplitterState();

View File

@ -325,13 +325,34 @@ const CustomizableWidgets = [
let formatArgs = ["android", "ios"].map(os => {
let link = doc.createElement("label");
link.textContent = bundle.getString(`appMenuRemoteTabs.mobilePromo.${os}`)
link.setAttribute("href", Services.prefs.getCharPref(`identity.mobilepromo.${os}`) + "synced-tabs");
link.setAttribute("mobile-promo-os", os);
link.className = "text-link remotetabs-promo-link";
return link.outerHTML;
});
// Put it all together...
let contents = bundle.getFormattedString("appMenuRemoteTabs.mobilePromo", formatArgs);
doc.getElementById("PanelUI-remotetabs-mobile-promo").innerHTML = contents;
let promoParentElt = doc.getElementById("PanelUI-remotetabs-mobile-promo");
promoParentElt.innerHTML = contents;
// We manually manage the "click" event to open the promo links because
// allowing the "text-link" widget handle it has 2 problems: (1) it only
// supports button 0 and (2) it's tricky to intercept when it does the
// open and auto-close the panel. (1) can probably be fixed, but (2) is
// trickier without hard-coding here the knowledge of exactly what buttons
// it does support.
// So we allow left and middle clicks to open the link in a new tab and
// close the panel; not setting a "href" attribute prevents the text-link
// widget handling it, and we build the final URL in the click handler to
// make testing easier (ie, so tests can change the pref after the links
// were created and have the new pref value used.)
promoParentElt.addEventListener("click", e => {
let os = e.target.getAttribute("mobile-promo-os");
if (!os || e.button > 1) {
return;
}
let link = Services.prefs.getCharPref(`identity.mobilepromo.${os}`) + "synced-tabs";
doc.defaultView.openUILinkIn(link, "tab");
CustomizableUI.hidePanelForNode(e.target);
});
},
onViewShowing(aEvent) {
let doc = aEvent.target.ownerDocument;
@ -728,7 +749,7 @@ const CustomizableWidgets = [
zoomResetButton.setAttribute("label", CustomizableUI.getLocalizedProperty(
buttons[1], "label", [updateDisplay ? zoomFactor : 100]
));
};
}
// Register ourselves with the service so we know when the zoom prefs change.
Services.obs.addObserver(updateZoomResetButton, "browser-fullZoom:zoomChange", false);

View File

@ -82,7 +82,7 @@ function CustomizeMode(aWindow) {
Services.prefs.addObserver(kDrawInTitlebarPref, this, false);
}
this.window.addEventListener("unload", this);
};
}
CustomizeMode.prototype = {
_changed: false,

View File

@ -1,62 +1,62 @@
/* 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";
const DEFAULT_THEME_ID = "{972ce4c6-7e08-4474-a285-3208198ce6fd}";
const {LightweightThemeManager} = Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm", {});
add_task(function* () {
Services.prefs.clearUserPref("lightweightThemes.usedThemes");
Services.prefs.clearUserPref("lightweightThemes.recommendedThemes");
LightweightThemeManager.clearBuiltInThemes();
yield startCustomizing();
let themesButton = document.getElementById("customization-lwtheme-button");
let popup = document.getElementById("customization-lwtheme-menu");
let popupShownPromise = popupShown(popup);
EventUtils.synthesizeMouseAtCenter(themesButton, {});
info("Clicked on themes button");
yield popupShownPromise;
let header = document.getElementById("customization-lwtheme-menu-header");
let recommendedHeader = document.getElementById("customization-lwtheme-menu-recommended");
is(header.nextSibling.nextSibling, recommendedHeader,
"There should only be one theme (default) in the 'My Themes' section by default");
is(header.nextSibling.theme.id, DEFAULT_THEME_ID, "That theme should be the default theme");
let firstLWTheme = recommendedHeader.nextSibling;
let firstLWThemeId = firstLWTheme.theme.id;
let themeChangedPromise = promiseObserverNotified("lightweight-theme-changed");
firstLWTheme.doCommand();
info("Clicked on first theme");
yield themeChangedPromise;
popupShownPromise = popupShown(popup);
EventUtils.synthesizeMouseAtCenter(themesButton, {});
info("Clicked on themes button");
yield popupShownPromise;
is(header.nextSibling.theme.id, DEFAULT_THEME_ID, "The first theme should be the Default theme");
let installedThemeId = header.nextSibling.nextSibling.theme.id;
ok(installedThemeId.startsWith(firstLWThemeId),
"The second theme in the 'My Themes' section should be the newly installed theme: " +
"Installed theme id: " + installedThemeId + "; First theme ID: " + firstLWThemeId);
is(header.nextSibling.nextSibling.nextSibling, recommendedHeader,
"There should be two themes in the 'My Themes' section");
let defaultTheme = header.nextSibling;
defaultTheme.doCommand();
is(Services.prefs.getCharPref("lightweightThemes.selectedThemeID"), "", "No lwtheme should be selected");
});
add_task(function* asyncCleanup() {
yield endCustomizing();
Services.prefs.clearUserPref("lightweightThemes.usedThemes");
Services.prefs.clearUserPref("lightweightThemes.recommendedThemes");
});
/* 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";
const DEFAULT_THEME_ID = "{972ce4c6-7e08-4474-a285-3208198ce6fd}";
const {LightweightThemeManager} = Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm", {});
add_task(function* () {
Services.prefs.clearUserPref("lightweightThemes.usedThemes");
Services.prefs.clearUserPref("lightweightThemes.recommendedThemes");
LightweightThemeManager.clearBuiltInThemes();
yield startCustomizing();
let themesButton = document.getElementById("customization-lwtheme-button");
let popup = document.getElementById("customization-lwtheme-menu");
let popupShownPromise = popupShown(popup);
EventUtils.synthesizeMouseAtCenter(themesButton, {});
info("Clicked on themes button");
yield popupShownPromise;
let header = document.getElementById("customization-lwtheme-menu-header");
let recommendedHeader = document.getElementById("customization-lwtheme-menu-recommended");
is(header.nextSibling.nextSibling, recommendedHeader,
"There should only be one theme (default) in the 'My Themes' section by default");
is(header.nextSibling.theme.id, DEFAULT_THEME_ID, "That theme should be the default theme");
let firstLWTheme = recommendedHeader.nextSibling;
let firstLWThemeId = firstLWTheme.theme.id;
let themeChangedPromise = promiseObserverNotified("lightweight-theme-changed");
firstLWTheme.doCommand();
info("Clicked on first theme");
yield themeChangedPromise;
popupShownPromise = popupShown(popup);
EventUtils.synthesizeMouseAtCenter(themesButton, {});
info("Clicked on themes button");
yield popupShownPromise;
is(header.nextSibling.theme.id, DEFAULT_THEME_ID, "The first theme should be the Default theme");
let installedThemeId = header.nextSibling.nextSibling.theme.id;
ok(installedThemeId.startsWith(firstLWThemeId),
"The second theme in the 'My Themes' section should be the newly installed theme: " +
"Installed theme id: " + installedThemeId + "; First theme ID: " + firstLWThemeId);
is(header.nextSibling.nextSibling.nextSibling, recommendedHeader,
"There should be two themes in the 'My Themes' section");
let defaultTheme = header.nextSibling;
defaultTheme.doCommand();
is(Services.prefs.getCharPref("lightweightThemes.selectedThemeID"), "", "No lwtheme should be selected");
});
add_task(function* asyncCleanup() {
yield endCustomizing();
Services.prefs.clearUserPref("lightweightThemes.usedThemes");
Services.prefs.clearUserPref("lightweightThemes.recommendedThemes");
});

View File

@ -1,82 +1,82 @@
"use strict";
// NB: This uses some ugly hacks to get into the CUI module from elsewhere...
// don't try this at home, kids.
function test() {
// Customize something to make sure stuff changed:
CustomizableUI.addWidgetToArea("feed-button", CustomizableUI.AREA_NAVBAR);
let CustomizableUIBSPass = Cu.import("resource:///modules/CustomizableUI.jsm", {});
is(CustomizableUIBSPass.gFuturePlacements.size, 0,
"All future placements should be dealt with by now.");
let {CustomizableUIInternal, gFuturePlacements, gPalette} = CustomizableUIBSPass;
// Force us to have a saved state:
CustomizableUIInternal.saveState();
CustomizableUIInternal.loadSavedState();
CustomizableUIInternal._introduceNewBuiltinWidgets();
is(gFuturePlacements.size, 0,
"No change to future placements initially.");
let currentVersion = CustomizableUIBSPass.kVersion;
// Add our widget to the defaults:
let testWidgetNew = {
id: "test-messing-with-default-placements-new-pref",
label: "Test messing with default placements - pref-based",
defaultArea: CustomizableUI.AREA_NAVBAR,
introducedInVersion: "pref",
};
let normalizedWidget = CustomizableUIInternal.normalizeWidget(testWidgetNew,
CustomizableUI.SOURCE_BUILTIN);
ok(normalizedWidget, "Widget should be normalizable");
if (!normalizedWidget) {
return;
}
CustomizableUIBSPass.gPalette.set(testWidgetNew.id, normalizedWidget);
// Now adjust default placements for area:
let navbarArea = CustomizableUIBSPass.gAreas.get(CustomizableUI.AREA_NAVBAR);
let navbarPlacements = navbarArea.get("defaultPlacements");
navbarPlacements.splice(navbarPlacements.indexOf("bookmarks-menu-button") + 1, 0, testWidgetNew.id);
let savedPlacements = CustomizableUIBSPass.gSavedState.placements[CustomizableUI.AREA_NAVBAR];
// Then call the re-init routine so we re-add the builtin widgets
CustomizableUIInternal._introduceNewBuiltinWidgets();
is(gFuturePlacements.size, 1,
"Should have 1 more future placement");
let futureNavbarPlacements = gFuturePlacements.get(CustomizableUI.AREA_NAVBAR);
ok(futureNavbarPlacements, "Should have placements for nav-bar");
if (futureNavbarPlacements) {
ok(futureNavbarPlacements.has(testWidgetNew.id), "widget should be in future placements");
}
CustomizableUIInternal._placeNewDefaultWidgetsInArea(CustomizableUI.AREA_NAVBAR);
let indexInSavedPlacements = savedPlacements.indexOf(testWidgetNew.id);
info("Saved placements: " + savedPlacements.join(', '));
isnot(indexInSavedPlacements, -1, "Widget should have been inserted");
is(indexInSavedPlacements, savedPlacements.indexOf("bookmarks-menu-button") + 1,
"Widget should be in the right place.");
if (futureNavbarPlacements) {
ok(!futureNavbarPlacements.has(testWidgetNew.id), "widget should be out of future placements");
}
if (indexInSavedPlacements != -1) {
savedPlacements.splice(indexInSavedPlacements, 1);
}
gFuturePlacements.delete(CustomizableUI.AREA_NAVBAR);
let indexInDefaultPlacements = navbarPlacements.indexOf(testWidgetNew.id);
if (indexInDefaultPlacements != -1) {
navbarPlacements.splice(indexInDefaultPlacements, 1);
}
gPalette.delete(testWidgetNew.id);
CustomizableUI.reset();
}
"use strict";
// NB: This uses some ugly hacks to get into the CUI module from elsewhere...
// don't try this at home, kids.
function test() {
// Customize something to make sure stuff changed:
CustomizableUI.addWidgetToArea("feed-button", CustomizableUI.AREA_NAVBAR);
let CustomizableUIBSPass = Cu.import("resource:///modules/CustomizableUI.jsm", {});
is(CustomizableUIBSPass.gFuturePlacements.size, 0,
"All future placements should be dealt with by now.");
let {CustomizableUIInternal, gFuturePlacements, gPalette} = CustomizableUIBSPass;
// Force us to have a saved state:
CustomizableUIInternal.saveState();
CustomizableUIInternal.loadSavedState();
CustomizableUIInternal._introduceNewBuiltinWidgets();
is(gFuturePlacements.size, 0,
"No change to future placements initially.");
let currentVersion = CustomizableUIBSPass.kVersion;
// Add our widget to the defaults:
let testWidgetNew = {
id: "test-messing-with-default-placements-new-pref",
label: "Test messing with default placements - pref-based",
defaultArea: CustomizableUI.AREA_NAVBAR,
introducedInVersion: "pref",
};
let normalizedWidget = CustomizableUIInternal.normalizeWidget(testWidgetNew,
CustomizableUI.SOURCE_BUILTIN);
ok(normalizedWidget, "Widget should be normalizable");
if (!normalizedWidget) {
return;
}
CustomizableUIBSPass.gPalette.set(testWidgetNew.id, normalizedWidget);
// Now adjust default placements for area:
let navbarArea = CustomizableUIBSPass.gAreas.get(CustomizableUI.AREA_NAVBAR);
let navbarPlacements = navbarArea.get("defaultPlacements");
navbarPlacements.splice(navbarPlacements.indexOf("bookmarks-menu-button") + 1, 0, testWidgetNew.id);
let savedPlacements = CustomizableUIBSPass.gSavedState.placements[CustomizableUI.AREA_NAVBAR];
// Then call the re-init routine so we re-add the builtin widgets
CustomizableUIInternal._introduceNewBuiltinWidgets();
is(gFuturePlacements.size, 1,
"Should have 1 more future placement");
let futureNavbarPlacements = gFuturePlacements.get(CustomizableUI.AREA_NAVBAR);
ok(futureNavbarPlacements, "Should have placements for nav-bar");
if (futureNavbarPlacements) {
ok(futureNavbarPlacements.has(testWidgetNew.id), "widget should be in future placements");
}
CustomizableUIInternal._placeNewDefaultWidgetsInArea(CustomizableUI.AREA_NAVBAR);
let indexInSavedPlacements = savedPlacements.indexOf(testWidgetNew.id);
info("Saved placements: " + savedPlacements.join(', '));
isnot(indexInSavedPlacements, -1, "Widget should have been inserted");
is(indexInSavedPlacements, savedPlacements.indexOf("bookmarks-menu-button") + 1,
"Widget should be in the right place.");
if (futureNavbarPlacements) {
ok(!futureNavbarPlacements.has(testWidgetNew.id), "widget should be out of future placements");
}
if (indexInSavedPlacements != -1) {
savedPlacements.splice(indexInSavedPlacements, 1);
}
gFuturePlacements.delete(CustomizableUI.AREA_NAVBAR);
let indexInDefaultPlacements = navbarPlacements.indexOf(testWidgetNew.id);
if (indexInDefaultPlacements != -1) {
navbarPlacements.splice(indexInDefaultPlacements, 1);
}
gPalette.delete(testWidgetNew.id);
CustomizableUI.reset();
}

View File

@ -63,7 +63,7 @@ function promiseObserverNotification(aObserver) {
Services.obs.removeObserver(notificationCallback, aObserver, false);
clearTimeout(timeoutId);
deferred.resolve();
};
}
let timeoutId = setTimeout(() => {
Services.obs.removeObserver(notificationCallback, aObserver, false);
deferred.reject("Notification '" + aObserver + "' did not happen within 20 seconds.");
@ -83,7 +83,7 @@ function promiseTabSelect() {
container.removeEventListener("TabSelect", callback);
clearTimeout(timeoutId);
executeSoon(deferred.resolve);
};
}
container.addEventListener("TabSelect", callback);
return deferred.promise;
}

View File

@ -27,7 +27,7 @@ add_task(function* testPrivateBrowsingCustomizeModeWidget() {
"Widget should not appear as unused in private window");
yield promiseWindowClosed(privateWindow);
CustomizableUI.destroyWidget(kWidgetId);
CustomizableUI.destroyWidget(kWidgetId);
});
add_task(function* asyncCleanup() {

View File

@ -4,6 +4,8 @@
"use strict";
requestLongerTimeout(2);
let {SyncedTabs} = Cu.import("resource://services-sync/SyncedTabs.jsm", {});
XPCOMUtils.defineLazyModuleGetter(this, "UITour", "resource:///modules/UITour.jsm");
@ -130,6 +132,69 @@ add_task(function* () {
yield openPrefsFromMenuPanel("PanelUI-remotetabs-reauthsync", "syncbutton")
});
// Test the mobile promo links
add_task(function* () {
// change the preferences for the mobile links.
Services.prefs.setCharPref("identity.mobilepromo.android", "http://example.com/?os=android&tail=");
Services.prefs.setCharPref("identity.mobilepromo.ios", "http://example.com/?os=ios&tail=");
mockedInternal.getTabClients = () => [];
mockedInternal.syncTabs = () => Promise.resolve();
document.getElementById("sync-reauth-state").hidden = true;
document.getElementById("sync-setup-state").hidden = true;
document.getElementById("sync-syncnow-state").hidden = false;
CustomizableUI.addWidgetToArea("sync-button", CustomizableUI.AREA_PANEL);
let syncPanel = document.getElementById("PanelUI-remotetabs");
let links = syncPanel.querySelectorAll(".remotetabs-promo-link");
is(links.length, 2, "found 2 links as expected");
// test each link and left and middle mouse buttons
for (let link of links) {
for (let button = 0; button < 2; button++) {
yield PanelUI.show();
EventUtils.sendMouseEvent({ type: "click", button }, link, window);
// the panel should have been closed.
ok(!isPanelUIOpen(), "click closed the panel");
// should be a new tab - wait for the load.
is(gBrowser.tabs.length, 2, "there's a new tab");
yield new Promise(resolve => {
if (gBrowser.selectedBrowser.currentURI.spec == "about:blank") {
gBrowser.selectedBrowser.addEventListener("load", function listener(e) {
gBrowser.selectedBrowser.removeEventListener("load", listener, true);
resolve();
}, true);
return;
}
// the new tab has already transitioned away from about:blank so we
// are good to go.
resolve();
});
let os = link.getAttribute("mobile-promo-os");
let expectedUrl = `http://example.com/?os=${os}&tail=synced-tabs`;
is(gBrowser.selectedBrowser.currentURI.spec, expectedUrl, "correct URL");
gBrowser.removeTab(gBrowser.selectedTab);
}
}
// test each link and right mouse button - should be a noop.
yield PanelUI.show();
for (let link of links) {
EventUtils.sendMouseEvent({ type: "click", button: 2 }, link, window);
// the panel should still be open
ok(isPanelUIOpen(), "panel remains open after right-click");
is(gBrowser.tabs.length, 1, "no new tab was opened");
}
PanelUI.hide();
Services.prefs.clearUserPref("identity.mobilepromo.android");
Services.prefs.clearUserPref("identity.mobilepromo.ios");
});
// Test the "Sync Now" button
add_task(function* () {
let nSyncs = 0;

View File

@ -38,7 +38,7 @@ function test() {
placementArraysEqual(CustomizableUI.AREA_NAVBAR, newSavedState.placements[CustomizableUI.AREA_NAVBAR],
CustomizableUI.getWidgetIdsInArea(CustomizableUI.AREA_NAVBAR));
}
};
}
registerCleanupFunction(function() {
let backstagePass = Cu.import("resource:///modules/CustomizableUI.jsm", {});

View File

@ -22,5 +22,5 @@ function test() {
}
is(tb.getAttribute("collapsed"), "false", "Toolbar should be uncollapsed");
tb.remove();
};
}

View File

@ -143,7 +143,7 @@ function placementArraysEqual(areaId, actualPlacements, expectedPlacements) {
} else if (expectedPlacements[i] instanceof RegExp) {
ok(expectedPlacements[i].test(actualPlacements[i]),
"Item " + i + " (" + actualPlacements[i] + ") in " +
areaId + " should match " + expectedPlacements[i]);
areaId + " should match " + expectedPlacements[i]);
} else {
ok(false, "Unknown type of expected placement passed to " +
" assertAreaPlacements. Is your test broken?");
@ -289,7 +289,7 @@ function promisePanelElementShown(win, aPanel) {
aPanel.removeEventListener("popupshown", onPanelOpen);
win.clearTimeout(timeoutId);
deferred.resolve();
};
}
aPanel.addEventListener("popupshown", onPanelOpen);
return deferred.promise;
}
@ -332,7 +332,7 @@ function subviewShown(aSubview) {
aSubview.removeEventListener("ViewShowing", onViewShowing);
win.clearTimeout(timeoutId);
deferred.resolve();
};
}
aSubview.addEventListener("ViewShowing", onViewShowing);
return deferred.promise;
}
@ -347,7 +347,7 @@ function subviewHidden(aSubview) {
aSubview.removeEventListener("ViewHiding", onViewHiding);
win.clearTimeout(timeoutId);
deferred.resolve();
};
}
aSubview.addEventListener("ViewHiding", onViewHiding);
return deferred.promise;
}
@ -505,7 +505,7 @@ function promisePopupEvent(aPopup, aEventSuffix) {
function onPopupEvent(e) {
aPopup.removeEventListener(eventType, onPopupEvent);
deferred.resolve();
};
}
aPopup.addEventListener(eventType, onPopupEvent);
return deferred.promise;

View File

@ -77,7 +77,7 @@ function resolveURIInternal(aCmdLine, aArgument) {
// We have interpreted the argument as a relative file URI, but the file
// doesn't exist. Try URI fixup heuristics: see bug 290782.
try {
uri = urifixup.createFixupURI(aArgument, 0);
}
@ -129,7 +129,7 @@ function needHomepageOverride(prefb) {
// a way to make existing profiles retain the default that we removed.
if (savedmstone)
prefb.setBoolPref("browser.rights.3.shown", true);
prefb.setCharPref("browser.startup.homepage_override.mstone", mstone);
prefb.setCharPref("browser.startup.homepage_override.buildID", buildID);
return (savedmstone ? OVERRIDE_NEW_MSTONE : OVERRIDE_NEW_PROFILE);
@ -195,7 +195,7 @@ function openWindow(parent, url, target, features, args, noExternalArgs) {
return wwatch.openWindow(parent, url, target, features, argstring);
}
// Pass an array to avoid the browser "|"-splitting behavior.
var argArray = Components.classes["@mozilla.org/supports-array;1"]
.createInstance(Components.interfaces.nsISupportsArray);

View File

@ -1232,7 +1232,7 @@ PlacesToolbar.prototype = {
let childRect = child.getBoundingClientRect();
childOverflowed = this.isRTL ? (childRect.left < scrollRect.left)
: (childRect.right > scrollRect.right);
}
child.style.visibility = childOverflowed ? "hidden" : "visible";
}

View File

@ -970,7 +970,7 @@ PlacesController.prototype = {
while (aURIs.length) {
let URIslice = aURIs.splice(0, REMOVE_PAGES_CHUNKLEN);
PlacesUtils.bhistory.removePages(URIslice, URIslice.length);
Services.tm.mainThread.dispatch(() => gen.next(),
Services.tm.mainThread.dispatch(() => gen.next(),
Ci.nsIThread.DISPATCH_NORMAL);
yield unefined;
}

View File

@ -20,7 +20,7 @@ function HistorySidebarInit()
if (gHistoryGrouping == "site")
document.getElementById("bysite").setAttribute("checked", "true");
else if (gHistoryGrouping == "visited")
else if (gHistoryGrouping == "visited")
document.getElementById("byvisited").setAttribute("checked", "true");
else if (gHistoryGrouping == "lastvisited")
document.getElementById("bylastvisited").setAttribute("checked", "true");
@ -28,7 +28,7 @@ function HistorySidebarInit()
document.getElementById("bydayandsite").setAttribute("checked", "true");
else
document.getElementById("byday").setAttribute("checked", "true");
searchHistory("");
}

View File

@ -774,7 +774,7 @@ var PlacesSearchBox = {
get searchFilter() {
return document.getElementById("searchFilter");
},
/**
* Folders to include when searching.
*/
@ -894,7 +894,7 @@ var PlacesSearchBox = {
title = PlacesUIUtils.getString("searchDownloads");
break;
default:
title = PlacesUIUtils.getString("searchBookmarks");
title = PlacesUIUtils.getString("searchBookmarks");
}
this.searchFilter.placeholder = title;
},

View File

@ -230,7 +230,7 @@ PlacesTreeView.prototype = {
if (aRow < 0) {
return null;
}
let node = this._rows[aRow];
if (node !== undefined)
return node;
@ -885,7 +885,7 @@ PlacesTreeView.prototype = {
PlacesUtils.livemarks.getLivemark({ id: aNode.itemId })
.then(aLivemark => {
let shouldInvalidate =
let shouldInvalidate =
!this._controller.hasCachedLivemarkInfo(aNode);
this._controller.cacheLivemarkInfo(aNode, aLivemark);
if (aNewState == Components.interfaces.nsINavHistoryContainerResultNode.STATE_OPENED) {

View File

@ -26,9 +26,9 @@ add_task(function* test() {
ok(placesItems.localName == "scrollbox", "PlacesToolbarItems should not be null");
ok(placesItems.childNodes[0], "PlacesToolbarItems must have at least one child");
/**
/**
* Simulates a drop of a URI onto the bookmarks bar.
*
*
* @param aEffect
* The effect to use for the drop operation: move, copy, or link.
* @param aMimeType
@ -38,22 +38,22 @@ add_task(function* test() {
const uriSpec = "http://www.mozilla.org/D1995729-A152-4e30-8329-469B01F30AA7";
let uri = makeURI(uriSpec);
ChromeUtils.synthesizeDrop(placesItems.childNodes[0],
placesItems,
[[{type: aMimeType,
data: uriSpec}]],
placesItems,
[[{type: aMimeType,
data: uriSpec}]],
aEffect, window);
// Verify that the drop produces exactly one bookmark.
let bookmarkIds = PlacesUtils.bookmarks
.getBookmarkIdsForURI(uri);
ok(bookmarkIds.length == 1, "There should be exactly one bookmark");
PlacesUtils.bookmarks.removeItem(bookmarkIds[0]);
// Verify that we removed the bookmark successfully.
ok(!PlacesUtils.bookmarks.isBookmarked(uri), "URI should be removed");
}
}
// Simulate a bookmark drop for all of the mime types and effects.
let mimeTypes = ["text/plain", "text/unicode", "text/x-moz-url"];
let effects = ["move", "copy", "link"];

View File

@ -49,7 +49,7 @@ function fakeOpenPopup(aPopup) {
popupEvent.initMouseEvent("popupshowing", true, true, window, 0,
0, 0, 0, 0, false, false, false, false,
0, null);
aPopup.dispatchEvent(popupEvent);
aPopup.dispatchEvent(popupEvent);
}
/**
@ -474,7 +474,7 @@ function getViewsForFolder(aFolderId) {
break;
case PlacesUtils.unfiledBookmarksFolderId:
return ["sidebar"]
break;
break;
}
return new Array();
}

View File

@ -228,7 +228,7 @@ add_test(function test_separator()
let id = PlacesUtils.bookmarks.insertSeparator(PlacesUtils.unfiledBookmarksFolderId,
PlacesUtils.bookmarks.DEFAULT_INDEX);
PlacesUtils.annotations.setItemAnnotation(id, "random-anno",
"random-value", 0,
"random-value", 0,
PlacesUtils.annotations.EXPIRE_NEVER);
});

View File

@ -14,7 +14,7 @@ var gGetBoolPref = Services.prefs.getBoolPref;
function run_test() {
run_next_test();
};
}
do_register_cleanup(cleanup);
@ -25,7 +25,7 @@ function cleanup() {
}
Services.prefs.clearUserPref("browser.migration.version");
Services.prefs.clearUserPref(AUTOCOMPLETE_PREF);
};
}
function setupBehaviorAndMigrate(aDefaultBehavior, aAutocompleteEnabled = true) {
cleanup();
@ -35,7 +35,7 @@ function setupBehaviorAndMigrate(aDefaultBehavior, aAutocompleteEnabled = true)
Services.prefs.setBoolPref(AUTOCOMPLETE_PREF, aAutocompleteEnabled);
// Simulate a migration.
gBrowserGlue.observe(null, TOPIC_BROWSERGLUE_TEST, TOPICDATA_BROWSERGLUE_TEST);
};
}
add_task(function*() {
do_print("Migrate default.behavior = 0");

View File

@ -2,9 +2,9 @@
function test() {
waitForExplicitFinish();
gBrowser.selectedTab = gBrowser.addTab();
// Navigate to malware site. Can't use an onload listener here since
// error pages don't fire onload. Also can't register the DOMContentLoaded
// handler here because registering it too soon would mean that we might
@ -30,7 +30,7 @@ function testMalware(event) {
// Confirm that "Ignore this warning" is visible - bug 422410
var el = content.document.getElementById("ignoreWarningButton");
ok(el, "Ignore warning button should be present for malware");
var style = content.getComputedStyle(el, null);
is(style.display, "inline-block", "Ignore Warning button should be display:inline-block for malware");
@ -65,13 +65,13 @@ function testPhishing(event) {
}
window.removeEventListener("DOMContentLoaded", testPhishing, true);
var el = content.document.getElementById("ignoreWarningButton");
ok(el, "Ignore warning button should be present for phishing");
var style = content.getComputedStyle(el, null);
is(style.display, "inline-block", "Ignore Warning button should be display:inline-block for phishing");
gBrowser.removeCurrentTab();
finish();
}

View File

@ -21,20 +21,20 @@ function testNormal() {
// open the menu, to force it to update
menu = document.getElementById("menu_HelpPopup");
ok(menu, "Help menu should exist!");
menu.addEventListener("popupshown", testNormal_PopupListener, false);
menu.openPopup(null, "", 0, 0, false, null);
}
function testNormal_PopupListener() {
menu.removeEventListener("popupshown", testNormal_PopupListener, false);
var reportMenu = document.getElementById("menu_HelpPopup_reportPhishingtoolmenu");
var errorMenu = document.getElementById("menu_HelpPopup_reportPhishingErrortoolmenu");
is(reportMenu.hidden, false, "Report phishing menu should be visible on normal sites");
is(errorMenu.hidden, true, "Report error menu item should be hidden on normal sites");
menu.hidePopup();
// Now launch the phishing test. Can't use onload here because error pages don't
// fire normal load events.
window.addEventListener("DOMContentLoaded", testPhishing, true);
@ -50,13 +50,13 @@ function testPhishing() {
function testPhishing_PopupListener() {
menu.removeEventListener("popupshown", testPhishing_PopupListener, false);
var reportMenu = document.getElementById("menu_HelpPopup_reportPhishingtoolmenu");
var errorMenu = document.getElementById("menu_HelpPopup_reportPhishingErrortoolmenu");
is(reportMenu.hidden, true, "Report phishing menu should be hidden on phishing sites");
is(errorMenu.hidden, false, "Report error menu item should be visible on phishing sites");
menu.hidePopup();
gBrowser.removeCurrentTab();
finish();
}

View File

@ -86,7 +86,7 @@ function promiseSetEngine() {
resolve();
break;
}
};
}
Services.obs.addObserver(observer, "browser-search-engine-modified", false);
ss.addEngine("http://mochi.test:8888/browser/browser/components/search/test/426329.xml",
@ -103,7 +103,7 @@ function promiseRemoveEngine() {
Services.obs.removeObserver(observer, "browser-search-engine-modified");
resolve();
}
};
}
Services.obs.addObserver(observer, "browser-search-engine-modified", false);
var engine = ss.getEngineByName("Bug 426329");

View File

@ -17,7 +17,7 @@ function test() {
let previouslySelectedEngine = Services.search.currentEngine;
Services.search.currentEngine = engine;
engine.alias = "b";
let base = "https://www.bing.com/search?q=foo&pc=MOZI";
let url;

View File

@ -51,7 +51,7 @@ function SyncedTabsDeckComponent({
View: TabListView,
SyncedTabs: SyncedTabs
});
};
}
SyncedTabsDeckComponent.prototype = {
PANELS: {

View File

@ -24,7 +24,7 @@ this.EXPORTED_SYMBOLS = [
function SyncedTabsDeckStore() {
EventEmitter.call(this);
this._panels = [];
};
}
Object.assign(SyncedTabsDeckStore.prototype, EventEmitter.prototype, {
_change(isUpdatable = false) {

View File

@ -27,7 +27,7 @@ function SyncedTabsListStore(SyncedTabs) {
this._selectedRow = [-1, -1];
this.filter = "";
this.inputFocused = false;
};
}
Object.assign(SyncedTabsListStore.prototype, EventEmitter.prototype, {
// This internal method triggers the "change" event that views

View File

@ -43,7 +43,7 @@ function TabListView(window, props) {
this.container = this._doc.createElement("div");
this._setupContextMenu();
};
}
TabListView.prototype = {
render(state) {

View File

@ -258,5 +258,5 @@ function checkItem(node, item) {
Assert.equal(node.dataset.id, item.id,
"Node's ID should match item ID");
}
};
}

View File

@ -408,7 +408,7 @@ function reloadUpdateManagerData()
function writeUpdatesToXMLFile(aText)
{
const PERMS_FILE = 0644;
const PERMS_FILE = 0o644;
const MODE_WRONLY = 0x02;
const MODE_CREATE = 0x08;

View File

@ -9,7 +9,7 @@ Cc["@mozilla.org/moz/jssubscript-loader;1"]
.getService(Ci.mozIJSSubScriptLoader)
.loadSubScript("chrome://mochikit/content/tests/SimpleTest/MockObjects.js", this);
function MockShellService() {};
function MockShellService() {}
MockShellService.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIShellService]),
isDefaultBrowser: function(aStartupCheck, aForAllTypes) { return false; },

View File

@ -44,7 +44,7 @@ function destroyHiddenBrowser(aFrame, aBrowser) {
// Take care of the frame holding our invisible browser.
aFrame.destroy();
};
}
/**
* Test that UITour works when called when no tabs are available (e.g., when using windowless

View File

@ -1520,7 +1520,7 @@ Experiments.ExperimentEntry.prototype = {
this._log.error("initFromCacheData() - missing required key " + key);
return false;
}
};
}
if (!this._isManifestDataValid(data._manifestData)) {
return false;

View File

@ -1,33 +1,33 @@
var {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource:///modules/experiments/Experiments.jsm");
var gStarted = false;
function startup(data, reasonCode) {
if (gStarted) {
return;
}
gStarted = true;
// delay realstartup to trigger the race condition
Cc['@mozilla.org/thread-manager;1'].getService(Ci.nsIThreadManager)
.mainThread.dispatch(realstartup, 0);
}
function realstartup() {
let experiments = Experiments.instance();
let experiment = experiments._getActiveExperiment();
if (experiment.branch) {
Cu.reportError("Found pre-existing branch: " + experiment.branch);
return;
}
let branch = "racy-set";
experiments.setExperimentBranch(experiment.id, branch)
.then(null, Cu.reportError);
}
function shutdown() { }
function install() { }
function uninstall() { }
var {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource:///modules/experiments/Experiments.jsm");
var gStarted = false;
function startup(data, reasonCode) {
if (gStarted) {
return;
}
gStarted = true;
// delay realstartup to trigger the race condition
Cc['@mozilla.org/thread-manager;1'].getService(Ci.nsIThreadManager)
.mainThread.dispatch(realstartup, 0);
}
function realstartup() {
let experiments = Experiments.instance();
let experiment = experiments._getActiveExperiment();
if (experiment.branch) {
Cu.reportError("Found pre-existing branch: " + experiment.branch);
return;
}
let branch = "racy-set";
experiments.setExperimentBranch(experiment.id, branch)
.then(null, Cu.reportError);
}
function shutdown() { }
function install() { }
function uninstall() { }

View File

@ -1,104 +1,104 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
Cu.import("resource://testing-common/httpd.js");
Cu.import("resource://gre/modules/Timer.jsm");
const MANIFEST_HANDLER = "manifests/handler";
const SEC_IN_ONE_DAY = 24 * 60 * 60;
const MS_IN_ONE_DAY = SEC_IN_ONE_DAY * 1000;
var gProfileDir = null;
var gHttpServer = null;
var gHttpRoot = null;
var gDataRoot = null;
var gPolicy = null;
var gManifestObject = null;
var gManifestHandlerURI = null;
function run_test() {
run_next_test();
}
add_task(function* test_setup() {
loadAddonManager();
gProfileDir = do_get_profile();
yield removeCacheFile();
gHttpServer = new HttpServer();
gHttpServer.start(-1);
let port = gHttpServer.identity.primaryPort;
gHttpRoot = "http://localhost:" + port + "/";
gDataRoot = gHttpRoot + "data/";
gManifestHandlerURI = gHttpRoot + MANIFEST_HANDLER;
gHttpServer.registerDirectory("/data/", do_get_cwd());
gHttpServer.registerPathHandler("/" + MANIFEST_HANDLER, (request, response) => {
response.setStatusLine(null, 200, "OK");
response.write(JSON.stringify(gManifestObject));
response.processAsync();
response.finish();
});
do_register_cleanup(() => gHttpServer.stop(() => {}));
Services.prefs.setBoolPref(PREF_EXPERIMENTS_ENABLED, true);
Services.prefs.setIntPref(PREF_LOGGING_LEVEL, 0);
Services.prefs.setBoolPref(PREF_LOGGING_DUMP, true);
Services.prefs.setCharPref(PREF_MANIFEST_URI, gManifestHandlerURI);
Services.prefs.setIntPref(PREF_FETCHINTERVAL, 0);
let ExperimentsScope = Cu.import("resource:///modules/experiments/Experiments.jsm");
let Experiments = ExperimentsScope.Experiments;
gPolicy = new Experiments.Policy();
patchPolicy(gPolicy, {
updatechannel: () => "nightly",
delayCacheWrite: (promise) => {
return new Promise((resolve, reject) => {
promise.then(
(result) => { setTimeout(() => resolve(result), 500); },
(err) => { reject(err); }
);
});
},
});
let now = new Date(2014, 5, 1, 12);
defineNow(gPolicy, now);
let experimentName = "experiment-racybranch.xpi";
let experimentPath = getExperimentPath(experimentName);
let experimentHash = "sha1:" + sha1File(experimentPath);
gManifestObject = {
version: 1,
experiments: [
{
id: "test-experiment-racybranch@tests.mozilla.org",
xpiURL: gDataRoot + "experiment-racybranch.xpi",
xpiHash: experimentHash,
maxActiveSeconds: 10 * SEC_IN_ONE_DAY,
appName: ["XPCShell"],
channel: ["nightly"],
startTime: dateToSeconds(futureDate(now, -MS_IN_ONE_DAY)),
endTime: dateToSeconds(futureDate(now, MS_IN_ONE_DAY)),
},
],
};
do_print("gManifestObject: " + JSON.stringify(gManifestObject));
// In order for the addon manager to work properly, we hack
// Experiments.instance which is used by the XPIProvider
let experiments = new Experiments.Experiments(gPolicy);
Assert.strictEqual(ExperimentsScope.gExperiments, null);
ExperimentsScope.gExperiments = experiments;
yield experiments.updateManifest();
let active = experiments._getActiveExperiment();
Assert.ok(active);
Assert.equal(active.branch, "racy-set");
Assert.ok(!experiments._dirty);
});
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
Cu.import("resource://testing-common/httpd.js");
Cu.import("resource://gre/modules/Timer.jsm");
const MANIFEST_HANDLER = "manifests/handler";
const SEC_IN_ONE_DAY = 24 * 60 * 60;
const MS_IN_ONE_DAY = SEC_IN_ONE_DAY * 1000;
var gProfileDir = null;
var gHttpServer = null;
var gHttpRoot = null;
var gDataRoot = null;
var gPolicy = null;
var gManifestObject = null;
var gManifestHandlerURI = null;
function run_test() {
run_next_test();
}
add_task(function* test_setup() {
loadAddonManager();
gProfileDir = do_get_profile();
yield removeCacheFile();
gHttpServer = new HttpServer();
gHttpServer.start(-1);
let port = gHttpServer.identity.primaryPort;
gHttpRoot = "http://localhost:" + port + "/";
gDataRoot = gHttpRoot + "data/";
gManifestHandlerURI = gHttpRoot + MANIFEST_HANDLER;
gHttpServer.registerDirectory("/data/", do_get_cwd());
gHttpServer.registerPathHandler("/" + MANIFEST_HANDLER, (request, response) => {
response.setStatusLine(null, 200, "OK");
response.write(JSON.stringify(gManifestObject));
response.processAsync();
response.finish();
});
do_register_cleanup(() => gHttpServer.stop(() => {}));
Services.prefs.setBoolPref(PREF_EXPERIMENTS_ENABLED, true);
Services.prefs.setIntPref(PREF_LOGGING_LEVEL, 0);
Services.prefs.setBoolPref(PREF_LOGGING_DUMP, true);
Services.prefs.setCharPref(PREF_MANIFEST_URI, gManifestHandlerURI);
Services.prefs.setIntPref(PREF_FETCHINTERVAL, 0);
let ExperimentsScope = Cu.import("resource:///modules/experiments/Experiments.jsm");
let Experiments = ExperimentsScope.Experiments;
gPolicy = new Experiments.Policy();
patchPolicy(gPolicy, {
updatechannel: () => "nightly",
delayCacheWrite: (promise) => {
return new Promise((resolve, reject) => {
promise.then(
(result) => { setTimeout(() => resolve(result), 500); },
(err) => { reject(err); }
);
});
},
});
let now = new Date(2014, 5, 1, 12);
defineNow(gPolicy, now);
let experimentName = "experiment-racybranch.xpi";
let experimentPath = getExperimentPath(experimentName);
let experimentHash = "sha1:" + sha1File(experimentPath);
gManifestObject = {
version: 1,
experiments: [
{
id: "test-experiment-racybranch@tests.mozilla.org",
xpiURL: gDataRoot + "experiment-racybranch.xpi",
xpiHash: experimentHash,
maxActiveSeconds: 10 * SEC_IN_ONE_DAY,
appName: ["XPCShell"],
channel: ["nightly"],
startTime: dateToSeconds(futureDate(now, -MS_IN_ONE_DAY)),
endTime: dateToSeconds(futureDate(now, MS_IN_ONE_DAY)),
},
],
};
do_print("gManifestObject: " + JSON.stringify(gManifestObject));
// In order for the addon manager to work properly, we hack
// Experiments.instance which is used by the XPIProvider
let experiments = new Experiments.Experiments(gPolicy);
Assert.strictEqual(ExperimentsScope.gExperiments, null);
ExperimentsScope.gExperiments = experiments;
yield experiments.updateManifest();
let active = experiments._getActiveExperiment();
Assert.ok(active);
Assert.equal(active.branch, "racy-set");
Assert.ok(!experiments._dirty);
});

View File

@ -1,47 +1,47 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
Cu.import("resource://testing-common/httpd.js");
Cu.import("resource:///modules/experiments/Experiments.jsm");
const MANIFEST_HANDLER = "manifests/handler";
function run_test() {
run_next_test();
}
add_task(function* test_setup() {
loadAddonManager();
do_get_profile();
let httpServer = new HttpServer();
httpServer.start(-1);
let port = httpServer.identity.primaryPort;
let httpRoot = "http://localhost:" + port + "/";
let handlerURI = httpRoot + MANIFEST_HANDLER;
httpServer.registerPathHandler("/" + MANIFEST_HANDLER,
(request, response) => {
response.processAsync();
response.setStatus(null, 200, "OK");
response.write("["); // never finish!
});
do_register_cleanup(() => httpServer.stop(() => {}));
Services.prefs.setBoolPref(PREF_EXPERIMENTS_ENABLED, true);
Services.prefs.setIntPref(PREF_LOGGING_LEVEL, 0);
Services.prefs.setBoolPref(PREF_LOGGING_DUMP, true);
Services.prefs.setCharPref(PREF_MANIFEST_URI, handlerURI);
Services.prefs.setIntPref(PREF_FETCHINTERVAL, 0);
let experiments = Experiments.instance();
experiments.updateManifest().then(
() => {
Assert.ok(true, "updateManifest finished successfully");
},
(e) => {
do_throw("updateManifest should not have failed: got error " + e);
});
yield experiments.uninit();
});
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
Cu.import("resource://testing-common/httpd.js");
Cu.import("resource:///modules/experiments/Experiments.jsm");
const MANIFEST_HANDLER = "manifests/handler";
function run_test() {
run_next_test();
}
add_task(function* test_setup() {
loadAddonManager();
do_get_profile();
let httpServer = new HttpServer();
httpServer.start(-1);
let port = httpServer.identity.primaryPort;
let httpRoot = "http://localhost:" + port + "/";
let handlerURI = httpRoot + MANIFEST_HANDLER;
httpServer.registerPathHandler("/" + MANIFEST_HANDLER,
(request, response) => {
response.processAsync();
response.setStatus(null, 200, "OK");
response.write("["); // never finish!
});
do_register_cleanup(() => httpServer.stop(() => {}));
Services.prefs.setBoolPref(PREF_EXPERIMENTS_ENABLED, true);
Services.prefs.setIntPref(PREF_LOGGING_LEVEL, 0);
Services.prefs.setBoolPref(PREF_LOGGING_DUMP, true);
Services.prefs.setCharPref(PREF_MANIFEST_URI, handlerURI);
Services.prefs.setIntPref(PREF_FETCHINTERVAL, 0);
let experiments = Experiments.instance();
experiments.updateManifest().then(
() => {
Assert.ok(true, "updateManifest finished successfully");
},
(e) => {
do_throw("updateManifest should not have failed: got error " + e);
});
yield experiments.uninit();
});

View File

@ -1,55 +1,55 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
Cu.import("resource:///modules/experiments/Experiments.jsm");
const SEC_IN_ONE_DAY = 24 * 60 * 60;
const MS_IN_ONE_DAY = SEC_IN_ONE_DAY * 1000;
var cacheData = {
_enabled: true,
_manifestData: {
id: "foobartestid",
xpiURL: "http://example.com/foo.xpi",
xpiHash: "sha256:abcde",
startTime: 0,
endTime: 2000000000,
maxActiveSeconds: 40000000,
appName: "TestApp",
channel: "test-foo",
},
_needsUpdate: false,
_randomValue: 0.5,
_failedStart: false,
_name: "Foo",
_description: "Foobar",
_homepageURL: "",
_addonId: "foo@test",
_startDate: 0,
_endDate: 2000000000,
_branch: null
};
add_task(function* test_valid() {
let e = new Experiments.ExperimentEntry();
Assert.ok(e.initFromCacheData(cacheData));
Assert.ok(e.enabled);
});
add_task(function* test_upgrade() {
let e = new Experiments.ExperimentEntry();
delete cacheData._branch;
Assert.ok(e.initFromCacheData(cacheData));
Assert.ok(e.enabled);
});
add_task(function* test_missing() {
let e = new Experiments.ExperimentEntry();
delete cacheData._name;
Assert.ok(!e.initFromCacheData(cacheData));
});
function run_test() {
run_next_test();
}
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
Cu.import("resource:///modules/experiments/Experiments.jsm");
const SEC_IN_ONE_DAY = 24 * 60 * 60;
const MS_IN_ONE_DAY = SEC_IN_ONE_DAY * 1000;
var cacheData = {
_enabled: true,
_manifestData: {
id: "foobartestid",
xpiURL: "http://example.com/foo.xpi",
xpiHash: "sha256:abcde",
startTime: 0,
endTime: 2000000000,
maxActiveSeconds: 40000000,
appName: "TestApp",
channel: "test-foo",
},
_needsUpdate: false,
_randomValue: 0.5,
_failedStart: false,
_name: "Foo",
_description: "Foobar",
_homepageURL: "",
_addonId: "foo@test",
_startDate: 0,
_endDate: 2000000000,
_branch: null
};
add_task(function* test_valid() {
let e = new Experiments.ExperimentEntry();
Assert.ok(e.initFromCacheData(cacheData));
Assert.ok(e.enabled);
});
add_task(function* test_upgrade() {
let e = new Experiments.ExperimentEntry();
delete cacheData._branch;
Assert.ok(e.initFromCacheData(cacheData));
Assert.ok(e.enabled);
});
add_task(function* test_missing() {
let e = new Experiments.ExperimentEntry();
delete cacheData._name;
Assert.ok(!e.initFromCacheData(cacheData));
});
function run_test() {
run_next_test();
}

View File

@ -134,6 +134,10 @@ var WindowListener = {
return new Promise((resolve) => {
let callback = iframe => {
let mm = iframe.QueryInterface(Ci.nsIFrameLoaderOwner).frameLoader.messageManager;
if (!("messageManager" in iframe)) {
iframe.messageManager = mm;
}
this.hookWindowCloseForPanelClose(iframe);
mm.sendAsyncMessage("Social:WaitForDocumentVisible");
mm.addMessageListener("Social:DocumentVisible", () => resolve(mm));
@ -625,6 +629,11 @@ var WindowListener = {
* through the sdk.
*/
handleMousemove: function(event) {
// We want to stop sending events if sharing is paused.
if (this._browserSharePaused) {
return;
}
// Only update every so often.
let now = Date.now();
if (now - this.lastCursorTime < MIN_CURSOR_INTERVAL) {

View File

@ -176,6 +176,13 @@ loop.shared.actions = (function() {
dimensions: Object
}),
/**
* Used for notifying that the hasVideo property of the screen stream, has changed.
*/
VideoScreenStreamChanged: Action.define("videoScreenStreamChanged", {
hasVideo: Boolean
}),
/**
* A stream from local or remote media has been created.
*/

View File

@ -1043,12 +1043,21 @@ loop.OTSdkDriver = (function() {
* Handles publishing of property changes to a stream.
*/
_onStreamPropertyChanged: function(event) {
if (event.changedProperty === STREAM_PROPERTIES.VIDEO_DIMENSIONS) {
this.dispatcher.dispatch(new sharedActions.VideoDimensionsChanged({
isLocal: event.stream.connection.id === this.session.connection.id,
videoType: event.stream.videoType,
dimensions: event.stream[STREAM_PROPERTIES.VIDEO_DIMENSIONS]
}));
switch (event.changedProperty) {
case STREAM_PROPERTIES.VIDEO_DIMENSIONS:
this.dispatcher.dispatch(new sharedActions.VideoDimensionsChanged({
isLocal: event.stream.connection.id === this.session.connection.id,
videoType: event.stream.videoType,
dimensions: event.stream[STREAM_PROPERTIES.VIDEO_DIMENSIONS]
}));
break;
case STREAM_PROPERTIES.HAS_VIDEO:
if (event.stream.videoType === "screen") {
this.dispatcher.dispatch(new sharedActions.VideoScreenStreamChanged({
hasVideo: event.newValue
}));
}
break;
}
},

View File

@ -16,7 +16,8 @@ loop.store.RemoteCursorStore = (function() {
var RemoteCursorStore = loop.store.createStore({
actions: [
"receivedCursorData",
"videoDimensionsChanged"
"videoDimensionsChanged",
"videoScreenStreamChanged"
],
/**
@ -99,6 +100,21 @@ loop.store.RemoteCursorStore = (function() {
width: actionData.dimensions.width
}
});
},
/**
* Listen to screen stream changes.
*
* @param {sharedActions.VideoScreenStreamChanged} actionData
*/
videoScreenStreamChanged: function(actionData) {
if (actionData.hasVideo) {
return;
}
this.setStoreState({
remoteCursorPosition: null
});
}
});

View File

@ -1477,19 +1477,6 @@ describe("loop.OTSdkDriver", function() {
}
};
it("should not dispatch a VideoDimensionsChanged action for other properties", function() {
session.trigger("streamPropertyChanged", {
stream: stream,
changedProperty: STREAM_PROPERTIES.HAS_AUDIO
});
session.trigger("streamPropertyChanged", {
stream: stream,
changedProperty: STREAM_PROPERTIES.HAS_VIDEO
});
sinon.assert.notCalled(dispatcher.dispatch);
});
it("should dispatch a VideoDimensionsChanged action", function() {
session.connection = {
id: "localUser"
@ -1503,6 +1490,22 @@ describe("loop.OTSdkDriver", function() {
sinon.assert.calledWithMatch(dispatcher.dispatch,
sinon.match.hasOwn("name", "videoDimensionsChanged"));
});
it("should dispatch a VideoScreenShareChanged action", function() {
session.connection = {
id: "localUser"
};
session.trigger("streamPropertyChanged", {
stream: stream,
oldValue: false,
newValue: true,
changedProperty: STREAM_PROPERTIES.HAS_VIDEO
});
sinon.assert.calledOnce(dispatcher.dispatch);
sinon.assert.calledWithMatch(dispatcher.dispatch,
sinon.match.hasOwn("name", "videoScreenStreamChanged"));
});
});
describe("connectionCreated", function() {

View File

@ -117,4 +117,37 @@ describe("loop.store.RemoteCursorStore", function() {
expect(store.getStoreState().realVideoSize).eql(null);
});
});
describe("#videoScreenStreamChanged", function() {
beforeEach(function() {
store.setStoreState({
remoteCursorPosition: {
ratioX: 1,
ratioY: 1
}
});
});
it("should remove cursor position if screen stream has no video", function() {
store.videoScreenStreamChanged(new sharedActions.VideoScreenStreamChanged({
hasVideo: false
}));
expect(store.getStoreState().remoteCursorPosition).eql(null);
});
it("should not remove cursor position if screen stream has video", function() {
sandbox.stub(store, "setStoreState");
store.videoScreenStreamChanged(new sharedActions.VideoScreenStreamChanged({
hasVideo: true
}));
sinon.assert.notCalled(store.setStoreState);
expect(store.getStoreState().remoteCursorPosition).eql({
ratioX: 1,
ratioY: 1
});
});
});
});

View File

@ -26,7 +26,7 @@ sign_in_again_button=Přihlásit se
sign_in_again_use_as_guest_button2=Použít {{clientSuperShortname}} jako host
panel_browse_with_friend_button=Prohlédnout si tuto stránku spolu s přítelem
panel_stop_sharing_tabs_button=Vypnout sdílení vašich panelů
panel_disconnect_button=Odpojit
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -183,28 +183,9 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_browser_message2=Sdílíte své panely. Jakýkoliv panel, na který klepnete, může být viděn vašimi přáteli
infobar_screenshare_paused_browser_message=Sdílení panelu je pozastaveno
infobar_button_gotit_label=Rozumím
infobar_button_gotit_accesskey=R
infobar_button_pause_label=Pozastavit
infobar_button_pause_accesskey=P
infobar_button_restart_label=Restartovat
infobar_button_restart_accesskey=e
infobar_button_resume_label=Pokračovat
infobar_button_resume_accesskey=r
infobar_button_stop_label=Zastavit
infobar_button_stop_accesskey=s
infobar_menuitem_dontshowagain_label=Příště již nezobrazovat
infobar_menuitem_dontshowagain_accesskey=P
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Zatím nemáte žádné konverzace.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Zahájit novou konverzaci!
infobar_button_disconnect_label=Odpojit
# E10s not supported strings

View File

@ -26,13 +26,16 @@ sign_in_again_button=Log ind
sign_in_again_use_as_guest_button2=Brug {{clientSuperShortname}} som gæst
panel_browse_with_friend_button=Besøg siden sammen med en ven
panel_stop_sharing_tabs_button=Stop med at dele dine faneblade
panel_disconnect_button=Afbryd forbindelse
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Klik på Hello-knappen for at bruge nettet sammen med en ven.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## ways to use Hello project.
first_time_experience_content=Brug det til at planlægge, arbejde og grine sammen.
first_time_experience_button_label2=Se, hvordan det fungerer
invite_header_text_bold=Inviter nogen til at besøge siden sammen med dig.
invite_header_text3=Det kræver selskab at bruge Firefox Hello, så send et link til én af dine venner sådan at I kan bruge nettet sammen.
@ -180,28 +183,13 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_browser_message2=Du deler dine faneblade. Når du klikker på et faneblad kan dine venner se det
infobar_screenshare_paused_browser_message=Deling af faneblade er sat på pause
infobar_button_gotit_label=Ok!
infobar_button_gotit_accesskey=O
infobar_button_pause_label=Pause
infobar_button_pause_accesskey=P
infobar_button_restart_label=Genstart
infobar_screenshare_stop_sharing_message=Du deler ikke dine faneblade længere
infobar_button_restart_label2=Genstart deling
infobar_button_restart_accesskey=e
infobar_button_resume_label=Fortsæt
infobar_button_resume_accesskey=F
infobar_button_stop_label=Stop
infobar_button_stop_label2=Stop med at dele
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=Vis ikke dette igen
infobar_menuitem_dontshowagain_accesskey=V
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Ingen samtaler endnu.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Start en ny!
infobar_button_disconnect_label=Afbryd
infobar_button_disconnect_accesskey=A
# E10s not supported strings
@ -244,7 +232,8 @@ rooms_room_full_call_to_action_label=Læs mere om {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=Hent {{brandShortname}} for at starte din egen
rooms_room_full_label=Der er allerede to personer i denne samtale.
rooms_room_join_label=Vær med i samtalen
rooms_room_joined_label=Nogen har sluttet sig til samtalen!
rooms_room_joined_owner_connected_label2=Din ven har nu oprettet forbindelse og vil være i stand til at se dine faneblade.
rooms_room_joined_owner_not_connected_label=Din ven venter på at besøge {{roomURLHostname}} sammen med dig.
self_view_hidden_message=Billedet fra eget kamera er skjult, men sendes stadig til andre. Gør vinduet større for at få vist billedet fra dit kamera

View File

@ -26,7 +26,7 @@ sign_in_again_button=Anmelden
sign_in_again_use_as_guest_button2={{clientSuperShortname}} als Gast verwenden
panel_browse_with_friend_button=Seite mit einem Freund besuchen
panel_stop_sharing_tabs_button=Weitergabe Ihrer Tabs beenden
panel_disconnect_button=Verbindung trennen
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -54,7 +54,7 @@ display_name_guest=Gast
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
session_expired_error_description=Sitzung abgeladen. Alle vorher von Ihnen erzeugten und weitergegebenen Adressen funktionieren nicht mehr.
session_expired_error_description=Sitzung abgelaufen. Alle vorher von Ihnen erzeugten und weitergegebenen Adressen funktionieren nicht mehr.
could_not_authenticate=Authentifizierung fehlgeschlagen
password_changed_question=Haben Sie Ihr Passwort geändert?
try_again_later=Bitte versuchen Sie es später erneut.
@ -183,28 +183,13 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_browser_message2=Sie geben Ihre Tabs weiter. Jeder von Ihnen angeklickte Tab wird von Ihren Freunden gesehen.
infobar_screenshare_paused_browser_message=Weitergabe der Tabs wurde angehalten.
infobar_button_gotit_label=OK
infobar_button_gotit_accesskey=O
infobar_button_pause_label=Anhalten
infobar_button_pause_accesskey=A
infobar_button_restart_label=Neu starten
infobar_screenshare_stop_sharing_message=Sie geben Ihre Tabs nicht mehr weiter.
infobar_button_restart_label2=Wieder weitergeben
infobar_button_restart_accesskey=s
infobar_button_resume_label=Fortsetzen
infobar_button_resume_accesskey=F
infobar_button_stop_label=Abbrechen
infobar_button_stop_label2=Nicht mehr weitergeben
infobar_button_stop_accesskey=b
infobar_menuitem_dontshowagain_label=Nicht mehr anzeigen
infobar_menuitem_dontshowagain_accesskey=N
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Noch keine Gespräche
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Beginnen Sie ein Gespräch!
infobar_button_disconnect_label=Verbindung trennen
infobar_button_disconnect_accesskey=t
# E10s not supported strings
@ -247,7 +232,8 @@ rooms_room_full_call_to_action_label=Erfahren Sie mehr über {{clientShortname}}
rooms_room_full_call_to_action_nonFx_label=Laden Sie {{brandShortname}} herunter, um Ihr Eigenes zu beginnen.
rooms_room_full_label=In diesem Gespräch befinden sich bereits zwei Personen.
rooms_room_join_label=Gespräch betreten
rooms_room_joined_label=Jemand hat das Gespräch betreten!
rooms_room_joined_owner_connected_label2=Ihr Freund ist jetzt verbunden und kann Ihre Tabs sehen.
rooms_room_joined_owner_not_connected_label=Ihr Freund wartet darauf, mit Ihnen {{roomURLHostname}} anzusehen.
self_view_hidden_message=Eigenes Kamerabild ist ausgeblendet, wird aber gesendet. Passen Sie die Fenstergröße an, um es anzuzeigen.

View File

@ -26,7 +26,7 @@ sign_in_again_button=Pśizjawiś
sign_in_again_use_as_guest_button2={{clientSuperShortname}} ako gósć wužywaś
panel_browse_with_friend_button=Toś ten bok se z pśijaśelom woglědaś
panel_stop_sharing_tabs_button=Waše rejtarki wěcej njeźěliś
panel_disconnect_button=Zwisk źěliś
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -182,28 +182,13 @@ door_hanger_button=W pórěźe
# Infobar strings
infobar_screenshare_browser_message2=Źěliśo swóje rejtarki. Waše pśijaśele mógu kuždy rejtark wiźeś, na kótaryž kliknjośo
infobar_screenshare_paused_browser_message=Źělenje rejtarka jo se pśetergnuło
infobar_button_gotit_label=Som to zrozměł!
infobar_button_gotit_accesskey=S
infobar_button_pause_label=Zastajiś
infobar_button_pause_accesskey=Z
infobar_button_restart_label=Znowego startowaś
infobar_screenshare_stop_sharing_message=Njeźěliśo wěcej swóje rejtarki
infobar_button_restart_label2=Źělenje znowego startowaś
infobar_button_restart_accesskey=n
infobar_button_resume_label=Pókšacowaś
infobar_button_resume_accesskey=P
infobar_button_stop_label=Skóńcyś
infobar_button_stop_label2=Źělenje zastajiś
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=Wěcej njepokazaś
infobar_menuitem_dontshowagain_accesskey=W
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Hyšći žedne rozgrona.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Zachopśo nowe!
infobar_button_disconnect_label=Zwisk źěliś
infobar_button_disconnect_accesskey=Z
# E10s not supported strings
@ -246,7 +231,8 @@ rooms_room_full_call_to_action_label=Zgóńśo wěcej wó {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=Ześěgniśo {{brandShortname}}, aby swójsku zachopił
rooms_room_full_label=Stej južo dwě wósobje w toś tom rozgronje.
rooms_room_join_label=Rozgronoju se pśizamknuś
rooms_room_joined_label=Něchten jo se rozgronoju pśizamknuł!
rooms_room_joined_owner_connected_label2=Waš pśijaśel jo něnto zwězany a móžo waše rejtarki wiźeś.
rooms_room_joined_owner_not_connected_label=Waš pśijaśel caka, aby {{roomURLHostname}} z wami pśeglědował.
self_view_hidden_message=Samonaglěd schowany, ale sćelo se hyšći; změńśo wjelikosć wokna, kótarež ma se pokazaś

View File

@ -26,7 +26,7 @@ sign_in_again_button=Sign In
sign_in_again_use_as_guest_button2=Use {{clientSuperShortname}} as a Guest
panel_browse_with_friend_button=Browse this page with a friend
panel_stop_sharing_tabs_button=Stop sharing your tabs
panel_disconnect_button=Disconnect
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -182,28 +182,13 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_browser_message2=You are sharing your tabs. Any tab you click on can be seen by your friends
infobar_screenshare_paused_browser_message=Tab sharing is paused
infobar_button_gotit_label=Got it!
infobar_button_gotit_accesskey=G
infobar_button_pause_label=Pause
infobar_button_pause_accesskey=P
infobar_button_restart_label=Restart
infobar_screenshare_stop_sharing_message=You are no longer sharing your tabs
infobar_button_restart_label2=Restart sharing
infobar_button_restart_accesskey=e
infobar_button_resume_label=Resume
infobar_button_resume_accesskey=R
infobar_button_stop_label=Stop
infobar_button_stop_label2=Stop sharing
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=Don't show this again
infobar_menuitem_dontshowagain_accesskey=D
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=No conversations yet.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Start a new one!
infobar_button_disconnect_label=Disconnect
infobar_button_disconnect_accesskey=D
# E10s not supported strings
@ -246,7 +231,8 @@ rooms_room_full_call_to_action_label=Learn more about {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=Download {{brandShortname}} to start your own
rooms_room_full_label=There are already two people in this conversation.
rooms_room_join_label=Join the conversation
rooms_room_joined_label=Someone has joined the conversation!
rooms_room_joined_owner_connected_label2=Your friend is now connected and will be able to see your tabs.
rooms_room_joined_owner_not_connected_label=Your friend is waiting to browse {{roomURLHostname}} with you.
self_view_hidden_message=Self-view hidden but still being sent; resize window \\\n to show

View File

@ -26,7 +26,7 @@ sign_in_again_button=Iniciar sesión
sign_in_again_use_as_guest_button2=Usar {{clientSuperShortname}} como un Invitado
panel_browse_with_friend_button=Navegar esta página con un amigo
panel_stop_sharing_tabs_button=Dejar de compartir tus pestañas
panel_disconnect_button=Desconectar
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -182,28 +182,13 @@ door_hanger_button=Aceptar
# Infobar strings
infobar_screenshare_browser_message2=Estás compartiendo tus pestañas. Cualquier pestaña en la que des clic puede ser vista por tus amigos
infobar_screenshare_paused_browser_message=Compartir pestaña está en pausa
infobar_button_gotit_label=¡Entiendo!
infobar_button_gotit_accesskey=G
infobar_button_pause_label=Pausa
infobar_button_pause_accesskey=P
infobar_button_restart_label=Reiniciar
infobar_screenshare_stop_sharing_message=Ya no estás compartiendo tus pestañas
infobar_button_restart_label2=Volver a compartir
infobar_button_restart_accesskey=e
infobar_button_resume_label=Reanudar
infobar_button_resume_accesskey=R
infobar_button_stop_label=Detener
infobar_button_stop_label2=Dejar de compartir
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=No mostrar esto de nuevo
infobar_menuitem_dontshowagain_accesskey=D
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=No hay conversaciones todavía.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=¡Iniciar una nueva!
infobar_button_disconnect_label=Desconectar
infobar_button_disconnect_accesskey=D
# E10s not supported strings
@ -246,7 +231,8 @@ rooms_room_full_call_to_action_label=Saber más acerca de {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=Descarga {{brandShortname}} para iniciar la tuya
rooms_room_full_label=Ya hay dos personas en esta conversación.
rooms_room_join_label=Unirse a la conversación
rooms_room_joined_label=¡Alguien se ha unido a la conversación!
rooms_room_joined_owner_connected_label2=Tu amigo está ahora conectado y podrá ver tus pestañas.
rooms_room_joined_owner_not_connected_label=Tu amigo está esperando para navegar {{roomURLHostname}} contigo.
self_view_hidden_message=Auto-vista oculta pero enviándose; redimensiona ventana para mostrar

View File

@ -26,7 +26,7 @@ sign_in_again_button=ورود
sign_in_again_use_as_guest_button2=استفاده از {{clientSuperShortname}} به عنوان مهمان
panel_browse_with_friend_button=این صفحه را با همراهی یک دوست مرور کنید
panel_stop_sharing_tabs_button=توقف اشتراک‌گذاری زبانه‌ها
panel_disconnect_button=قطع ارتباط
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -182,28 +182,13 @@ door_hanger_button=تایید
# Infobar strings
infobar_screenshare_browser_message2=شما در حال اشتراک‌گذاری زبانه‌های خود هستید. هر زبانه‌ای که بر روی‌اش کلیک کنید، توسط دوستانتان دید میشود
infobar_screenshare_paused_browser_message=اشتراک‌گذاری زبانه‌ها متوقف شد
infobar_button_gotit_label=گرفتم!
infobar_button_gotit_accesskey=G
infobar_button_pause_label=مکث
infobar_button_pause_accesskey=P
infobar_button_restart_label=راه‌اندازی مجدد
infobar_screenshare_stop_sharing_message=شما دیگر در حال اشتراک‌گذاری زبانه‌های خود نیستید
infobar_button_restart_label2=راه‌اندازی مجدد اشتراک‌گذاری
infobar_button_restart_accesskey=e
infobar_button_resume_label=ادامه
infobar_button_resume_accesskey=R
infobar_button_stop_label=توقف
infobar_button_stop_label2=توقف اشتراک‌گذاری
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=مجددا این مورد را نشان نشده
infobar_menuitem_dontshowagain_accesskey=D
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=تا حالا هیچ گفت‌وگویی انجام نشده.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=یک مورد جدید شروع کنید!
infobar_button_disconnect_label=قطع ارتباط
infobar_button_disconnect_accesskey=D
# E10s not supported strings
@ -246,7 +231,8 @@ rooms_room_full_call_to_action_label=درباره {{clientShortname}} بیشتر
rooms_room_full_call_to_action_nonFx_label=برای شروع گفت‌وگو خودتان {{brandShortname}} را بارگیری کنید
rooms_room_full_label=در حال حاضر در نفر در این گفت‌وگو حضور دارند.
rooms_room_join_label=پیوستن به گفت‌وگو
rooms_room_joined_label=یک نفر به گفت‌وگو پیوسته است!
rooms_room_joined_owner_connected_label2=هم‌اکنون دوست شما متصل شده است و می‌تواند زبانه‌های شما را ببیند.
rooms_room_joined_owner_not_connected_label=دوست شما منتظر است تا {{roomURLHostname}} را همراه با شما ببیند.
self_view_hidden_message=نمای فردی پنهان شده است ولی ارسال می‌شود؛ برای نمایش اندازه پنجره را تغییر دهید

View File

@ -26,7 +26,7 @@ sign_in_again_button=Oanmelde
sign_in_again_use_as_guest_button2={{clientSuperShortname}} as gast brûke
panel_browse_with_friend_button=Dizze side mei in freon besjen
panel_stop_sharing_tabs_button=Dielen fan jo ljepblêden stopje
panel_disconnect_button=Ferbining ferbrekke
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -182,28 +182,13 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_browser_message2=Jo diele jo ljepblêden. Elts ljepblêd dat jo oanklikke kin sjoen wurde troch jo freonen
infobar_screenshare_paused_browser_message=Ljepblêd diele is pausearre
infobar_button_gotit_label=Ik begryp it!
infobar_button_gotit_accesskey=I
infobar_button_pause_label=Pauze
infobar_button_pause_accesskey=P
infobar_button_restart_label=Opnij starte
infobar_screenshare_stop_sharing_message=Jo diele net langer jo ljepblêden
infobar_button_restart_label2=Dielen ferfetsje
infobar_button_restart_accesskey=O
infobar_button_resume_label=Ferfetsje
infobar_button_resume_accesskey=F
infobar_button_stop_label=Stopje
infobar_button_stop_label2=Dielen stopje
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=Dit net mear toane
infobar_menuitem_dontshowagain_accesskey=D
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Noch gjin petearen.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Begjin in nij petear!
infobar_button_disconnect_label=Ferbining ferbrekke
infobar_button_disconnect_accesskey=F
# E10s not supported strings
@ -246,7 +231,8 @@ rooms_room_full_call_to_action_label=Mear ynfo oer {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=Download {{brandShortname}} om sels in petear te starten
rooms_room_full_label=Der binne al twa persoanen yn dit petear.
rooms_room_join_label=Dielnimme oan it petear
rooms_room_joined_label=Ien nimt diel oan it petear!
rooms_room_joined_owner_connected_label2=Jo freon(din) is no ferbûn en kin jo ljepblêden sjen.
rooms_room_joined_owner_not_connected_label=Jo freon(din) wachtet om mei jo nei {{roomURLHostname}} te sjen.
self_view_hidden_message=Eigen werjefte ferburgen, mar wurdt noch hieltyd ferstjoerd; wizigje finsterformaat om te toanen

View File

@ -26,7 +26,7 @@ sign_in_again_button=Oanmelde
sign_in_again_use_as_guest_button2={{clientSuperShortname}} as gast brûke
panel_browse_with_friend_button=Dizze side mei in freon besjen
panel_stop_sharing_tabs_button=Dielen fan jo ljepblêden stopje
panel_disconnect_button=Ferbining ferbrekke
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -182,28 +182,13 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_browser_message2=Jo diele jo ljepblêden. Elts ljepblêd dat jo oanklikke kin sjoen wurde troch jo freonen
infobar_screenshare_paused_browser_message=Ljepblêd diele is pausearre
infobar_button_gotit_label=Ik begryp it!
infobar_button_gotit_accesskey=I
infobar_button_pause_label=Pauze
infobar_button_pause_accesskey=P
infobar_button_restart_label=Opnij starte
infobar_screenshare_stop_sharing_message=Jo diele net langer jo ljepblêden
infobar_button_restart_label2=Dielen ferfetsje
infobar_button_restart_accesskey=O
infobar_button_resume_label=Ferfetsje
infobar_button_resume_accesskey=F
infobar_button_stop_label=Stopje
infobar_button_stop_label2=Dielen stopje
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=Dit net mear toane
infobar_menuitem_dontshowagain_accesskey=D
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Noch gjin petearen.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Begjin in nij petear!
infobar_button_disconnect_label=Ferbining ferbrekke
infobar_button_disconnect_accesskey=F
# E10s not supported strings
@ -246,7 +231,8 @@ rooms_room_full_call_to_action_label=Mear ynfo oer {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=Download {{brandShortname}} om sels in petear te starten
rooms_room_full_label=Der binne al twa persoanen yn dit petear.
rooms_room_join_label=Dielnimme oan it petear
rooms_room_joined_label=Ien nimt diel oan it petear!
rooms_room_joined_owner_connected_label2=Jo freon(din) is no ferbûn en kin jo ljepblêden sjen.
rooms_room_joined_owner_not_connected_label=Jo freon(din) wachtet om mei jo nei {{roomURLHostname}} te sjen.
self_view_hidden_message=Eigen werjefte ferburgen, mar wurdt noch hieltyd ferstjoerd; wizigje finsterformaat om te toanen

View File

@ -26,7 +26,7 @@ sign_in_again_button=Clàraich a-steach
sign_in_again_use_as_guest_button2=Cleachd {{clientSuperShortname}} mar aoigh
panel_browse_with_friend_button=Rùraich an duilleag seo còmhla ri caraid
panel_stop_sharing_tabs_button=Sguir de cho-roinneadh nan tabaichean agad
panel_disconnect_button=Dì-cheangail
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -182,28 +182,13 @@ door_hanger_button=Bheir
# Infobar strings
infobar_screenshare_browser_message2=Tha thu a co-roinneadh nan tabaichean agad. Chì do charaidean taba sam bith a bhriogas tu air
infobar_screenshare_paused_browser_message=Tha co-roinneadh nan tabaichean na stad
infobar_button_gotit_label=Tha mi agaibh!
infobar_button_gotit_accesskey=T
infobar_button_pause_label=Cuir na stad
infobar_button_pause_accesskey=u
infobar_button_restart_label=Ath-thòisich
infobar_screenshare_stop_sharing_message=Chan eil thu a co-roinneadh nan tabaichean agad tuilleadh
infobar_button_restart_label2=Tòisich air co-roinneadh
infobar_button_restart_accesskey=A
infobar_button_resume_label=Lean air
infobar_button_resume_accesskey=L
infobar_button_stop_label=Sguir dheth
infobar_button_stop_label2=Sguir a cho-roinneadh
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=Na seall seo a-rithist
infobar_menuitem_dontshowagain_accesskey=N
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Chan eil còmhradh ann fhathast.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Tòisich air fear ùr!
infobar_button_disconnect_label=Dì-cheangail
infobar_button_disconnect_accesskey=D
# E10s not supported strings
@ -246,7 +231,8 @@ rooms_room_full_call_to_action_label=Barrachd fiosrachaidh air {{clientShortname
rooms_room_full_call_to_action_nonFx_label=Luchdaich a-nuas {{brandShortname}} airson fear a thòiseachadh thu fhèin
rooms_room_full_label=Tha dithis sa chòmhradh seo mu thràth.
rooms_room_join_label=Gabh pàirt sa chòmhradh
rooms_room_joined_label=Tha cuideigin eile sa chòmhradh seo a-nis!
rooms_room_joined_owner_connected_label2=Tha do charaid ceangailte a-nis is chì iad na tabaichean agad.
rooms_room_joined_owner_not_connected_label=Tha do charaid a feitheamh ort airson {{roomURLHostname}} a rùrachadh còmhla riut.
self_view_hidden_message=Tha do dhealbh fhèin am falach ach 'ga chur fhathast; atharraich meud na h-uinneige gus fhaicinn

View File

@ -26,7 +26,7 @@ sign_in_again_button=Přizjewić
sign_in_again_use_as_guest_button2={{clientSuperShortname}} jako hósć wužiwać
panel_browse_with_friend_button=Tutu stronu z přećelom přehladować
panel_stop_sharing_tabs_button=Waše rajtarki hižo njedźělić
panel_disconnect_button=Zwisk dźělić
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -182,28 +182,13 @@ door_hanger_button=W porjadku
# Infobar strings
infobar_screenshare_browser_message2=Dźěliće swoje rajtarki. Waši přećeljo móža kóždy rajtark widźeć, na kotryž kliknjeće
infobar_screenshare_paused_browser_message=Dźělenje rajtarka je přetorhnjene
infobar_button_gotit_label=Sym to zrozumił!
infobar_button_gotit_accesskey=S
infobar_button_pause_label=Zastajić
infobar_button_pause_accesskey=Z
infobar_button_restart_label=Znowa startować
infobar_screenshare_stop_sharing_message=Hižo swoje rajtarki njedźěliće
infobar_button_restart_label2=Dźělenje znowa startować
infobar_button_restart_accesskey=n
infobar_button_resume_label=Pokročować
infobar_button_resume_accesskey=P
infobar_button_stop_label=Stój
infobar_button_stop_label2=Dźělenje zastajić
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=To hižo njepokazać
infobar_menuitem_dontshowagain_accesskey=T
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Hišće žane rozmołwy.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Započńće nowu!
infobar_button_disconnect_label=Zwisk dźělić
infobar_button_disconnect_accesskey=Z
# E10s not supported strings
@ -246,7 +231,8 @@ rooms_room_full_call_to_action_label=Zhońće wjace wo {{clientShortname}}»
rooms_room_full_call_to_action_nonFx_label=Sćehńće {{brandShortname}}, zo byšće swójsku započał
rooms_room_full_label=Stej hižo dwě wosobje w tutej rozmołwje.
rooms_room_join_label=Rozmołwje so přidružić
rooms_room_joined_label=Něchtó je so rozmołwje přidružił!
rooms_room_joined_owner_connected_label2=Waš přećel je nětko zwjazany a móže waše rajtarki widźeć.
rooms_room_joined_owner_not_connected_label=Waš přećel čaka, zo by {{roomURLHostname}} z wami přehladował.
self_view_hidden_message=Samonapohlad schowany, ale sćele so hišće; změńće wulkosć wokna, kotrež ma so pokazać

View File

@ -26,7 +26,7 @@ sign_in_again_button=Bejelentkezés
sign_in_again_use_as_guest_button2=A {{clientSuperShortname}} használata vendégként
panel_browse_with_friend_button=Oldal böngészése ismerősével
panel_stop_sharing_tabs_button=Lapmegosztás leállítása
panel_disconnect_button=Bontás
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -182,28 +182,13 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_browser_message2=Megosztja a lapjait. Ismerősei látni fogják bármely lap tartalmát, amelyre rákattint.
infobar_screenshare_paused_browser_message=A lapmegosztás szüneteltetve
infobar_button_gotit_label=Megértettem!
infobar_button_gotit_accesskey=M
infobar_button_pause_label=Szünet
infobar_button_pause_accesskey=z
infobar_button_restart_label=Újraindítás
infobar_screenshare_stop_sharing_message=Már nem osztja meg böngészőlapjait
infobar_button_restart_label2=Megosztás újrakezdése
infobar_button_restart_accesskey=r
infobar_button_resume_label=Folytatás
infobar_button_resume_accesskey=F
infobar_button_stop_label=Leállítás
infobar_button_stop_label2=Megosztás leállítása
infobar_button_stop_accesskey=L
infobar_menuitem_dontshowagain_label=Ne mutassa ezt újra
infobar_menuitem_dontshowagain_accesskey=N
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Még nincsenek beszélgetések.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Kezdjen újat!
infobar_button_disconnect_label=Bontás
infobar_button_disconnect_accesskey=o
# E10s not supported strings
@ -246,7 +231,8 @@ rooms_room_full_call_to_action_label=Tudjon meg többet a {{clientShortname}}ró
rooms_room_full_call_to_action_nonFx_label=A {{brandShortname}} letöltésével sajátot indíthat
rooms_room_full_label=Már vannak ketten ebben a csevegésben.
rooms_room_join_label=Csatlakozás a csevegéshez
rooms_room_joined_label=Valaki csatlakozott a csevegéshez!
rooms_room_joined_owner_connected_label2=Ismerőse csatlakozott, és láthatja az Ön böngészőlapjait.
rooms_room_joined_owner_not_connected_label=Ismerőse arra vár, hogy közösen böngészhessék a következőt: {{roomURLHostname}}.
self_view_hidden_message=A saját kamera képe elrejtve, de elküldésre kerül. Méretezze át az ablakot a megjelenítéshez

View File

@ -26,7 +26,7 @@ sign_in_again_button=Մուտք գործել
sign_in_again_use_as_guest_button2=Օգտագործել {{clientSuperShortname}}-ը որպես Հյուր
panel_browse_with_friend_button=Դիտել էջը ընկերոջ հետ
panel_stop_sharing_tabs_button=Կանգնեցնել ներդիրների համաօգտագործումը
panel_disconnect_button=Կապախզել
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -182,28 +182,13 @@ door_hanger_button=Լավ
# Infobar strings
infobar_screenshare_browser_message2=Դուք համաօգտագործում եք ձեր ներդիրները: Ցանկացած ներդիր, որ սեղմում եք կտեսնեն ձեր ընկերները:
infobar_screenshare_paused_browser_message=Ներդիրի համաօգտագործումը դադարեցված է
infobar_button_gotit_label=Հասկացա
infobar_button_gotit_accesskey=G
infobar_button_pause_label=Դադար
infobar_button_pause_accesskey=P
infobar_button_restart_label=Վերամեկնարկել
infobar_screenshare_stop_sharing_message=Դուք այլևս չեք համաօգտագործում ձեր ներդիրները
infobar_button_restart_label2=Վերսկսել համաօգտագործումը
infobar_button_restart_accesskey=e
infobar_button_resume_label=Շարունակել
infobar_button_resume_accesskey=R
infobar_button_stop_label=Կանգնեցնել
infobar_button_stop_label2=Կանգնեցնել համաօգտագործումը
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=Այլևս չհարցնել
infobar_menuitem_dontshowagain_accesskey=D
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Զրույցներ չկան:
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Սկսել նորը
infobar_button_disconnect_label=Կապախզել
infobar_button_disconnect_accesskey=D
# E10s not supported strings

View File

@ -0,0 +1,255 @@
# 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/.
# Panel Strings
clientSuperShortname=Halo
## LOCALIZATION_NOTE(loopMenuItem_label): Label of the menu item that is placed
## inside the browser 'Tools' menu. Use the unicode ellipsis char, \u2026, or
## use "..." if \u2026 doesn't suit traditions in your locale.
loopMenuItem_label=Mulai sebuah percakapan …
loopMenuItem_accesskey=t
## LOCALIZATION_NOTE(sign_in_again_title_line_one, sign_in_again_title_line_two2):
## These are displayed together at the top of the panel when a user is needed to
## sign-in again. The emphesis is on the first line to get the user to sign-in again,
## and this is displayed in slightly larger font. Please arrange as necessary for
## your locale.
## {{clientShortname2}} will be replaced by the brand name for either string.
sign_in_again_title_line_one=Silakan masuk kembali
sign_in_again_title_line_two2=untuk memulai menggunakan {{clientShortname2}}
sign_in_again_button=Masuk
## LOCALIZATION_NOTE(sign_in_again_use_as_guest_button2): {{clientSuperShortname}}
## will be replaced by the super short brandname.
sign_in_again_use_as_guest_button2=Gunakan {{clientSuperShortname}} sebagai Tamu
panel_browse_with_friend_button=Jelajahi laman ini bersama teman
panel_stop_sharing_tabs_button=Berhenti membagikan tab Anda
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Klik tombol Hello untuk jelajahi laman Web bersama teman.
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## ways to use Hello project.
first_time_experience_content=Gunakan ini untuk perencanaan bersama, pekerjaan bersama, dan tertawa bersama.
first_time_experience_button_label2=Lihat cara kerja
invite_header_text_bold=Undang seseorang untuk jelajahi laman ini bersama Anda!
invite_header_text3=Membutuhkan 2 orang untuk menggunakan Firefox Hello, jadi kirimkan tautan ke teman untuk menjelajah Web bersama Anda!
## LOCALIZATION_NOTE(invite_copy_link_button, invite_copied_link_button,
## invite_email_link_button, invite_facebook_button2): These labels appear under
## an iconic button for the invite view.
invite_copy_link_button=Salin Tautan
invite_copied_link_button=Tersalin!
invite_email_link_button=Email Tautan
invite_facebook_button3=Facebook
invite_your_link=Tautan Anda:
# Status text
display_name_guest=Tamu
# Error bars
## LOCALIZATION NOTE(session_expired_error_description,could_not_authenticate,password_changed_question,try_again_later,could_not_connect,check_internet_connection,login_expired,service_not_available,problem_accessing_account):
## These may be displayed at the top of the panel.
session_expired_error_description=Sesi habis. Semua URLs yang sebelumnya Anda buat dan bagikan akan tidak berfungsi lagi.
could_not_authenticate=Tidak Dapat Mengautentikasi
password_changed_question=Apakah Anda mengganti password Anda?
try_again_later=Silakan coba kembali nanti
could_not_connect=Tidak Dapat Terhubung Dengan Server
check_internet_connection=Silakan periksa koneksi internet Anda
login_expired=Sesi Masuk Anda Habis
service_not_available=Layanan Tidak Tersedia Saat Ini
problem_accessing_account=Terjadi Masalah Dalam Mengakses Akun Anda
## LOCALIZATION NOTE(retry_button): Displayed when there is an error to retry
## the appropriate action.
retry_button=Ulangi
share_email_subject7=Undangan Anda untuk menjelajah Web bersama
## LOCALIZATION NOTE (share_email_body7): In this item, don't translate the
## part between {{..}} and leave the \n\n part alone
share_email_body7=Seorang teman menunggu Anda di Firefox Hello. Klik tautan untuk terhubungdan menjelajah Web bersama: {{callUrl}}
## LOCALIZATION NOTE (share_email_body_context3): In this item, don't translate
## the part between {{..}} and leave the \n\n part alone.
share_email_body_context3=Seorang teman menunggu Anda di Firefox Hello. Klik tautan untuk terhubung dan menjelajahi {{title}} bersama: {{callUrl}}
## LOCALIZATION NOTE (share_email_footer2): Common footer content for both email types
share_email_footer2=\n\n____________\nFirefox Hello memungkinkan anda menjelajah Web dengan teman-teman Anda. Gunakan ini untuk melakukan: perencanaan bersama, pekerjaan bersama, tertawa bersama. Pelajarri lebih lanjut di http://www.firefox.com/hello
## LOCALIZATION NOTE (share_tweeet): In this item, don't translate the part
## between {{..}}. Please keep the text below 117 characters to make sure it fits
## in a tweet.
share_tweet=Gabung dengan saya untuk percakapan video pada {{clientShortname2}}!
share_add_service_button=Tambah Layanan
## LOCALIZATION NOTE (copy_link_menuitem, email_link_menuitem, delete_conversation_menuitem):
## These menu items are displayed from a panel's context menu for a conversation.
copy_link_menuitem=Salin Tautan
email_link_menuitem=Email Tautan
delete_conversation_menuitem2=Hapus
panel_footer_signin_or_signup_link=Masuk atau Daftar
settings_menu_item_account=Akun
settings_menu_item_settings=Pengaturan
settings_menu_item_signout=Keluar
settings_menu_item_signin=Masuk
settings_menu_item_turnnotificationson=Mengaktifkan Pemberitahuan
settings_menu_item_turnnotificationsoff=Mematikan Pemberitahuan
settings_menu_item_feedback=Kirim Masukan
settings_menu_button_tooltip=Pengaturan
# Conversation Window Strings
initiate_call_button_label2=Siap melakukan percakapan?
incoming_call_title2=Permintaan Percakapan
incoming_call_block_button=Blok
hangup_button_title=Putuskan
hangup_button_caption2=Keluar
## LOCALIZATION NOTE (call_with_contact_title): The title displayed
## when calling a contact. Don't translate the part between {{..}} because
## this will be replaced by the contact's name.
call_with_contact_title=Percakapan dengan {{incomingCallIdentity}}
# Outgoing conversation
outgoing_call_title=Mulai percakapan?
initiate_audio_video_call_button2=Mulai
initiate_audio_video_call_tooltip2=Mulai percakapan video
initiate_audio_call_button2=Percakapan video
peer_ended_conversation2=Orang yang dipanggil telah mengakhiri percakapan.
restart_call=Gabung Kembali
## LOCALIZATION NOTE (contact_offline_title): Title which is displayed when the
## contact is offline.
contact_offline_title=Orang ini tidak luring
## LOCALIZATION NOTE (call_timeout_notification_text): Title which is displayed
## when the call didn't go through.
call_timeout_notification_text=Panggilan tidak sampai.
## LOCALIZATION NOTE (cancel_button):
## This button is displayed when a call has failed.
cancel_button=Batal
rejoin_button=Gabung Kembali Percakapan
cannot_start_call_session_not_ready=Tidak dapat memulai panggilan, sesi tidak siap.
network_disconnected=Sambungan jaringan terputus tiba-tiba.
connection_error_see_console_notification=Panggilan gagal; lihat detailnya pada konsol.
no_media_failure_message=Tidak ada kamera atau mikrofon ditemukan.
ice_failure_message=Koneksi gagal. Firewall Anda mungkin memblokir panggilan.
## LOCALIZATION NOTE (legal_text_and_links3): In this item, don't translate the
## parts between {{..}} because these will be replaced with links with the labels
## from legal_text_tos and legal_text_privacy. clientShortname will be replaced
## by the brand name.
legal_text_and_links3=Dengan menggunakan {{clientShortname}} Anda menyetujui {{terms_of_use}} dan {{privacy_notice}}.
legal_text_tos=Ketentuan Penggunaan
legal_text_privacy=Kebijakan Privasi
## LOCALIZATION NOTE (powered_by_beforeLogo, powered_by_afterLogo):
## These 2 strings are displayed before and after a 'Telefonica'
## logo.
powered_by_beforeLogo=Didukung oleh
powered_by_afterLogo=
## LOCALIZATION_NOTE (feedback_rejoin_button): Displayed on the feedback form after
## a signed-in to signed-in user call.
feedback_rejoin_button=Gabung Kembali
## LOCALIZATION NOTE (feedback_report_user_button): Used to report a user in the case of
## an abusive user.
feedback_report_user_button=Laporkan Pengguna
feedback_window_heading=Bagaimana percakapan Anda tadi?
feedback_request_button=Tinggalkan Masukan
tour_label=Tur
rooms_list_recently_browsed2=Baru saja dijelajah
rooms_list_currently_browsing2=Penjelajahan saat ini
rooms_signout_alert=Percakapan yang terbuka akan ditutup
room_name_untitled_page=Halaman Tanpa Judul
## LOCALIZATION NOTE (door_hanger_return, door_hanger_prompt_name, door_hanger_button): Dialog message on leaving conversation
door_hanger_return=Sampai bertemu lagi! Anda dapat kembali ke sesi ini bersama setiap saat melalui panel Halo.
door_hanger_prompt_name=Apakah Anda ingin memberikannya nama yang lebih mudah diingat? Nama:
door_hanger_button=OK
# Infobar strings
infobar_screenshare_browser_message2=Anda membagikan tab Anda. Tab apapun yang diklik dapat terlihat oleh teman Anda
infobar_screenshare_paused_browser_message=Pembagian tab dihentikan sementara
infobar_button_gotit_label=Mengerti!
infobar_button_gotit_accesskey=G
infobar_button_pause_label=Tunda
infobar_button_pause_accesskey=P
infobar_button_restart_label=Mulai Ulang
infobar_button_restart_accesskey=e
infobar_button_resume_label=Lanjutkan
infobar_button_resume_accesskey=R
infobar_button_stop_label=Hentikan
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=Jangan tampilkan lagi
infobar_menuitem_dontshowagain_accesskey=D
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Belum ada percakapan.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Mulai percakapan baru!
# E10s not supported strings
e10s_not_supported_button_label=Buka Jendela Baru
e10s_not_supported_subheading={{brandShortname}} tidak dapat bekerja dalam jendela multi-proses.
# 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/.
## LOCALIZATION NOTE: In this file, don't translate the part between {{..}}
# Text chat strings
chat_textbox_placeholder=Tik di sini...
## LOCALIZATION NOTE(clientShortname2): This should not be localized and
## should remain "Firefox Hello" for all locales.
clientShortname2=Firefox Hello
conversation_has_ended=Percakapan Anda berakhir.
generic_failure_message=Kami mengalami kesulitan teknikal …
generic_failure_no_reason2=Ingin mencoba lagi?
help_label=Bantuan
mute_local_audio_button_title=Bisukan audio Anda
unmute_local_audio_button_title=Bunyikan audio Anda
mute_local_video_button_title2=Non-aktifkan video
unmute_local_video_button_title2=Aktifkan video
## LOCALIZATION NOTE (retry_call_button):
## This button is displayed when a call has failed.
retry_call_button=Coba Lagi
rooms_leave_button_label=Tinggalkan
rooms_panel_title=Pilih percakapan atau mulai yang baru
rooms_room_full_call_to_action_label=Pelajari selengkapnya tentang {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=Unduh {{brandShortname}} untuk memulai percakapan Anda sendiri
rooms_room_full_label=Sudah ada dua orang dalam percakapan ini.
rooms_room_join_label=Gabung ke dalam percakapan
rooms_room_joined_label=Seseorang bergabung ke dalam percakapan!
self_view_hidden_message=Tampilan diri sedang tersembunyi tetapi tetap dikirim, ubah ukuran jendela untuk menampilkannya
## LOCALIZATION NOTE (tos_failure_message): Don't translate {{clientShortname}}
## as this will be replaced by clientShortname2.
tos_failure_message={{clientShortname}} tidak tersedia di negara Anda.

View File

@ -26,7 +26,7 @@ sign_in_again_button=ログイン
sign_in_again_use_as_guest_button2=ゲストとして {{clientSuperShortname}} を使用
panel_browse_with_friend_button=このページを友だちと一緒に見る
panel_stop_sharing_tabs_button=タブの共有を中止
panel_disconnect_button=接続中止
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -182,28 +182,13 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_browser_message2=あなたはウィンドウを共有しています。開いているタブはすべて友だちによって見られます
infobar_screenshare_paused_browser_message=タブ共有が一時停止されています
infobar_button_gotit_label=了解
infobar_button_gotit_accesskey=G
infobar_button_pause_label=一時停止
infobar_button_pause_accesskey=P
infobar_button_restart_label=再起動
infobar_screenshare_stop_sharing_message=タブの共有を中止しました
infobar_button_restart_label2=共有を再開
infobar_button_restart_accesskey=e
infobar_button_resume_label=再開
infobar_button_resume_accesskey=R
infobar_button_stop_label=停止
infobar_button_stop_label2=共有を中止
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=再度表示しない
infobar_menuitem_dontshowagain_accesskey=D
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=まだ通話がありません。
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=新たに通話を始めましょう!
infobar_button_disconnect_label=接続中止
infobar_button_disconnect_accesskey=D
# E10s not supported strings
@ -246,7 +231,8 @@ rooms_room_full_call_to_action_label={{clientShortname}} の詳細 »
rooms_room_full_call_to_action_nonFx_label={{brandShortname}} をダウンロードして会話を始めましょう
rooms_room_full_label=この会話には既に 2 名が参加しています。
rooms_room_join_label=会話に参加
rooms_room_joined_label=誰かが会話に参加しました!
rooms_room_joined_owner_connected_label2=あなたの友人が接続し、あなたのタブを見られるようになりました。
rooms_room_joined_owner_not_connected_label=友人があなたと {{roomURLHostname}} を見るために待っています。
self_view_hidden_message=セルフビューは隠れていますが送信されています。表示するにはウィンドウの大きさを変更してください

View File

@ -18,15 +18,15 @@ loopMenuItem_accesskey=c
## and this is displayed in slightly larger font. Please arrange as necessary for
## your locale.
## {{clientShortname2}} will be replaced by the brand name for either string.
sign_in_again_title_line_one=Por favor, inicie novamente a sessão
sign_in_again_title_line_two2=para continuar a utilizar o {{clientShortname2}}
sign_in_again_title_line_one=Por favor, entre novamente
sign_in_again_title_line_two2=para continuar usando o {{clientShortname2}}
sign_in_again_button=Entrar
## LOCALIZATION_NOTE(sign_in_again_use_as_guest_button2): {{clientSuperShortname}}
## will be replaced by the super short brandname.
sign_in_again_use_as_guest_button2=Utilizar {{clientSuperShortname}} como um Convidado
sign_in_again_use_as_guest_button2=Usar o {{clientSuperShortname}} como um convidado
panel_browse_with_friend_button=Navegue nesta página com um amigo
panel_stop_sharing_tabs_button=Parar de compartilhar suas abas
panel_disconnect_button=Desconectar
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -175,35 +175,20 @@ rooms_signout_alert=As conversas abertas serão fechadas
room_name_untitled_page=Página sem título
## LOCALIZATION NOTE (door_hanger_return, door_hanger_prompt_name, door_hanger_button): Dialog message on leaving conversation
door_hanger_return=Até mais! Você pode retornar para essa sessão compartilhada a qualquer momento através do painel do Hello.
door_hanger_return=Até mais! Retorne para essa sessão compartilhada a qualquer momento através do painel Hello.
door_hanger_prompt_name=Gostaria de dar um nome mais fácil de lembrar? Nome atual:
door_hanger_button=OK
# Infobar strings
infobar_screenshare_browser_message2=Você está compartilhando suas abas. Qualquer aba que clicar pode ser vista pelos seus amigos
infobar_screenshare_paused_browser_message=O compartilhamento de abas está pausado
infobar_button_gotit_label=Entendi!
infobar_button_gotit_accesskey=E
infobar_button_pause_label=Pausar
infobar_button_pause_accesskey=P
infobar_button_restart_label=Reiniciar
infobar_screenshare_stop_sharing_message=Já não está compartilhando suas abas
infobar_button_restart_label2=Reiniciar compartilhamento
infobar_button_restart_accesskey=R
infobar_button_resume_label=Continuar
infobar_button_resume_accesskey=C
infobar_button_stop_label=Parar
infobar_button_stop_label2=Parar compartilhamento
infobar_button_stop_accesskey=a
infobar_menuitem_dontshowagain_label=Não exibir novamente
infobar_menuitem_dontshowagain_accesskey=N
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Nenhuma conversa.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Iniciar uma nova conversa!
infobar_button_disconnect_label=Desconectar
infobar_button_disconnect_accesskey=D
# E10s not supported strings
@ -246,7 +231,8 @@ rooms_room_full_call_to_action_label=Saiba mais sobre o {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=Baixe o {{brandShortname}} para iniciar a sua
rooms_room_full_label=Já existem duas pessoas nesta conversa.
rooms_room_join_label=Entre na conversa
rooms_room_joined_label=Alguém entrou na conversa!
rooms_room_joined_owner_connected_label2=Seu amigo agora está conectado e será capaz de ver suas abas.
rooms_room_joined_owner_not_connected_label=Seu amigo está esperando para navegar em {{roomURLHostname}} com você.
self_view_hidden_message=A visualização da sua câmera está oculta, mas ainda é transmitida; redimensione a janela para visualizá-la novamente

View File

@ -26,7 +26,7 @@ sign_in_again_button=Iniciar sessão
sign_in_again_use_as_guest_button2=Utilizar {{clientSuperShortname}} como um Convidado
panel_browse_with_friend_button=Navegue nesta página com um amigo
panel_stop_sharing_tabs_button=Parar de partilhar os seus separadores
panel_disconnect_button=Desligar
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -182,28 +182,13 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_browser_message2=Está a partilhar os seus separadores. Qualquer separador que clicar poderá será ser visto pelos seus amigos
infobar_screenshare_paused_browser_message=A partilha de separadores está em pausa
infobar_button_gotit_label=Compreendi!
infobar_button_gotit_accesskey=C
infobar_button_pause_label=Pausa
infobar_button_pause_accesskey=P
infobar_button_restart_label=Reiniciar
infobar_screenshare_stop_sharing_message=Já não está a partilhar os seus separadores
infobar_button_restart_label2=Reiniciar a partilha
infobar_button_restart_accesskey=e
infobar_button_resume_label=Continuar
infobar_button_resume_accesskey=o
infobar_button_stop_label=Parar
infobar_button_stop_label2=Parar de partilhar
infobar_button_stop_accesskey=r
infobar_menuitem_dontshowagain_label=Não voltar a mostrar isto
infobar_menuitem_dontshowagain_accesskey=n
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Ainda sem conversas.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Começar uma nova conversa!
infobar_button_disconnect_label=Desligar
infobar_button_disconnect_accesskey=D
# E10s not supported strings
@ -246,7 +231,8 @@ rooms_room_full_call_to_action_label=Saiba mais sobre o {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=Descarregue o {{brandShortname}} para começar a sua
rooms_room_full_label=Já existem duas pessoas nesta conversa.
rooms_room_join_label=Junte-se à conversa
rooms_room_joined_label=Alguém se juntou à conversa!
rooms_room_joined_owner_connected_label2=O seu amigo está agora ligado e poderá ver os seus separadores.
rooms_room_joined_owner_not_connected_label=O seu amigo está à espera para navegar em {{roomURLHostname}} consigo.
self_view_hidden_message=Vista própria oculta mas ainda a ser enviada; redimensione a janela para mostrar

View File

@ -26,7 +26,7 @@ sign_in_again_button=Logga in
sign_in_again_use_as_guest_button2=Använd {{clientSuperShortname}} som gäst
panel_browse_with_friend_button=Surfa på denna sida med en vän
panel_stop_sharing_tabs_button=Sluta dela dina flikar
panel_disconnect_button=Koppla från
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -182,28 +182,13 @@ door_hanger_button=Ok
# Infobar strings
infobar_screenshare_browser_message2=Du delar dina flikar. Alla flik du klickar på kan ses av dina vänner
infobar_screenshare_paused_browser_message=Flikdelning pausad
infobar_button_gotit_label=Jag fattar!
infobar_button_gotit_accesskey=g
infobar_button_pause_label=Pausa
infobar_button_pause_accesskey=P
infobar_button_restart_label=Starta om
infobar_button_restart_accesskey=a
infobar_button_resume_label=Återuppta
infobar_button_resume_accesskey=r
infobar_button_stop_label=Stoppa
infobar_screenshare_stop_sharing_message=Du delar inte längre dina flikar
infobar_button_restart_label2=Starta om delning
infobar_button_restart_accesskey=d
infobar_button_stop_label2=Sluta dela
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=Visa inte detta igen
infobar_menuitem_dontshowagain_accesskey=I
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Inga konversationer än.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Starta en ny!
infobar_button_disconnect_label=Koppla från
infobar_button_disconnect_accesskey=f
# E10s not supported strings
@ -246,7 +231,8 @@ rooms_room_full_call_to_action_label=Läs mer om {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=Hämta {{brandShortname}} för att börja ett eget
rooms_room_full_label=Det är redan två person i denna konversation.
rooms_room_join_label=Delta i konversationen
rooms_room_joined_label=Någon har gått med i konversationen!
rooms_room_joined_owner_connected_label2=Din vän är nu ansluten och kommer att kunna se dina flikar.
rooms_room_joined_owner_not_connected_label=Din vän väntar på att surfa {{roomURLHostname}} tillsammans med dig.
self_view_hidden_message=Själv-vy dold, men skickas ändå; ändra fönsterstorlek för att visa

View File

@ -26,7 +26,7 @@ sign_in_again_button=Увійти
sign_in_again_use_as_guest_button2=Використовувати {{clientSuperShortname}}, як гість
panel_browse_with_friend_button=Переглянути цю сторінку з другом
panel_stop_sharing_tabs_button=Припинити ділитися своїми вкладками
panel_disconnect_button=Від'єднатися
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -183,28 +183,13 @@ door_hanger_button=OK
# Infobar strings
infobar_screenshare_browser_message2=Ви ділитеся своїми вкладками. Ваші друзі можуть побачити вміст будь-якої вкладки, на яку ви перейшли.
infobar_screenshare_paused_browser_message=Спільний доступ до вкладок призупинено
infobar_button_gotit_label=Зрозуміло!
infobar_button_gotit_accesskey=З
infobar_button_pause_label=Пауза
infobar_button_pause_accesskey=П
infobar_button_restart_label=Перезапустити
infobar_screenshare_stop_sharing_message=Ви більше не ділитеся своїми вкладками
infobar_button_restart_label2=Перезапустити обмін
infobar_button_restart_accesskey=з
infobar_button_resume_label=Продовжити
infobar_button_resume_accesskey=о
infobar_button_stop_label=Зупинити
infobar_button_stop_label2=Припинити обмін
infobar_button_stop_accesskey=и
infobar_menuitem_dontshowagain_label=Не показувати знову
infobar_menuitem_dontshowagain_accesskey=Н
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=Ще немає розмов.
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=Почніть нову розмову!
infobar_button_disconnect_label=Від'єднатися
infobar_button_disconnect_accesskey=В
# E10s not supported strings
@ -247,7 +232,8 @@ rooms_room_full_call_to_action_label=Дізнатися більше про {{cl
rooms_room_full_call_to_action_nonFx_label=Завантажити {{brandShortname}}, щоб почати власну
rooms_room_full_label=В цій розмові вже беруть участь двоє людей.
rooms_room_join_label=Долучитися до розмови
rooms_room_joined_label=Хтось долучився до розмови!
rooms_room_joined_owner_connected_label2=Ваш друг тепер під'єднаний і зможе бачити ваші вкладки.
rooms_room_joined_owner_not_connected_label=Ваш друг чекає на спільний перегляд {{roomURLHostname}}.
self_view_hidden_message=Вигляд самого себе прихований, але все ще відправляється; змініть розмір вікна для показу

View File

@ -26,7 +26,7 @@ sign_in_again_button=登录
sign_in_again_use_as_guest_button2=以访客身份使用 {{clientSuperShortname}}
panel_browse_with_friend_button=与朋友一同浏览此页面
panel_stop_sharing_tabs_button=停止分享您的标签页
panel_disconnect_button=断开连接
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -182,28 +182,13 @@ door_hanger_button=确定
# Infobar strings
infobar_screenshare_browser_message2=您正在共享您的标签页。您的朋友将会看到您所点选的任何标签页
infobar_screenshare_paused_browser_message=暂停标签页共享
infobar_button_gotit_label=明白!
infobar_button_gotit_accesskey=G
infobar_button_pause_label=暂停
infobar_button_pause_accesskey=P
infobar_button_restart_label=重启
infobar_screenshare_stop_sharing_message=您目前不再共享您的标签页
infobar_button_restart_label2=重新开始共享
infobar_button_restart_accesskey=e
infobar_button_resume_label=继续
infobar_button_resume_accesskey=R
infobar_button_stop_label=停止
infobar_button_stop_label2=停止共享
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=不再显示
infobar_menuitem_dontshowagain_accesskey=D
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=还没有对话。
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=开始一场新的对话!
infobar_button_disconnect_label=断开连接
infobar_button_disconnect_accesskey=D
# E10s not supported strings
@ -246,7 +231,8 @@ rooms_room_full_call_to_action_label=详细了解有关 {{clientShortname}} »
rooms_room_full_call_to_action_nonFx_label=下载 {{brandShortname}} 开始您自己的通话
rooms_room_full_label=这个通话中已经有两个人了。
rooms_room_join_label=加入通话
rooms_room_joined_label=有人加入了通话!
rooms_room_joined_owner_connected_label2=您的朋友目前已连接,并将可以看到您的标签页。
rooms_room_joined_owner_not_connected_label=您的朋友正在等待与您浏览 {{roomURLHostname}}。
self_view_hidden_message=已隐藏但仍在发送中;调整窗口以显示

View File

@ -26,7 +26,7 @@ sign_in_again_button=登入
sign_in_again_use_as_guest_button2=以訪客身分使用 {{clientSuperShortname}}
panel_browse_with_friend_button=與朋友一起瀏覽此頁面
panel_stop_sharing_tabs_button=停止分享您的分頁
panel_disconnect_button=取消連線
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
@ -182,28 +182,13 @@ door_hanger_button=確定
# Infobar strings
infobar_screenshare_browser_message2=您正在分享分頁,您的朋友將能看到您點擊的任何分頁內容。
infobar_screenshare_paused_browser_message=已暫停分享分頁
infobar_button_gotit_label=知道了!
infobar_button_gotit_accesskey=G
infobar_button_pause_label=暫停
infobar_button_pause_accesskey=P
infobar_button_restart_label=重新啟動
infobar_screenshare_stop_sharing_message=您已停止分享分頁
infobar_button_restart_label2=重新開始分享
infobar_button_restart_accesskey=e
infobar_button_resume_label=繼續
infobar_button_resume_accesskey=R
infobar_button_stop_label=停止
infobar_button_stop_label2=停止分享
infobar_button_stop_accesskey=S
infobar_menuitem_dontshowagain_label=不要再顯示此訊息
infobar_menuitem_dontshowagain_accesskey=D
# Context in conversation strings
## LOCALIZATION NOTE(no_conversations_message_heading2): Title shown when user
## has no conversations available.
no_conversations_message_heading2=沒有對話。
## LOCALIZATION NOTE(no_conversations_start_message2): Subheading inviting the
## user to start a new conversation.
no_conversations_start_message2=開啟一場新的對話!
infobar_button_disconnect_label=取消連線
infobar_button_disconnect_accesskey=D
# E10s not supported strings
@ -246,7 +231,8 @@ rooms_room_full_call_to_action_label=了解 {{clientShortname}} 的更多資訊
rooms_room_full_call_to_action_nonFx_label=下載 {{brandShortname}},開始您自己的通話
rooms_room_full_label=這場通話中已經有兩個人。
rooms_room_join_label=加入通話
rooms_room_joined_label=某人加入了通話!
rooms_room_joined_owner_connected_label2=您的朋友已上線,將能夠看到您的分頁。
rooms_room_joined_owner_not_connected_label=您的朋友正等待與您一起瀏覽 {{roomURLHostname}}。
self_view_hidden_message=已隱藏您自己的畫面,但還是會送出。請調整視窗大小以顯示自己的畫面。

View File

@ -9,7 +9,7 @@
<Description about="urn:mozilla:install-manifest">
<em:id>loop@mozilla.org</em:id>
<em:bootstrap>true</em:bootstrap>
<em:version>0.3.0alpha</em:version>
<em:version>0.3.0</em:version>
<em:type>2</em:type>
<!-- Target Application this extension can install into,

View File

@ -9,7 +9,6 @@
#define bn_IN bn-IN
#define en_GB en-GB
#define en_US en-US
#define es_AR es-AR
#define es_CL es-CL
#define es_ES es-ES
#define es_MX es-MX
@ -58,7 +57,7 @@
# For locales we support, include the file from the locale's directory in the
# source tree.
# For other locales (and en-US) fallback to the en-US directory.
#if AB_CD == af || AB_CD == ar || AB_CD == as || AB_CD == ast || AB_CD == az || AB_CD == be || AB_CD == bg || AB_CD == bn_BD || AB_CD == bn_IN || AB_CD == bs || AB_CD == ca || AB_CD == cs || AB_CD == cy || AB_CD == da || AB_CD == de || AB_CD == dsb || AB_CD == el || AB_CD == en_GB || AB_CD == en_US || AB_CD == eo || AB_CD == es_AR || AB_CD == es_CL || AB_CD == es_ES || AB_CD == es_MX || AB_CD == et || AB_CD == eu || AB_CD == fa || AB_CD == ff || AB_CD == fi || AB_CD == fr || AB_CD == fy || AB_CD == fy_NL || AB_CD == ga || AB_CD == gd || AB_CD == gl || AB_CD == gu_IN || AB_CD == he || AB_CD == hi_IN || AB_CD == hr || AB_CD == hsb || AB_CD == ht || AB_CD == hu || AB_CD == hy_AM || AB_CD == id || AB_CD == it || AB_CD == ja || AB_CD == kk || AB_CD == km || AB_CD == kn || AB_CD == ko || AB_CD == ku || AB_CD == lij || AB_CD == lt || AB_CD == lv || AB_CD == mk || AB_CD == ml || AB_CD == mn || AB_CD == ms || AB_CD == my || AB_CD == nb_NO || AB_CD == ne_NP || AB_CD == nl || AB_CD == or || AB_CD == pa || AB_CD == pa_IN || AB_CD == pl || AB_CD == pt || AB_CD == pt_BR || AB_CD == pt_PT || AB_CD == rm || AB_CD == ro || AB_CD == ru || AB_CD == si || AB_CD == sk || AB_CD == sl || AB_CD == son || AB_CD == sq || AB_CD == sr || AB_CD == sv_SE || AB_CD == ta || AB_CD == te || AB_CD == th || AB_CD == tr || AB_CD == uk || AB_CD == ur || AB_CD == vi || AB_CD == xh || AB_CD == zh_CN || AB_CD == zh_TW || AB_CD == zu
#if AB_CD == af || AB_CD == ar || AB_CD == as || AB_CD == ast || AB_CD == az || AB_CD == be || AB_CD == bg || AB_CD == bn_BD || AB_CD == bn_IN || AB_CD == bs || AB_CD == ca || AB_CD == cs || AB_CD == cy || AB_CD == da || AB_CD == de || AB_CD == dsb || AB_CD == el || AB_CD == en_GB || AB_CD == en_US || AB_CD == eo || AB_CD == es_CL || AB_CD == es_ES || AB_CD == es_MX || AB_CD == et || AB_CD == eu || AB_CD == fa || AB_CD == ff || AB_CD == fi || AB_CD == fr || AB_CD == fy || AB_CD == fy_NL || AB_CD == ga || AB_CD == gd || AB_CD == gl || AB_CD == gu_IN || AB_CD == he || AB_CD == hi_IN || AB_CD == hr || AB_CD == hsb || AB_CD == ht || AB_CD == hu || AB_CD == hy_AM || AB_CD == id || AB_CD == it || AB_CD == ja || AB_CD == kk || AB_CD == km || AB_CD == kn || AB_CD == ko || AB_CD == ku || AB_CD == lij || AB_CD == lt || AB_CD == lv || AB_CD == mk || AB_CD == ml || AB_CD == mn || AB_CD == ms || AB_CD == my || AB_CD == nb_NO || AB_CD == ne_NP || AB_CD == nl || AB_CD == or || AB_CD == pa || AB_CD == pa_IN || AB_CD == pl || AB_CD == pt || AB_CD == pt_BR || AB_CD == pt_PT || AB_CD == rm || AB_CD == ro || AB_CD == ru || AB_CD == si || AB_CD == sk || AB_CD == sl || AB_CD == son || AB_CD == sq || AB_CD == sr || AB_CD == sv_SE || AB_CD == ta || AB_CD == te || AB_CD == th || AB_CD == tr || AB_CD == uk || AB_CD == ur || AB_CD == vi || AB_CD == xh || AB_CD == zh_CN || AB_CD == zh_TW || AB_CD == zu
locale/@AB_CD@/ (chrome/locale/@AB_CD@/*)
#else
locale/@AB_CD@/ (chrome/locale/en-US/*)

View File

@ -23,9 +23,11 @@ LOOPDIR=browser/extensions/loop
# prompting is in browser_devices_get_user_media_about_urls.js. It's possible
# to mess this up with CSP handling, and probably other changes, too.
# Currently disabled due to Bug 1225832 - New Loop architecture is not compatible with test.
# browser/components/uitour/test/browser_UITour_loop.js
TESTS="
${LOOPDIR}/chrome/test/mochitest
browser/components/uitour/test/browser_UITour_loop.js
browser/base/content/test/general/browser_devices_get_user_media_about_urls.js
browser/base/content/test/general/browser_parsable_css.js
"

View File

@ -204,7 +204,7 @@ function CreatePocketWidget(reason) {
}
});
};
}
// PocketContextMenu
// When the context menu is opened check if we need to build and enable pocket UI.
@ -226,7 +226,7 @@ var PocketContextMenu = {
}
},
observe: function(aSubject, aTopic, aData) {
let subject = aSubject.wrappedJSObject;;
let subject = aSubject.wrappedJSObject;
let document = subject.menu.ownerDocument;
let window = document.defaultView;
let pocketEnabled = CustomizableUI.getPlacementOfWidget("pocket-button");

View File

@ -51,41 +51,41 @@ XPCOMUtils.defineLazyModuleGetter(this, "pktApi",
var pktUI = (function() {
// -- Initialization (on startup and new windows) -- //
var inited = false;
var _currentPanelDidShow;
// -- Initialization (on startup and new windows) -- //
var inited = false;
var _currentPanelDidShow;
var _currentPanelDidHide;
var _isHidden = false;
var _notificationTimeout;
var _isHidden = false;
var _notificationTimeout;
// Init panel id at 0. The first actual panel id will have the number 1 so
// in case at some point any panel has the id 0 we know there is something
// wrong
var _panelId = 0;
var prefBranch = Services.prefs.getBranch("extensions.pocket.settings.");
var prefBranch = Services.prefs.getBranch("extensions.pocket.settings.");
var overflowMenuWidth = 230;
var overflowMenuHeight = 475;
var savePanelWidth = 350;
var savePanelHeights = {collapsed: 153, expanded: 272};
var overflowMenuWidth = 230;
var overflowMenuHeight = 475;
var savePanelWidth = 350;
var savePanelHeights = {collapsed: 153, expanded: 272};
// -- Event Handling -- //
// -- Event Handling -- //
/**
* Event handler when Pocket toolbar button is pressed
*/
function pocketPanelDidShow(event) {
if (_currentPanelDidShow) {
_currentPanelDidShow(event);
if (_currentPanelDidShow) {
_currentPanelDidShow(event);
}
}
function pocketPanelDidHide(event) {
if (_currentPanelDidHide) {
_currentPanelDidHide(event);
if (_currentPanelDidHide) {
_currentPanelDidHide(event);
}
// clear the panel
@ -105,20 +105,20 @@ var pktUI = (function() {
/**
* Either save or attempt to log the user in
*/
function tryToSaveCurrentPage() {
tryToSaveUrl(getCurrentUrl(), getCurrentTitle());
}
function tryToSaveCurrentPage() {
tryToSaveUrl(getCurrentUrl(), getCurrentTitle());
}
function tryToSaveUrl(url, title) {
// If the user is logged in, go ahead and save the current page
if (pktApi.isUserLoggedIn()) {
saveAndShowConfirmation(url, title);
// If the user is logged in, go ahead and save the current page
if (pktApi.isUserLoggedIn()) {
saveAndShowConfirmation(url, title);
return;
}
}
// If the user is not logged in, show the logged-out state to prompt them to authenticate
showSignUp();
// If the user is not logged in, show the logged-out state to prompt them to authenticate
showSignUp();
}
@ -136,7 +136,7 @@ var pktUI = (function() {
if (inOverflowMenu)
{
startheight = overflowMenuHeight;
startheight = overflowMenuHeight;
}
else if (pktApi.getSignupAB().indexOf('storyboard') > -1)
{
@ -163,12 +163,12 @@ var pktUI = (function() {
variant = pktApi.getSignupAB();
}
var panelId = showPanel("about:pocket-signup?pockethost=" + Services.prefs.getCharPref("extensions.pocket.site") + "&fxasignedin=" + fxasignedin + "&variant=" + variant + '&inoverflowmenu=' + inOverflowMenu + "&locale=" + getUILocale(), {
onShow: function() {
onShow: function() {
},
onHide: panelDidHide,
width: inOverflowMenu ? overflowMenuWidth : 300,
height: startheight
});
onHide: panelDidHide,
width: inOverflowMenu ? overflowMenuWidth : 300,
height: startheight
});
});
}
@ -187,11 +187,11 @@ var pktUI = (function() {
var inOverflowMenu = isInOverflowMenu();
var startheight = pktApi.isPremiumUser() && isValidURL ? savePanelHeights.expanded : savePanelHeights.collapsed;
if (inOverflowMenu) {
startheight = overflowMenuHeight;
startheight = overflowMenuHeight;
}
var panelId = showPanel("about:pocket-saved?pockethost=" + Services.prefs.getCharPref("extensions.pocket.site") + "&premiumStatus=" + (pktApi.isPremiumUser() ? '1' : '0') + '&inoverflowmenu='+inOverflowMenu + "&locale=" + getUILocale(), {
onShow: function() {
var panelId = showPanel("about:pocket-saved?pockethost=" + Services.prefs.getCharPref("extensions.pocket.site") + "&premiumStatus=" + (pktApi.isPremiumUser() ? '1' : '0') + '&inoverflowmenu='+inOverflowMenu + "&locale=" + getUILocale(), {
onShow: function() {
var saveLinkMessageId = 'saveLink';
// Send error message for invalid url
@ -248,12 +248,12 @@ var pktUI = (function() {
}
// Send the link
pktApi.addLink(url, options);
},
onHide: panelDidHide,
width: inOverflowMenu ? overflowMenuWidth : savePanelWidth,
height: startheight
});
pktApi.addLink(url, options);
},
onHide: panelDidHide,
width: inOverflowMenu ? overflowMenuWidth : savePanelWidth,
height: startheight
});
}
/**
@ -268,37 +268,37 @@ var pktUI = (function() {
// We don't have to hide and show the panel again if it's already shown
// as if the user tries to click again on the toolbar button the overlay
// will close instead of the button will be clicked
var iframe = getPanelFrame();
var iframe = getPanelFrame();
// Register event handlers
registerEventMessages();
// Register event handlers
registerEventMessages();
// Load the iframe
iframe.setAttribute('src', url);
// Load the iframe
iframe.setAttribute('src', url);
// Uncomment to leave panel open -- for debugging
// panel.setAttribute('noautohide', true);
// panel.setAttribute('consumeoutsideclicks', false);
//
// Uncomment to leave panel open -- for debugging
// panel.setAttribute('noautohide', true);
// panel.setAttribute('consumeoutsideclicks', false);
//
// For some reason setting onpopupshown and onpopuphidden on the panel directly didn't work, so
// do it this hacky way for now
_currentPanelDidShow = options.onShow;
_currentPanelDidHide = options.onHide;
// For some reason setting onpopupshown and onpopuphidden on the panel directly didn't work, so
// do it this hacky way for now
_currentPanelDidShow = options.onShow;
_currentPanelDidHide = options.onHide;
resizePanel({
width: options.width,
height: options.height
});
resizePanel({
width: options.width,
height: options.height
});
return _panelId;
}
/**
* Resize the panel
* options = {
* width: ,
* height: ,
* animate [default false]
* width: ,
* height: ,
* animate [default false]
* }
*/
function resizePanel(options) {
@ -327,25 +327,25 @@ var pktUI = (function() {
* Register all of the messages needed for the panels
*/
function registerEventMessages() {
var iframe = getPanelFrame();
var iframe = getPanelFrame();
// Only register the messages once
// Only register the messages once
var didInitAttributeKey = 'did_init';
var didInitMessageListener = iframe.getAttribute(didInitAttributeKey);
if (typeof didInitMessageListener !== "undefined" && didInitMessageListener == 1) {
if (typeof didInitMessageListener !== "undefined" && didInitMessageListener == 1) {
return;
}
iframe.setAttribute(didInitAttributeKey, 1);
iframe.setAttribute(didInitAttributeKey, 1);
// When the panel is displayed it generated an event called
// "show": we will listen for that event and when it happens,
// send our own "show" event to the panel's script, so the
// script can prepare the panel for display.
// When the panel is displayed it generated an event called
// "show": we will listen for that event and when it happens,
// send our own "show" event to the panel's script, so the
// script can prepare the panel for display.
var _showMessageId = "show";
pktUIMessaging.addMessageListener(_showMessageId, function(panelId, data) {
// Let panel know that it is ready
pktUIMessaging.sendMessageToPanel(panelId, _showMessageId);
});
pktUIMessaging.addMessageListener(_showMessageId, function(panelId, data) {
// Let panel know that it is ready
pktUIMessaging.sendMessageToPanel(panelId, _showMessageId);
});
// Open a new tab with a given url and activate if
var _openTabWithUrlMessageId = "openTabWithUrl";
@ -362,96 +362,96 @@ var pktUI = (function() {
pktUIMessaging.sendResponseMessageToPanel(panelId, _openTabWithUrlMessageId, url);
});
// Close the panel
// Close the panel
var _closeMessageId = "close";
pktUIMessaging.addMessageListener(_closeMessageId, function(panelId, data) {
getPanel().hidePopup();
});
// Send the current url to the panel
var _getCurrentURLMessageId = "getCurrentURL";
pktUIMessaging.addMessageListener(_getCurrentURLMessageId, function(panelId, data) {
pktUIMessaging.sendResponseMessageToPanel(panelId, _getCurrentURLMessageId, getCurrentUrl());
});
var _resizePanelMessageId = "resizePanel";
pktUIMessaging.addMessageListener(_resizePanelMessageId, function(panelId, data) {
resizePanel(data);
pktUIMessaging.addMessageListener(_closeMessageId, function(panelId, data) {
getPanel().hidePopup();
});
// Callback post initialization to tell background script that panel is "ready" for communication.
pktUIMessaging.addMessageListener("listenerReady", function(panelId, data) {
// Send the current url to the panel
var _getCurrentURLMessageId = "getCurrentURL";
pktUIMessaging.addMessageListener(_getCurrentURLMessageId, function(panelId, data) {
pktUIMessaging.sendResponseMessageToPanel(panelId, _getCurrentURLMessageId, getCurrentUrl());
});
});
var _resizePanelMessageId = "resizePanel";
pktUIMessaging.addMessageListener(_resizePanelMessageId, function(panelId, data) {
resizePanel(data);
});
pktUIMessaging.addMessageListener("collapseSavePanel", function(panelId, data) {
if (!pktApi.isPremiumUser() && !isInOverflowMenu())
resizePanel({width:savePanelWidth, height:savePanelHeights.collapsed});
});
// Callback post initialization to tell background script that panel is "ready" for communication.
pktUIMessaging.addMessageListener("listenerReady", function(panelId, data) {
pktUIMessaging.addMessageListener("expandSavePanel", function(panelId, data) {
if (!isInOverflowMenu())
resizePanel({width:savePanelWidth, height:savePanelHeights.expanded});
});
});
// Ask for recently accessed/used tags for auto complete
var _getTagsMessageId = "getTags";
pktUIMessaging.addMessageListener("collapseSavePanel", function(panelId, data) {
if (!pktApi.isPremiumUser() && !isInOverflowMenu())
resizePanel({width:savePanelWidth, height:savePanelHeights.collapsed});
});
pktUIMessaging.addMessageListener("expandSavePanel", function(panelId, data) {
if (!isInOverflowMenu())
resizePanel({width:savePanelWidth, height:savePanelHeights.expanded});
});
// Ask for recently accessed/used tags for auto complete
var _getTagsMessageId = "getTags";
pktUIMessaging.addMessageListener(_getTagsMessageId, function(panelId, data) {
pktApi.getTags(function(tags, usedTags) {
pktApi.getTags(function(tags, usedTags) {
pktUIMessaging.sendResponseMessageToPanel(panelId, _getTagsMessageId, {
tags: tags,
usedTags: usedTags
});
});
});
});
});
// Ask for suggested tags based on passed url
// Ask for suggested tags based on passed url
var _getSuggestedTagsMessageId = "getSuggestedTags";
pktUIMessaging.addMessageListener(_getSuggestedTagsMessageId, function(panelId, data) {
pktApi.getSuggestedTagsForURL(data.url, {
success: function(data, response) {
var suggestedTags = data.suggested_tags;
var successResponse = {
status: "success",
value: {
suggestedTags: suggestedTags
}
}
pktUIMessaging.addMessageListener(_getSuggestedTagsMessageId, function(panelId, data) {
pktApi.getSuggestedTagsForURL(data.url, {
success: function(data, response) {
var suggestedTags = data.suggested_tags;
var successResponse = {
status: "success",
value: {
suggestedTags: suggestedTags
}
}
pktUIMessaging.sendResponseMessageToPanel(panelId, _getSuggestedTagsMessageId, successResponse);
},
error: function(error, response) {
},
error: function(error, response) {
pktUIMessaging.sendErrorResponseMessageToPanel(panelId, _getSuggestedTagsMessageId, error);
}
})
});
}
})
});
// Pass url and array list of tags, add to existing save item accordingly
// Pass url and array list of tags, add to existing save item accordingly
var _addTagsMessageId = "addTags";
pktUIMessaging.addMessageListener(_addTagsMessageId, function(panelId, data) {
pktApi.addTagsToURL(data.url, data.tags, {
success: function(data, response) {
var successResponse = {status: "success"};
pktUIMessaging.addMessageListener(_addTagsMessageId, function(panelId, data) {
pktApi.addTagsToURL(data.url, data.tags, {
success: function(data, response) {
var successResponse = {status: "success"};
pktUIMessaging.sendResponseMessageToPanel(panelId, _addTagsMessageId, successResponse);
},
error: function(error, response) {
},
error: function(error, response) {
pktUIMessaging.sendErrorResponseMessageToPanel(panelId, _addTagsMessageId, error);
}
});
});
}
});
});
// Based on clicking "remove page" CTA, and passed unique item id, remove the item
// Based on clicking "remove page" CTA, and passed unique item id, remove the item
var _deleteItemMessageId = "deleteItem";
pktUIMessaging.addMessageListener(_deleteItemMessageId, function(panelId, data) {
pktApi.deleteItem(data.itemId, {
success: function(data, response) {
var successResponse = {status: "success"};
pktUIMessaging.addMessageListener(_deleteItemMessageId, function(panelId, data) {
pktApi.deleteItem(data.itemId, {
success: function(data, response) {
var successResponse = {status: "success"};
pktUIMessaging.sendResponseMessageToPanel(panelId, _deleteItemMessageId, successResponse);
},
error: function(error, response) {
pktUIMessaging.sendErrorResponseMessageToPanel(panelId, _deleteItemMessageId, error);
}
})
});
},
error: function(error, response) {
pktUIMessaging.sendErrorResponseMessageToPanel(panelId, _deleteItemMessageId, error);
}
})
});
var _initL10NMessageId = "initL10N";
pktUIMessaging.addMessageListener(_initL10NMessageId, function(panelId, data) {
@ -465,15 +465,15 @@ var pktUI = (function() {
pktUIMessaging.sendResponseMessageToPanel(panelId, _initL10NMessageId, { strings: strings });
});
}
}
// -- Browser Navigation -- //
// -- Browser Navigation -- //
/**
/**
* Open a new tab with a given url and notify the iframe panel that it was opened
*/
function openTabWithUrl(url) {
function openTabWithUrl(url) {
let recentWindow = Services.wm.getMostRecentWindow("navigator:browser");
if (!recentWindow) {
Cu.reportError("Pocket: No open browser windows to openTabWithUrl");
@ -500,13 +500,13 @@ var pktUI = (function() {
// If there were no non-private windows opened already.
recentWindow.openUILinkIn(url, "window");
}
}
// -- Helper Functions -- //
function getCurrentUrl() {
return getBrowser().currentURI.spec;
return getBrowser().currentURI.spec;
}
function getCurrentTitle() {
@ -519,7 +519,7 @@ var pktUI = (function() {
while (panel && panel.localName != "panel") {
panel = panel.parentNode;
}
return panel;
return panel;
}
function getPanelFrame() {
@ -547,41 +547,41 @@ var pktUI = (function() {
}
function hasLegacyExtension() {
return !!document.getElementById('RIL_urlbar_add');
return !!document.getElementById('RIL_urlbar_add');
}
function isHidden() {
return _isHidden;
return _isHidden;
}
function getFirefoxAccountSignedInUser(callback) {
fxAccounts.getSignedInUser().then(userData => {
callback(userData);
}).then(null, error => {
callback();
});
fxAccounts.getSignedInUser().then(userData => {
callback(userData);
}).then(null, error => {
callback();
});
}
function getUILocale() {
var locale = Cc["@mozilla.org/chrome/chrome-registry;1"].
var locale = Cc["@mozilla.org/chrome/chrome-registry;1"].
getService(Ci.nsIXULChromeRegistry).
getSelectedLocale("browser");
return locale;
}
/**
/**
* Public functions
*/
return {
getPanelFrame: getPanelFrame,
getPanelFrame: getPanelFrame,
openTabWithUrl: openTabWithUrl,
pocketPanelDidShow: pocketPanelDidShow,
pocketPanelDidHide: pocketPanelDidHide,
pocketPanelDidShow: pocketPanelDidShow,
pocketPanelDidHide: pocketPanelDidHide,
tryToSaveUrl: tryToSaveUrl,
tryToSaveCurrentPage: tryToSaveCurrentPage
tryToSaveUrl: tryToSaveUrl,
tryToSaveCurrentPage: tryToSaveCurrentPage
};
}());
@ -631,7 +631,7 @@ var pktUIMessaging = (function() {
*/
function sendMessageToPanel(panelId, messageId, payload) {
if (!isPanelIdValid(panelId)) { return; };
if (!isPanelIdValid(panelId)) { return; }
var panelFrame = pktUI.getPanelFrame();
if (!isPocketPanelFrameValid(panelFrame)) { return; }

View File

@ -2,7 +2,7 @@
PKT_SAVED_OVERLAY is the view itself and contains all of the methods to manipute the overlay and messaging.
It does not contain any logic for saving or communication with the extension or server.
*/
var PKT_SAVED_OVERLAY = function (options)
var PKT_SAVED_OVERLAY = function (options)
{
var myself = this;
this.inited = false;
@ -49,7 +49,7 @@ var PKT_SAVED_OVERLAY = function (options)
};
this.fillSuggestedTags = function()
{
if (!$('.pkt_ext_suggestedtag_detail').length)
if (!$('.pkt_ext_suggestedtag_detail').length)
{
myself.suggestedTagsLoaded = true;
myself.startCloseTimer();
@ -59,16 +59,16 @@ var PKT_SAVED_OVERLAY = function (options)
thePKT_SAVED.sendMessage("getSuggestedTags",
{
url: myself.savedUrl
}, function(resp)
}, function(resp)
{
$('.pkt_ext_suggestedtag_detail').removeClass('pkt_ext_suggestedtag_detail_loading');
if (resp.status == 'success')
if (resp.status == 'success')
{
var newtags = [];
for (var i = 0; i < resp.value.suggestedTags.length; i++)
{
newtags.push(resp.value.suggestedTags[i].tag);
}
}
myself.suggestedTagsLoaded = true;
if (!myself.mouseInside) {
myself.startCloseTimer();
@ -99,25 +99,25 @@ var PKT_SAVED_OVERLAY = function (options)
myself.closeValid = false;
});
};
this.startCloseTimer = function(manualtime)
this.startCloseTimer = function(manualtime)
{
var settime = manualtime ? manualtime : myself.autocloseTiming;
if (typeof myself.autocloseTimer == 'number')
if (typeof myself.autocloseTimer == 'number')
{
clearTimeout(myself.autocloseTimer);
}
myself.autocloseTimer = setTimeout(function()
myself.autocloseTimer = setTimeout(function()
{
if (myself.closeValid || myself.preventCloseTimerCancel)
if (myself.closeValid || myself.preventCloseTimerCancel)
{
myself.preventCloseTimerCancel = false;
myself.closePopup();
}
}, settime);
};
this.stopCloseTimer = function()
this.stopCloseTimer = function()
{
if (myself.preventCloseTimerCancel)
if (myself.preventCloseTimerCancel)
{
return;
}
@ -183,7 +183,7 @@ var PKT_SAVED_OVERLAY = function (options)
if (r.test(myself.userTags[i]) && limit > 0) {
returnlist.push({name:myself.userTags[i]});
limit--;
}
}
}
}
if (!$('.token-input-dropdown-tag').data('init')) {
@ -206,7 +206,7 @@ var PKT_SAVED_OVERLAY = function (options)
else {
myself.hideTagsError();
return {name:myself.sanitizeText(text.toLowerCase())};
}
}
},
onReady: function() {
$('.token-input-dropdown').addClass('token-input-dropdown-tag');
@ -253,10 +253,10 @@ var PKT_SAVED_OVERLAY = function (options)
myself.checkPlaceholderStatus();
},
onShowDropdown: function() {
thePKT_SAVED.sendMessage("expandSavePanel");
thePKT_SAVED.sendMessage("expandSavePanel");
},
onHideDropdown: function() {
thePKT_SAVED.sendMessage("collapseSavePanel");
thePKT_SAVED.sendMessage("collapseSavePanel");
}
});
$('body').on('keydown',function(e) {
@ -317,11 +317,11 @@ var PKT_SAVED_OVERLAY = function (options)
tags: originaltags
}, function(resp)
{
if (resp.status == 'success')
if (resp.status == 'success')
{
myself.showStateFinalMsg(myself.dictJSON.tagssaved);
}
else if (resp.status == 'error')
else if (resp.status == 'error')
{
$('.pkt_ext_edit_msg').addClass('pkt_ext_edit_msg_error pkt_ext_edit_msg_active').text(resp.error.message);
}
@ -381,7 +381,7 @@ var PKT_SAVED_OVERLAY = function (options)
$('.token-input-token').each(function(index, element) {
activetokenstext += $(element).find('p').text() + '|';
});
var inactivetags = $('.pkt_ext_suggestedtag_detail').find('.token_tag_inactive');
inactivetags.each(function(index,element) {
if (activetokenstext.indexOf('|' + $(element).text() + '|') == -1) {
@ -465,7 +465,7 @@ var PKT_SAVED_OVERLAY = function (options)
};
PKT_SAVED_OVERLAY.prototype = {
create : function()
create : function()
{
if (this.active)
{
@ -531,11 +531,11 @@ PKT_SAVED.prototype = {
},
addMessageListener: function(messageId, callback) {
pktPanelMessaging.addMessageListener(this.panelId, messageId, callback);
pktPanelMessaging.addMessageListener(this.panelId, messageId, callback);
},
sendMessage: function(messageId, payload, callback) {
pktPanelMessaging.sendMessage(this.panelId, messageId, payload, callback);
pktPanelMessaging.sendMessage(this.panelId, messageId, payload, callback);
},
create: function() {
@ -580,11 +580,11 @@ PKT_SAVED.prototype = {
{
myself.overlay.showStateError(myself.overlay.dictJSON.pagenotsaved,resp.error.message);
}
}
}
else
{
myself.overlay.showStateError(myself.overlay.dictJSON.pagenotsaved,myself.overlay.dictJSON.errorgeneric);
}
}
return;
}

View File

@ -2,7 +2,7 @@
PKT_SIGNUP_OVERLAY is the view itself and contains all of the methods to manipute the overlay and messaging.
It does not contain any logic for saving or communication with the extension or server.
*/
var PKT_SIGNUP_OVERLAY = function (options)
var PKT_SIGNUP_OVERLAY = function (options)
{
var myself = this;
this.inited = false;
@ -62,7 +62,7 @@ var PKT_SIGNUP_OVERLAY = function (options)
};
PKT_SIGNUP_OVERLAY.prototype = {
create : function()
create : function()
{
var myself = this;

View File

@ -15,10 +15,10 @@
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@ -56,7 +56,7 @@ var pktApi = (function() {
*/
// Base url for all api calls
var pocketAPIhost = Services.prefs.getCharPref("extensions.pocket.api"); // api.getpocket.com
var pocketAPIhost = Services.prefs.getCharPref("extensions.pocket.api"); // api.getpocket.com
var pocketSiteHost = Services.prefs.getCharPref("extensions.pocket.site"); // getpocket.com
var baseAPIUrl = "https://" + pocketAPIhost + "/v3";
@ -66,10 +66,10 @@ var pktApi = (function() {
*/
var oAuthConsumerKey = Services.prefs.getCharPref("extensions.pocket.oAuthConsumerKey");
/**
*
*/
var prefBranch = Services.prefs.getBranch("extensions.pocket.settings.");
/**
*
*/
var prefBranch = Services.prefs.getBranch("extensions.pocket.settings.");
/**
* Helper
@ -96,7 +96,7 @@ var pktApi = (function() {
// Handle non-exception-throwing cases:
// Neither JSON.parse(false) or JSON.parse(1234) throw errors, hence the type-checking,
// but... JSON.parse(null) returns 'null', and typeof null === "object",
// but... JSON.parse(null) returns 'null', and typeof null === "object",
// so we must check for that, too.
if (o && typeof o === "object" && o !== null) {
return o;
@ -119,13 +119,13 @@ var pktApi = (function() {
* does not exist, null is returned
*/
function getSetting(key) {
// TODO : Move this to sqlite or a local file so it's not editable (and is safer)
// https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School/Local_Storage
if (!prefBranch.prefHasUserValue(key))
return undefined;
return prefBranch.getComplexValue(key, Components.interfaces.nsISupportsString).data;
// TODO : Move this to sqlite or a local file so it's not editable (and is safer)
// https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School/Local_Storage
if (!prefBranch.prefHasUserValue(key))
return undefined;
return prefBranch.getComplexValue(key, Components.interfaces.nsISupportsString).data;
}
/**
@ -136,18 +136,18 @@ var pktApi = (function() {
* the key you are creating/updating.
*/
function setSetting(key, value) {
// TODO : Move this to sqlite or a local file so it's not editable (and is safer)
// https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School/Local_Storage
if (!value)
prefBranch.clearUserPref(key);
else
{
// We use complexValue as tags can have utf-8 characters in them
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
str.data = value;
prefBranch.setComplexValue(key, Components.interfaces.nsISupportsString, str);
}
// TODO : Move this to sqlite or a local file so it's not editable (and is safer)
// https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School/Local_Storage
if (!value)
prefBranch.clearUserPref(key);
else
{
// We use complexValue as tags can have utf-8 characters in them
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
str.data = value;
prefBranch.setComplexValue(key, Components.interfaces.nsISupportsString, str);
}
}
/**
@ -159,7 +159,7 @@ var pktApi = (function() {
* The return format: { cookieName:cookieValue, cookieName:cookieValue, ... }
*/
function getCookiesFromPocket() {
var cookieManager = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2);
var pocketCookies = cookieManager.getCookiesFromHost(pocketSiteHost);
var cookies = {};
@ -261,9 +261,9 @@ var pktApi = (function() {
var request = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Components.interfaces.nsIXMLHttpRequest);
request.open("POST", url, true);
request.onreadystatechange = function(e){
if (request.readyState == 4) {
if (request.status === 200) {
request.onreadystatechange = function(e){
if (request.readyState == 4) {
if (request.status === 200) {
// There could still be an error if the response is no valid json
// or does not have status = 1
var response = parseJSON(request.response);
@ -290,22 +290,22 @@ var pktApi = (function() {
var error = {message: errorMessage};
options.error(error, request);
}
}
};
}
};
// Set headers
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.setRequestHeader('X-Accept',' application/json');
// Set headers
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.setRequestHeader('X-Accept',' application/json');
// Serialize and Fire off the request
var str = [];
for(var p in data) {
if (data.hasOwnProperty(p)) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(data[p]));
}
}
var str = [];
for(var p in data) {
if (data.hasOwnProperty(p)) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(data[p]));
}
}
request.send(str.join("&"));
request.send(str.join("&"));
return true;
}
@ -344,7 +344,7 @@ var pktApi = (function() {
var title = options.title;
if (title !== "undefined") {
sendData.title = title;
};
}
return apiRequest({
path: "/firefox/save",
@ -611,17 +611,17 @@ var pktApi = (function() {
* Helper function to get current signup AB group the user is in
*/
function getSignupAB() {
var setting = getSetting('signupAB');
var setting = getSetting('signupAB');
if (!setting || setting.contains('hero'))
{
var rand = (Math.floor(Math.random()*100+1));
if (rand > 90)
{
setting = 'storyboard_nlm';
setting = 'storyboard_nlm';
}
else
{
setting = 'storyboard_lm';
setting = 'storyboard_lm';
}
setSetting('signupAB',setting);
}

View File

@ -42,10 +42,10 @@ FormSubmitObserver.prototype =
{
this._content = aWindow;
this._tab = aTabChildGlobal;
this._mm =
this._content.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDocShell)
.sameTypeRootTreeItem
this._mm =
this._content.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDocShell)
.sameTypeRootTreeItem
.QueryInterface(Ci.nsIDocShell)
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIContentFrameMessageManager);
@ -103,7 +103,7 @@ FormSubmitObserver.prototype =
if (!aInvalidElements.length) {
return;
}
// Insure that this is the FormSubmitObserver associated with the form
// element / window this notification is about.
if (this._content != aFormElement.ownerDocument.defaultView.top.document.defaultView) {
@ -142,7 +142,7 @@ FormSubmitObserver.prototype =
/*
* Internal
*/
/*
* Handles input changes on the form element we've associated a popup
* with. Updates the validation message or closes the popup if form data
@ -218,8 +218,8 @@ FormSubmitObserver.prototype =
this._mm.sendAsyncMessage("FormValidation:HidePopup", {});
},
_getWindowUtils: function () {
return this._content.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
_getWindowUtils: function () {
return this._content.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
},
_isRootDocumentEvent: function (aEvent) {

View File

@ -1,170 +1,170 @@
/* 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";
const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
this.EXPORTED_SYMBOLS = ["LaterRun"];
Cu.import("resource://gre/modules/Preferences.jsm");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "setInterval", "resource://gre/modules/Timer.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "clearInterval", "resource://gre/modules/Timer.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "RecentWindow", "resource://gre/modules/RecentWindow.jsm");
const kEnabledPref = "browser.laterrun.enabled";
const kPagePrefRoot = "browser.laterrun.pages.";
// Number of sessions we've been active in
const kSessionCountPref = "browser.laterrun.bookkeeping.sessionCount";
// Time the profile was created at:
const kProfileCreationTime = "browser.laterrun.bookkeeping.profileCreationTime";
// After 50 sessions or 1 month since install, assume we will no longer be
// interested in showing anything to "new" users
const kSelfDestructSessionLimit = 50;
const kSelfDestructHoursLimit = 31 * 24;
class Page {
constructor({pref, minimumHoursSinceInstall, minimumSessionCount, requireBoth, url}) {
this.pref = pref;
this.minimumHoursSinceInstall = minimumHoursSinceInstall || 0;
this.minimumSessionCount = minimumSessionCount || 1;
this.requireBoth = requireBoth || false;
this.url = url;
}
get hasRun() {
return Preferences.get(this.pref + "hasRun", false);
}
applies(sessionInfo) {
if (this.hasRun) {
return false;
}
if (this.requireBoth) {
return sessionInfo.sessionCount >= this.minimumSessionCount &&
sessionInfo.hoursSinceInstall >= this.minimumHoursSinceInstall;
}
return sessionInfo.sessionCount >= this.minimumSessionCount ||
sessionInfo.hoursSinceInstall >= this.minimumHoursSinceInstall;
}
}
let LaterRun = {
init() {
if (!this.enabled) {
return;
}
// If this is the first run, set the time we were installed
if (!Preferences.has(kProfileCreationTime)) {
// We need to store seconds in order to fit within int prefs.
Preferences.set(kProfileCreationTime, Math.floor(Date.now() / 1000));
}
this.sessionCount++;
if (this.hoursSinceInstall > kSelfDestructHoursLimit ||
this.sessionCount > kSelfDestructSessionLimit) {
this.selfDestruct();
return;
}
},
// The enabled, hoursSinceInstall and sessionCount properties mirror the
// preferences system, and are here for convenience.
get enabled() {
return Preferences.get(kEnabledPref, false);
},
set enabled(val) {
let wasEnabled = this.enabled;
Preferences.set(kEnabledPref, val);
if (val && !wasEnabled) {
this.init();
}
},
get hoursSinceInstall() {
let installStamp = Preferences.get(kProfileCreationTime, Date.now() / 1000);
return Math.floor((Date.now() / 1000 - installStamp) / 3600);
},
get sessionCount() {
if (this._sessionCount) {
return this._sessionCount;
}
return this._sessionCount = Preferences.get(kSessionCountPref, 0);
},
set sessionCount(val) {
this._sessionCount = val;
Preferences.set(kSessionCountPref, val);
},
// Because we don't want to keep incrementing this indefinitely for no reason,
// we will turn ourselves off after a set amount of time/sessions (see top of
// file).
selfDestruct() {
Preferences.set(kEnabledPref, false);
},
// Create an array of Page objects based on the currently set prefs
readPages() {
// Enumerate all the pages.
let allPrefsForPages = Services.prefs.getChildList(kPagePrefRoot);
let pageDataStore = new Map();
for (let pref of allPrefsForPages) {
let [slug, prop] = pref.substring(kPagePrefRoot.length).split(".");
if (!pageDataStore.has(slug)) {
pageDataStore.set(slug, {pref: pref.substring(0, pref.length - prop.length)});
}
let defaultPrefValue = 0;
if (prop == "requireBoth" || prop == "hasRun") {
defaultPrefValue = false;
} else if (prop == "url") {
defaultPrefValue = "";
}
pageDataStore.get(slug)[prop] = Preferences.get(pref, defaultPrefValue);
}
let rv = [];
for (let [, pageData] of pageDataStore) {
if (pageData.url) {
let uri = null;
try {
uri = Services.io.newURI(pageData.url.trim(), null, null);
} catch (ex) {
Cu.reportError("Invalid LaterRun page URL " + pageData.url + " ignored.");
}
if (!uri.schemeIs("https")) {
Cu.reportError("Insecure LaterRun page URL " + uri.spec + " ignored.");
} else {
pageData.url = uri.spec;
rv.push(new Page(pageData));
}
}
}
return rv;
},
// Return a URL for display as a 'later run' page if its criteria are matched,
// or null otherwise.
// NB: will only return one page at a time; if multiple pages match, it's up
// to the preference service which one gets shown first, and the next one
// will be shown next startup instead.
getURL() {
if (!this.enabled) {
return null;
}
let pages = this.readPages();
let page = pages.find(page => page.applies(this));
if (page) {
Services.prefs.setBoolPref(page.pref + "hasRun", true);
return page.url;
}
return null;
},
};
LaterRun.init();
/* 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";
const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
this.EXPORTED_SYMBOLS = ["LaterRun"];
Cu.import("resource://gre/modules/Preferences.jsm");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "setInterval", "resource://gre/modules/Timer.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "clearInterval", "resource://gre/modules/Timer.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "RecentWindow", "resource://gre/modules/RecentWindow.jsm");
const kEnabledPref = "browser.laterrun.enabled";
const kPagePrefRoot = "browser.laterrun.pages.";
// Number of sessions we've been active in
const kSessionCountPref = "browser.laterrun.bookkeeping.sessionCount";
// Time the profile was created at:
const kProfileCreationTime = "browser.laterrun.bookkeeping.profileCreationTime";
// After 50 sessions or 1 month since install, assume we will no longer be
// interested in showing anything to "new" users
const kSelfDestructSessionLimit = 50;
const kSelfDestructHoursLimit = 31 * 24;
class Page {
constructor({pref, minimumHoursSinceInstall, minimumSessionCount, requireBoth, url}) {
this.pref = pref;
this.minimumHoursSinceInstall = minimumHoursSinceInstall || 0;
this.minimumSessionCount = minimumSessionCount || 1;
this.requireBoth = requireBoth || false;
this.url = url;
}
get hasRun() {
return Preferences.get(this.pref + "hasRun", false);
}
applies(sessionInfo) {
if (this.hasRun) {
return false;
}
if (this.requireBoth) {
return sessionInfo.sessionCount >= this.minimumSessionCount &&
sessionInfo.hoursSinceInstall >= this.minimumHoursSinceInstall;
}
return sessionInfo.sessionCount >= this.minimumSessionCount ||
sessionInfo.hoursSinceInstall >= this.minimumHoursSinceInstall;
}
}
let LaterRun = {
init() {
if (!this.enabled) {
return;
}
// If this is the first run, set the time we were installed
if (!Preferences.has(kProfileCreationTime)) {
// We need to store seconds in order to fit within int prefs.
Preferences.set(kProfileCreationTime, Math.floor(Date.now() / 1000));
}
this.sessionCount++;
if (this.hoursSinceInstall > kSelfDestructHoursLimit ||
this.sessionCount > kSelfDestructSessionLimit) {
this.selfDestruct();
return;
}
},
// The enabled, hoursSinceInstall and sessionCount properties mirror the
// preferences system, and are here for convenience.
get enabled() {
return Preferences.get(kEnabledPref, false);
},
set enabled(val) {
let wasEnabled = this.enabled;
Preferences.set(kEnabledPref, val);
if (val && !wasEnabled) {
this.init();
}
},
get hoursSinceInstall() {
let installStamp = Preferences.get(kProfileCreationTime, Date.now() / 1000);
return Math.floor((Date.now() / 1000 - installStamp) / 3600);
},
get sessionCount() {
if (this._sessionCount) {
return this._sessionCount;
}
return this._sessionCount = Preferences.get(kSessionCountPref, 0);
},
set sessionCount(val) {
this._sessionCount = val;
Preferences.set(kSessionCountPref, val);
},
// Because we don't want to keep incrementing this indefinitely for no reason,
// we will turn ourselves off after a set amount of time/sessions (see top of
// file).
selfDestruct() {
Preferences.set(kEnabledPref, false);
},
// Create an array of Page objects based on the currently set prefs
readPages() {
// Enumerate all the pages.
let allPrefsForPages = Services.prefs.getChildList(kPagePrefRoot);
let pageDataStore = new Map();
for (let pref of allPrefsForPages) {
let [slug, prop] = pref.substring(kPagePrefRoot.length).split(".");
if (!pageDataStore.has(slug)) {
pageDataStore.set(slug, {pref: pref.substring(0, pref.length - prop.length)});
}
let defaultPrefValue = 0;
if (prop == "requireBoth" || prop == "hasRun") {
defaultPrefValue = false;
} else if (prop == "url") {
defaultPrefValue = "";
}
pageDataStore.get(slug)[prop] = Preferences.get(pref, defaultPrefValue);
}
let rv = [];
for (let [, pageData] of pageDataStore) {
if (pageData.url) {
let uri = null;
try {
uri = Services.io.newURI(pageData.url.trim(), null, null);
} catch (ex) {
Cu.reportError("Invalid LaterRun page URL " + pageData.url + " ignored.");
}
if (!uri.schemeIs("https")) {
Cu.reportError("Insecure LaterRun page URL " + uri.spec + " ignored.");
} else {
pageData.url = uri.spec;
rv.push(new Page(pageData));
}
}
}
return rv;
},
// Return a URL for display as a 'later run' page if its criteria are matched,
// or null otherwise.
// NB: will only return one page at a time; if multiple pages match, it's up
// to the preference service which one gets shown first, and the next one
// will be shown next startup instead.
getURL() {
if (!this.enabled) {
return null;
}
let pages = this.readPages();
let page = pages.find(page => page.applies(this));
if (page) {
Services.prefs.setBoolPref(page.pref + "hasRun", true);
return page.url;
}
return null;
},
};
LaterRun.init();

View File

@ -281,7 +281,7 @@ function CreateSocialStatusWidget(aId, aProvider) {
return node;
}
});
};
}
function CreateSocialMarkWidget(aId, aProvider) {
if (!aProvider.markURL)
@ -316,7 +316,7 @@ function CreateSocialMarkWidget(aId, aProvider) {
return node;
}
});
};
}
function sizeSocialPanelToContent(panel, iframe, requestedSize) {

View File

@ -146,7 +146,7 @@ this.WinTaskbarJumpList =
/**
* Startup, shutdown, and update
*/
*/
startup: function WTBJL_startup() {
// exit if this isn't win7 or higher.
@ -155,7 +155,7 @@ this.WinTaskbarJumpList =
// Win shell shortcut maintenance. If we've gone through an update,
// this will update any pinned taskbar shortcuts. Not specific to
// jump lists, but this was a convienent place to call it.
// jump lists, but this was a convienent place to call it.
try {
// dev builds may not have helper.exe, ignore failures.
this._shortcutMaintenance();
@ -253,13 +253,13 @@ this.WinTaskbarJumpList =
/**
* Taskbar api wrappers
*/
*/
_startBuild: function WTBJL__startBuild() {
var removedItems = Cc["@mozilla.org/array;1"].
createInstance(Ci.nsIMutableArray);
this._builder.abortListBuild();
if (this._builder.initListBuild(removedItems)) {
if (this._builder.initListBuild(removedItems)) {
// Prior to building, delete removed items from history.
this._clearHistory(removedItems);
return true;
@ -283,7 +283,7 @@ this.WinTaskbarJumpList =
task.args, task.iconIndex, null);
items.appendElement(item, false);
}, this);
if (items.length > 0)
this._builder.addListToBuild(this._builder.JUMPLIST_CATEGORY_TASKS, items);
},
@ -324,7 +324,7 @@ this.WinTaskbarJumpList =
let title = aResult.title || aResult.uri;
let faviconPageUri = Services.io.newURI(aResult.uri, null, null);
let shortcut = this._getHandlerAppItem(title, title, aResult.uri, 1,
let shortcut = this._getHandlerAppItem(title, title, aResult.uri, 1,
faviconPageUri);
items.appendElement(shortcut, false);
this._frequentHashList.push(aResult.uri);
@ -386,8 +386,8 @@ this.WinTaskbarJumpList =
* Jump list item creation helpers
*/
_getHandlerAppItem: function WTBJL__getHandlerAppItem(name, description,
args, iconIndex,
_getHandlerAppItem: function WTBJL__getHandlerAppItem(name, description,
args, iconIndex,
faviconPageUri) {
var file = Services.dirsvc.get("XREExeF", Ci.nsILocalFile);
@ -469,7 +469,7 @@ this.WinTaskbarJumpList =
/**
* Prefs utilities
*/
*/
_refreshPrefs: function WTBJL__refreshPrefs() {
this._enabled = _prefs.getBoolPref(PREF_TASKBAR_ENABLED);
@ -481,7 +481,7 @@ this.WinTaskbarJumpList =
/**
* Init and shutdown utilities
*/
*/
_initTaskbar: function WTBJL__initTaskbar() {
this._builder = _taskbarService.createJumpListBuilder();
@ -499,7 +499,7 @@ this.WinTaskbarJumpList =
Services.obs.addObserver(this, "browser:purge-session-history", false);
_prefs.addObserver("", this, false);
},
_freeObs: function WTBJL__freeObs() {
Services.obs.removeObserver(this, "profile-before-change");
Services.obs.removeObserver(this, "browser:purge-session-history");

View File

@ -31,7 +31,7 @@
* Screen real estate is limited so when there are too many thumbnails to fit
* on the screen, the taskbar stops displaying thumbnails and instead displays
* just the title, icon and close button in a similar fashion to previous
* versions of the taskbar. If there are still too many previews to fit on the
* versions of the taskbar. If there are still too many previews to fit on the
* screen, the taskbar resorts to a scroll up and scroll down button pair to let
* the user scroll through the list of tabs. Since this is undoubtedly
* inconvenient for users with many tabs, the AeroPeek objects turns off all of

View File

@ -1,7 +1,7 @@
/* 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/. */
this.EXPORTED_SYMBOLS = ["OfflineAppCacheHelper"];
Components.utils.import('resource://gre/modules/LoadContextInfo.jsm');

View File

@ -1547,7 +1547,7 @@ add_task(function* test_DirectoryLinksProvider_ClickRemoval() {
resolve();
};
});
};
}
let testObserver = new UrlDeletionTester();
DirectoryLinksProvider.addObserver(testObserver);
@ -1665,7 +1665,7 @@ add_task(function* test_inadjecentSites() {
let dataURI = 'data:application/json,' + JSON.stringify(theList);
DirectoryLinksProvider._inadjacentSitesUrl = dataURI;
return DirectoryLinksProvider._loadInadjacentSites();
};
}
// setup gLinks loader
let gLinks = NewTabUtils.links;

View File

@ -1,131 +1,131 @@
"use strict";
const kEnabledPref = "browser.laterrun.enabled";
const kPagePrefRoot = "browser.laterrun.pages.";
const kSessionCountPref = "browser.laterrun.bookkeeping.sessionCount";
const kProfileCreationTime = "browser.laterrun.bookkeeping.profileCreationTime";
Components.utils.import("resource://gre/modules/Services.jsm");
Components.utils.import("resource:///modules/LaterRun.jsm");
Services.prefs.setBoolPref(kEnabledPref, true);
add_task(function* test_page_applies() {
Services.prefs.setCharPref(kPagePrefRoot + "test_LaterRun_unittest.url", "https://www.mozilla.org/");
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumHoursSinceInstall", 10);
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumSessionCount", 3);
let pages = LaterRun.readPages();
// We have to filter the pages because it's possible Firefox ships with other URLs
// that get included in this test.
pages = pages.filter(page => page.pref == kPagePrefRoot + "test_LaterRun_unittest.");
Assert.equal(pages.length, 1, "Got 1 page");
let page = pages[0];
Assert.equal(page.pref, kPagePrefRoot + "test_LaterRun_unittest.", "Should know its own pref");
Assert.equal(page.minimumHoursSinceInstall, 10, "Needs to have 10 hours since install");
Assert.equal(page.minimumSessionCount, 3, "Needs to have 3 sessions");
Assert.equal(page.requireBoth, false, "Either requirement is enough");
Assert.equal(page.url, "https://www.mozilla.org/", "URL is stored correctly");
Assert.ok(page.applies({hoursSinceInstall: 1, sessionCount: 3}),
"Applies when session count has been met.");
Assert.ok(page.applies({hoursSinceInstall: 1, sessionCount: 4}),
"Applies when session count has been exceeded.");
Assert.ok(page.applies({hoursSinceInstall: 10, sessionCount: 2}),
"Applies when total session time has been met.");
Assert.ok(page.applies({hoursSinceInstall: 20, sessionCount: 2}),
"Applies when total session time has been exceeded.");
Assert.ok(page.applies({hoursSinceInstall: 10, sessionCount: 3}),
"Applies when both time and session count have been met.");
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 1}),
"Does not apply when neither time and session count have been met.");
page.requireBoth = true;
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 3}),
"Does not apply when only session count has been met.");
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 4}),
"Does not apply when only session count has been exceeded.");
Assert.ok(!page.applies({hoursSinceInstall: 10, sessionCount: 2}),
"Does not apply when only total session time has been met.");
Assert.ok(!page.applies({hoursSinceInstall: 20, sessionCount: 2}),
"Does not apply when only total session time has been exceeded.");
Assert.ok(page.applies({hoursSinceInstall: 10, sessionCount: 3}),
"Applies when both time and session count have been met.");
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 1}),
"Does not apply when neither time and session count have been met.");
// Check that pages that have run never apply:
Services.prefs.setBoolPref(kPagePrefRoot + "test_LaterRun_unittest.hasRun", true);
page.requireBoth = false;
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 3}),
"Does not apply when page has already run (sessionCount equal).");
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 4}),
"Does not apply when page has already run (sessionCount exceeding).");
Assert.ok(!page.applies({hoursSinceInstall: 10, sessionCount: 2}),
"Does not apply when page has already run (hoursSinceInstall equal).");
Assert.ok(!page.applies({hoursSinceInstall: 20, sessionCount: 2}),
"Does not apply when page has already run (hoursSinceInstall exceeding).");
Assert.ok(!page.applies({hoursSinceInstall: 10, sessionCount: 3}),
"Does not apply when page has already run (both criteria equal).");
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 1}),
"Does not apply when page has already run (both criteria insufficient anyway).");
clearAllPagePrefs();
});
add_task(function* test_get_URL() {
Services.prefs.setIntPref(kProfileCreationTime, Math.floor((Date.now() - 11 * 60 * 60 * 1000) / 1000));
Services.prefs.setCharPref(kPagePrefRoot + "test_LaterRun_unittest.url", "https://www.mozilla.org/");
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumHoursSinceInstall", 10);
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumSessionCount", 3);
let pages = LaterRun.readPages();
// We have to filter the pages because it's possible Firefox ships with other URLs
// that get included in this test.
pages = pages.filter(page => page.pref == kPagePrefRoot + "test_LaterRun_unittest.");
Assert.equal(pages.length, 1, "Should only be 1 matching page");
let page = pages[0];
let url;
do {
url = LaterRun.getURL();
// We have to loop because it's possible Firefox ships with other URLs that get triggered by
// this test.
} while (url && url != "https://www.mozilla.org/");
Assert.equal(url, "https://www.mozilla.org/", "URL should be as expected when prefs are set.");
Assert.ok(Services.prefs.prefHasUserValue(kPagePrefRoot + "test_LaterRun_unittest.hasRun"), "Should have set pref");
Assert.ok(Services.prefs.getBoolPref(kPagePrefRoot + "test_LaterRun_unittest.hasRun"), "Should have set pref to true");
Assert.ok(page.hasRun, "Other page objects should know it has run, too.");
clearAllPagePrefs();
});
add_task(function* test_insecure_urls() {
Services.prefs.setCharPref(kPagePrefRoot + "test_LaterRun_unittest.url", "http://www.mozilla.org/");
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumHoursSinceInstall", 10);
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumSessionCount", 3);
let pages = LaterRun.readPages();
// We have to filter the pages because it's possible Firefox ships with other URLs
// that get triggered in this test.
pages = pages.filter(page => page.pref == kPagePrefRoot + "test_LaterRun_unittest.");
Assert.equal(pages.length, 0, "URL with non-https scheme should get ignored");
clearAllPagePrefs();
});
add_task(function* test_dynamic_pref_getter_setter() {
delete LaterRun._sessionCount;
Services.prefs.setIntPref(kSessionCountPref, 0);
Assert.equal(LaterRun.sessionCount, 0, "Should start at 0");
LaterRun.sessionCount++;
Assert.equal(LaterRun.sessionCount, 1, "Should increment.");
Assert.equal(Services.prefs.getIntPref(kSessionCountPref), 1, "Should update pref");
});
function clearAllPagePrefs() {
let allChangedPrefs = Services.prefs.getChildList(kPagePrefRoot);
for (let pref of allChangedPrefs) {
Services.prefs.clearUserPref(pref);
}
}
"use strict";
const kEnabledPref = "browser.laterrun.enabled";
const kPagePrefRoot = "browser.laterrun.pages.";
const kSessionCountPref = "browser.laterrun.bookkeeping.sessionCount";
const kProfileCreationTime = "browser.laterrun.bookkeeping.profileCreationTime";
Components.utils.import("resource://gre/modules/Services.jsm");
Components.utils.import("resource:///modules/LaterRun.jsm");
Services.prefs.setBoolPref(kEnabledPref, true);
add_task(function* test_page_applies() {
Services.prefs.setCharPref(kPagePrefRoot + "test_LaterRun_unittest.url", "https://www.mozilla.org/");
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumHoursSinceInstall", 10);
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumSessionCount", 3);
let pages = LaterRun.readPages();
// We have to filter the pages because it's possible Firefox ships with other URLs
// that get included in this test.
pages = pages.filter(page => page.pref == kPagePrefRoot + "test_LaterRun_unittest.");
Assert.equal(pages.length, 1, "Got 1 page");
let page = pages[0];
Assert.equal(page.pref, kPagePrefRoot + "test_LaterRun_unittest.", "Should know its own pref");
Assert.equal(page.minimumHoursSinceInstall, 10, "Needs to have 10 hours since install");
Assert.equal(page.minimumSessionCount, 3, "Needs to have 3 sessions");
Assert.equal(page.requireBoth, false, "Either requirement is enough");
Assert.equal(page.url, "https://www.mozilla.org/", "URL is stored correctly");
Assert.ok(page.applies({hoursSinceInstall: 1, sessionCount: 3}),
"Applies when session count has been met.");
Assert.ok(page.applies({hoursSinceInstall: 1, sessionCount: 4}),
"Applies when session count has been exceeded.");
Assert.ok(page.applies({hoursSinceInstall: 10, sessionCount: 2}),
"Applies when total session time has been met.");
Assert.ok(page.applies({hoursSinceInstall: 20, sessionCount: 2}),
"Applies when total session time has been exceeded.");
Assert.ok(page.applies({hoursSinceInstall: 10, sessionCount: 3}),
"Applies when both time and session count have been met.");
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 1}),
"Does not apply when neither time and session count have been met.");
page.requireBoth = true;
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 3}),
"Does not apply when only session count has been met.");
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 4}),
"Does not apply when only session count has been exceeded.");
Assert.ok(!page.applies({hoursSinceInstall: 10, sessionCount: 2}),
"Does not apply when only total session time has been met.");
Assert.ok(!page.applies({hoursSinceInstall: 20, sessionCount: 2}),
"Does not apply when only total session time has been exceeded.");
Assert.ok(page.applies({hoursSinceInstall: 10, sessionCount: 3}),
"Applies when both time and session count have been met.");
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 1}),
"Does not apply when neither time and session count have been met.");
// Check that pages that have run never apply:
Services.prefs.setBoolPref(kPagePrefRoot + "test_LaterRun_unittest.hasRun", true);
page.requireBoth = false;
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 3}),
"Does not apply when page has already run (sessionCount equal).");
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 4}),
"Does not apply when page has already run (sessionCount exceeding).");
Assert.ok(!page.applies({hoursSinceInstall: 10, sessionCount: 2}),
"Does not apply when page has already run (hoursSinceInstall equal).");
Assert.ok(!page.applies({hoursSinceInstall: 20, sessionCount: 2}),
"Does not apply when page has already run (hoursSinceInstall exceeding).");
Assert.ok(!page.applies({hoursSinceInstall: 10, sessionCount: 3}),
"Does not apply when page has already run (both criteria equal).");
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 1}),
"Does not apply when page has already run (both criteria insufficient anyway).");
clearAllPagePrefs();
});
add_task(function* test_get_URL() {
Services.prefs.setIntPref(kProfileCreationTime, Math.floor((Date.now() - 11 * 60 * 60 * 1000) / 1000));
Services.prefs.setCharPref(kPagePrefRoot + "test_LaterRun_unittest.url", "https://www.mozilla.org/");
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumHoursSinceInstall", 10);
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumSessionCount", 3);
let pages = LaterRun.readPages();
// We have to filter the pages because it's possible Firefox ships with other URLs
// that get included in this test.
pages = pages.filter(page => page.pref == kPagePrefRoot + "test_LaterRun_unittest.");
Assert.equal(pages.length, 1, "Should only be 1 matching page");
let page = pages[0];
let url;
do {
url = LaterRun.getURL();
// We have to loop because it's possible Firefox ships with other URLs that get triggered by
// this test.
} while (url && url != "https://www.mozilla.org/");
Assert.equal(url, "https://www.mozilla.org/", "URL should be as expected when prefs are set.");
Assert.ok(Services.prefs.prefHasUserValue(kPagePrefRoot + "test_LaterRun_unittest.hasRun"), "Should have set pref");
Assert.ok(Services.prefs.getBoolPref(kPagePrefRoot + "test_LaterRun_unittest.hasRun"), "Should have set pref to true");
Assert.ok(page.hasRun, "Other page objects should know it has run, too.");
clearAllPagePrefs();
});
add_task(function* test_insecure_urls() {
Services.prefs.setCharPref(kPagePrefRoot + "test_LaterRun_unittest.url", "http://www.mozilla.org/");
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumHoursSinceInstall", 10);
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumSessionCount", 3);
let pages = LaterRun.readPages();
// We have to filter the pages because it's possible Firefox ships with other URLs
// that get triggered in this test.
pages = pages.filter(page => page.pref == kPagePrefRoot + "test_LaterRun_unittest.");
Assert.equal(pages.length, 0, "URL with non-https scheme should get ignored");
clearAllPagePrefs();
});
add_task(function* test_dynamic_pref_getter_setter() {
delete LaterRun._sessionCount;
Services.prefs.setIntPref(kSessionCountPref, 0);
Assert.equal(LaterRun.sessionCount, 0, "Should start at 0");
LaterRun.sessionCount++;
Assert.equal(LaterRun.sessionCount, 1, "Should increment.");
Assert.equal(Services.prefs.getIntPref(kSessionCountPref), 1, "Should update pref");
});
function clearAllPagePrefs() {
let allChangedPrefs = Services.prefs.getChildList(kPagePrefRoot);
for (let pref of allChangedPrefs) {
Services.prefs.clearUserPref(pref);
}
}

View File

@ -120,7 +120,7 @@ this.webrtcUI = {
for (let stream of this._streams) {
if (stream.browser == aOldBrowser)
stream.browser = aNewBrowser;
};
}
},
showSharingDoorhanger: function(aActiveStream, aType) {
@ -251,7 +251,7 @@ function getHost(uri, href) {
uri = Services.io.newURI(href, null, null);
}
host = uri.host;
} catch (ex) {};
} catch (ex) {}
if (!host) {
if (uri && uri.scheme.toLowerCase() == "about") {
// Special case-ing Loop/ Hello gUM requests.

Some files were not shown because too many files have changed in this diff Show More