forked from mirrors/gecko-dev
MozReview-Commit-ID: F6xUXCgdRE4 --HG-- extra : rebase_source : 65de1b0aba412d9044b5196115f74276caa058f2
98 lines
3.4 KiB
JavaScript
98 lines
3.4 KiB
JavaScript
/* 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 EventEmitter = require("devtools/shared/event-emitter");
|
|
|
|
loader.lazyRequireGetter(this, "CommandState",
|
|
"devtools/shared/gcli/command-state", true);
|
|
|
|
const l10n = require("gcli/l10n");
|
|
require("devtools/server/actors/inspector/inspector");
|
|
const { HighlighterEnvironment } =
|
|
require("devtools/server/actors/highlighters");
|
|
const { RulersHighlighter } =
|
|
require("devtools/server/actors/highlighters/rulers");
|
|
|
|
const highlighters = new WeakMap();
|
|
|
|
exports.items = [
|
|
// The client rulers command is used to maintain the toolbar button state only
|
|
// and redirects to the server command to actually toggle the rulers (see
|
|
// rulers_server below).
|
|
{
|
|
name: "rulers",
|
|
runAt: "client",
|
|
description: l10n.lookup("rulersDesc"),
|
|
manual: l10n.lookup("rulersManual"),
|
|
buttonId: "command-button-rulers",
|
|
buttonClass: "command-button",
|
|
tooltipText: l10n.lookup("rulersTooltip"),
|
|
state: {
|
|
isChecked: (target) => CommandState.isEnabledForTarget(target, "rulers"),
|
|
onChange: (target, handler) => CommandState.on("changed", handler),
|
|
offChange: (target, handler) => CommandState.off("changed", handler)
|
|
},
|
|
exec: function* (args, context) {
|
|
const { target } = context.environment;
|
|
|
|
// Pipe the call to the server command.
|
|
const response = yield context.updateExec("rulers_server");
|
|
const isEnabled = response.data;
|
|
|
|
if (isEnabled) {
|
|
CommandState.enableForTarget(target, "rulers");
|
|
} else {
|
|
CommandState.disableForTarget(target, "rulers");
|
|
}
|
|
|
|
// Toggle off the button when the page navigates because the rulers are
|
|
// removed automatically by the RulersHighlighter on the server then.
|
|
target.once("will-navigate", () => CommandState.disableForTarget(target, "rulers"));
|
|
}
|
|
},
|
|
// The server rulers command is hidden by default, it's just used by the
|
|
// client command.
|
|
{
|
|
name: "rulers_server",
|
|
runAt: "server",
|
|
hidden: true,
|
|
returnType: "highlighterVisibility",
|
|
exec: function(args, context) {
|
|
const env = context.environment;
|
|
const { document } = env;
|
|
|
|
// Calling the command again after the rulers have been shown once hides
|
|
// them.
|
|
if (highlighters.has(document)) {
|
|
const { highlighter } = highlighters.get(document);
|
|
highlighter.destroy();
|
|
return false;
|
|
}
|
|
|
|
// Otherwise, display the rulers.
|
|
const environment = new HighlighterEnvironment();
|
|
environment.initFromWindow(env.window);
|
|
const highlighter = new RulersHighlighter(environment);
|
|
|
|
// Store the instance of the rulers highlighter for this document so we
|
|
// can hide it later.
|
|
highlighters.set(document, { highlighter, environment });
|
|
|
|
// Listen to the highlighter's destroy event which may happen if the
|
|
// window is refreshed or closed with the rulers shown.
|
|
EventEmitter.once(highlighter, "destroy", () => {
|
|
if (highlighters.has(document)) {
|
|
const { environment: toDestroy } = highlighters.get(document);
|
|
toDestroy.destroy();
|
|
highlighters.delete(document);
|
|
}
|
|
});
|
|
|
|
highlighter.show();
|
|
return true;
|
|
}
|
|
}
|
|
];
|