зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1524665 - Add send tab to device button, r=gijs
Differential Revision: https://phabricator.services.mozilla.com//D23387 --HG-- extra : rebase_source : 2f41fc8a0f78149105b32b87017e1d9035cc5d3e
This commit is contained in:
Родитель
de28a9888d
Коммит
b326d15f68
|
@ -1083,58 +1083,7 @@ BrowserPageActions.sendToDevice = {
|
||||||
},
|
},
|
||||||
|
|
||||||
onShowingSubview(panelViewNode) {
|
onShowingSubview(panelViewNode) {
|
||||||
let bodyNode = panelViewNode.querySelector(".panel-subview-body");
|
gSync.populateSendTabToDevicesView(panelViewNode, this.onShowingSubview.bind(this));
|
||||||
let panelNode = panelViewNode.closest("panel");
|
|
||||||
let browser = gBrowser.selectedBrowser;
|
|
||||||
let url = browser.currentURI.spec;
|
|
||||||
let title = browser.contentTitle;
|
|
||||||
let multiselected = gBrowser.selectedTab.multiselected;
|
|
||||||
|
|
||||||
// This is on top because it also clears the device list between state
|
|
||||||
// changes.
|
|
||||||
gSync.populateSendTabToDevicesMenu(bodyNode, url, title, multiselected, (clientId, name, clientType, lastModified) => {
|
|
||||||
if (!name) {
|
|
||||||
return document.createXULElement("toolbarseparator");
|
|
||||||
}
|
|
||||||
let item = document.createXULElement("toolbarbutton");
|
|
||||||
item.classList.add("pageAction-sendToDevice-device", "subviewbutton");
|
|
||||||
if (clientId) {
|
|
||||||
item.classList.add("subviewbutton-iconic");
|
|
||||||
if (lastModified) {
|
|
||||||
item.setAttribute("tooltiptext", gSync.formatLastSyncDate(lastModified));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
item.addEventListener("command", event => {
|
|
||||||
if (panelNode) {
|
|
||||||
PanelMultiView.hidePopup(panelNode);
|
|
||||||
}
|
|
||||||
// There are items in the subview that don't represent devices: "Sign
|
|
||||||
// in", "Learn about Sync", etc. Device items will be .sendtab-target.
|
|
||||||
if (event.target.classList.contains("sendtab-target")) {
|
|
||||||
let action = PageActions.actionForID("sendToDevice");
|
|
||||||
let messageId = gSync.offline && "sendToDeviceOffline";
|
|
||||||
showBrowserPageActionFeedback(action, event, messageId);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return item;
|
|
||||||
});
|
|
||||||
|
|
||||||
bodyNode.removeAttribute("state");
|
|
||||||
// In the first ~10 sec after startup, Sync may not be loaded and the list
|
|
||||||
// of devices will be empty.
|
|
||||||
if (gSync.sendTabConfiguredAndLoading) {
|
|
||||||
bodyNode.setAttribute("state", "notready");
|
|
||||||
// Force a background Sync
|
|
||||||
Services.tm.dispatchToMainThread(async () => {
|
|
||||||
await Weave.Service.sync({why: "pageactions", engines: []}); // [] = clients engine only
|
|
||||||
// There's no way Sync is still syncing at this point, but we check
|
|
||||||
// anyway to avoid infinite looping.
|
|
||||||
if (!window.closed && !gSync.sendTabConfiguredAndLoading) {
|
|
||||||
this.onShowingSubview(panelViewNode);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -196,6 +196,78 @@ var gSync = {
|
||||||
this.updateFxAToolbarPanel(state);
|
this.updateFxAToolbarPanel(state);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
updateSendToDeviceTitle() {
|
||||||
|
let string = gBrowserBundle.GetStringFromName("sendTabsToDevice.label");
|
||||||
|
let title = PluralForm.get(1, string).replace("#1", 1);
|
||||||
|
if (gBrowser.selectedTab.multiselected) {
|
||||||
|
let tabCount = gBrowser.selectedTabs.length;
|
||||||
|
title = PluralForm.get(tabCount, string).replace("#1", tabCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById("PanelUI-fxa-menu-sendtab-button").setAttribute("label", title);
|
||||||
|
},
|
||||||
|
|
||||||
|
showSendToDeviceView(anchor) {
|
||||||
|
PanelUI.showSubView("PanelUI-sendTabToDevice", anchor);
|
||||||
|
let panelViewNode = document.getElementById("PanelUI-sendTabToDevice");
|
||||||
|
this.populateSendTabToDevicesView(panelViewNode, this.populateSendTabToDevicesView);
|
||||||
|
},
|
||||||
|
|
||||||
|
populateSendTabToDevicesView(panelViewNode, reloadFunc) {
|
||||||
|
let bodyNode = panelViewNode.querySelector(".panel-subview-body");
|
||||||
|
let panelNode = panelViewNode.closest("panel");
|
||||||
|
let browser = gBrowser.selectedBrowser;
|
||||||
|
let url = browser.currentURI.spec;
|
||||||
|
let title = browser.contentTitle;
|
||||||
|
let multiselected = gBrowser.selectedTab.multiselected;
|
||||||
|
|
||||||
|
// This is on top because it also clears the device list between state
|
||||||
|
// changes.
|
||||||
|
this.populateSendTabToDevicesMenu(bodyNode, url, title, multiselected, (clientId, name, clientType, lastModified) => {
|
||||||
|
if (!name) {
|
||||||
|
return document.createXULElement("toolbarseparator");
|
||||||
|
}
|
||||||
|
let item = document.createXULElement("toolbarbutton");
|
||||||
|
item.classList.add("pageAction-sendToDevice-device", "subviewbutton");
|
||||||
|
if (clientId) {
|
||||||
|
item.classList.add("subviewbutton-iconic");
|
||||||
|
if (lastModified) {
|
||||||
|
item.setAttribute("tooltiptext", gSync.formatLastSyncDate(lastModified));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
item.addEventListener("command", event => {
|
||||||
|
if (panelNode) {
|
||||||
|
PanelMultiView.hidePopup(panelNode);
|
||||||
|
}
|
||||||
|
// There are items in the subview that don't represent devices: "Sign
|
||||||
|
// in", "Learn about Sync", etc. Device items will be .sendtab-target.
|
||||||
|
if (event.target.classList.contains("sendtab-target")) {
|
||||||
|
let action = PageActions.actionForID("sendToDevice");
|
||||||
|
let messageId = gSync.offline && "sendToDeviceOffline";
|
||||||
|
showBrowserPageActionFeedback(action, event, messageId);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return item;
|
||||||
|
});
|
||||||
|
|
||||||
|
bodyNode.removeAttribute("state");
|
||||||
|
// In the first ~10 sec after startup, Sync may not be loaded and the list
|
||||||
|
// of devices will be empty.
|
||||||
|
if (gSync.sendTabConfiguredAndLoading) {
|
||||||
|
bodyNode.setAttribute("state", "notready");
|
||||||
|
// Force a background Sync
|
||||||
|
Services.tm.dispatchToMainThread(async () => {
|
||||||
|
await Weave.Service.sync({why: "pageactions", engines: []}); // [] = clients engine only
|
||||||
|
// There's no way Sync is still syncing at this point, but we check
|
||||||
|
// anyway to avoid infinite looping.
|
||||||
|
if (!window.closed && !gSync.sendTabConfiguredAndLoading) {
|
||||||
|
reloadFunc(panelViewNode);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
toggleAccountPanel(viewId, aEvent) {
|
toggleAccountPanel(viewId, aEvent) {
|
||||||
// Don't show the panel if the window is in customization mode.
|
// Don't show the panel if the window is in customization mode.
|
||||||
if (document.documentElement.hasAttribute("customizing")) {
|
if (document.documentElement.hasAttribute("customizing")) {
|
||||||
|
|
|
@ -475,7 +475,10 @@ function showFxaToolbarMenu(enable) {
|
||||||
// if sync is enabled.
|
// if sync is enabled.
|
||||||
const syncEnabled = Services.prefs.getBoolPref("identity.fxaccounts.enabled", false);
|
const syncEnabled = Services.prefs.getBoolPref("identity.fxaccounts.enabled", false);
|
||||||
const mainWindowEl = document.documentElement;
|
const mainWindowEl = document.documentElement;
|
||||||
|
const fxaPanelEl = document.getElementById("PanelUI-fxa");
|
||||||
if (enable && syncEnabled) {
|
if (enable && syncEnabled) {
|
||||||
|
fxaPanelEl.addEventListener("ViewShowing", gSync.updateSendToDeviceTitle);
|
||||||
|
|
||||||
mainWindowEl.setAttribute("fxastatus", "not_configured");
|
mainWindowEl.setAttribute("fxastatus", "not_configured");
|
||||||
// We have to manually update the sync state UI when toggling the FxA toolbar
|
// We have to manually update the sync state UI when toggling the FxA toolbar
|
||||||
// because it could show an invalid icon if the user is logged in and no sync
|
// because it could show an invalid icon if the user is logged in and no sync
|
||||||
|
@ -491,6 +494,7 @@ function showFxaToolbarMenu(enable) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
mainWindowEl.removeAttribute("fxastatus");
|
mainWindowEl.removeAttribute("fxastatus");
|
||||||
|
fxaPanelEl.removeEventListener("ViewShowing", gSync.updateSendToDeviceTitle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -742,6 +742,10 @@
|
||||||
</vbox>
|
</vbox>
|
||||||
</hbox>
|
</hbox>
|
||||||
<toolbarseparator/>
|
<toolbarseparator/>
|
||||||
|
<toolbarbutton id="PanelUI-fxa-menu-sendtab-button"
|
||||||
|
class="subviewbutton subviewbutton-iconic subviewbutton-nav"
|
||||||
|
closemenu="none"
|
||||||
|
oncommand="gSync.showSendToDeviceView(this);"/>
|
||||||
<toolbarbutton id="PanelUI-fxa-menu-remotetabs-button"
|
<toolbarbutton id="PanelUI-fxa-menu-remotetabs-button"
|
||||||
class="subviewbutton subviewbutton-iconic subviewbutton-nav"
|
class="subviewbutton subviewbutton-iconic subviewbutton-nav"
|
||||||
label="&appMenuRemoteTabs.label;"
|
label="&appMenuRemoteTabs.label;"
|
||||||
|
@ -764,6 +768,14 @@
|
||||||
</vbox>
|
</vbox>
|
||||||
</vbox>
|
</vbox>
|
||||||
</panelview>
|
</panelview>
|
||||||
|
<!-- This panelview is used to contain the dynamically created buttons for send tab to devices -->
|
||||||
|
<panelview id="PanelUI-sendTabToDevice" flex="1" class="PanelUI-subView">
|
||||||
|
<vbox class="panel-subview-body">
|
||||||
|
<toolbarbutton id="PanelUI-sendTabToDevice-syncingDevices" class="subviewbutton subviewbutton-iconic pageAction-sendToDevice-notReady"
|
||||||
|
label="&sendToDevice.syncNotReady.label;"
|
||||||
|
disabled="true"/>
|
||||||
|
</vbox>
|
||||||
|
</panelview>
|
||||||
|
|
||||||
<panelview id="PanelUI-bookmarkingTools" class="PanelUI-subView">
|
<panelview id="PanelUI-bookmarkingTools" class="PanelUI-subView">
|
||||||
<vbox class="panel-subview-body">
|
<vbox class="panel-subview-body">
|
||||||
|
|
|
@ -761,6 +761,10 @@ panelmultiview[mainViewId="PanelUI-fxa"] #PanelUI-remotetabs-syncnow {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#PanelUI-sendTabToDevice > .panel-subview-body:not([state]) > #PanelUI-sendTabToDevice-syncingDevices {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
.fxaChooseWhatToSyncDevices {
|
.fxaChooseWhatToSyncDevices {
|
||||||
height: 102px;
|
height: 102px;
|
||||||
width: 201px;
|
width: 201px;
|
||||||
|
|
|
@ -180,6 +180,7 @@
|
||||||
list-style-image: url("chrome://browser/skin/mail.svg");
|
list-style-image: url("chrome://browser/skin/mail.svg");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#PanelUI-fxa-menu-sendtab-button,
|
||||||
#pageAction-panel-sendToDevice,
|
#pageAction-panel-sendToDevice,
|
||||||
#pageAction-urlbar-sendToDevice {
|
#pageAction-urlbar-sendToDevice {
|
||||||
list-style-image: url("chrome://browser/skin/send-to-device.svg");
|
list-style-image: url("chrome://browser/skin/send-to-device.svg");
|
||||||
|
|
Загрузка…
Ссылка в новой задаче