mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Merge m-c to m-i
This commit is contained in:
commit
3cd9dfa77b
3
.gitignore
vendored
3
.gitignore
vendored
@ -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]
|
||||
|
||||
|
@ -2,12 +2,4 @@
|
||||
"extends": [
|
||||
"../toolkit/.eslintrc"
|
||||
],
|
||||
|
||||
"rules": {
|
||||
// No redeclaring variables
|
||||
"no-redeclare": 2,
|
||||
|
||||
// Functions must always return something or nothing
|
||||
"consistent-return": 2,
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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.
|
||||
|
@ -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() {
|
||||
|
@ -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 =
|
||||
|
@ -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
|
||||
);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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");
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -82,7 +82,7 @@ function CustomizeMode(aWindow) {
|
||||
Services.prefs.addObserver(kDrawInTitlebarPref, this, false);
|
||||
}
|
||||
this.window.addEventListener("unload", this);
|
||||
};
|
||||
}
|
||||
|
||||
CustomizeMode.prototype = {
|
||||
_changed: false,
|
||||
|
@ -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");
|
||||
});
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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;
|
||||
|
@ -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", {});
|
||||
|
@ -22,5 +22,5 @@ function test() {
|
||||
}
|
||||
is(tb.getAttribute("collapsed"), "false", "Toolbar should be uncollapsed");
|
||||
tb.remove();
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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";
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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("");
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
},
|
||||
|
@ -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) {
|
||||
|
@ -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"];
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
});
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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");
|
||||
|
@ -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;
|
||||
|
||||
|
@ -51,7 +51,7 @@ function SyncedTabsDeckComponent({
|
||||
View: TabListView,
|
||||
SyncedTabs: SyncedTabs
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
SyncedTabsDeckComponent.prototype = {
|
||||
PANELS: {
|
||||
|
@ -24,7 +24,7 @@ this.EXPORTED_SYMBOLS = [
|
||||
function SyncedTabsDeckStore() {
|
||||
EventEmitter.call(this);
|
||||
this._panels = [];
|
||||
};
|
||||
}
|
||||
|
||||
Object.assign(SyncedTabsDeckStore.prototype, EventEmitter.prototype, {
|
||||
_change(isUpdatable = false) {
|
||||
|
@ -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
|
||||
|
@ -43,7 +43,7 @@ function TabListView(window, props) {
|
||||
this.container = this._doc.createElement("div");
|
||||
|
||||
this._setupContextMenu();
|
||||
};
|
||||
}
|
||||
|
||||
TabListView.prototype = {
|
||||
render(state) {
|
||||
|
@ -258,5 +258,5 @@ function checkItem(node, item) {
|
||||
Assert.equal(node.dataset.id, item.id,
|
||||
"Node's ID should match item ID");
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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; },
|
||||
|
@ -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
|
||||
|
@ -1520,7 +1520,7 @@ Experiments.ExperimentEntry.prototype = {
|
||||
this._log.error("initFromCacheData() - missing required key " + key);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
if (!this._isManifestDataValid(data._manifestData)) {
|
||||
return false;
|
||||
|
@ -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() { }
|
||||
|
@ -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);
|
||||
});
|
||||
|
@ -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();
|
||||
});
|
||||
|
@ -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();
|
||||
}
|
||||
|
9
browser/extensions/loop/bootstrap.js
vendored
9
browser/extensions/loop/bootstrap.js
vendored
@ -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) {
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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;
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -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
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -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() {
|
||||
|
@ -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
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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ś
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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=نمای فردی پنهان شده است ولی ارسال میشود؛ برای نمایش اندازه پنجره را تغییر دهید
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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ć
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
255
browser/extensions/loop/chrome/locale/id/loop.properties
Normal file
255
browser/extensions/loop/chrome/locale/id/loop.properties
Normal 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.
|
@ -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=セルフビューは隠れていますが送信されています。表示するにはウィンドウの大きさを変更してください
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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=Вигляд самого себе прихований, але все ще відправляється; змініть розмір вікна для показу
|
||||
|
||||
|
@ -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=已隐藏但仍在发送中;调整窗口以显示
|
||||
|
||||
|
@ -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=已隱藏您自己的畫面,但還是會送出。請調整視窗大小以顯示自己的畫面。
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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/*)
|
||||
|
@ -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
|
||||
"
|
||||
|
4
browser/extensions/pocket/bootstrap.js
vendored
4
browser/extensions/pocket/bootstrap.js
vendored
@ -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");
|
||||
|
@ -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; }
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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();
|
||||
|
@ -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) {
|
||||
|
@ -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");
|
||||
|
@ -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
|
||||
|
@ -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');
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
Loading…
Reference in New Issue
Block a user