merge fx-team to mozilla-central a=merge

This commit is contained in:
Carsten "Tomcat" Book 2015-02-19 15:46:34 +01:00
Родитель aa31157b0a af821bee27
Коммит 46f922660f
18 изменённых файлов: 810 добавлений и 44 удалений

Просмотреть файл

@ -196,6 +196,7 @@ let RemoteDebugger = {
globalActorFactories: restrictPrivileges ? { globalActorFactories: restrictPrivileges ? {
webappsActor: DebuggerServer.globalActorFactories.webappsActor, webappsActor: DebuggerServer.globalActorFactories.webappsActor,
deviceActor: DebuggerServer.globalActorFactories.deviceActor, deviceActor: DebuggerServer.globalActorFactories.deviceActor,
settingsActor: DebuggerServer.globalActorFactories.settingsActor
} : DebuggerServer.globalActorFactories } : DebuggerServer.globalActorFactories
}; };
let { RootActor } = devtools.require("devtools/server/actors/root"); let { RootActor } = devtools.require("devtools/server/actors/root");

Просмотреть файл

@ -329,11 +329,6 @@ loop.panel = (function(_, mozL10n) {
render: function() { render: function() {
var cx = React.addons.classSet; var cx = React.addons.classSet;
// For now all of the menu entries require FxA so hide the whole gear if FxA is disabled.
if (!navigator.mozLoop.fxAEnabled) {
return null;
}
return ( return (
React.createElement("div", {className: "settings-menu dropdown"}, React.createElement("div", {className: "settings-menu dropdown"},
React.createElement("a", {className: "button-settings", onClick: this.showDropdownMenu, React.createElement("a", {className: "button-settings", onClick: this.showDropdownMenu,
@ -347,7 +342,7 @@ loop.panel = (function(_, mozL10n) {
React.createElement(SettingsDropdownEntry, {label: mozL10n.get("settings_menu_item_account"), React.createElement(SettingsDropdownEntry, {label: mozL10n.get("settings_menu_item_account"),
onClick: this.handleClickAccountEntry, onClick: this.handleClickAccountEntry,
icon: "account", icon: "account",
displayed: this._isSignedIn()}), displayed: this._isSignedIn() && navigator.mozLoop.fxAEnabled}),
React.createElement(SettingsDropdownEntry, {icon: "tour", React.createElement(SettingsDropdownEntry, {icon: "tour",
label: mozL10n.get("tour_label"), label: mozL10n.get("tour_label"),
onClick: this.openGettingStartedTour}), onClick: this.openGettingStartedTour}),

Просмотреть файл

@ -329,11 +329,6 @@ loop.panel = (function(_, mozL10n) {
render: function() { render: function() {
var cx = React.addons.classSet; var cx = React.addons.classSet;
// For now all of the menu entries require FxA so hide the whole gear if FxA is disabled.
if (!navigator.mozLoop.fxAEnabled) {
return null;
}
return ( return (
<div className="settings-menu dropdown"> <div className="settings-menu dropdown">
<a className="button-settings" onClick={this.showDropdownMenu} <a className="button-settings" onClick={this.showDropdownMenu}
@ -347,7 +342,7 @@ loop.panel = (function(_, mozL10n) {
<SettingsDropdownEntry label={mozL10n.get("settings_menu_item_account")} <SettingsDropdownEntry label={mozL10n.get("settings_menu_item_account")}
onClick={this.handleClickAccountEntry} onClick={this.handleClickAccountEntry}
icon="account" icon="account"
displayed={this._isSignedIn()} /> displayed={this._isSignedIn() && navigator.mozLoop.fxAEnabled} />
<SettingsDropdownEntry icon="tour" <SettingsDropdownEntry icon="tour"
label={mozL10n.get("tour_label")} label={mozL10n.get("tour_label")}
onClick={this.openGettingStartedTour} /> onClick={this.openGettingStartedTour} />

Просмотреть файл

@ -260,6 +260,17 @@ describe("loop.panel", function() {
}); });
}); });
it("should hide the account entry when FxA is not enabled", function() {
navigator.mozLoop.userProfile = {email: "test@example.com"};
navigator.mozLoop.fxAEnabled = false;
var view = TestUtils.renderIntoDocument(
React.createElement(loop.panel.SettingsDropdown));
expect(view.getDOMNode().querySelectorAll(".icon-account"))
.to.have.length.of(0);
});
describe("SettingsDropdown", function() { describe("SettingsDropdown", function() {
beforeEach(function() { beforeEach(function() {
navigator.mozLoop.logInToFxA = sandbox.stub(); navigator.mozLoop.logInToFxA = sandbox.stub();
@ -271,14 +282,6 @@ describe("loop.panel", function() {
navigator.mozLoop.fxAEnabled = true; navigator.mozLoop.fxAEnabled = true;
}); });
it("should be hidden if FxA is not enabled",
function() {
navigator.mozLoop.fxAEnabled = false;
var view = TestUtils.renderIntoDocument(
React.createElement(loop.panel.SettingsDropdown));
expect(view.getDOMNode()).to.be.null;
});
it("should show a signin entry when user is not authenticated", it("should show a signin entry when user is not authenticated",
function() { function() {
navigator.mozLoop.loggedInToFxA = false; navigator.mozLoop.loggedInToFxA = false;

Просмотреть файл

@ -86,6 +86,7 @@ support-files =
doc_scope-variable-3.html doc_scope-variable-3.html
doc_scope-variable-4.html doc_scope-variable-4.html
doc_script-eval.html doc_script-eval.html
doc_script-bookmarklet.html
doc_script-switching-01.html doc_script-switching-01.html
doc_script-switching-02.html doc_script-switching-02.html
doc_split-console-paused-reload.html doc_split-console-paused-reload.html
@ -413,6 +414,8 @@ skip-if = e10s && debug
skip-if = e10s && debug skip-if = e10s && debug
[browser_dbg_sources-sorting.js] [browser_dbg_sources-sorting.js]
skip-if = e10s && debug skip-if = e10s && debug
[browser_dbg_sources-bookmarklet.js]
skip-if = e10s && debug
[browser_dbg_split-console-paused-reload.js] [browser_dbg_split-console-paused-reload.js]
skip-if = e10s && debug skip-if = e10s && debug
[browser_dbg_stack-01.js] [browser_dbg_stack-01.js]

Просмотреть файл

@ -0,0 +1,50 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Make sure javascript bookmarklet scripts appear and load correctly in the source list
*/
const TAB_URL = EXAMPLE_URL + "doc_script-bookmarklet.html";
const BOOKMARKLET_SCRIPT_CODE = "console.log('bookmarklet executed');";
function test() {
let gTab, gPanel, gDebugger;
let gSources, gBreakpoints;
initDebugger(TAB_URL).then(([aTab,, aPanel]) => {
gTab = aTab;
gPanel = aPanel;
gDebugger = gPanel.panelWin;
gSources = gDebugger.DebuggerView.Sources;
gBreakpoints = gDebugger.DebuggerController.Breakpoints;
return Task.spawn(function*() {
let waitForSource = waitForDebuggerEvents(gPanel, gPanel.panelWin.EVENTS.NEW_SOURCE, 1);
// NOTE: devtools debugger panel needs to be already open,
// or the bookmarklet script will not be shown in the sources panel
callInTab(gTab, "injectBookmarklet", BOOKMARKLET_SCRIPT_CODE);
yield waitForSource;
is(gSources.values.length, 2, "Should have 2 source");
let item = gSources.getItemForAttachment(e => {
return e.label.indexOf("javascript:") === 0;
});
ok(item, "Source label is incorrect.");
let res = yield promiseInvoke(gDebugger.DebuggerController.client,
gDebugger.DebuggerController.client.request,
{ to: item.value, type: "source"});
ok(res && res.source == BOOKMARKLET_SCRIPT_CODE, "SourceActor reply received");
is(res.source, BOOKMARKLET_SCRIPT_CODE, "source is correct");
is(res.contentType, "text/javascript", "contentType is correct");
yield closeDebuggerAndFinish(gPanel);
});
});
}

Просмотреть файл

@ -0,0 +1,14 @@
<!-- Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ -->
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<title>Debugger test page</title>
</head>
<body>
<script>function injectBookmarklet(bookmarklet) { setTimeout(function() { window.location = "javascript:" + bookmarklet; }, 0); }</script>
</body>
</html>

Просмотреть файл

@ -0,0 +1,603 @@
/* 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 { Ci, Cc } = require("chrome");
const { Services } = require("resource://gre/modules/Services.jsm");
const Strings = Services.strings.createBundle("chrome://browser/locale/devtools/device.properties");
/* `Devices` is a catalog of existing devices and their properties, intended
* for (mobile) device emulation tools and features.
*
* The properties of a device are:
* - name: Device brand and model(s).
* - width: Viewport width.
* - height: Viewport height.
* - pixelRatio: Screen pixel ratio to viewport.
* - userAgent: Device UserAgent string.
* - touch: Whether the screen is touch-enabled.
*
* To add more devices to this catalog, either patch this file, or push new
* device descriptions from your own code (e.g. an addon) like so:
*
* var myPhone = { name: "My Phone", ... };
* require("devtools/shared/devices").Devices.Others.phones.push(myPhone);
*/
let Devices = {
Types: ["phones", "tablets", "notebooks", "televisions", "watches"],
// Get the localized string of a device type.
GetString(deviceType) {
return Strings.GetStringFromName("device." + deviceType);
},
};
exports.Devices = Devices;
// The `Devices.FirefoxOS` list was put together from various sources online.
Devices.FirefoxOS = {
phones: [
{
name: "Firefox OS Flame",
width: 320,
height: 570,
pixelRatio: 1.5,
userAgent: "Mozilla/5.0 (Mobile; rv:28.0) Gecko/28.0 Firefox/28.0",
touch: true,
},
{
name: "Alcatel One Touch Fire, Fire C",
width: 320,
height: 480,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Mobile; ALCATELOneTouch4012X; rv:28.0) Gecko/28.0 Firefox/28.0",
touch: true,
},
{
name: "Alcatel Fire E",
width: 320,
height: 480,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (Mobile; ALCATELOneTouch4012X; rv:28.0) Gecko/28.0 Firefox/28.0",
touch: true,
},
{
name: "Geeksphone Keon",
width: 320,
height: 480,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Mobile; rv:28.0) Gecko/28.0 Firefox/28.0",
touch: true,
},
{
name: "Geeksphone Peak, Revolution",
width: 360,
height: 640,
pixelRatio: 1.5,
userAgent: "Mozilla/5.0 (Mobile; rv:28.0) Gecko/28.0 Firefox/28.0",
touch: true,
},
{
name: "Intex Cloud Fx",
width: 320,
height: 480,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Mobile; rv:28.0) Gecko/28.0 Firefox/28.0",
touch: true,
},
{
name: "LG Fireweb",
width: 320,
height: 480,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Mobile; LG-D300; rv:28.0) Gecko/28.0 Firefox/28.0",
touch: true,
},
{
name: "Spice Fire One Mi-FX1",
width: 320,
height: 480,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Mobile; rv:28.0) Gecko/28.0 Firefox/28.0",
touch: true,
},
{
name: "Symphony GoFox F15",
width: 320,
height: 480,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Mobile; rv:28.0) Gecko/28.0 Firefox/28.0",
touch: true,
},
{
name: "Zen Fire 105",
width: 320,
height: 480,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Mobile; rv:28.0) Gecko/28.0 Firefox/28.0",
touch: true,
},
{
name: "ZTE Open",
width: 320,
height: 480,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Mobile; ZTEOPEN; rv:28.0) Gecko/28.0 Firefox/28.0",
touch: true,
},
{
name: "ZTE Open C",
width: 320,
height: 450,
pixelRatio: 1.5,
userAgent: "Mozilla/5.0 (Mobile; OPENC; rv:28.0) Gecko/28.0 Firefox/28.0",
touch: true,
},
],
tablets: [
{
name: "Foxconn InFocus",
width: 1280,
height: 800,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Mobile; rv:28.0) Gecko/28.0 Firefox/28.0",
touch: true,
},
{
name: "VIA Vixen",
width: 1024,
height: 600,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Mobile; rv:28.0) Gecko/28.0 Firefox/28.0",
touch: true,
},
],
notebooks: [
],
televisions: [
{
name: "720p HD Television",
width: 1280,
height: 720,
pixelRatio: 1,
userAgent: "",
touch: false,
},
{
name: "1080p Full HD Television",
width: 1920,
height: 1080,
pixelRatio: 1,
userAgent: "",
touch: false,
},
{
name: "4K Ultra HD Television",
width: 3840,
height: 2160,
pixelRatio: 1,
userAgent: "",
touch: false,
},
],
watches: [
{
name: "LG G Watch",
width: 280,
height: 280,
pixelRatio: 1,
userAgent: "",
touch: true,
},
{
name: "LG G Watch R",
width: 320,
height: 320,
pixelRatio: 1,
userAgent: "",
touch: true,
},
{
name: "Moto 360",
width: 320,
height: 290,
pixelRatio: 1,
userAgent: "",
touch: true,
},
{
name: "Samsung Gear Live",
width: 320,
height: 320,
pixelRatio: 1,
userAgent: "",
touch: true,
},
],
};
// `Devices.Others` was derived from the Chromium source code:
// - chromium/src/third_party/WebKit/Source/devtools/front_end/toolbox/OverridesUI.js
Devices.Others = {
phones: [
{
name: "Apple iPhone 3GS",
width: 320,
height: 480,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
touch: true,
},
{
name: "Apple iPhone 4",
width: 320,
height: 480,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
touch: true,
},
{
name: "Apple iPhone 5",
width: 320,
height: 568,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53",
touch: true,
},
{
name: "Apple iPhone 6",
width: 375,
height: 667,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4",
touch: true,
},
{
name: "Apple iPhone 6 Plus",
width: 414,
height: 736,
pixelRatio: 3,
userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4",
touch: true,
},
{
name: "BlackBerry Z10",
width: 384,
height: 640,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+",
touch: true,
},
{
name: "BlackBerry Z30",
width: 360,
height: 640,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+",
touch: true,
},
{
name: "Google Nexus 4",
width: 384,
height: 640,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19",
touch: true,
},
{
name: "Google Nexus 5",
width: 360,
height: 640,
pixelRatio: 3,
userAgent: "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19",
touch: true,
},
{
name: "Google Nexus S",
width: 320,
height: 533,
pixelRatio: 1.5,
userAgent: "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Nexus S Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
touch: true,
},
{
name: "HTC Evo, Touch HD, Desire HD, Desire",
width: 320,
height: 533,
pixelRatio: 1.5,
userAgent: "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Sprint APA9292KT Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
touch: true,
},
{
name: "HTC One X, EVO LTE",
width: 360,
height: 640,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (Linux; Android 4.0.3; HTC One X Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19",
touch: true,
},
{
name: "HTC Sensation, Evo 3D",
width: 360,
height: 640,
pixelRatio: 1.5,
userAgent: "Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; HTC Sensation Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
touch: true,
},
{
name: "LG Optimus 2X, Optimus 3D, Optimus Black",
width: 320,
height: 533,
pixelRatio: 1.5,
userAgent: "Mozilla/5.0 (Linux; U; Android 2.2; en-us; LG-P990/V08c Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2",
touch: true,
},
{
name: "LG Optimus G",
width: 384,
height: 640,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (Linux; Android 4.0; LG-E975 Build/IMM76L) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19",
touch: true,
},
{
name: "LG Optimus LTE, Optimus 4X HD",
width: 424,
height: 753,
pixelRatio: 1.7,
userAgent: "Mozilla/5.0 (Linux; U; Android 2.3; en-us; LG-P930 Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
touch: true,
},
{
name: "LG Optimus One",
width: 213,
height: 320,
pixelRatio: 1.5,
userAgent: "Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; LG-MS690 Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
touch: true,
},
{
name: "Motorola Defy, Droid, Droid X, Milestone",
width: 320,
height: 569,
pixelRatio: 1.5,
userAgent: "Mozilla/5.0 (Linux; U; Android 2.0; en-us; Milestone Build/ SHOLS_U2_01.03.1) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
touch: true,
},
{
name: "Motorola Droid 3, Droid 4, Droid Razr, Atrix 4G, Atrix 2",
width: 540,
height: 960,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Droid Build/FRG22D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
touch: true,
},
{
name: "Motorola Droid Razr HD",
width: 720,
height: 1280,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Linux; U; Android 2.3; en-us; DROID RAZR 4G Build/6.5.1-73_DHD-11_M1-29) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
touch: true,
},
{
name: "Nokia C5, C6, C7, N97, N8, X7",
width: 360,
height: 640,
pixelRatio: 1,
userAgent: "NokiaN97/21.1.107 (SymbianOS/9.4; Series60/5.0 Mozilla/5.0; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebkit/525 (KHTML, like Gecko) BrowserNG/7.1.4",
touch: true,
},
{
name: "Nokia Lumia 7X0, Lumia 8XX, Lumia 900, N800, N810, N900",
width: 320,
height: 533,
pixelRatio: 1.5,
userAgent: "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 820)",
touch: true,
},
{
name: "Samsung Galaxy Note 3",
width: 360,
height: 640,
pixelRatio: 3,
userAgent: "Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
touch: true,
},
{
name: "Samsung Galaxy Note II",
width: 360,
height: 640,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
touch: true,
},
{
name: "Samsung Galaxy Note",
width: 400,
height: 640,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (Linux; U; Android 2.3; en-us; SAMSUNG-SGH-I717 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
touch: true,
},
{
name: "Samsung Galaxy S III, Galaxy Nexus",
width: 360,
height: 640,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
touch: true,
},
{
name: "Samsung Galaxy S, S II, W",
width: 320,
height: 533,
pixelRatio: 1.5,
userAgent: "Mozilla/5.0 (Linux; U; Android 2.1; en-us; GT-I9000 Build/ECLAIR) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
touch: true,
},
{
name: "Samsung Galaxy S4",
width: 360,
height: 640,
pixelRatio: 3,
userAgent: "Mozilla/5.0 (Linux; Android 4.2.2; GT-I9505 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36",
touch: true,
},
{
name: "Sony Xperia S, Ion",
width: 360,
height: 640,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (Linux; U; Android 4.0; en-us; LT28at Build/6.1.C.1.111) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
touch: true,
},
{
name: "Sony Xperia Sola, U",
width: 480,
height: 854,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Linux; U; Android 2.3; en-us; SonyEricssonST25i Build/6.0.B.1.564) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
touch: true,
},
{
name: "Sony Xperia Z, Z1",
width: 360,
height: 640,
pixelRatio: 3,
userAgent: "Mozilla/5.0 (Linux; U; Android 4.2; en-us; SonyC6903 Build/14.1.G.1.518) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
touch: true,
},
],
tablets: [
{
name: "Amazon Kindle Fire HDX 7″",
width: 1920,
height: 1200,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (Linux; U; en-us; KFTHWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true",
touch: true,
},
{
name: "Amazon Kindle Fire HDX 8.9″",
width: 2560,
height: 1600,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true",
touch: true,
},
{
name: "Amazon Kindle Fire (First Generation)",
width: 1024,
height: 600,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.0.141.16-Gen4_11004310) AppleWebkit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true",
touch: true,
},
{
name: "Apple iPad 1 / 2 / iPad Mini",
width: 1024,
height: 768,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (iPad; CPU OS 4_3_5 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8L1 Safari/6533.18.5",
touch: true,
},
{
name: "Apple iPad 3 / 4",
width: 1024,
height: 768,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53",
touch: true,
},
{
name: "BlackBerry PlayBook",
width: 1024,
height: 600,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+",
touch: true,
},
{
name: "Google Nexus 10",
width: 1280,
height: 800,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (Linux; Android 4.3; Nexus 10 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36",
touch: true,
},
{
name: "Google Nexus 7 2",
width: 960,
height: 600,
pixelRatio: 2,
userAgent: "Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36",
touch: true,
},
{
name: "Google Nexus 7",
width: 966,
height: 604,
pixelRatio: 1.325,
userAgent: "Mozilla/5.0 (Linux; Android 4.3; Nexus 7 Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36",
touch: true,
},
{
name: "Motorola Xoom, Xyboard",
width: 1280,
height: 800,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
touch: true,
},
{
name: "Samsung Galaxy Tab 7.7, 8.9, 10.1",
width: 1280,
height: 800,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
touch: true,
},
{
name: "Samsung Galaxy Tab",
width: 1024,
height: 600,
pixelRatio: 1,
userAgent: "Mozilla/5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
touch: true,
},
],
notebooks: [
{
name: "Notebook with touch",
width: 1280,
height: 950,
pixelRatio: 1,
userAgent: "",
touch: true,
},
{
name: "Notebook with HiDPI screen",
width: 1440,
height: 900,
pixelRatio: 2,
userAgent: "",
touch: false,
},
{
name: "Generic notebook",
width: 1280,
height: 800,
pixelRatio: 1,
userAgent: "",
touch: false,
},
],
televisions: [
],
watches: [
],
};

Просмотреть файл

@ -48,6 +48,7 @@ EXTRA_JS_MODULES.devtools.shared.timeline += [
EXTRA_JS_MODULES.devtools.shared += [ EXTRA_JS_MODULES.devtools.shared += [
'autocomplete-popup.js', 'autocomplete-popup.js',
'd3.js', 'd3.js',
'devices.js',
'doorhanger.js', 'doorhanger.js',
'frame-script-utils.js', 'frame-script-utils.js',
'inplace-editor.js', 'inplace-editor.js',

Просмотреть файл

@ -37,7 +37,6 @@ add_task(function*() {
} }
}); });
function* testLivePreviewData(data, ruleView, selector) { function* testLivePreviewData(data, ruleView, selector) {
let testElement = getNode(selector); let testElement = getNode(selector);
let idRuleEditor = getRuleViewRuleEditor(ruleView, 1); let idRuleEditor = getRuleViewRuleEditor(ruleView, 1);
@ -57,10 +56,13 @@ function* testLivePreviewData(data, ruleView, selector) {
EventUtils.synthesizeKey("VK_RETURN", {}); EventUtils.synthesizeKey("VK_RETURN", {});
} }
// This wait is an orange waiting to happen, but it might take a few event // Wait for the modifyproperties request to complete before
// loop spins in either the client or parent process before we see the // checking the computed style.
// updated value. for (let rule of ruleView._elementStyle.rules) {
yield wait(1); if (rule._applyingModifications) {
yield rule._applyingModifications;
}
}
// While the editor is still focused in, the display should have changed already // While the editor is still focused in, the display should have changed already
is((yield getComputedStyleProperty(selector, null, "display")), is((yield getComputedStyleProperty(selector, null, "display")),

Просмотреть файл

@ -0,0 +1,19 @@
# 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 These strings are used inside Device Emulation developer
# tools. The correct localization of this file might be to keep it in English,
# or another language commonly spoken among web developers. You want to make
# that choice consistent across the developer tools. A good criteria is the
# language in which you'd find the best documentation on web development on the
# web.
# LOCALIZATION NOTE:
# These strings are category names in a list of devices that a user can choose
# to simulate (e.g. "ZTE Open C", "VIA Vixen", "720p HD Television", etc).
device.phones=Phones
device.tablets=Tablets
device.notebooks=Notebooks
device.televisions=TVs
device.watches=Watches

Просмотреть файл

@ -33,6 +33,7 @@
locale/browser/devtools/appcacheutils.properties (%chrome/browser/devtools/appcacheutils.properties) locale/browser/devtools/appcacheutils.properties (%chrome/browser/devtools/appcacheutils.properties)
locale/browser/devtools/debugger.dtd (%chrome/browser/devtools/debugger.dtd) locale/browser/devtools/debugger.dtd (%chrome/browser/devtools/debugger.dtd)
locale/browser/devtools/debugger.properties (%chrome/browser/devtools/debugger.properties) locale/browser/devtools/debugger.properties (%chrome/browser/devtools/debugger.properties)
locale/browser/devtools/device.properties (%chrome/browser/devtools/device.properties)
locale/browser/devtools/netmonitor.dtd (%chrome/browser/devtools/netmonitor.dtd) locale/browser/devtools/netmonitor.dtd (%chrome/browser/devtools/netmonitor.dtd)
locale/browser/devtools/netmonitor.properties (%chrome/browser/devtools/netmonitor.properties) locale/browser/devtools/netmonitor.properties (%chrome/browser/devtools/netmonitor.properties)
locale/browser/devtools/shadereditor.dtd (%chrome/browser/devtools/shadereditor.dtd) locale/browser/devtools/shadereditor.dtd (%chrome/browser/devtools/shadereditor.dtd)

Просмотреть файл

@ -355,6 +355,14 @@ body {
background-position: center; background-position: center;
background-size: 30px 24px; background-size: 30px 24px;
background-repeat: no-repeat; background-repeat: no-repeat;
background-color: transparent;
border: 0;
width: 100%;
}
/* Remove dotted border when button is focused */
.button::-moz-focus-inner {
border: 0;
} }
.dropdown { .dropdown {

Просмотреть файл

@ -557,20 +557,49 @@ var LoginManagerContent = {
/* /*
* _fillform * _fillform
* *
* Fill the form with login information if we can find it. This will find * Fill the form with the provided login information.
* an array of logins if not given any, otherwise it will use the logins * The logins are returned so they can be reused for
* passed in. The logins are returned so they can be reused for
* optimization. Success of action is also returned in format * optimization. Success of action is also returned in format
* [success, foundLogins]. * [success, foundLogins].
* *
* - autofillForm denotes if we should fill the form in automatically * - autofillForm denotes if we should fill the form in automatically
* - userTriggered is an indication of whether this filling was triggered by * - userTriggered is an indication of whether this filling was triggered by
* the user * the user
* - foundLogins is an array of nsILoginInfo for optimization * - foundLogins is an array of nsILoginInfo
*/ */
_fillForm : function (form, autofillForm, clobberPassword, _fillForm : function (form, autofillForm, clobberPassword,
userTriggered, foundLogins) { userTriggered, foundLogins) {
let ignoreAutocomplete = true; let ignoreAutocomplete = true;
const AUTOFILL_RESULT = {
FILLED: 0,
NO_PASSWORD_FIELD: 1,
PASSWORD_DISABLED_READONLY: 2,
NO_LOGINS_FIT: 3,
NO_SAVED_LOGINS: 4,
EXISTING_PASSWORD: 5,
EXISTING_USERNAME: 6,
MULTIPLE_LOGINS: 7,
NO_AUTOFILL_FORMS: 8,
AUTOCOMPLETE_OFF: 9,
UNKNOWN_FAILURE: 10,
};
function recordAutofillResult(result) {
if (userTriggered) {
// Ignore fills as a result of user action.
return;
}
const autofillResultHist = Services.telemetry.getHistogramById("PWMGR_FORM_AUTOFILL_RESULT");
autofillResultHist.add(result);
}
// Nothing to do if we have no matching logins available.
if (foundLogins.length == 0) {
// We don't log() here since this is a very common case.
recordAutofillResult(AUTOFILL_RESULT.NO_SAVED_LOGINS);
return [false, foundLogins];
}
// Heuristically determine what the user/pass fields are // Heuristically determine what the user/pass fields are
// We do this before checking to see if logins are stored, // We do this before checking to see if logins are stored,
// so that the user isn't prompted for a master password // so that the user isn't prompted for a master password
@ -579,12 +608,16 @@ var LoginManagerContent = {
this._getFormFields(form, false); this._getFormFields(form, false);
// Need a valid password field to do anything. // Need a valid password field to do anything.
if (passwordField == null) if (passwordField == null) {
log("not filling form, no password field found");
recordAutofillResult(AUTOFILL_RESULT.NO_PASSWORD_FIELD);
return [false, foundLogins]; return [false, foundLogins];
}
// If the password field is disabled or read-only, there's nothing to do. // If the password field is disabled or read-only, there's nothing to do.
if (passwordField.disabled || passwordField.readOnly) { if (passwordField.disabled || passwordField.readOnly) {
log("not filling form, password field disabled or read-only"); log("not filling form, password field disabled or read-only");
recordAutofillResult(AUTOFILL_RESULT.PASSWORD_DISABLED_READONLY);
return [false, foundLogins]; return [false, foundLogins];
} }
@ -619,11 +652,11 @@ var LoginManagerContent = {
return fit; return fit;
}, this); }, this);
if (logins.length == 0) {
// Nothing to do if we have no matching logins available. log("form not filled, none of the logins fit in the field");
if (logins.length == 0) recordAutofillResult(AUTOFILL_RESULT.NO_LOGINS_FIT);
return [false, foundLogins]; return [false, foundLogins];
}
// The reason we didn't end up filling the form, if any. We include // The reason we didn't end up filling the form, if any. We include
// this in the formInfo object we send with the passwordmgr-found-logins // this in the formInfo object we send with the passwordmgr-found-logins
@ -641,6 +674,8 @@ var LoginManagerContent = {
didntFillReason = "existingPassword"; didntFillReason = "existingPassword";
this._notifyFoundLogins(didntFillReason, usernameField, this._notifyFoundLogins(didntFillReason, usernameField,
passwordField, foundLogins, null); passwordField, foundLogins, null);
log("form not filled, the password field was already filled");
recordAutofillResult(AUTOFILL_RESULT.EXISTING_PASSWORD);
return [false, foundLogins]; return [false, foundLogins];
} }
@ -744,6 +779,28 @@ var LoginManagerContent = {
this._notifyFoundLogins(didntFillReason, usernameField, passwordField, this._notifyFoundLogins(didntFillReason, usernameField, passwordField,
foundLogins, selectedLogin); foundLogins, selectedLogin);
if (didFillForm) {
recordAutofillResult(AUTOFILL_RESULT.FILLED);
} else {
let autofillResult = AUTOFILL_RESULT.UNKNOWN_FAILURE;
switch (didntFillReason) {
// existingPassword is already handled above
case "existingUsername":
autofillResult = AUTOFILL_RESULT.EXISTING_USERNAME;
break;
case "multipleLogins":
autofillResult = AUTOFILL_RESULT.MULTIPLE_LOGINS;
break;
case "noAutofillForms":
autofillResult = AUTOFILL_RESULT.NO_AUTOFILL_FORMS;
break;
case "autocompleteOff":
autofillResult = AUTOFILL_RESULT.AUTOCOMPLETE_OFF;
break;
}
recordAutofillResult(autofillResult);
}
return [didFillForm, foundLogins]; return [didFillForm, foundLogins];
}, },

Просмотреть файл

@ -25,10 +25,10 @@
</div> </div>
<ul id="reader-toolbar" class="toolbar toolbar-hidden"> <ul id="reader-toolbar" class="toolbar toolbar-hidden">
<li><a id="close-button" class="button close-button" href="#"></a></li> <li><button id="close-button" class="button close-button"/></li>
<li><a id="share-button" class="button share-button" href="#"></a></li> <li><button id="share-button" class="button share-button"/></li>
<ul id="style-dropdown" class="dropdown"> <ul id="style-dropdown" class="dropdown">
<li><a class="dropdown-toggle button style-button" href="#"></a></li> <li><button class="dropdown-toggle button style-button"/></li>
<li class="dropdown-popup"> <li class="dropdown-popup">
<ul id="font-type-buttons"></ul> <ul id="font-type-buttons"></ul>
<hr></hr> <hr></hr>
@ -38,8 +38,8 @@
<div class="dropdown-arrow"/> <div class="dropdown-arrow"/>
</li> </li>
</ul> </ul>
<li><a id="toggle-button" class="button toggle-button" href="#"></a></li> <li><button id="toggle-button" class="button toggle-button"/></li>
<li><a id="list-button" class="button list-button" href="#"></a></li> <li><button id="list-button" class="button list-button"/></li>
</ul> </ul>
</body> </body>

Просмотреть файл

@ -7363,6 +7363,12 @@
"extended_statistics_ok": true, "extended_statistics_ok": true,
"description": "The number of sites for which the user has explicitly rejected saving logins" "description": "The number of sites for which the user has explicitly rejected saving logins"
}, },
"PWMGR_FORM_AUTOFILL_RESULT": {
"expires_in_version": "never",
"kind": "enumerated",
"n_values" : 20,
"description": "The result of auto-filling a login form. See http://mzl.la/1Mbs6jL for bucket descriptions."
},
"PWMGR_NUM_PASSWORDS_PER_HOSTNAME": { "PWMGR_NUM_PASSWORDS_PER_HOSTNAME": {
"expires_in_version": "never", "expires_in_version": "never",
"kind": "linear", "kind": "linear",

Просмотреть файл

@ -5319,6 +5319,12 @@ ThreadSources.prototype = {
} }
} catch(ex) { } catch(ex) {
// Not a valid URI. // Not a valid URI.
// bug 1124536: fix getSourceText on scripts associated "javascript:SOURCE" urls
// (e.g. 'evaluate(sandbox, sourcecode, "javascript:"+sourcecode)' )
if (url.indexOf("javascript:") === 0) {
spec.contentType = "text/javascript";
}
} }
} }
else { else {

Просмотреть файл

@ -239,9 +239,12 @@ body {
background-position: center; background-position: center;
background-size: 24px 24px; background-size: 24px 24px;
background-repeat: no-repeat; background-repeat: no-repeat;
padding: 4px; background-color: transparent;
height: 32px; height: 40px;
width: 32px; width: 40px;
border-top: 0;
border-left: 0;
border-right: 0;
border-bottom: 1px solid #c1c1c1; border-bottom: 1px solid #c1c1c1;
} }
@ -265,7 +268,6 @@ body {
background-color: #FBFBFB; background-color: #FBFBFB;
font-size: 14px; font-size: 14px;
visibility: hidden; visibility: hidden;
cursor: pointer;
border-radius: 4px; border-radius: 4px;
border: 1px solid #B5B5B5; border: 1px solid #B5B5B5;
box-shadow: 0px 1px 12px #666; box-shadow: 0px 1px 12px #666;
@ -376,7 +378,7 @@ body {
.close-button { .close-button {
background-image: url("chrome://global/skin/reader/RM-Close-24x24.svg"); background-image: url("chrome://global/skin/reader/RM-Close-24x24.svg");
height: 60px; height: 68px;
background-position: center 8px; background-position: center 8px;
} }