mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
204 lines
5.5 KiB
JavaScript
204 lines
5.5 KiB
JavaScript
#ifdef 0
|
|
/* 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/. */
|
|
#endif
|
|
|
|
/**
|
|
* This class represents a site that is contained in a cell and can be pinned,
|
|
* moved around or deleted.
|
|
*/
|
|
function Site(aNode, aLink) {
|
|
this._node = aNode;
|
|
this._node._newtabSite = this;
|
|
|
|
this._link = aLink;
|
|
|
|
this._render();
|
|
this._addEventHandlers();
|
|
}
|
|
|
|
Site.prototype = {
|
|
/**
|
|
* The site's DOM node.
|
|
*/
|
|
get node() this._node,
|
|
|
|
/**
|
|
* The site's link.
|
|
*/
|
|
get link() this._link,
|
|
|
|
/**
|
|
* The url of the site's link.
|
|
*/
|
|
get url() this.link.url,
|
|
|
|
/**
|
|
* The title of the site's link.
|
|
*/
|
|
get title() this.link.title,
|
|
|
|
/**
|
|
* The site's parent cell.
|
|
*/
|
|
get cell() {
|
|
let parentNode = this.node.parentNode;
|
|
return parentNode && parentNode._newtabCell;
|
|
},
|
|
|
|
/**
|
|
* Pins the site on its current or a given index.
|
|
* @param aIndex The pinned index (optional).
|
|
*/
|
|
pin: function Site_pin(aIndex) {
|
|
if (typeof aIndex == "undefined")
|
|
aIndex = this.cell.index;
|
|
|
|
this._updateAttributes(true);
|
|
gPinnedLinks.pin(this._link, aIndex);
|
|
},
|
|
|
|
/**
|
|
* Unpins the site and calls the given callback when done.
|
|
*/
|
|
unpin: function Site_unpin() {
|
|
if (this.isPinned()) {
|
|
this._updateAttributes(false);
|
|
gPinnedLinks.unpin(this._link);
|
|
gUpdater.updateGrid();
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Checks whether this site is pinned.
|
|
* @return Whether this site is pinned.
|
|
*/
|
|
isPinned: function Site_isPinned() {
|
|
return gPinnedLinks.isPinned(this._link);
|
|
},
|
|
|
|
/**
|
|
* Blocks the site (removes it from the grid) and calls the given callback
|
|
* when done.
|
|
*/
|
|
block: function Site_block() {
|
|
if (!gBlockedLinks.isBlocked(this._link)) {
|
|
gUndoDialog.show(this);
|
|
gBlockedLinks.block(this._link);
|
|
gUpdater.updateGrid();
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Gets the DOM node specified by the given query selector.
|
|
* @param aSelector The query selector.
|
|
* @return The DOM node we found.
|
|
*/
|
|
_querySelector: function Site_querySelector(aSelector) {
|
|
return this.node.querySelector(aSelector);
|
|
},
|
|
|
|
/**
|
|
* Updates attributes for all nodes which status depends on this site being
|
|
* pinned or unpinned.
|
|
* @param aPinned Whether this site is now pinned or unpinned.
|
|
*/
|
|
_updateAttributes: function (aPinned) {
|
|
let control = this._querySelector(".newtab-control-pin");
|
|
|
|
if (aPinned) {
|
|
control.setAttribute("pinned", true);
|
|
control.setAttribute("title", newTabString("unpin"));
|
|
} else {
|
|
control.removeAttribute("pinned");
|
|
control.setAttribute("title", newTabString("pin"));
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Renders the site's data (fills the HTML fragment).
|
|
*/
|
|
_render: function Site_render() {
|
|
let url = this.url;
|
|
let title = this.title || url;
|
|
let tooltip = (title == url ? title : title + "\n" + url);
|
|
|
|
let link = this._querySelector(".newtab-link");
|
|
link.setAttribute("title", tooltip);
|
|
link.setAttribute("href", url);
|
|
this._querySelector(".newtab-title").textContent = title;
|
|
|
|
if (this.isPinned())
|
|
this._updateAttributes(true);
|
|
// request a staleness check for the thumbnail, which will cause page.js
|
|
// to be notified and call our refreshThumbnail() method.
|
|
PageThumbs.captureIfStale(this.url);
|
|
// but still display whatever thumbnail might be available now.
|
|
this.refreshThumbnail();
|
|
},
|
|
|
|
/**
|
|
* Refreshes the thumbnail for the site.
|
|
*/
|
|
refreshThumbnail: function Site_refreshThumbnail() {
|
|
let thumbnailURL = PageThumbs.getThumbnailURL(this.url);
|
|
let thumbnail = this._querySelector(".newtab-thumbnail");
|
|
// if this is being called due to the thumbnail being updated we will
|
|
// be setting it to the same value it had before. To be confident the
|
|
// change wont be optimized away we remove the property first.
|
|
thumbnail.style.removeProperty("backgroundImage");
|
|
thumbnail.style.backgroundImage = "url(" + thumbnailURL + ")";
|
|
},
|
|
|
|
/**
|
|
* Adds event handlers for the site and its buttons.
|
|
*/
|
|
_addEventHandlers: function Site_addEventHandlers() {
|
|
// Register drag-and-drop event handlers.
|
|
this._node.addEventListener("dragstart", this, false);
|
|
this._node.addEventListener("dragend", this, false);
|
|
this._node.addEventListener("mouseover", this, false);
|
|
|
|
let controls = this.node.querySelectorAll(".newtab-control");
|
|
for (let i = 0; i < controls.length; i++)
|
|
controls[i].addEventListener("click", this, false);
|
|
},
|
|
|
|
/**
|
|
* Speculatively opens a connection to the current site.
|
|
*/
|
|
_speculativeConnect: function Site_speculativeConnect() {
|
|
let sc = Services.io.QueryInterface(Ci.nsISpeculativeConnect);
|
|
let uri = Services.io.newURI(this.url, null, null);
|
|
sc.speculativeConnect(uri, null);
|
|
},
|
|
|
|
/**
|
|
* Handles all site events.
|
|
*/
|
|
handleEvent: function Site_handleEvent(aEvent) {
|
|
switch (aEvent.type) {
|
|
case "click":
|
|
aEvent.preventDefault();
|
|
if (aEvent.target.classList.contains("newtab-control-block"))
|
|
this.block();
|
|
else if (this.isPinned())
|
|
this.unpin();
|
|
else
|
|
this.pin();
|
|
break;
|
|
case "mouseover":
|
|
this._node.removeEventListener("mouseover", this, false);
|
|
this._speculativeConnect();
|
|
break;
|
|
case "dragstart":
|
|
gDrag.start(this, aEvent);
|
|
break;
|
|
case "dragend":
|
|
gDrag.end(this, aEvent);
|
|
break;
|
|
}
|
|
}
|
|
};
|