fune/browser/components/firefoxview/viewpage.mjs

137 lines
3.8 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/. */
import { MozLitElement } from "chrome://global/content/lit-utils.mjs";
// eslint-disable-next-line import/no-unassigned-import
import "chrome://browser/content/firefoxview/card-container.mjs";
// eslint-disable-next-line import/no-unassigned-import
import "chrome://browser/content/firefoxview/fxview-empty-state.mjs";
// eslint-disable-next-line import/no-unassigned-import
import "chrome://browser/content/firefoxview/fxview-tab-list.mjs";
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
PlacesUtils: "resource://gre/modules/PlacesUtils.sys.mjs",
});
export class ViewPage extends MozLitElement {
static get properties() {
return {
selectedTab: { type: Boolean },
recentBrowsing: { type: Boolean },
};
}
constructor() {
super();
this.selectedTab = false;
this.recentBrowsing = Boolean(this.closest("VIEW-RECENTBROWSING"));
}
connectedCallback() {
super.connectedCallback();
this.ownerDocument.addEventListener("visibilitychange", this);
}
disconnectedCallback() {
super.disconnectedCallback();
this.ownerDocument.removeEventListener("visibilitychange", this);
}
handleEvent(event) {
switch (event.type) {
case "visibilitychange":
if (this.ownerDocument.visibilityState === "visible") {
this.viewTabVisibleCallback();
} else {
this.viewTabHiddenCallback();
}
break;
}
}
/**
* Override this function to run a callback whenever Firefox View is visible.
*/
viewTabVisibleCallback() {}
/**
* Override this function to run a callback whenever Firefox View is hidden.
*/
viewTabHiddenCallback() {}
enter() {
this.selectedTab = true;
}
exit() {
this.selectedTab = false;
}
getWindow() {
return window.browsingContext.embedderWindowGlobal.browsingContext.window;
}
/**
* This function doesn't just copy the link to the clipboard, it creates a
* URL object on the clipboard, so when it's pasted into an application that
* supports it, it displays the title as a link.
*/
copyLink(e) {
// Copied from doCommand/placesCmd_copy in PlacesUIUtils.sys.mjs
// This is a little hacky, but there is a lot of code in Places that handles
// clipboard stuff, so it's easier to reuse.
let node = {};
node.type = 0;
node.title = this.triggerNode.title;
node.uri = this.triggerNode.url;
// This order is _important_! It controls how this and other applications
// select data to be inserted based on type.
let contents = [
{ type: lazy.PlacesUtils.TYPE_X_MOZ_URL, entries: [] },
{ type: lazy.PlacesUtils.TYPE_HTML, entries: [] },
{ type: lazy.PlacesUtils.TYPE_PLAINTEXT, entries: [] },
];
contents.forEach(function (content) {
content.entries.push(lazy.PlacesUtils.wrapNode(node, content.type));
});
let xferable = Cc["@mozilla.org/widget/transferable;1"].createInstance(
Ci.nsITransferable
);
xferable.init(null);
function addData(type, data) {
xferable.addDataFlavor(type);
xferable.setTransferData(type, lazy.PlacesUtils.toISupportsString(data));
}
contents.forEach(function (content) {
addData(content.type, content.entries.join(lazy.PlacesUtils.endl));
});
Services.clipboard.setData(
xferable,
null,
Ci.nsIClipboard.kGlobalClipboard
);
}
openInNewWindow(e) {
this.getWindow().openTrustedLinkIn(this.triggerNode.url, "window", {
private: false,
});
}
openInNewPrivateWindow(e) {
this.getWindow().openTrustedLinkIn(this.triggerNode.url, "window", {
private: true,
});
}
}