From 93e29882cfe0775b3bb93522ca000a7a5360bf7d Mon Sep 17 00:00:00 2001 From: Robert Strong Date: Fri, 1 May 2015 12:10:45 -0700 Subject: [PATCH 01/12] Bug 1160370 - Add tags to app update test manifests. r=spohl --- toolkit/mozapps/update/tests/chrome/chrome.ini | 1 + toolkit/mozapps/update/tests/unit_aus_update/xpcshell.ini | 1 + toolkit/mozapps/update/tests/unit_base_updater/xpcshell.ini | 1 + toolkit/mozapps/update/tests/unit_service_updater/xpcshell.ini | 1 + 4 files changed, 4 insertions(+) diff --git a/toolkit/mozapps/update/tests/chrome/chrome.ini b/toolkit/mozapps/update/tests/chrome/chrome.ini index 64fa0754f082..e6c3cbbb2cd5 100644 --- a/toolkit/mozapps/update/tests/chrome/chrome.ini +++ b/toolkit/mozapps/update/tests/chrome/chrome.ini @@ -3,6 +3,7 @@ ; file, You can obtain one at http://mozilla.org/MPL/2.0/. [DEFAULT] +tags = appupdate skip-if = (buildapp == 'b2g' || buildapp == 'mulet') support-files = utils.js diff --git a/toolkit/mozapps/update/tests/unit_aus_update/xpcshell.ini b/toolkit/mozapps/update/tests/unit_aus_update/xpcshell.ini index 4ff7e3ac4ed2..3087d54eab63 100644 --- a/toolkit/mozapps/update/tests/unit_aus_update/xpcshell.ini +++ b/toolkit/mozapps/update/tests/unit_aus_update/xpcshell.ini @@ -3,6 +3,7 @@ ; file, You can obtain one at http://mozilla.org/MPL/2.0/. [DEFAULT] +tags = appupdate head = head_update.js tail = diff --git a/toolkit/mozapps/update/tests/unit_base_updater/xpcshell.ini b/toolkit/mozapps/update/tests/unit_base_updater/xpcshell.ini index a33a507aa723..3a26ac222d6d 100644 --- a/toolkit/mozapps/update/tests/unit_base_updater/xpcshell.ini +++ b/toolkit/mozapps/update/tests/unit_base_updater/xpcshell.ini @@ -7,6 +7,7 @@ ; from running the tests in the moz.build file. [DEFAULT] +tags = appupdate head = head_update.js tail = diff --git a/toolkit/mozapps/update/tests/unit_service_updater/xpcshell.ini b/toolkit/mozapps/update/tests/unit_service_updater/xpcshell.ini index 76b2d68dc77f..4c380ad79964 100644 --- a/toolkit/mozapps/update/tests/unit_service_updater/xpcshell.ini +++ b/toolkit/mozapps/update/tests/unit_service_updater/xpcshell.ini @@ -5,6 +5,7 @@ ; Tests that require the updater binary and the maintenance service. [DEFAULT] +tags = appupdate head = head_update.js tail = From 109f1ff513d98c7ccc61feb8e60be502efdbf357 Mon Sep 17 00:00:00 2001 From: Brian Grinstead Date: Fri, 1 May 2015 13:01:38 -0700 Subject: [PATCH 02/12] Bug 1160345 - Set toolbox button visibility before consulting with the GCLI actor (which may not be available on old servers);r=jryans --- browser/devtools/framework/toolbox.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/browser/devtools/framework/toolbox.js b/browser/devtools/framework/toolbox.js index 682e453df37f..2b02ef74b001 100644 --- a/browser/devtools/framework/toolbox.js +++ b/browser/devtools/framework/toolbox.js @@ -717,6 +717,10 @@ Toolbox.prototype = { this._buildPickerButton(); } + // Set the visibility of the built in buttons before adding more buttons + // so they are shown before calling into the GCLI actor. + this.setToolboxButtonsVisibility(); + const options = { environment: CommandUtils.createEnvironment(this, '_target') }; From d7d4d70a861e15cd2b87fa4b27badc0d30c92583 Mon Sep 17 00:00:00 2001 From: Jordan Santell Date: Tue, 28 Apr 2015 17:19:15 -0700 Subject: [PATCH 03/12] Bug 1159480 - Pull out actor-specific logic from Performance Front. r=vp --- .../devtools/performance/modules/actors.js | 293 +++++++++++++++ .../performance/modules/compatibility.js | 135 ++++--- browser/devtools/performance/modules/front.js | 355 ++++-------------- browser/devtools/performance/moz.build | 1 + .../test/browser_perf-shared-connection-02.js | 2 +- 5 files changed, 438 insertions(+), 348 deletions(-) create mode 100644 browser/devtools/performance/modules/actors.js diff --git a/browser/devtools/performance/modules/actors.js b/browser/devtools/performance/modules/actors.js new file mode 100644 index 000000000000..61fec66b177f --- /dev/null +++ b/browser/devtools/performance/modules/actors.js @@ -0,0 +1,293 @@ +/* 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 { Task } = require("resource://gre/modules/Task.jsm"); +const { Promise } = require("resource://gre/modules/Promise.jsm"); +const { + actorCompatibilityBridge, getProfiler, + MockMemoryFront, MockTimelineFront, + memoryActorSupported, timelineActorSupported +} = require("devtools/performance/compatibility"); + +loader.lazyRequireGetter(this, "EventEmitter", + "devtools/toolkit/event-emitter"); +loader.lazyRequireGetter(this, "RecordingUtils", + "devtools/performance/recording-utils", true); +loader.lazyRequireGetter(this, "TimelineFront", + "devtools/server/actors/timeline", true); +loader.lazyRequireGetter(this, "MemoryFront", + "devtools/server/actors/memory", true); +loader.lazyRequireGetter(this, "timers", + "resource://gre/modules/Timer.jsm"); + +// how often do we pull allocation sites from the memory actor +const ALLOCATION_SITE_POLL_TIMER = 200; // ms + +const MEMORY_ACTOR_METHODS = [ + "destroy", "attach", "detach", "getState", "getAllocationsSettings", + "getAllocations", "startRecordingAllocations", "stopRecordingAllocations" +]; + +const TIMELINE_ACTOR_METHODS = [ + "start", "stop", +]; + +const PROFILER_ACTOR_METHODS = [ + "isActive", "startProfiler", "getStartOptions", "stopProfiler", + "registerEventNotifications", "unregisterEventNotifications" +]; + +/** + * Constructor for a facade around an underlying ProfilerFront. + */ +function ProfilerFrontFacade (target) { + this._target = target; + this._onProfilerEvent = this._onProfilerEvent.bind(this); + EventEmitter.decorate(this); +} + +ProfilerFrontFacade.prototype = { + EVENTS: ["console-api-profiler", "profiler-stopped"], + + // Connects to the targets underlying real ProfilerFront. + connect: Task.async(function*() { + let target = this._target; + this._actor = yield getProfiler(target); + + // Fetch and store information about the SPS profiler and + // server profiler. + this.traits = {}; + this.traits.filterable = target.getTrait("profilerDataFilterable"); + + // Directly register to event notifications when connected + // to hook into `console.profile|profileEnd` calls. + yield this.registerEventNotifications({ events: this.EVENTS }); + // TODO bug 1159389, listen directly to actor if supporting new front + target.client.addListener("eventNotification", this._onProfilerEvent); + }), + + /** + * Unregisters events for the underlying profiler actor. + */ + destroy: Task.async(function *() { + yield this.unregisterEventNotifications({ events: this.EVENTS }); + // TODO bug 1159389, listen directly to actor if supporting new front + this._target.client.removeListener("eventNotification", this._onProfilerEvent); + }), + + /** + * Starts the profiler actor, if necessary. + */ + start: Task.async(function *(options={}) { + // Start the profiler only if it wasn't already active. The built-in + // nsIPerformance module will be kept recording, because it's the same instance + // for all targets and interacts with the whole platform, so we don't want + // to affect other clients by stopping (or restarting) it. + let profilerStatus = yield this.isActive(); + if (profilerStatus.isActive) { + this.emit("profiler-already-active"); + return profilerStatus.currentTime; + } + + // Translate options from the recording model into profiler-specific + // options for the nsIProfiler + let profilerOptions = { + entries: options.bufferSize, + interval: options.sampleFrequency ? (1000 / (options.sampleFrequency * 1000)) : void 0 + }; + + yield this.startProfiler(profilerOptions); + + this.emit("profiler-activated"); + return 0; + }), + + /** + * Returns profile data from now since `startTime`. + */ + getProfile: Task.async(function *(options) { + let profilerData = yield (actorCompatibilityBridge("getProfile").call(this, options)); + // If the backend does not support filtering by start and endtime on platform (< Fx40), + // do it on the client (much slower). + if (!this.traits.filterable) { + RecordingUtils.filterSamples(profilerData.profile, options.startTime || 0); + } + + return profilerData; + }), + + /** + * Invoked whenever a registered event was emitted by the profiler actor. + * + * @param object response + * The data received from the backend. + */ + _onProfilerEvent: function (_, { topic, subject, details }) { + if (topic === "console-api-profiler") { + if (subject.action === "profile") { + this.emit("console-profile-start", details); + } else if (subject.action === "profileEnd") { + this.emit("console-profile-end", details); + } + } else if (topic === "profiler-stopped") { + this.emit("profiler-stopped"); + } + }, + + toString: () => "[object ProfilerFrontFacade]" +}; + +// Bind all the methods that directly proxy to the actor +PROFILER_ACTOR_METHODS.forEach(method => ProfilerFrontFacade.prototype[method] = actorCompatibilityBridge(method)); +exports.ProfilerFront = ProfilerFrontFacade; + +/** + * Constructor for a facade around an underlying TimelineFront. + */ +function TimelineFrontFacade (target) { + this._target = target; + EventEmitter.decorate(this); +} + +TimelineFrontFacade.prototype = { + EVENTS: ["markers", "frames", "memory", "ticks"], + + connect: Task.async(function*() { + let supported = yield timelineActorSupported(this._target); + this._actor = supported ? + new TimelineFront(this._target.client, this._target.form) : + new MockTimelineFront(); + + this.IS_MOCK = !supported; + + // Binds underlying actor events and consolidates them to a `timeline-data` + // exposed event. + this.EVENTS.forEach(type => { + let handler = this[`_on${type}`] = this._onTimelineData.bind(this, type); + this._actor.on(type, handler); + }); + }), + + /** + * Override actor's destroy, so we can unregister listeners before + * destroying the underlying actor. + */ + destroy: Task.async(function *() { + this.EVENTS.forEach(type => this._actor.off(type, this[`_on${type}`])); + yield this._actor.destroy(); + }), + + /** + * An aggregate of all events (markers, frames, memory, ticks) and exposes + * to PerformanceActorsConnection as a single event. + */ + _onTimelineData: function (type, ...data) { + this.emit("timeline-data", type, ...data); + }, + + toString: () => "[object TimelineFrontFacade]" +}; + +// Bind all the methods that directly proxy to the actor +TIMELINE_ACTOR_METHODS.forEach(method => TimelineFrontFacade.prototype[method] = actorCompatibilityBridge(method)); +exports.TimelineFront = TimelineFrontFacade; + +/** + * Constructor for a facade around an underlying ProfilerFront. + */ +function MemoryFrontFacade (target) { + this._target = target; + this._pullAllocationSites = this._pullAllocationSites.bind(this); + EventEmitter.decorate(this); +} + +MemoryFrontFacade.prototype = { + connect: Task.async(function*() { + let supported = yield memoryActorSupported(this._target); + this._actor = supported ? + new MemoryFront(this._target.client, this._target.form) : + new MockMemoryFront(); + + this.IS_MOCK = !supported; + }), + + /** + * Starts polling for allocation information. + */ + start: Task.async(function *(options) { + if (!options.withAllocations) { + return 0; + } + + yield this.attach(); + + let startTime = yield this.startRecordingAllocations({ + probability: options.allocationsSampleProbability, + maxLogLength: options.allocationsMaxLogLength + }); + + yield this._pullAllocationSites(); + + return startTime; + }), + + /** + * Stops polling for allocation information. + */ + stop: Task.async(function *(options) { + if (!options.withAllocations) { + return 0; + } + + // Since `_pullAllocationSites` is usually running inside a timeout, and + // it's performing asynchronous requests to the server, a recording may + // be stopped before that method finishes executing. Therefore, we need to + // wait for the last request to `getAllocations` to finish before actually + // stopping recording allocations. + yield this._lastPullAllocationSitesFinished; + timers.clearTimeout(this._sitesPullTimeout); + + let endTime = yield this.stopRecordingAllocations(); + yield this.detach(); + + return endTime; + }), + + /** + * At regular intervals, pull allocations from the memory actor, and + * forward them on this Front facade as "timeline-data" events. This + * gives the illusion that the MemoryActor supports an EventEmitter-style + * event stream. + */ + _pullAllocationSites: Task.async(function *() { + let { promise, resolve } = Promise.defer(); + this._lastPullAllocationSitesFinished = promise; + + if ((yield this.getState()) !== "attached") { + resolve(); + return; + } + + let memoryData = yield this.getAllocations(); + // Match the signature of the TimelineFront events, with "timeline-data" + // being the event name, and the second argument describing the type. + this.emit("timeline-data", "allocations", { + sites: memoryData.allocations, + timestamps: memoryData.allocationsTimestamps, + frames: memoryData.frames, + counts: memoryData.counts + }); + + this._sitesPullTimeout = timers.setTimeout(this._pullAllocationSites, ALLOCATION_SITE_POLL_TIMER); + + resolve(); + }), + + toString: () => "[object MemoryFrontFacade]" +}; + +// Bind all the methods that directly proxy to the actor +MEMORY_ACTOR_METHODS.forEach(method => MemoryFrontFacade.prototype[method] = actorCompatibilityBridge(method)); +exports.MemoryFront = MemoryFrontFacade; diff --git a/browser/devtools/performance/modules/compatibility.js b/browser/devtools/performance/modules/compatibility.js index 2cf4fa39a77a..fd792878c13f 100644 --- a/browser/devtools/performance/modules/compatibility.js +++ b/browser/devtools/performance/modules/compatibility.js @@ -4,72 +4,9 @@ "use strict"; const { Task } = require("resource://gre/modules/Task.jsm"); -loader.lazyRequireGetter(this, "promise"); +const { Promise } = require("resource://gre/modules/Promise.jsm"); loader.lazyRequireGetter(this, "EventEmitter", "devtools/toolkit/event-emitter"); -loader.lazyRequireGetter(this, "RecordingUtils", - "devtools/performance/recording-utils", true); - -const REQUIRED_MEMORY_ACTOR_METHODS = [ - "attach", "detach", "startRecordingAllocations", "stopRecordingAllocations", "getAllocations" -]; - -/** - * Constructor for a facade around an underlying ProfilerFront. - */ -function ProfilerFront (target) { - this._target = target; -} - -ProfilerFront.prototype = { - // Connects to the targets underlying real ProfilerFront. - connect: Task.async(function*() { - let target = this._target; - // Chrome and content process targets already have obtained a reference - // to the profiler tab actor. Use it immediately. - if (target.form && target.form.profilerActor) { - this._profiler = target.form.profilerActor; - } - // Check if we already have a grip to the `listTabs` response object - // and, if we do, use it to get to the profiler actor. - else if (target.root && target.root.profilerActor) { - this._profiler = target.root.profilerActor; - } - // Otherwise, call `listTabs`. - else { - this._profiler = (yield listTabs(target.client)).profilerActor; - } - - // Fetch and store information about the SPS profiler and - // server profiler. - this.traits = {}; - this.traits.filterable = target.getTrait("profilerDataFilterable"); - }), - - /** - * Makes a request to the underlying real profiler actor. Handles - * backwards compatibility differences based off of the features - * and traits of the actor. - */ - _request: function (method, ...args) { - let deferred = promise.defer(); - let data = args[0] || {}; - data.to = this._profiler; - data.type = method; - this._target.client.request(data, res => { - // If the backend does not support filtering by start and endtime on platform (< Fx40), - // do it on the client (much slower). - if (method === "getProfile" && !this.traits.filterable) { - RecordingUtils.filterSamples(res.profile, data.startTime || 0); - } - - deferred.resolve(res); - }); - return deferred.promise; - } -}; - -exports.ProfilerFront = ProfilerFront; /** * A dummy front decorated with the provided methods. @@ -87,7 +24,8 @@ function MockFront (blueprint) { function MockMemoryFront () { MockFront.call(this, [ - ["initialize"], + ["start", 0], // for facade + ["stop", 0], // for facade ["destroy"], ["attach"], ["detach"], @@ -101,7 +39,6 @@ exports.MockMemoryFront = MockMemoryFront; function MockTimelineFront () { MockFront.call(this, [ - ["initialize"], ["destroy"], ["start", 0], ["stop", 0], @@ -169,12 +106,66 @@ function timelineActorSupported(target) { exports.timelineActorSupported = Task.async(timelineActorSupported); /** - * Returns a promise resolved with a listing of all the tabs in the - * provided thread client. + * Returns a promise resolving to the location of the profiler actor + * within this context. + * + * @param {TabTarget} target + * @return {Promise} */ -function listTabs(client) { - let deferred = promise.defer(); - client.listTabs(deferred.resolve); - return deferred.promise; +function getProfiler (target) { + let { promise, resolve } = Promise.defer(); + // Chrome and content process targets already have obtained a reference + // to the profiler tab actor. Use it immediately. + if (target.form && target.form.profilerActor) { + resolve(target.form.profilerActor); + } + // Check if we already have a grip to the `listTabs` response object + // and, if we do, use it to get to the profiler actor. + else if (target.root && target.root.profilerActor) { + resolve(target.root.profilerActor); + } + // Otherwise, call `listTabs`. + else { + target.client.listTabs(({ profilerActor }) => resolve(profilerActor)); + } + return promise; +} +exports.getProfiler = Task.async(getProfiler); + +/** + * Makes a request to an actor that does not have the modern `Front` + * interface. + */ +function legacyRequest (target, actor, method, args) { + let { promise, resolve } = Promise.defer(); + let data = args[0] || {}; + data.to = actor; + data.type = method; + target.client.request(data, resolve); + return promise; } +/** + * Returns a function to be used as a method on an "Actor" in ./actors. + * Calls the underlying actor's method, supporting the modern `Front` + * interface if possible, otherwise, falling back to using + * `legacyRequest`. + */ +function actorCompatibilityBridge (method) { + return function () { + // Check to see if this is a modern ActorFront, which has its + // own `request` method. Also, check if its a mock actor, as it mimicks + // the ActorFront interface. + // The profiler actor does not currently support the modern `Front` + // interface, so we have to manually push packets to it. + // TODO bug 1159389, fix up profiler actor to not need this, however + // we will need it for backwards compat + if (this.IS_MOCK || this._actor.request) { + return this._actor[method].apply(this._actor, arguments); + } + else { + return legacyRequest(this._target, this._actor, method, arguments); + } + }; +} +exports.actorCompatibilityBridge = actorCompatibilityBridge; diff --git a/browser/devtools/performance/modules/front.js b/browser/devtools/performance/modules/front.js index 63d5da7fc358..0ce6e8307c8a 100644 --- a/browser/devtools/performance/modules/front.js +++ b/browser/devtools/performance/modules/front.js @@ -9,24 +9,15 @@ const { extend } = require("sdk/util/object"); const { RecordingModel } = require("devtools/performance/recording-model"); loader.lazyRequireGetter(this, "Services"); -loader.lazyRequireGetter(this, "promise"); loader.lazyRequireGetter(this, "EventEmitter", "devtools/toolkit/event-emitter"); -loader.lazyRequireGetter(this, "TimelineFront", - "devtools/server/actors/timeline", true); -loader.lazyRequireGetter(this, "MemoryFront", - "devtools/server/actors/memory", true); loader.lazyRequireGetter(this, "DevToolsUtils", "devtools/toolkit/DevToolsUtils"); -loader.lazyRequireGetter(this, "compatibility", - "devtools/performance/compatibility"); +loader.lazyRequireGetter(this, "actors", + "devtools/performance/actors"); loader.lazyImporter(this, "gDevTools", "resource:///modules/devtools/gDevTools.jsm"); -loader.lazyImporter(this, "setTimeout", - "resource://gre/modules/Timer.jsm"); -loader.lazyImporter(this, "clearTimeout", - "resource://gre/modules/Timer.jsm"); loader.lazyImporter(this, "Promise", "resource://gre/modules/Promise.jsm"); @@ -41,9 +32,6 @@ const CONNECTION_PIPE_EVENTS = [ "recording-started", "recording-stopped" ]; -// Events to listen to from the profiler actor -const PROFILER_EVENTS = ["console-api-profiler", "profiler-stopped"]; - /** * A cache of all PerformanceActorsConnection instances. * The keys are Target objects. @@ -84,17 +72,15 @@ function PerformanceActorsConnection(target) { this._target = target; this._client = this._target.client; - this._request = this._request.bind(this); this._pendingConsoleRecordings = []; this._sitesPullTimeout = 0; this._recordings = []; - this._onTimelineMarkers = this._onTimelineMarkers.bind(this); - this._onTimelineFrames = this._onTimelineFrames.bind(this); - this._onTimelineMemory = this._onTimelineMemory.bind(this); - this._onTimelineTicks = this._onTimelineTicks.bind(this); - this._onProfilerEvent = this._onProfilerEvent.bind(this); - this._pullAllocationSites = this._pullAllocationSites.bind(this); + this._pipeToConnection = this._pipeToConnection.bind(this); + this._onTimelineData = this._onTimelineData.bind(this); + this._onConsoleProfileStart = this._onConsoleProfileStart.bind(this); + this._onConsoleProfileEnd = this._onConsoleProfileEnd.bind(this); + this._onProfilerUnexpectedlyStopped = this._onProfilerUnexpectedlyStopped.bind(this); Services.obs.notifyObservers(null, "performance-actors-connection-created", null); } @@ -128,10 +114,7 @@ PerformanceActorsConnection.prototype = { // Only initialize the timeline and memory fronts if the respective actors // are available. Older Gecko versions don't have existing implementations, // in which case all the methods we need can be easily mocked. - yield this._connectProfilerActor(); - yield this._connectTimelineActor(); - yield this._connectMemoryActor(); - + yield this._connectActors(); yield this._registerListeners(); this._connected = true; @@ -159,132 +142,64 @@ PerformanceActorsConnection.prototype = { }), /** - * Initializes a connection to the profiler actor. Uses a facade around the ProfilerFront - * for similarity to the other actors in the shared connection. + * Initializes fronts and connects to the underlying actors using the facades + * found in ./actors.js. */ - _connectProfilerActor: Task.async(function*() { - this._profiler = new compatibility.ProfilerFront(this._target); - yield this._profiler.connect(); - }), + _connectActors: Task.async(function*() { + this._profiler = new actors.ProfilerFront(this._target); + this._memory = new actors.MemoryFront(this._target); + this._timeline = new actors.TimelineFront(this._target); - /** - * Initializes a connection to a timeline actor. - */ - _connectTimelineActor: function() { - let supported = yield compatibility.timelineActorSupported(this._target); - if (supported) { - this._timeline = new TimelineFront(this._target.client, this._target.form); - } else { - this._timeline = new compatibility.MockTimelineFront(); - } - this._timelineSupported = supported; - }, + yield Promise.all([ + this._profiler.connect(), + this._memory.connect(), + this._timeline.connect() + ]); - /** - * Initializes a connection to a memory actor. - */ - _connectMemoryActor: Task.async(function* () { - let supported = yield compatibility.memoryActorSupported(this._target); - if (supported) { - this._memory = new MemoryFront(this._target.client, this._target.form); - } else { - this._memory = new compatibility.MockMemoryFront(); - } - this._memorySupported = supported; + // Expose server support status of underlying actors + // after connecting. + this._memorySupported = !this._memory.IS_MOCK; + this._timelineSupported = !this._timeline.IS_MOCK; }), /** * Registers listeners on events from the underlying * actors, so the connection can handle them. */ - _registerListeners: Task.async(function*() { - // Pipe events from TimelineActor to the PerformanceFront - this._timeline.on("markers", this._onTimelineMarkers); - this._timeline.on("frames", this._onTimelineFrames); - this._timeline.on("memory", this._onTimelineMemory); - this._timeline.on("ticks", this._onTimelineTicks); - - // Register events on the profiler actor to hook into `console.profile*` calls. - yield this._request("profiler", "registerEventNotifications", { events: PROFILER_EVENTS }); - this._client.addListener("eventNotification", this._onProfilerEvent); - }), + _registerListeners: function () { + this._timeline.on("timeline-data", this._onTimelineData); + this._memory.on("timeline-data", this._onTimelineData); + this._profiler.on("console-profile-start", this._onConsoleProfileStart); + this._profiler.on("console-profile-end", this._onConsoleProfileEnd); + this._profiler.on("profiler-stopped", this._onProfilerUnexpectedlyStopped); + this._profiler.on("profiler-already-active", this._pipeToConnection); + this._profiler.on("profiler-activated", this._pipeToConnection); + }, /** * Unregisters listeners on events on the underlying actors. */ - _unregisterListeners: Task.async(function*() { - this._timeline.off("markers", this._onTimelineMarkers); - this._timeline.off("frames", this._onTimelineFrames); - this._timeline.off("memory", this._onTimelineMemory); - this._timeline.off("ticks", this._onTimelineTicks); - - yield this._request("profiler", "unregisterEventNotifications", { events: PROFILER_EVENTS }); - this._client.removeListener("eventNotification", this._onProfilerEvent); - }), + _unregisterListeners: function () { + this._timeline.off("timeline-data", this._onTimelineData); + this._memory.off("timeline-data", this._onTimelineData); + this._profiler.off("console-profile-start", this._onConsoleProfileStart); + this._profiler.off("console-profile-end", this._onConsoleProfileEnd); + this._profiler.off("profiler-stopped", this._onProfilerUnexpectedlyStopped); + this._profiler.off("profiler-already-active", this._pipeToConnection); + this._profiler.off("profiler-activated", this._pipeToConnection); + }, /** * Closes the connections to non-profiler actors. */ _disconnectActors: Task.async(function* () { - yield this._timeline.destroy(); - yield this._memory.destroy(); + yield Promise.all([ + this._profiler.destroy(), + this._timeline.destroy(), + this._memory.destroy() + ]); }), - /** - * Sends the request over the remote debugging protocol to the - * specified actor. - * - * @param string actor - * Currently supported: "profiler", "timeline", "memory". - * @param string method - * Method to call on the backend. - * @param any args [optional] - * Additional data or arguments to send with the request. - * @return object - * A promise resolved with the response once the request finishes. - */ - _request: function(actor, method, ...args) { - // Handle requests to the profiler actor. - if (actor == "profiler") { - return this._profiler._request(method, ...args); - } - - // Handle requests to the timeline actor. - if (actor == "timeline") { - return this._timeline[method].apply(this._timeline, args); - } - - // Handle requests to the memory actor. - if (actor == "memory") { - return this._memory[method].apply(this._memory, args); - } - }, - - /** - * Invoked whenever a registered event was emitted by the profiler actor. - * - * @param object response - * The data received from the backend. - */ - _onProfilerEvent: function (_, { topic, subject, details }) { - if (topic === "console-api-profiler") { - if (subject.action === "profile") { - this._onConsoleProfileStart(details); - } else if (subject.action === "profileEnd") { - this._onConsoleProfileEnd(details); - } - } else if (topic === "profiler-stopped") { - this._onProfilerUnexpectedlyStopped(); - } - }, - - /** - * TODO handle bug 1144438 - */ - _onProfilerUnexpectedlyStopped: function () { - - }, - /** * Invoked whenever `console.profile` is called. * @@ -294,7 +209,7 @@ PerformanceActorsConnection.prototype = { * The time (in milliseconds) when the call was made, relative to when * the nsIProfiler module was started. */ - _onConsoleProfileStart: Task.async(function *({ profileLabel, currentTime: startTime }) { + _onConsoleProfileStart: Task.async(function *(_, { profileLabel, currentTime: startTime }) { let recordings = this._recordings; // Abort if a profile with this label already exists. @@ -325,7 +240,7 @@ PerformanceActorsConnection.prototype = { * The time (in milliseconds) when the call was made, relative to when * the nsIProfiler module was started. */ - _onConsoleProfileEnd: Task.async(function *(data) { + _onConsoleProfileEnd: Task.async(function *(_, data) { // If no data, abort; can occur if profiler isn't running and we get a surprise // call to console.profileEnd() if (!data) { @@ -361,14 +276,12 @@ PerformanceActorsConnection.prototype = { this.emit("console-profile-end", model); }), - /** - * Handlers for TimelineActor events. All pipe to `_onTimelineData` - * with the appropriate event name. - */ - _onTimelineMarkers: function (markers) { this._onTimelineData("markers", markers); }, - _onTimelineFrames: function (delta, frames) { this._onTimelineData("frames", delta, frames); }, - _onTimelineMemory: function (delta, measurement) { this._onTimelineData("memory", delta, measurement); }, - _onTimelineTicks: function (delta, timestamps) { this._onTimelineData("ticks", delta, timestamps); }, + /** + * TODO handle bug 1144438 + */ + _onProfilerUnexpectedlyStopped: function () { + Cu.reportError("Profiler unexpectedly stopped.", arguments); + }, /** * Called whenever there is timeline data of any of the following types: @@ -380,8 +293,7 @@ PerformanceActorsConnection.prototype = { * * Populate our internal store of recordings for all currently recording sessions. */ - - _onTimelineData: function (...data) { + _onTimelineData: function (_, ...data) { this._recordings.forEach(e => e.addTimelineData.apply(e, data)); this.emit("timeline-data", ...data); }, @@ -399,15 +311,13 @@ PerformanceActorsConnection.prototype = { let model = new RecordingModel(options); // All actors are started asynchronously over the remote debugging protocol. // Get the corresponding start times from each one of them. - let profilerStartTime = yield this._startProfiler(options); - let timelineStartTime = yield this._startTimeline(options); - let memoryStartTime = yield this._startMemory(options); + // The timeline and memory actors are target-dependent, so start those as well, + // even though these are mocked in older Geckos (FF < 35) + let profilerStartTime = yield this._profiler.start(options); + let timelineStartTime = yield this._timeline.start(options); + let memoryStartTime = yield this._memory.start(options); - let data = { - profilerStartTime, - timelineStartTime, - memoryStartTime - }; + let data = { profilerStartTime, timelineStartTime, memoryStartTime }; // Signify to the model that the recording has started, // populate with data and store the recording model here. @@ -445,7 +355,7 @@ PerformanceActorsConnection.prototype = { let config = model.getConfiguration(); let startTime = model.getProfilerStartTime(); - let profilerData = yield this._request("profiler", "getProfile", { startTime }); + let profilerData = yield this._profiler.getProfile({ startTime }); let memoryEndTime = Date.now(); let timelineEndTime = Date.now(); @@ -454,8 +364,8 @@ PerformanceActorsConnection.prototype = { // juse use Date.now() for the memory and timeline end times, as those // are only used in tests. if (!this.isRecording()) { - memoryEndTime = yield this._stopMemory(config); - timelineEndTime = yield this._stopTimeline(config); + memoryEndTime = yield this._memory.stop(config); + timelineEndTime = yield this._timeline.stop(config); } // Set the results on the RecordingModel itself. @@ -484,127 +394,12 @@ PerformanceActorsConnection.prototype = { }, /** - * Starts the profiler actor, if necessary. + * An event from an underlying actor that we just want + * to pipe to the connection itself. */ - _startProfiler: Task.async(function *(options={}) { - // Start the profiler only if it wasn't already active. The built-in - // nsIPerformance module will be kept recording, because it's the same instance - // for all targets and interacts with the whole platform, so we don't want - // to affect other clients by stopping (or restarting) it. - let profilerStatus = yield this._request("profiler", "isActive"); - if (profilerStatus.isActive) { - this.emit("profiler-already-active"); - return profilerStatus.currentTime; - } - - // Translate options from the recording model into profiler-specific - // options for the nsIProfiler - let profilerOptions = { - entries: options.bufferSize, - interval: options.sampleFrequency ? (1000 / (options.sampleFrequency * 1000)) : void 0 - }; - - yield this._request("profiler", "startProfiler", profilerOptions); - - this.emit("profiler-activated"); - return 0; - }), - - /** - * Starts the timeline actor. - */ - _startTimeline: Task.async(function *(options) { - // The timeline actor is target-dependent, so just make sure it's recording. - // It won't, however, be available in older Geckos (FF < 35). - return (yield this._request("timeline", "start", options)); - }), - - /** - * Stops the timeline actor. - */ - _stopTimeline: Task.async(function *(options) { - return (yield this._request("timeline", "stop")); - }), - - /** - * Starts polling for allocations from the memory actor, if necessary. - */ - _startMemory: Task.async(function *(options) { - if (!options.withAllocations) { - return 0; - } - let memoryStartTime = yield this._startRecordingAllocations(options); - yield this._pullAllocationSites(); - return memoryStartTime; - }), - - /** - * Stops polling for allocations from the memory actor, if necessary. - */ - _stopMemory: Task.async(function *(options) { - if (!options.withAllocations) { - return 0; - } - // Since `_pullAllocationSites` is usually running inside a timeout, and - // it's performing asynchronous requests to the server, a recording may - // be stopped before that method finishes executing. Therefore, we need to - // wait for the last request to `getAllocations` to finish before actually - // stopping recording allocations. - yield this._lastPullAllocationSitesFinished; - clearTimeout(this._sitesPullTimeout); - - return yield this._stopRecordingAllocations(); - }), - - /** - * Starts recording allocations in the memory actor. - */ - _startRecordingAllocations: Task.async(function*(options) { - yield this._request("memory", "attach"); - let memoryStartTime = yield this._request("memory", "startRecordingAllocations", { - probability: options.allocationsSampleProbability, - maxLogLength: options.allocationsMaxLogLength - }); - return memoryStartTime; - }), - - /** - * Stops recording allocations in the memory actor. - */ - _stopRecordingAllocations: Task.async(function*() { - let memoryEndTime = yield this._request("memory", "stopRecordingAllocations"); - yield this._request("memory", "detach"); - return memoryEndTime; - }), - - /** - * At regular intervals, pull allocations from the memory actor, and forward - * them to consumers. - */ - _pullAllocationSites: Task.async(function *() { - let deferred = promise.defer(); - this._lastPullAllocationSitesFinished = deferred.promise; - - let isDetached = (yield this._request("memory", "getState")) !== "attached"; - if (isDetached) { - deferred.resolve(); - return; - } - - let memoryData = yield this._request("memory", "getAllocations"); - - this._onTimelineData("allocations", { - sites: memoryData.allocations, - timestamps: memoryData.allocationsTimestamps, - frames: memoryData.frames, - counts: memoryData.counts - }); - - let delay = DEFAULT_ALLOCATION_SITES_PULL_TIMEOUT; - this._sitesPullTimeout = setTimeout(this._pullAllocationSites, delay); - - deferred.resolve(); - }), + _pipeToConnection: function (eventName, ...args) { + this.emit(eventName, ...args); + }, toString: () => "[object PerformanceActorsConnection]" }; @@ -620,7 +415,6 @@ function PerformanceFront(connection) { EventEmitter.decorate(this); this._connection = connection; - this._request = connection._request; // Set when mocks are being used this._memorySupported = connection._memorySupported; @@ -680,6 +474,17 @@ PerformanceFront.prototype = { */ isRecording: function () { return this._connection.isRecording(); + }, + + /** + * Interacts with the connection's actors. Should only be used in tests. + */ + _request: function (actorName, method, ...args) { + if (!gDevTools.testing) { + throw new Error("PerformanceFront._request may only be used in tests."); + } + let actor = this._connection[`_${actorName}`]; + return actor[method].apply(actor, args); } }; diff --git a/browser/devtools/performance/moz.build b/browser/devtools/performance/moz.build index 7b83784b013c..0662e080c984 100644 --- a/browser/devtools/performance/moz.build +++ b/browser/devtools/performance/moz.build @@ -4,6 +4,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. EXTRA_JS_MODULES.devtools.performance += [ + 'modules/actors.js', 'modules/compatibility.js', 'modules/front.js', 'modules/graphs.js', diff --git a/browser/devtools/performance/test/browser_perf-shared-connection-02.js b/browser/devtools/performance/test/browser_perf-shared-connection-02.js index 5df422a1d333..7e2c9edc3622 100644 --- a/browser/devtools/performance/test/browser_perf-shared-connection-02.js +++ b/browser/devtools/performance/test/browser_perf-shared-connection-02.js @@ -18,7 +18,7 @@ function spawnTest () { ok(sharedConnection, "A shared profiler connection for the current toolbox was retrieved."); - is(sharedConnection._request, panel.panelWin.gFront._request, + is(panel.panelWin.gFront._connection, sharedConnection, "The same shared profiler connection is used by the panel's front."); yield sharedConnection.open(); From 4d373656ab5e6a07b704167487ce7c25eca8c3d9 Mon Sep 17 00:00:00 2001 From: Jared Wein Date: Fri, 1 May 2015 17:16:42 -0400 Subject: [PATCH 04/12] Bug 1159744 - Use the panel implementations from the Pocket add-on for the Pocket feature. r=dolske --- browser/app/profile/firefox.js | 2 +- browser/base/content/browser.xul | 3 + .../test/general/browser_parsable_css.js | 4 +- .../customizableui/CustomizableWidgets.jsm | 126 +-- .../customizableui/content/panelUI.inc.xul | 37 +- browser/components/pocket/Pocket.jsm | 26 +- browser/components/pocket/img/signup_logo.png | Bin 3302 -> 0 bytes .../components/pocket/img/signup_logo@2x.png | Bin 7082 -> 0 bytes browser/components/pocket/jar.mn | 36 +- browser/components/pocket/main.js | 723 ++++++++++++++++++ browser/components/pocket/panels/LICENSE | 35 + .../components/pocket/panels/css/firasans.css | 6 + .../pocket/panels/css/normalize.css | 427 +++++++++++ .../components/pocket/panels/css/saved.css | 694 +++++++++++++++++ .../components/pocket/panels/css/signup.css | 267 +++++++ .../pocket/panels/fonts/FiraSans-Regular.woff | Bin 0 -> 179188 bytes .../pocket/panels/img/pocketlogo@1x.png | Bin 0 -> 4278 bytes .../pocket/panels/img/pocketlogo@2x.png | Bin 0 -> 9114 bytes .../pocket/panels/img/pocketlogosolo@1x.png | Bin 0 -> 1256 bytes .../pocket/panels/img/pocketlogosolo@2x.png | Bin 0 -> 2566 bytes .../panels/img/pocketmultidevices@1x.png | Bin 0 -> 28729 bytes .../panels/img/pocketmultidevices@2x.png | Bin 0 -> 96266 bytes .../panels/img/signup_firefoxlogo@1x.png | Bin 0 -> 635 bytes .../panels/img/signup_firefoxlogo@2x.png | Bin 0 -> 1375 bytes .../pocket/panels/img/signup_help@1x.png | Bin 0 -> 659 bytes .../pocket/panels/img/signup_help@2x.png | Bin 0 -> 1420 bytes .../img/signup_or@1x.png} | Bin .../pocket/{ => panels}/img/signup_or@2x.png | Bin .../pocket/panels/img/tag_close@1x.png | Bin 0 -> 1055 bytes .../pocket/panels/img/tag_close@2x.png | Bin 0 -> 1219 bytes .../components/pocket/panels/js/dictionary.js | 22 + .../components/pocket/panels/js/messages.js | 58 ++ browser/components/pocket/panels/js/saved.js | 631 +++++++++++++++ browser/components/pocket/panels/js/signup.js | 207 +++++ browser/components/pocket/panels/js/tmpl.js | 43 ++ .../panels/js/vendor/handlebars.runtime.js | 660 ++++++++++++++++ .../panels/js/vendor/jquery-2.1.1.min.js | 4 + .../panels/js/vendor/jquery.tokeninput.min.js | 6 + browser/components/pocket/panels/saved.html | 18 + browser/components/pocket/panels/signup.html | 17 + .../panels/tmpl/saved_premiumshell.handlebars | 6 + .../pocket/panels/tmpl/saved_shell.handlebars | 24 + .../panels/tmpl/signup_shell.handlebars | 13 + browser/components/pocket/pktApi.js | 581 ++++++++++++++ browser/themes/osx/menuPanel-yosemite.png | Bin 23603 -> 24635 bytes browser/themes/osx/menuPanel-yosemite@2x.png | Bin 53263 -> 55914 bytes .../customizableui/panelUIOverlay.inc.css | 131 +--- 47 files changed, 4514 insertions(+), 293 deletions(-) delete mode 100644 browser/components/pocket/img/signup_logo.png delete mode 100644 browser/components/pocket/img/signup_logo@2x.png create mode 100644 browser/components/pocket/main.js create mode 100644 browser/components/pocket/panels/LICENSE create mode 100644 browser/components/pocket/panels/css/firasans.css create mode 100644 browser/components/pocket/panels/css/normalize.css create mode 100644 browser/components/pocket/panels/css/saved.css create mode 100644 browser/components/pocket/panels/css/signup.css create mode 100644 browser/components/pocket/panels/fonts/FiraSans-Regular.woff create mode 100644 browser/components/pocket/panels/img/pocketlogo@1x.png create mode 100644 browser/components/pocket/panels/img/pocketlogo@2x.png create mode 100644 browser/components/pocket/panels/img/pocketlogosolo@1x.png create mode 100644 browser/components/pocket/panels/img/pocketlogosolo@2x.png create mode 100644 browser/components/pocket/panels/img/pocketmultidevices@1x.png create mode 100644 browser/components/pocket/panels/img/pocketmultidevices@2x.png create mode 100644 browser/components/pocket/panels/img/signup_firefoxlogo@1x.png create mode 100644 browser/components/pocket/panels/img/signup_firefoxlogo@2x.png create mode 100644 browser/components/pocket/panels/img/signup_help@1x.png create mode 100644 browser/components/pocket/panels/img/signup_help@2x.png rename browser/components/pocket/{img/signup_or.png => panels/img/signup_or@1x.png} (100%) rename browser/components/pocket/{ => panels}/img/signup_or@2x.png (100%) create mode 100644 browser/components/pocket/panels/img/tag_close@1x.png create mode 100644 browser/components/pocket/panels/img/tag_close@2x.png create mode 100644 browser/components/pocket/panels/js/dictionary.js create mode 100644 browser/components/pocket/panels/js/messages.js create mode 100644 browser/components/pocket/panels/js/saved.js create mode 100644 browser/components/pocket/panels/js/signup.js create mode 100644 browser/components/pocket/panels/js/tmpl.js create mode 100644 browser/components/pocket/panels/js/vendor/handlebars.runtime.js create mode 100644 browser/components/pocket/panels/js/vendor/jquery-2.1.1.min.js create mode 100644 browser/components/pocket/panels/js/vendor/jquery.tokeninput.min.js create mode 100644 browser/components/pocket/panels/saved.html create mode 100644 browser/components/pocket/panels/signup.html create mode 100644 browser/components/pocket/panels/tmpl/saved_premiumshell.handlebars create mode 100644 browser/components/pocket/panels/tmpl/saved_shell.handlebars create mode 100644 browser/components/pocket/panels/tmpl/signup_shell.handlebars create mode 100644 browser/components/pocket/pktApi.js diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index 56619a7f4249..6fb4b4614059 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -1920,6 +1920,6 @@ pref("dom.serviceWorkers.enabled", true); pref("browser.pocket.enabled", false); pref("browser.pocket.hostname", "localhost"); -pref("browser.pocket.removedByUser", false); +pref("browser.pocket.oAuthConsumerKey", "40249-e88c401e1b1f2242d9e441c4"); pref("browser.pocket.useLocaleList", true); pref("browser.pocket.enabledLocales", "en-US"); diff --git a/browser/base/content/browser.xul b/browser/base/content/browser.xul index 01c96d39d505..ebbf44297c3f 100644 --- a/browser/base/content/browser.xul +++ b/browser/base/content/browser.xul @@ -1300,4 +1300,7 @@ # starting with an empty iframe here in browser.xul from a Ts standpoint. + + + + + + + + + \ No newline at end of file diff --git a/browser/components/pocket/panels/signup.html b/browser/components/pocket/panels/signup.html new file mode 100644 index 000000000000..18b7db5c4f4e --- /dev/null +++ b/browser/components/pocket/panels/signup.html @@ -0,0 +1,17 @@ + + + + Pocket: Sign Up + + + + + + + + + + + + + \ No newline at end of file diff --git a/browser/components/pocket/panels/tmpl/saved_premiumshell.handlebars b/browser/components/pocket/panels/tmpl/saved_premiumshell.handlebars new file mode 100644 index 000000000000..5ef042636585 --- /dev/null +++ b/browser/components/pocket/panels/tmpl/saved_premiumshell.handlebars @@ -0,0 +1,6 @@ +
+

{{suggestedtags}}

+
+
    +
+
\ No newline at end of file diff --git a/browser/components/pocket/panels/tmpl/saved_shell.handlebars b/browser/components/pocket/panels/tmpl/saved_shell.handlebars new file mode 100644 index 000000000000..af1cd04c45a6 --- /dev/null +++ b/browser/components/pocket/panels/tmpl/saved_shell.handlebars @@ -0,0 +1,24 @@ +
+
+
+
+ +
+

{{pagesaved}}

+ +
+

+
+
+
+ +
+ {{save}} +
+
\ No newline at end of file diff --git a/browser/components/pocket/panels/tmpl/signup_shell.handlebars b/browser/components/pocket/panels/tmpl/signup_shell.handlebars new file mode 100644 index 000000000000..8b9d361cd418 --- /dev/null +++ b/browser/components/pocket/panels/tmpl/signup_shell.handlebars @@ -0,0 +1,13 @@ +

Recommended by Firefox

+
+ +
+

{{tagline}}

+

{{learnmore}}

+
+
+

{{signuptosave}}

+

{{help}}

+

+

{{alreadyhaveacct}} {{loginnow}}.

+
\ No newline at end of file diff --git a/browser/components/pocket/pktApi.js b/browser/components/pocket/pktApi.js new file mode 100644 index 000000000000..a2bed9e5fb58 --- /dev/null +++ b/browser/components/pocket/pktApi.js @@ -0,0 +1,581 @@ +/* + * LICENSE + * + * POCKET MARKS + * + * Notwithstanding the permitted uses of the Software (as defined below) pursuant to the license set forth below, "Pocket," "Read It Later" and the Pocket icon and logos (collectively, the “Pocket Marks”) are registered and common law trademarks of Read It Later, Inc. This means that, while you have considerable freedom to redistribute and modify the Software, there are tight restrictions on your ability to use the Pocket Marks. This license does not grant you any rights to use the Pocket Marks except as they are embodied in the Software. + * + * --- + * + * SOFTWARE + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * 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 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* + * Pocket API module + * + * Public API Documentation: http://getpocket.com/developer/ + * + * + * Definition of keys stored in preferences to preserve user state: + * premium_status: Current premium status for logged in user if available + * Can be 0 for no premium and 1 for premium + * latestSince: Last timestamp a save happened + * tags: All tags for logged in user + * usedTags: All used tags from within the extension sorted by recency + */ + +var pktApi = (function() { + + /** + * Configuration + */ + + // Base url for all api calls + // TODO: This is a dev server and will be changed before launch + var pocketAPIhost = Services.prefs.getCharPref("browser.pocket.hostname"); + + // Base url for all api calls + var baseAPIUrl = "https://" + pocketAPIhost + "/v3"; + + + /** + * Auth keys for the API requests + */ + var oAuthConsumerKey = Services.prefs.getCharPref("browser.pocket.oAuthConsumerKey"); + + /** + * + */ + var prefBranch = Services.prefs.getBranch("browser.pocket.settings."); + + /** + * Helper + */ + + var extend = function(out) { + out = out || {}; + + for (var i = 1; i < arguments.length; i++) { + if (!arguments[i]) + continue; + + for (var key in arguments[i]) { + if (arguments[i].hasOwnProperty(key)) + out[key] = arguments[i][key]; + } + } + return out; + } + + /** + * Settings + */ + + /** + * Wrapper for different plattforms to get settings for a given key + * @param {string} key A string containing the name of the key you want to + * retrieve the value of + * @return {string} String containing the value of the key. If the key + * 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; + + return prefBranch.getComplexValue(key, Components.interfaces.nsISupportsString).data; + } + + /** + * Wrapper for different plattforms to set a value for a given key in settings + * @param {string} key A string containing the name of the key you want + * to create/update. + * @param {string} value String containing the value you want to give + * 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); + } + } + + /** + * Auth + */ + + /* + * All cookies from the Pocket domain + * The return format: { cookieName:cookieValue, cookieName:cookieValue, ... } + */ + function getCookiesFromPocket() { + + var cookieManager = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2); + var pocketCookies = cookieManager.getCookiesFromHost(pocketAPIhost); + var cookies = {}; + while (pocketCookies.hasMoreElements()) { + var cookie = pocketCookies.getNext().QueryInterface(Ci.nsICookie2); + cookies[cookie.name] = cookie.value; + } + return cookies; + } + + /** + * Returns access token or undefined if no logged in user was found + * @return {string | undefined} Access token for logged in user user + */ + function getAccessToken() { + var pocketCookies = getCookiesFromPocket(); + + // If no cookie was found just return undefined + if (typeof pocketCookies['ftv1'] === "undefined") { + return undefined; + } + + // Check if a new user logged in in the meantime and clearUserData if so + var sessionId = pocketCookies['fsv1']; + var lastSessionId = getSetting('fsv1'); + if (sessionId !== lastSessionId) { + clearUserData(); + setSetting("fsv1", sessionId); + } + + // Return access token + return pocketCookies['ftv1']; + } + + /** + * Returns users logged in status + * @return {Boolean} Users logged in status + */ + function isUserLoggedIn() { + return (typeof getAccessToken() !== "undefined"); + } + + /** + * API + */ + + /** + * Helper function for executing api requests. It mainly configures the + * ajax call with default values like type, headers or dataType for an api call. + * This function is for internal usage only. + * @param {Object} options + * Possible keys: + * - {string} path: This should be the Pocket API + * endpoint to call. For example providing the path + * "/get" would result in a call to getpocket.com/v3/get + * - {Object|undefined} data: Gets passed on to the jQuery ajax + * call as data parameter + * - {function(Object data, XMLHttpRequest xhr) | undefined} success: + * A function to be called if the request succeeds. + * - {function(Error errorThrown, XMLHttpRequest xhr) | undefined} error: + * A function to be called if the request fails. + * @return {Boolean} Returns Boolean whether the api call started sucessfully + * + */ + function apiRequest(options) { + if ((typeof options === "undefined") || (typeof options.path === "undefined")) { + return false; + } + + var url = baseAPIUrl + options.path; + var data = options.data || {}; + data.locale_lang = window.navigator.language; + data.consumer_key = oAuthConsumerKey; + + 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) { + if (options.success) { + options.success(JSON.parse(request.response), request); + } + return; + } + + // TODO: Better error handling + if (options.error) { + // Check to handle Pocket error + var errorMessage = request.getResponseHeader("X-Error"); + if (typeof errorMessage !== "undefined") { + options.error(new Error(errorMessage), request); + return; + } + + // Handle other error + options.error(new Error(request.statusText), request); + } + } + }; + + // TODO - do we want to pass a special user agent? + //request.setRequestHeader("User-Agent" , 'Pocket Firefox ' + this.APP.v); + + // 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])); + } + } + + request.send(str.join("&")); + + return true; + } + + /** + * Cleans all settings for the previously logged in user + */ + function clearUserData() { + // Clear stored information + setSetting("premium_status", undefined); + setSetting("latestSince", undefined); + setSetting("tags", undefined); + setSetting("usedTags", undefined); + + } + + /** + * Add a new link to Pocket + * @param {string} url URL of the link + * @param {Object | undefined} options Can provide an title and have a + * success and error callbacks + * @return {Boolean} Returns Boolean whether the api call started sucessfully + */ + function addLink(url, options) { + + var since = getSetting('latestSince'); + var accessToken = getAccessToken(); + + var sendData = { + access_token: accessToken, + url: url, + since: since ? since : 0 + }; + + var title = options.title; + if (title !== "undefined") { + sendData.title = title; + }; + + return apiRequest({ + path: "/firefox/save", + data: sendData, + success: function(data) { + + // Update premium status, tags and since + var tags = data.tags; + if ((typeof tags !== "undefined") && Array.isArray(tags)) { + // If a tagslist is in the response replace the tags + setSetting('tags', JSON.stringify(data.tags)); + } + + // Update premium status + var premiumStatus = data.premium_status; + if (typeof premiumStatus !== "undefined") { + // If a premium_status is in the response replace the premium_status + setSetting("premium_status", premiumStatus); + } + + // Save since value for further requests + setSetting('latestSince', data.since); + + if (options.success) { + options.success.apply(options, Array.apply(null, arguments)); + } + }, + error: options.error + }); + + return sendAction(action, options); + } + + /** + * Delete an item identified by item id from the users list + * @param {string} itemId The id from the item we want to remove + * @param {Object | undefined} options Can provide an actionInfo object with + * further data to send to the API. Can + * have success and error callbacks + * @return {Boolean} Returns Boolean whether the api call started sucessfully + */ + function deleteItem(itemId, options) { + var action = { + action: "delete", + item_id: itemId + }; + return sendAction(action, options); + } + + /** + * General function to send all kinds of actions like adding of links or + * removing of items via the API + * @param {Object} action Action object + * @param {Object | undefined} options Can provide an actionInfo object + * with further data to send to the + * API. Can have success and error + * callbacks + * @return {Boolean} Returns Boolean whether the api call started sucessfully + */ + function sendAction(action, options) { + // Options can have an 'actionInfo' object. This actionInfo object gets + // passed through to the action object that will be send to the API endpoint + if (typeof options.actionInfo !== 'undefined') { + action = extend(action, options.actionInfo); + } + return sendActions([action], options); + } + + /** + * General function to send all kinds of actions like adding of links or + * removing of items via the API + * @param {Array} actions Array of action objects + * @param {Object | undefined} options Can have success and error callbacks + * @return {Boolean} Returns Boolean whether the api call started sucessfully + */ + function sendActions(actions, options) { + return apiRequest({ + path: "/send", + data: { + access_token: getAccessToken(), + actions: JSON.stringify(actions) + }, + success: options.success, + error: options.error + }); + } + + /** + * Handling Tags + */ + + /** + * Add tags to the item identified by the url. Also updates the used tags + * list + * @param {string} itemId The item identifier by item id + * @param {Array} tags Tags adding to the item + * @param {Object | undefined} options Can provide an actionInfo object with + * further data to send to the API. Can + * have success and error callbacks + * @return {Boolean} Returns Boolean whether the api call started sucessfully + */ + function addTagsToItem(itemId, tags, options) { + return addTags({item_id: itemId}, tags, options); + } + + /** + * Add tags to the item identified by the url. Also updates the used tags + * list + * @param {string} url The item identifier by url + * @param {Array} tags Tags adding to the item + * @param {Object} options Can provide an actionInfo object with further + * data to send to the API. Can have success and error + * callbacks + * @return {Boolean} Returns Boolean whether the api call started sucessfully + */ + function addTagsToURL(url, tags, options) { + return addTags({url: url}, tags, options); + } + + /** + * Helper function to execute the add tags api call. Will be used from addTagsToURL + * and addTagsToItem but not exposed outside + * @param {string} actionPart Specific action part to add to action + * @param {Array} tags Tags adding to the item + * @param {Object | undefined} options Can provide an actionInfo object with + * further data to send to the API. Can + * have success and error callbacks + * @return {Boolean} Returns Boolean whether the api call started sucessfully + */ + function addTags(actionPart, tags, options) { + // Tags add action + var action = { + action: "tags_add", + tags: tags + }; + action = extend(action, actionPart); + + // Backup the success callback as we need it later + var finalSuccessCallback = options.success; + + // Switch the success callback + options.success = function(data) { + + // Update used tags + var usedTagsJSON = getSetting("usedTags"); + var usedTags = usedTagsJSON ? JSON.parse(usedTagsJSON) : {}; + + // Check for each tag if it's already in the used tags + for (var i = 0; i < tags.length; i++) { + var tagToSave = tags[i].trim(); + var newUsedTagObject = { + "tag": tagToSave, + "timestamp": new Date() + }; + usedTags[tagToSave] = newUsedTagObject; + } + setSetting("usedTags", JSON.stringify(usedTags)); + + // Let the callback know that we are finished + if (finalSuccessCallback) { + finalSuccessCallback(data); + } + }; + + // Execute the action + return sendAction(action, options); + } + + /** + * Get all cached tags and used tags within the callback + * @param {function(Array, Array, Boolean)} callback + * Function with tags and used tags as parameter. + */ + function getTags(callback) { + + var tagsFromSettings = function() { + var tagsJSON = getSetting("tags"); + if (typeof tagsJSON !== "undefined") { + return JSON.parse(tagsJSON) + } + return []; + } + + var sortedUsedTagsFromSettings = function() { + // Get and Sort used tags + var usedTags = []; + + var usedTagsJSON = getSetting("usedTags"); + if (typeof usedTagsJSON !== "undefined") { + var usedTagsObject = JSON.parse(usedTagsJSON); + var usedTagsObjectArray = []; + for (var tagKey in usedTagsObject) { + usedTagsObjectArray.push(usedTagsObject[tagKey]); + } + + // Sort usedTagsObjectArray based on timestamp + usedTagsObjectArray.sort(function(a, b) { + a = new Date(a.timestamp); + b = new Date(b.timestamp); + return a < b ? -1 : a > b ? 1 : 0; + }); + + // Get all keys tags + for (var j = 0; j < usedTagsObjectArray.length; j++) { + usedTags.push(usedTagsObjectArray[j].tag); + } + + // Reverse to set the last recent used tags to the front + usedTags.reverse(); + } + + return usedTags; + } + + if (callback) { + var tags = tagsFromSettings(); + var usedTags = sortedUsedTagsFromSettings(); + callback(tags, usedTags); + } + } + + /** + * Helper method to check if a user is premium or not + */ + function isPremiumUser() { + return getSetting('premium_status') == 1; + } + + /** + * Fetch suggested tags for a given item id + * @param {string} itemId Item id of + * @param {Object | undefined} options Can provide an actionInfo object + * with further data to send to the API. + * Can have success and error callbacks + * @return {Boolean} Returns Boolean whether the api call started sucessfully + */ + function getSuggestedTagsForItem(itemId, options) { + return getSuggestedTags({item_id: itemId}, options); + } + + /** + * Fetch suggested tags for a given URL + * @param {string} url (required) The item identifier by url + * @param {Object} options Can provide an actionInfo object with further + * data to send to the API. Can have success and error + * callbacks + * @return {Boolean} Returns Boolean whether the api call started sucessfully + */ + function getSuggestedTagsForURL(url, options) { + return getSuggestedTags({url: url}, options); + } + + /** + * Helper function to get suggested tags + * @return {Boolean} Returns Boolean whether the api call started sucessfully + */ + function getSuggestedTags(data, options) { + + data = data || {}; + options = options || {}; + + data.access_token = getAccessToken(); + + return apiRequest({ + path: "/getSuggestedTags", + data: data, + success: options.success, + error: options.error + }); + } + + /** + * Public functions + */ + return { + isUserLoggedIn : isUserLoggedIn, + clearUserData: clearUserData, + addLink: addLink, + deleteItem: deleteItem, + addTagsToItem: addTagsToItem, + addTagsToURL: addTagsToURL, + getTags: getTags, + isPremiumUser: isPremiumUser, + getSuggestedTagsForItem: getSuggestedTagsForItem, + getSuggestedTagsForURL: getSuggestedTagsForURL + }; +}()); \ No newline at end of file diff --git a/browser/themes/osx/menuPanel-yosemite.png b/browser/themes/osx/menuPanel-yosemite.png index 7024da57786717b73a86a74280900c67b2b96ca2..d402e07214e593400735aba7552069a029b40ed4 100644 GIT binary patch literal 24635 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 z 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

1Rz5Ajyj4Rsy1ZjUYbT*fgH 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 C(zJvC literal 53263 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 aw{o?^$z>+c>dqsZz&YuS_F{NqQvL%xKu .menu-iconic-left { #customizationui-widget-multiview > .panel-viewcontainer, #customizationui-widget-multiview > .panel-viewcontainer > .panel-viewstack, #PanelUI-panicView > .panel-subview-body, -#PanelUI-panicView { +#PanelUI-panicView, +#PanelUI-pocketView > .panel-subview-body, +#PanelUI-pocketView { overflow: visible; } @@ -1236,133 +1238,6 @@ menuitem[checked="true"].subviewbutton > .menu-iconic-left { transform: scaleX(-1); } -#pocket-login-required, -#pocket-page-saved { - text-align: center; -} - -#pocket-page-saved { - /* Needed to undo the padding that .panel-subview-body - places on all subviews. */ - margin: -4px; -} - -#pocket-header { - background-image: url(chrome://browser/content/pocket/img/signup_logo.png); - background-repeat: no-repeat; - background-position: center; - margin: 1rem 0; - width: 116px; - height: 29px; - text-indent: -999rem; -} - -.pocket-subheader { - color: #7d7e81; - margin-bottom: 3rem; - padding: 0 2rem; -} - -.pocket-button { - -moz-appearance: none; - background-color: #d3505a; - background-image: linear-gradient(to bottom, #ee5f64, #d3505a); - border: 1px solid #d13644; - border-radius: 4px; - box-shadow: inset 0 1px 1px rgba(255,255,255,0.4); - color: #fff; - font-weight: bold; - min-width: 10rem; - padding: .5rem 3rem; - transition: background-position 0.1s linear; -} - -#pocket-signup-or { - text-indent: -999rem; - margin: 1rem auto; - background-image: url(chrome://browser/content/pocket/img/signup_or.png); - width: 246px; - height: 27px; - display: block; -} - -#pocket-signup-with-email { - background-color: #f2f2f2; - background-image: linear-gradient(to bottom, #fff, #f2f2f2); - border-color: #d8d8d8; - color: #222; - text-shadow: 0 1px 0 rgba(255,255,255,0.5); - margin-bottom: 3rem; -} - -.pocket-button:hover { - background-position: 0 -15px; - color: #fff; -} - -.pocket-button:hover:active { - box-shadow: inset 0 0 6px rgba(0,0,0,0.15); -} - -#pocket-signup-with-email:hover, -#pocket-signup-with-email:hover:active { - color: #222; -} - -#pocket-account-question { - color: #333; - font-size: 0.875rem; - margin: 1.75rem auto 0; -} - -#pocket-separator { - height: 2px; - margin-top: 1rem; -} - -.pocket-separator-colorstop { - -moz-box-flex: 1; -} - -.pocket-separator-colorstop:nth-child(1) { - background: #7bedb7; -} - -.pocket-separator-colorstop:nth-child(2) { - background: #47bcb6; -} - -.pocket-separator-colorstop:nth-child(3) { - background: #f34156; -} - -.pocket-separator-colorstop:nth-child(4) { - background: #feb73d; -} - -#pocket-page-tags { - background-color: #e3e3e3; - padding: 1rem 0; - text-align: start; -} - -#pocket-page-suggested-tags-header { - margin-top: 1rem; - color: #666; -} - -@media (min-resolution: 1.25dppx) { - #pocket-header { - background-image: url(chrome://browser/content/pocket/img/signup_logo@2x.png); - background-size: 116px 29px; - } - - #pocket-signup-or { - background-image: url(chrome://browser/content/pocket/img/signup_or@2x.png); - background-size: 246px 27px; - } -} - .subviewradio { -moz-binding: url(chrome://global/content/bindings/radio.xml#radio); -moz-appearance: none; From ddab823969de0738b4bfe01c0076d9e6b4aedd86 Mon Sep 17 00:00:00 2001 From: Nick Alexander Date: Fri, 1 May 2015 14:20:30 -0700 Subject: [PATCH 05/12] Bug 1159277 - Document Adjust data collection in Firefox for Android. r=mfinkle,bsmedberg --HG-- extra : rebase_source : 8eb78834c266436c89d930f26a628a4ba83a53f2 --- mobile/android/base/adjust/adjust.rst | 19 --- .../base/distribution/ReferrerReceiver.java | 8 +- mobile/android/base/docs/adjust.rst | 161 ++++++++++++++++++ mobile/android/base/docs/index.rst | 1 + 4 files changed, 169 insertions(+), 20 deletions(-) delete mode 100644 mobile/android/base/adjust/adjust.rst create mode 100644 mobile/android/base/docs/adjust.rst diff --git a/mobile/android/base/adjust/adjust.rst b/mobile/android/base/adjust/adjust.rst deleted file mode 100644 index ca9fa49e4860..000000000000 --- a/mobile/android/base/adjust/adjust.rst +++ /dev/null @@ -1,19 +0,0 @@ -Adjust SDK integration -====================== - -The *Adjust install tracking SDK* is a pure-Java library that is conditionally -compiled into Fennec. It's not trivial to integrate such conditional feature -libraries into Fennec without pre-processing. To minimize such pre-processing, -we define a trivial ``AdjustHelperInterface`` and define two implementations: -the real ``AdjustHelper``, which requires the Adjust SDK, and a no-op -``StubAdjustHelper``, which has no additional requirements. We use the existing -pre-processed ``AppConstants.java.in`` to switch, at build-time, between the two -implementations. - -An alternative approach would be to build three jars -- one interface jar and -two implementation jars -- and include one of the implementation jars at -build-time. The implementation jars could either define a common symbol, or the -appropriate symbol could be determined at build-time. That's a rather heavier -approach than the one chosen. If the helper class were to grow to multiple -classes, with a non-trivial exposed API, this approach could be better. It -would also be easier to integrate into the parallel Gradle build system. diff --git a/mobile/android/base/distribution/ReferrerReceiver.java b/mobile/android/base/distribution/ReferrerReceiver.java index 019ec4a6dfd3..dfa79fc3ed5c 100644 --- a/mobile/android/base/distribution/ReferrerReceiver.java +++ b/mobile/android/base/distribution/ReferrerReceiver.java @@ -30,7 +30,13 @@ public class ReferrerReceiver extends BroadcastReceiver { public static final String ACTION_REFERRER_RECEIVED = "org.mozilla.fennec.REFERRER_RECEIVED"; /** - * If the install intent has this source, we'll track the campaign ID. + * If the install intent has this source, it is a Mozilla specific or over + * the air distribution referral. We'll track the campaign ID using + * Mozilla's metrics systems. + * + * If the install intent has a source different than this one, it is a + * referral from an advertising network. We may track these campaigns using + * third-party tracking and metrics systems. */ private static final String MOZILLA_UTM_SOURCE = "mozilla"; diff --git a/mobile/android/base/docs/adjust.rst b/mobile/android/base/docs/adjust.rst new file mode 100644 index 000000000000..4e83320f0806 --- /dev/null +++ b/mobile/android/base/docs/adjust.rst @@ -0,0 +1,161 @@ +.. -*- Mode: rst; fill-column: 100; -*- + +====================================== + Install tracking with the Adjust SDK +====================================== + +Fennec (Firefox for Android) tracks certain types of installs using a third party install tracking +framework called Adjust. The intention is to determine the origin of Fennec installs by answering +the question, "Did this user on this device install Fennec in response to a specific advertising +campaign performed by Mozilla?" + +Mozilla is using a third party framework in order to answer this question for the Firefox for +Android 38.0.5 release. We hope to remove the framework from Fennec in the future. + +The framework consists of a software development kit (SDK) built into Fennec and a +data-collecting Internet service backend run by the German company `adjust GmbH`_. The Adjust SDK +is open source and MIT licensed: see the `github repository`_. Fennec ships a copy of the SDK +(currently not modified from upstream) in ``mobile/android/thirdparty/com/adjust/sdk``. The SDK is +documented at https://docs.adjust.com. + +Data collection +~~~~~~~~~~~~~~~ + +When is data collected and sent to the Adjust backend? +====================================================== + +Data is never collected (or sent to the Adjust backend) unless + +* the Fennec binary is an official Mozilla binary [#official]_; and +* the release channel is Release or Beta [#channel]_. + +If both of the above conditions are true, then data is collected and sent to the Adjust backend in +the following two circumstances: first, when + +* Fennec is started on the device [#started]_. + +Second, when + +* the Fennec binary was installed from the Google Play Store; and +* the Google Play Store sends the installed Fennec binary an `INSTALL_REFERRER Intent`_, and the + received Intent includes Google Play Store campaign tracking information. This happens when thea + Google Play Store install is in response to a campaign-specific Google Play Store link. For + details, see the developer documentation at + https://developers.google.com/analytics/devguides/collection/android/v4/campaigns. + +In these two limited circumstances, data is collected and sent to the Adjust backend. + +Where does data sent to the Adjust backend go? +============================================== + +The Adjust SDK is hard-coded to send data to the endpoint https://app.adjust.com. The endpoint is +defined by ``com.adjust.sdk.Constants.BASE_URL`` at +https://hg.mozilla.org/mozilla-central/file/f76f02793f7a/mobile/android/thirdparty/com/adjust/sdk/Constants.java#l27. + +The Adjust backend then sends a limited subset of the collected data -- limited but sufficient to +uniquely identify the submitting device -- to a set of advertising network providers that Mozilla +elects to share the collected data with. Those advertising networks then confirm or deny that the +identifying information corresponds to a specific advertising campaign performed by Mozilla. + +What data is collected and sent to the Adjust backend? +====================================================== + +The Adjust SDK collects and sends two messages to the Adjust backend. The messages have the +following parameters:: + + V/Adjust ( 6508): Parameters: + V/Adjust ( 6508): screen_format normal + V/Adjust ( 6508): device_manufacturer samsung + V/Adjust ( 6508): session_count 1 + V/Adjust ( 6508): device_type phone + V/Adjust ( 6508): screen_size normal + V/Adjust ( 6508): package_name org.mozilla.firefox + V/Adjust ( 6508): app_version 39.0a1 + V/Adjust ( 6508): android_uuid + V/Adjust ( 6508): display_width 720 + V/Adjust ( 6508): country GB + V/Adjust ( 6508): os_version 18 + V/Adjust ( 6508): needs_attribution_data 0 + V/Adjust ( 6508): environment sandbox + V/Adjust ( 6508): device_name Galaxy Nexus + V/Adjust ( 6508): os_name android + V/Adjust ( 6508): tracking_enabled 1 + V/Adjust ( 6508): created_at 2015-03-24T17:53:38.452Z-0400 + V/Adjust ( 6508): app_token + V/Adjust ( 6508): screen_density high + V/Adjust ( 6508): language en + V/Adjust ( 6508): display_height 1184 + V/Adjust ( 6508): gps_adid + + V/Adjust ( 6508): Parameters: + V/Adjust ( 6508): needs_attribution_data 0 + V/Adjust ( 6508): app_token + V/Adjust ( 6508): environment production + V/Adjust ( 6508): android_uuid + V/Adjust ( 6508): tracking_enabled 1 + V/Adjust ( 6508): gps_adid + +The available parameters (including ones not exposed to Mozilla) are documented at +https://partners.adjust.com/placeholders/. + +Notes on what data is collected +------------------------------- + +The *android_uuid* uniquely identifies the device. + +The *gps_adid* is a Google Advertising ID. It is capable of uniquely identifying a device to any +advertiser, across all applications. If a Google Advertising ID is not available, Adjust may fall +back to an Android ID, or, as a last resort, the device's WiFi MAC address. + +The *tracking_enabled* flag is only used to allow or disallow contextual advertising to be sent to a +user. It can be, and is, ignored for general install tracking of the type Mozilla is using the +Adjust SDK for. (This flag might be used by consumers using the Adjust SDK to provide in-App +advertising.) + +It is not clear how much entropy their is in the set of per-device parameters that do not +*explicitly* uniquely identify the device. That is, it is not known if the device parameters are +likely to uniquely fingerprint the device, in the way that user agent capabilities are likely to +uniquely fingerprint the user. + +Technical notes +~~~~~~~~~~~~~~~ + +Build flags controlling the Adjust SDK integration +================================================== + +The Adjust SDK feature is controlled by the build flag ``MOZ_INSTALL_TRACKING``. No trace of the +Adjust SDK should be present in Fennec if this is not defined. + +Access to the Adjust backend is controlled by a private App-specific token. Fennec's token is +managed by Release Engineering and should not be exposed if at all possible; for example, it should +*not* leak to build logs. The value of the token is read from the file specified using the +``configure`` flag ``--with-adjust-sdk-keyfile=KEYFILE`` and stored in the build variable +``MOZ_INSTALL_TRACKING_ADJUST_SDK_APP_TOKEN``. Nota bene: if ``MOZ_INSTALL_TRACKING`` is defined +but the App-specific token is not specified, Fennec will submit data to a special Adjust sandbox. +This makes it possible to test the Adjust flow without submitting false data to the install tracking +backend. + +Technical notes on the Adjust SDK integration +============================================= + +The *Adjust install tracking SDK* is a pure-Java library that is conditionally compiled into Fennec. +It's not trivial to integrate such conditional feature libraries into Fennec without pre-processing. +To minimize such pre-processing, we define a trivial ``AdjustHelperInterface`` and define two +implementations: the real ``AdjustHelper``, which requires the Adjust SDK, and a no-op +``StubAdjustHelper``, which has no additional requirements. We use the existing pre-processed +``AppConstants.java.in`` to switch, at build-time, between the two implementations. + +Notes and links +=============== + +.. _adjust GmbH: http://www.adjust.com +.. _github repository: https://github.com/adjust/android_sdk +.. [#official] Data is not sent for builds not produced by Mozilla: this would include + redistributors such as the Palemoon project. +.. [#channel] Data is not sent for Aurora, Nightly, or custom builds. +.. [#started] *Started* means more than just when the user taps the Fennec icon or otherwise causes + the Fennec user interface to appear directly. It includes, for example, when a Fennec service + (like the Update Service, or Background Sync), starts and Fennec was not previously running on the + device. See http://developer.android.com/reference/android/app/Application.html#onCreate%28%29 + for details. +.. _INSTALL_REFERRER Intent: https://developer.android.com/reference/com/google/android/gms/tagmanager/InstallReferrerReceiver.html diff --git a/mobile/android/base/docs/index.rst b/mobile/android/base/docs/index.rst index 205ac1aa00c2..69bd9b1efb30 100644 --- a/mobile/android/base/docs/index.rst +++ b/mobile/android/base/docs/index.rst @@ -7,4 +7,5 @@ Firefox for Android localeswitching uitelemetry + adjust gradle From 58df5ad7459c37e377e1e3530caf9f344f328f90 Mon Sep 17 00:00:00 2001 From: Nick Alexander Date: Fri, 1 May 2015 13:42:15 -0700 Subject: [PATCH 06/12] Bug 1159371 - Make --disable-compile-environment work with --enable-application=mobile/android. r=glandium --HG-- extra : rebase_source : e624b5dc8c3ca5de7cf72477ea082ce2495e25db extra : source : dcd206152465e4b24c9fea05e319536611c33644 --- configure.in | 29 +++++++++++++++++++++-------- mobile/android/base/moz.build | 4 ++++ mobile/android/confvars.sh | 5 ++++- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/configure.in b/configure.in index e26147e485ea..3b74b011e65f 100644 --- a/configure.in +++ b/configure.in @@ -367,6 +367,15 @@ dnl ======================================================== dnl AR_FLAGS set here so HOST_AR_FLAGS can be set correctly (see bug 538269) AR_FLAGS='crs $@' +if test -z "$COMPILE_ENVIRONMENT"; then +if test "$target" != "$host"; then +# Assert that we're cross compiling, but don't require a compile toolchain (as +# MOZ_CROSS_COMPILER does below). +CROSS_COMPILE=1 +AC_DEFINE(CROSS_COMPILE) +fi +fi # !COMPILE_ENVIRONMENT + if test "$COMPILE_ENVIRONMENT"; then if test "$target" != "$host"; then @@ -1965,7 +1974,7 @@ case "$target" in TARGET_COMPILER_ABI="ibmc" CC_VERSION=`lslpp -Lcq vac.C 2>/dev/null | awk -F: '{ print $3 }'` CXX_VERSION=`lslpp -Lcq vacpp.cmp.core 2>/dev/null | awk -F: '{ print $3 }'` - fi + fi # COMPILE_ENVIRONMENT fi case "${target_os}" in aix4.1*) @@ -1974,7 +1983,7 @@ case "$target" in esac if test "$COMPILE_ENVIRONMENT"; then MOZ_CHECK_HEADERS(sys/inttypes.h) - fi + fi # COMPILE_ENVIRONMENT AC_DEFINE(NSCAP_DISABLE_DEBUG_PTR_TYPES) ;; @@ -2101,7 +2110,9 @@ ia64*-hpux*) MOZ_SYNTH_PICO=1 else _PLATFORM_DEFAULT_TOOLKIT=cairo-android - MOZ_LINKER=1 + if test "$COMPILE_ENVIRONMENT"; then + MOZ_LINKER=1 + fi fi TARGET_NSPR_MDCPUCFG='\"md/_linux.cfg\"' @@ -2587,7 +2598,7 @@ if test -z "$COMPILE_ENVIRONMENT"; then SKIP_LIBRARY_CHECKS=1 else MOZ_COMPILER_OPTS -fi +fi # COMPILE_ENVIRONMENT if test -z "$SKIP_COMPILER_CHECKS"; then dnl Checks for typedefs, structures, and compiler characteristics. @@ -3919,7 +3930,9 @@ case "${target}" in NSS_DISABLE_DBM=1 MOZ_THEME_FASTSTRIPE=1 MOZ_TREE_FREETYPE=1 - MOZ_MEMORY=1 + if test "$COMPILE_ENVIRONMENT"; then + MOZ_MEMORY=1 + fi MOZ_RAW=1 ;; @@ -5451,7 +5464,7 @@ if test -n "$MOZ_VPX" -a -z "$MOZ_NATIVE_LIBVPX"; then VPX_ASFLAGS="-f win32 -rnasm -pnasm -DPIC" VPX_X86_ASM=1 dnl The encoder needs obj_int_extract to get asm offsets. - fi + fi # COMPILE_ENVIRONMENT and others ;; *:arm*) if test -n "$GNU_AS" ; then @@ -5481,7 +5494,7 @@ if test -n "$MOZ_VPX" -a -z "$MOZ_NATIVE_LIBVPX"; then if test -n "$COMPILE_ENVIRONMENT" -a -n "$VPX_X86_ASM" -a -z "$VPX_AS"; then AC_MSG_ERROR([yasm is a required build tool for this architecture when webm is enabled. You may either install yasm or --disable-webm (which disables the WebM video format). See https://developer.mozilla.org/en/YASM for more details.]) - fi + fi # COMPILE_ENVIRONMENT and others if test -z "$GNU_CC" -a -z "$INTEL_CC" -a -z "$CLANG_CC" ; then dnl We prefer to get asm offsets using inline assembler, which the above @@ -7339,7 +7352,7 @@ if test -n "$COMPILE_ENVIRONMENT" -a -n "$USE_ELF_HACK"; then USE_ELF_HACK= fi fi -fi +fi # COMPILE_ENVIRONMENT and others. dnl ======================================================== dnl = libstdc++ compatibility hacks diff --git a/mobile/android/base/moz.build b/mobile/android/base/moz.build index 5431a777c19a..feb92072debe 100644 --- a/mobile/android/base/moz.build +++ b/mobile/android/base/moz.build @@ -760,6 +760,10 @@ for var in ('ANDROID_PACKAGE_NAME', 'ANDROID_CPU_ARCH', # Mangle our package name to avoid Bug 750548. DEFINES['MANGLED_ANDROID_PACKAGE_NAME'] = CONFIG['ANDROID_PACKAGE_NAME'].replace('fennec', 'f3nn3c') DEFINES['MOZ_APP_ABI'] = CONFIG['TARGET_XPCOM_ABI'] +if not CONFIG['COMPILE_ENVIRONMENT']: + # These should really come from the included binaries, but that's not easy. + DEFINES['MOZ_APP_ABI'] = 'arm-eabi-gcc3' # Observe quote differences here ... + DEFINES['TARGET_XPCOM_ABI'] = '"arm-eabi-gcc3"' # ... and here. if '-march=armv7' in CONFIG['OS_CFLAGS']: DEFINES['MOZ_MIN_CPU_VERSION'] = 7 diff --git a/mobile/android/confvars.sh b/mobile/android/confvars.sh index abed93626830..e3f68e90a4e6 100644 --- a/mobile/android/confvars.sh +++ b/mobile/android/confvars.sh @@ -46,8 +46,11 @@ MOZ_APP_ID={aa3c5121-dab2-40e2-81ca-7ea25febc110} MOZ_APP_STATIC_INI=1 -# Enable on-demand decompression +# Enable on-demand decompression. This requires a host compile toolchain to +# build szip to use during packaging. +if test "$COMPILE_ENVIRONMENT"; then MOZ_ENABLE_SZIP=1 +fi # Enable navigator.mozPay MOZ_PAY=1 From 60c90655c55e149f74306e1492e0363f817cccc1 Mon Sep 17 00:00:00 2001 From: Nick Alexander Date: Mon, 27 Apr 2015 14:55:34 -0700 Subject: [PATCH 07/12] Bug 1159371 - Allow compiling sub-directories with --disable-compile-environment. r=glandium Without this, invoking Make in a sub-directory will fail with an error that libs:: cannot find target `target'. Without this patch, the Fennec Gradle and IDE build integration fails compiling its custom targets in mobile/android/base and mobile/android/base/locales. --HG-- extra : rebase_source : a105072aee28e4f7693958a175d1d8ce3188b5f4 extra : source : 3232d253cf909e38da318c3ed3c04e7b5fc6a94f --- config/recurse.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/recurse.mk b/config/recurse.mk index 8a0a5a7bdf97..bd22bbe7222c 100644 --- a/config/recurse.mk +++ b/config/recurse.mk @@ -124,7 +124,9 @@ endef $(foreach subtier,$(filter-out compile,$(TIERS)),$(eval $(call CREATE_SUBTIER_TRAVERSAL_RULE,$(subtier)))) ifndef TOPLEVEL_BUILD +ifdef COMPILE_ENVIRONMENT libs:: target host +endif # COMPILE_ENVIRONMENT endif endif # ifeq ($(NO_RECURSE_MAKELEVEL),$(MAKELEVEL)) From 5c78694bbcc018b2c87d2c781efe9d9bde7be2f1 Mon Sep 17 00:00:00 2001 From: Margaret Leibovic Date: Fri, 1 May 2015 12:20:00 -0700 Subject: [PATCH 08/12] Bug 1158228 - merge github's readability code into m-c, rs=me --HG-- extra : rebase_source : 78e7e90941e849680ef1fdf2f409ea321b2317bb --- toolkit/components/reader/Readability.js | 125 ++++++++++++++--------- 1 file changed, 76 insertions(+), 49 deletions(-) diff --git a/toolkit/components/reader/Readability.js b/toolkit/components/reader/Readability.js index 80ef1ea1e1bd..278294d874b5 100644 --- a/toolkit/components/reader/Readability.js +++ b/toolkit/components/reader/Readability.js @@ -108,6 +108,9 @@ Readability.prototype = { // it quits and just show a link. DEFAULT_MAX_PAGES: 5, + // Element tags to score by default. + DEFAULT_TAGS_TO_SCORE: ["SECTION", "P", "TD", "PRE"], + // All of the regular expressions in use within readability. // Defined up here so we don't instantiate them repeatedly in loops. REGEXPS: { @@ -119,7 +122,7 @@ Readability.prototype = { byline: /byline|author|dateline|writtenby/i, replaceFonts: /<(\/?)font[^>]*>/gi, normalize: /\s{2,}/g, - videos: /https?:\/\/(www\.)?(youtube|youtube-nocookie|player\.vimeo)\.com/i, + videos: /https?:\/\/(www\.)?(dailymotion|youtube|youtube-nocookie|player\.vimeo)\.com/i, nextLink: /(next|weiter|continue|>([^\|]|$)|»([^\|]|$))/i, prevLink: /(prev|earl|old|new|<|«)/i, whitespace: /^\s*$/, @@ -186,6 +189,15 @@ Readability.prototype = { return Array.prototype.concat.apply([], nodeLists); }, + _getAllNodesWithTag: function(node, tagNames) { + if (node.querySelectorAll) { + return node.querySelectorAll(tagNames.join(',')); + } + return [].concat.apply([], tagNames.map(function(tag) { + return node.getElementsByTagName(tag); + })); + }, + /** * Converts each and uri in the given element to an absolute URI. * @@ -586,6 +598,18 @@ Readability.prototype = { return false; }, + _getNodeAncestors: function(node, maxDepth) { + maxDepth = maxDepth || 0; + var i = 0, ancestors = []; + while (node.parentNode) { + ancestors.push(node.parentNode) + if (maxDepth && ++i === maxDepth) + break; + node = node.parentNode; + } + return ancestors; + }, + /*** * grabArticle - Using a variety of metrics (content score, classname, element types), find the content that is * most likely to be the stuff a user wants to read. Then return it wrapped up in a div. @@ -640,8 +664,9 @@ Readability.prototype = { } } - if (node.tagName === "P" || node.tagName === "TD" || node.tagName === "PRE") + if (this.DEFAULT_TAGS_TO_SCORE.indexOf(node.tagName) !== -1) { elementsToScore.push(node); + } // Turn all divs that don't have children block level elements into p's if (node.tagName === "DIV") { @@ -680,30 +705,18 @@ Readability.prototype = { **/ var candidates = []; this._forEachNode(elementsToScore, function(elementToScore) { - var parentNode = elementToScore.parentNode; - var grandParentNode = parentNode ? parentNode.parentNode : null; - var innerText = this._getInnerText(elementToScore); - - if (!parentNode || typeof(parentNode.tagName) === 'undefined') + if (!elementToScore.parentNode || typeof(elementToScore.parentNode.tagName) === 'undefined') return; // If this paragraph is less than 25 characters, don't even count it. + var innerText = this._getInnerText(elementToScore); if (innerText.length < 25) return; - // Initialize readability data for the parent. - if (typeof parentNode.readability === 'undefined') { - this._initializeNode(parentNode); - candidates.push(parentNode); - } - - // Initialize readability data for the grandparent. - if (grandParentNode && - typeof(grandParentNode.readability) === 'undefined' && - typeof(grandParentNode.tagName) !== 'undefined') { - this._initializeNode(grandParentNode); - candidates.push(grandParentNode); - } + // Exclude nodes with no ancestor. + var ancestors = this._getNodeAncestors(elementToScore, 3); + if (ancestors.length === 0) + return; var contentScore = 0; @@ -716,11 +729,18 @@ Readability.prototype = { // For every 100 characters in this paragraph, add another point. Up to 3 points. contentScore += Math.min(Math.floor(innerText.length / 100), 3); - // Add the score to the parent. The grandparent gets half. - parentNode.readability.contentScore += contentScore; + // Initialize and score ancestors. + this._forEachNode(ancestors, function(ancestor, level) { + if (!ancestor.tagName) + return; - if (grandParentNode) - grandParentNode.readability.contentScore += contentScore / 2; + if (typeof(ancestor.readability) === 'undefined') { + this._initializeNode(ancestor); + candidates.push(ancestor); + } + + ancestor.readability.contentScore += contentScore / (level === 0 ? 1 : level * 2); + }); }); // After we've calculated scores, loop through all of the possible @@ -848,10 +868,6 @@ Readability.prototype = { sibling = this._setNodeTag(sibling, "DIV"); } - // To ensure a node does not interfere with readability styles, - // remove its classnames. - sibling.removeAttribute("class"); - articleContent.appendChild(sibling); // siblings is a reference to the children array, and // sibling is removed from the array when we call appendChild(). @@ -953,7 +969,7 @@ Readability.prototype = { var elementName = element.getAttribute("name"); var elementProperty = element.getAttribute("property"); - if (elementName === "author") { + if ([elementName, elementProperty].indexOf("author") !== -1) { metadata.byline = element.getAttribute("content"); return; } @@ -1597,6 +1613,7 @@ Readability.prototype = { var tagsList = e.getElementsByTagName(tag); var curTagsLength = tagsList.length; + var isList = tag === "ul" || tag === "ol"; // Gather counts for other typical elements embedded within. // Traverse backwards so we can remove nodes at the same time @@ -1632,13 +1649,13 @@ Readability.prototype = { var toRemove = false; if (img > p && !this._hasAncestorTag(tagsList[i], "figure")) { toRemove = true; - } else if (li > p && tag !== "ul" && tag !== "ol") { + } else if (!isList && li > p) { toRemove = true; - } else if ( input > Math.floor(p/3) ) { + } else if (input > Math.floor(p/3)) { toRemove = true; - } else if (contentLength < 25 && (img === 0 || img > 2) ) { + } else if (!isList && contentLength < 25 && (img === 0 || img > 2)) { toRemove = true; - } else if (weight < 25 && linkDensity > 0.2) { + } else if (!isList && weight < 25 && linkDensity > 0.2) { toRemove = true; } else if (weight >= 25 && linkDensity > 0.5) { toRemove = true; @@ -1663,7 +1680,7 @@ Readability.prototype = { for (var headerIndex = 1; headerIndex < 3; headerIndex += 1) { var headers = e.getElementsByTagName('h' + headerIndex); for (var i = headers.length - 1; i >= 0; i -= 1) { - if (this._getClassWeight(headers[i]) < 0 || this._getLinkDensity(headers[i]) > 0.33) + if (this._getClassWeight(headers[i]) < 0) headers[i].parentNode.removeChild(headers[i]); } } @@ -1686,32 +1703,42 @@ Readability.prototype = { * * @return boolean Whether or not we suspect parse() will suceeed at returning an article object. */ - isProbablyReaderable: function() { - var nodes = this._doc.getElementsByTagName("p"); - if (nodes.length < 5) { - return false; - } + isProbablyReaderable: function(helperIsVisible) { + var nodes = this._getAllNodesWithTag(this._doc, ["p", "pre"]); - var possibleParagraphs = 0; - for (var i = 0; i < nodes.length; i++) { - var node = nodes[i]; + // FIXME we should have a fallback for helperIsVisible, but this is + // problematic because of jsdom's elem.style handling - see + // https://github.com/mozilla/readability/pull/186 for context. + + var score = 0; + // This is a little cheeky, we use the accumulator 'score' to decide what to return from + // this callback: + return this._someNode(nodes, function(node) { + if (helperIsVisible && !helperIsVisible(node)) + return false; var matchString = node.className + " " + node.id; if (this.REGEXPS.unlikelyCandidates.test(matchString) && !this.REGEXPS.okMaybeItsACandidate.test(matchString)) { - continue; + return false; } - if (node.textContent.trim().length < 100) { - continue; + if (node.matches && node.matches("li p")) { + return false; } - possibleParagraphs++; - if (possibleParagraphs >= 5) { + var textContentLength = node.textContent.trim().length; + if (textContentLength < 140) { + return false; + } + + score += Math.sqrt(textContentLength - 140); + + if (score > 20) { return true; } - } - return false; + return false; + }); }, /** From c11d61496f15892f008ff4174f0f53b581f4b93f Mon Sep 17 00:00:00 2001 From: Dave Townsend Date: Fri, 1 May 2015 16:16:02 -0700 Subject: [PATCH 09/12] Bug 1159805: Land updated signed XPIs for tests. r=Mossop --- .../preliminary_bootstrap_2.xpi | Bin 5158 -> 5161 bytes .../signing_checks/signed_bootstrap_1.xpi | Bin 5146 -> 5150 bytes .../signing_checks/signed_bootstrap_2.xpi | Bin 5150 -> 5149 bytes .../signed_bootstrap_badid_2.xpi | Bin 5156 -> 5155 bytes .../signing_checks/signed_nonbootstrap_2.xpi | Bin 4628 -> 4627 bytes .../signed_nonbootstrap_badid_2.xpi | Bin 4634 -> 4634 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/preliminary_bootstrap_2.xpi b/toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/preliminary_bootstrap_2.xpi index a62faf1c52b3b5aadb1383d16b4cb5419eaedd1f..ec38fcc651ee28c7e5115ee3048baf2a16be7d75 100644 GIT binary patch delta 3977 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 delta 3971 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 tj9|QYbTuuP*59A-pZERWmr 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 diff --git a/toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/signed_bootstrap_badid_2.xpi b/toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/signed_bootstrap_badid_2.xpi index 150918a8c157f6855b4d9ea6796965153af4fe17..efad21d1b65576b75a0ac0efe44583c15fed97c1 100644 GIT binary patch delta 3990 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 diff --git a/toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/signed_nonbootstrap_2.xpi b/toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/signed_nonbootstrap_2.xpi index 3c6cd647031e61ea5d9c2f60419956a629185451..d6ddbcec38c8c9093cab75d0fc0eab3d316f42d9 100644 GIT binary patch delta 3887 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 diff --git a/toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/signed_nonbootstrap_badid_2.xpi b/toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/signed_nonbootstrap_badid_2.xpi index cdf4325acde44b9ef829471ea730ba3c3ab90c72..5898d83e499daed0c245040b98c6da3ce3448316 100644 GIT binary patch delta 3898 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 IlH6kZ5AXI{r~m)} delta 3879 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 CA6CWy From 8daa51d1dc30edb092ac959fc8e6b1ff8438cb77 Mon Sep 17 00:00:00 2001 From: Nick Alexander Date: Fri, 1 May 2015 14:51:27 -0700 Subject: [PATCH 10/12] Bug 1160662 - Refer to robocop.ini in $OBJDIR/_tests, not $OBJDIR. r=margaret --HG-- extra : rebase_source : 4b2f24feb33db1109d178d833cd59a7b7812167a --- testing/mochitest/mach_commands.py | 6 +++--- testing/testsuite-targets.mk | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/testing/mochitest/mach_commands.py b/testing/mochitest/mach_commands.py index 72e697829439..e770530dffe2 100644 --- a/testing/mochitest/mach_commands.py +++ b/testing/mochitest/mach_commands.py @@ -1122,9 +1122,9 @@ class AndroidCommands(MachCommandBase): '--robocop-ini=' + os.path.join( self.topobjdir, - 'build', - 'mobile', - 'robocop', + '_tests', + 'testing', + 'mochitest', 'robocop.ini'), '--log-mach=-', ] diff --git a/testing/testsuite-targets.mk b/testing/testsuite-targets.mk index 0739b1897d61..52b7eb1adcec 100644 --- a/testing/testsuite-targets.mk +++ b/testing/testsuite-targets.mk @@ -66,7 +66,7 @@ RUN_MOCHITEST_ROBOCOP = \ $(PYTHON) _tests/testing/mochitest/runtestsremote.py \ --robocop-apk=$(DEPTH)/build/mobile/robocop/robocop-debug.apk \ --robocop-ids=$(DEPTH)/mobile/android/base/fennec_ids.txt \ - --robocop-ini=$(DEPTH)/build/mobile/robocop/robocop.ini \ + --robocop-ini=_tests/testing/mochitest/robocop.ini \ --console-level=INFO --log-tbpl=./$@.log $(DM_FLAGS) --dm_trans=$(DM_TRANS) \ --app=$(TEST_PACKAGE_NAME) --deviceIP=${TEST_DEVICE} --xre-path=${MOZ_HOST_BIN} \ $(SYMBOLS_PATH) $(TEST_PATH_ARG) $(EXTRA_TEST_ARGS) From 3d1dc32f1ad3c1fe5b52dd9efcb38e14cee4c5e8 Mon Sep 17 00:00:00 2001 From: Wes Kocher Date: Fri, 1 May 2015 16:44:52 -0700 Subject: [PATCH 11/12] Backed out changeset c7440c022f74 (bug 1158228) for bc1 orange --- toolkit/components/reader/Readability.js | 125 +++++++++-------------- 1 file changed, 49 insertions(+), 76 deletions(-) diff --git a/toolkit/components/reader/Readability.js b/toolkit/components/reader/Readability.js index 278294d874b5..80ef1ea1e1bd 100644 --- a/toolkit/components/reader/Readability.js +++ b/toolkit/components/reader/Readability.js @@ -108,9 +108,6 @@ Readability.prototype = { // it quits and just show a link. DEFAULT_MAX_PAGES: 5, - // Element tags to score by default. - DEFAULT_TAGS_TO_SCORE: ["SECTION", "P", "TD", "PRE"], - // All of the regular expressions in use within readability. // Defined up here so we don't instantiate them repeatedly in loops. REGEXPS: { @@ -122,7 +119,7 @@ Readability.prototype = { byline: /byline|author|dateline|writtenby/i, replaceFonts: /<(\/?)font[^>]*>/gi, normalize: /\s{2,}/g, - videos: /https?:\/\/(www\.)?(dailymotion|youtube|youtube-nocookie|player\.vimeo)\.com/i, + videos: /https?:\/\/(www\.)?(youtube|youtube-nocookie|player\.vimeo)\.com/i, nextLink: /(next|weiter|continue|>([^\|]|$)|»([^\|]|$))/i, prevLink: /(prev|earl|old|new|<|«)/i, whitespace: /^\s*$/, @@ -189,15 +186,6 @@ Readability.prototype = { return Array.prototype.concat.apply([], nodeLists); }, - _getAllNodesWithTag: function(node, tagNames) { - if (node.querySelectorAll) { - return node.querySelectorAll(tagNames.join(',')); - } - return [].concat.apply([], tagNames.map(function(tag) { - return node.getElementsByTagName(tag); - })); - }, - /** * Converts each and uri in the given element to an absolute URI. * @@ -598,18 +586,6 @@ Readability.prototype = { return false; }, - _getNodeAncestors: function(node, maxDepth) { - maxDepth = maxDepth || 0; - var i = 0, ancestors = []; - while (node.parentNode) { - ancestors.push(node.parentNode) - if (maxDepth && ++i === maxDepth) - break; - node = node.parentNode; - } - return ancestors; - }, - /*** * grabArticle - Using a variety of metrics (content score, classname, element types), find the content that is * most likely to be the stuff a user wants to read. Then return it wrapped up in a div. @@ -664,9 +640,8 @@ Readability.prototype = { } } - if (this.DEFAULT_TAGS_TO_SCORE.indexOf(node.tagName) !== -1) { + if (node.tagName === "P" || node.tagName === "TD" || node.tagName === "PRE") elementsToScore.push(node); - } // Turn all divs that don't have children block level elements into p's if (node.tagName === "DIV") { @@ -705,18 +680,30 @@ Readability.prototype = { **/ var candidates = []; this._forEachNode(elementsToScore, function(elementToScore) { - if (!elementToScore.parentNode || typeof(elementToScore.parentNode.tagName) === 'undefined') + var parentNode = elementToScore.parentNode; + var grandParentNode = parentNode ? parentNode.parentNode : null; + var innerText = this._getInnerText(elementToScore); + + if (!parentNode || typeof(parentNode.tagName) === 'undefined') return; // If this paragraph is less than 25 characters, don't even count it. - var innerText = this._getInnerText(elementToScore); if (innerText.length < 25) return; - // Exclude nodes with no ancestor. - var ancestors = this._getNodeAncestors(elementToScore, 3); - if (ancestors.length === 0) - return; + // Initialize readability data for the parent. + if (typeof parentNode.readability === 'undefined') { + this._initializeNode(parentNode); + candidates.push(parentNode); + } + + // Initialize readability data for the grandparent. + if (grandParentNode && + typeof(grandParentNode.readability) === 'undefined' && + typeof(grandParentNode.tagName) !== 'undefined') { + this._initializeNode(grandParentNode); + candidates.push(grandParentNode); + } var contentScore = 0; @@ -729,18 +716,11 @@ Readability.prototype = { // For every 100 characters in this paragraph, add another point. Up to 3 points. contentScore += Math.min(Math.floor(innerText.length / 100), 3); - // Initialize and score ancestors. - this._forEachNode(ancestors, function(ancestor, level) { - if (!ancestor.tagName) - return; + // Add the score to the parent. The grandparent gets half. + parentNode.readability.contentScore += contentScore; - if (typeof(ancestor.readability) === 'undefined') { - this._initializeNode(ancestor); - candidates.push(ancestor); - } - - ancestor.readability.contentScore += contentScore / (level === 0 ? 1 : level * 2); - }); + if (grandParentNode) + grandParentNode.readability.contentScore += contentScore / 2; }); // After we've calculated scores, loop through all of the possible @@ -868,6 +848,10 @@ Readability.prototype = { sibling = this._setNodeTag(sibling, "DIV"); } + // To ensure a node does not interfere with readability styles, + // remove its classnames. + sibling.removeAttribute("class"); + articleContent.appendChild(sibling); // siblings is a reference to the children array, and // sibling is removed from the array when we call appendChild(). @@ -969,7 +953,7 @@ Readability.prototype = { var elementName = element.getAttribute("name"); var elementProperty = element.getAttribute("property"); - if ([elementName, elementProperty].indexOf("author") !== -1) { + if (elementName === "author") { metadata.byline = element.getAttribute("content"); return; } @@ -1613,7 +1597,6 @@ Readability.prototype = { var tagsList = e.getElementsByTagName(tag); var curTagsLength = tagsList.length; - var isList = tag === "ul" || tag === "ol"; // Gather counts for other typical elements embedded within. // Traverse backwards so we can remove nodes at the same time @@ -1649,13 +1632,13 @@ Readability.prototype = { var toRemove = false; if (img > p && !this._hasAncestorTag(tagsList[i], "figure")) { toRemove = true; - } else if (!isList && li > p) { + } else if (li > p && tag !== "ul" && tag !== "ol") { toRemove = true; - } else if (input > Math.floor(p/3)) { + } else if ( input > Math.floor(p/3) ) { toRemove = true; - } else if (!isList && contentLength < 25 && (img === 0 || img > 2)) { + } else if (contentLength < 25 && (img === 0 || img > 2) ) { toRemove = true; - } else if (!isList && weight < 25 && linkDensity > 0.2) { + } else if (weight < 25 && linkDensity > 0.2) { toRemove = true; } else if (weight >= 25 && linkDensity > 0.5) { toRemove = true; @@ -1680,7 +1663,7 @@ Readability.prototype = { for (var headerIndex = 1; headerIndex < 3; headerIndex += 1) { var headers = e.getElementsByTagName('h' + headerIndex); for (var i = headers.length - 1; i >= 0; i -= 1) { - if (this._getClassWeight(headers[i]) < 0) + if (this._getClassWeight(headers[i]) < 0 || this._getLinkDensity(headers[i]) > 0.33) headers[i].parentNode.removeChild(headers[i]); } } @@ -1703,42 +1686,32 @@ Readability.prototype = { * * @return boolean Whether or not we suspect parse() will suceeed at returning an article object. */ - isProbablyReaderable: function(helperIsVisible) { - var nodes = this._getAllNodesWithTag(this._doc, ["p", "pre"]); + isProbablyReaderable: function() { + var nodes = this._doc.getElementsByTagName("p"); + if (nodes.length < 5) { + return false; + } - // FIXME we should have a fallback for helperIsVisible, but this is - // problematic because of jsdom's elem.style handling - see - // https://github.com/mozilla/readability/pull/186 for context. - - var score = 0; - // This is a little cheeky, we use the accumulator 'score' to decide what to return from - // this callback: - return this._someNode(nodes, function(node) { - if (helperIsVisible && !helperIsVisible(node)) - return false; + var possibleParagraphs = 0; + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; var matchString = node.className + " " + node.id; if (this.REGEXPS.unlikelyCandidates.test(matchString) && !this.REGEXPS.okMaybeItsACandidate.test(matchString)) { - return false; + continue; } - if (node.matches && node.matches("li p")) { - return false; + if (node.textContent.trim().length < 100) { + continue; } - var textContentLength = node.textContent.trim().length; - if (textContentLength < 140) { - return false; - } - - score += Math.sqrt(textContentLength - 140); - - if (score > 20) { + possibleParagraphs++; + if (possibleParagraphs >= 5) { return true; } - return false; - }); + } + return false; }, /** From da51e83833efce0d12d12973d5c896c8f55fd8b7 Mon Sep 17 00:00:00 2001 From: Chenxia Liu Date: Thu, 30 Apr 2015 18:58:19 -0700 Subject: [PATCH 12/12] Bug 1159696 - Space between doorhanger and URL bar on v11 tablets. r=ally --HG-- extra : rebase_source : 0fa263f66e855807dfb532af60d6023c4aabf424 --- mobile/android/base/resources/values-large-v11/dimens.xml | 2 +- mobile/android/base/resources/values-large-v16/dimens.xml | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 mobile/android/base/resources/values-large-v16/dimens.xml diff --git a/mobile/android/base/resources/values-large-v11/dimens.xml b/mobile/android/base/resources/values-large-v11/dimens.xml index ab1a7e458a86..05d688c8f2ff 100644 --- a/mobile/android/base/resources/values-large-v11/dimens.xml +++ b/mobile/android/base/resources/values-large-v11/dimens.xml @@ -6,7 +6,7 @@ 400dp - 124dp + 100dp 56dp 60dp diff --git a/mobile/android/base/resources/values-large-v16/dimens.xml b/mobile/android/base/resources/values-large-v16/dimens.xml new file mode 100644 index 000000000000..80ce7118d7fd --- /dev/null +++ b/mobile/android/base/resources/values-large-v16/dimens.xml @@ -0,0 +1,8 @@ + + + + + 124dp +