Street Level: a link whose source has no working key says why

This commit is contained in:
Said Turksever committed 2026-11-11 09:21:06 +00:00
1 parent 5b7e917f94
commit e0fedc13dd
16 files changed
+90 -6

No files matched your search

+3 -3
View File
@@ -7,9 +7,9 @@
`sl=google` link never loads a billed panorama by itself: it arms Street `sl=google` link never loads a billed panorama by itself: it arms Street
View and leaves the load to OPEN GOOGLE STREET VIEW; embedded views open it, View and leaves the load to OPEN GOOGLE STREET VIEW; embedded views open it,
and so does the God's Eye View panel for a result issued in the last five and so does the God's Eye View panel for a result issued in the last five
minutes. A request stops when the user navigates or hides the panel before minutes; a link whose source has no working key says so. A request stops
its photo loads; a new photo replaces the open one in place, so EXPAND when the user navigates or hides the panel before its photo loads; a new
stays. When nothing is found and a 360°, flat or SINCE filter is on, the photo replaces the open one in place, so EXPAND stays. When nothing is found and a 360°, flat or SINCE filter is on, the
answer names the filter. An unavailable map stack now reports the answer names the filter. An unavailable map stack now reports the
controller's own reason instead of always asking for a Cesium ion token controller's own reason instead of always asking for a Cesium ion token
(Said Turksever, @asturksever, #1113). (Said Turksever, @asturksever, #1113).
+2 -1
View File
@@ -5329,7 +5329,8 @@ and a plain link runs it once restored (one shot: the rewritten hash drops
screen centre is within 1 km of it (`ARMED_REACH_M`) or cannot be picked; a screen centre is within 1 km of it (`ARMED_REACH_M`) or cannot be picked; a
sky centre refuses; any other lookup, open, close, disable, the source sky centre refuses; any other lookup, open, close, disable, the source
switched off or its map leaving drops it), opens the panel and shows a toast switched off or its map leaving drops it), opens the panel and shows a toast
pointing at OPEN GOOGLE STREET VIEW. pointing at OPEN GOOGLE STREET VIEW. A link whose source has no working
key here changes nothing and says so in a toast (not in a frame).
- **Who may open.** Posted views, and the panel page's own link (inline embed) - **Who may open.** Posted views, and the panel page's own link (inline embed)
for a tool result issued in the last 5 minutes, open the photo: for a tool result issued in the last 5 minutes, open the photo:
`show_in_gods_eye_view` stamps a street-level result `issued_at`, every `show_in_gods_eye_view` stamps a street-level result `issued_at`, every
+14
View File
@@ -207,6 +207,14 @@ function armedToast() {
}); });
} }
/** Why a link's photo stays shut: its source has no working key here. */
function keyToast(result) {
return t(
"{source} cannot open this link's street-level photo without a working key",
{ source: translateKnown(result.providerName || 'Street Level') },
);
}
/** /**
* Make the app show a view: style and map, exactly the view's layers, * Make the app show a view: style and map, exactly the view's layers,
* annotations, the camera, and the followed entity. Each step runs through the * annotations, the camera, and the followed entity. Each step runs through the
@@ -378,6 +386,12 @@ export function installViews({
streetLevelArgs(streetLevel, { autoOpen }), streetLevelArgs(streetLevel, { autoOpen }),
{ origin: 'programmatic' }, { origin: 'programmatic' },
); );
// A source without a working key changes nothing: say why, or the link
// looks broken. In a frame the host reads the result instead.
if (result?.stage === 'key' && !isEmbedded(location)) {
shell._showToast?.(keyToast(result));
return;
}
// OPEN must be in view, but embed mode hides the rail that holds it: in // OPEN must be in view, but embed mode hides the rail that holds it: in
// a frame a posted view is the way to open a photo. // a frame a posted view is the way to open a photo.
if (result?.armed === true && !isEmbedded(location)) { if (result?.armed === true && !isEmbedded(location)) {
+59 -2
View File
@@ -518,7 +518,7 @@ test('a link to street-level photos opens them after it restores', async () => {
[[], []], [[], []],
'an opened photo needs no toast or panel nudge', 'an opened photo needs no toast or panel nudge',
); );
// A failure (no key) is not an armed state either. // A failure (no key) is not an armed state either: it says why instead.
const failed = recorder({ const failed = recorder({
show_street_level: () => ({ show_street_level: () => ({
ok: false, ok: false,
@@ -542,7 +542,16 @@ test('a link to street-level photos opens them after it restores', async () => {
windowRef: new EventTarget(), windowRef: new EventTarget(),
}); });
await new Promise((resolve) => setTimeout(resolve, 0)); await new Promise((resolve) => setTimeout(resolve, 0));
assert.deepEqual([toasts, panels], [[], []]); assert.deepEqual(
[toasts, panels],
[
[
"Street Level cannot open this link's street-level photo without a working key",
],
[],
],
'it says why, and nothing to press opens',
);
}); });
test('a link that follows an entity keeps the camera: its photos are not opened', async () => { test('a link that follows an entity keeps the camera: its photos are not opened', async () => {
@@ -592,6 +601,54 @@ test('a failing link step does not take the next one with it', async () => {
assert.deepEqual(calls, ['annotate_map', 'show_street_level']); assert.deepEqual(calls, ['annotate_map', 'show_street_level']);
}); });
test('a link whose source has no working key says why instead of doing nothing; a frame stays quiet', async () => {
for (const embed of [false, true]) {
const toasts = [];
const { calls, run } = recorder({
show_street_level: () => ({
ok: false,
stage: 'key',
provider: 'google',
providerName: 'Google Street View',
error: 'Google Street View needs its key',
}),
});
const windowRef = new EventTarget();
if (embed) {
windowRef.document = { body: { classList: { add() {} } } };
windowRef.parent = { postMessage() {} };
}
installViews({
shell: {
initialRestorePromise: Promise.resolve(),
setCleanView() {},
_showToast: (text) => toasts.push(text),
setPanelCollapsed() {
throw new Error('nothing to arm');
},
},
viewer: fakeViewer(),
dataManager: fakeLayers(new Set()),
run,
location: {
search: embed ? '?embed=1' : '',
hash: '#v=2&lat=1&lon=2&map=photoreal&sl=google,38.57986,-121.49372',
},
windowRef,
});
await new Promise((resolve) => setTimeout(resolve, 0));
assert.equal(calls[0][0], 'show_street_level');
assert.deepEqual(
toasts,
embed
? []
: [
"Google Street View cannot open this link's street-level photo without a working key",
],
);
}
});
test('a plain link never auto-loads a billed photo: it arms the panel and says so; an embedded view opens', async () => { test('a plain link never auto-loads a billed photo: it arms the panel and says so; an embedded view opens', async () => {
const toasts = []; const toasts = [];
const panels = []; const panels = [];
+1
View File
@@ -3744,6 +3744,7 @@
"Switching map": "جارٍ تبديل الخريطة", "Switching map": "جارٍ تبديل الخريطة",
"Opening imagery": "جارٍ فتح الصور", "Opening imagery": "جارٍ فتح الصور",
"Street View is ready: press {open} to load it": "Street View جاهز: اضغط «{open}» لتحميله", "Street View is ready: press {open} to load it": "Street View جاهز: اضغط «{open}» لتحميله",
"{source} cannot open this link's street-level photo without a working key": "لا يمكن لـ {source} فتح صورة مستوى الشارع في هذا الرابط بدون مفتاح صالح",
"Street-level photos are hidden in the current view. Leave it first.": "صور مستوى الشارع مخفية في العرض الحالي. اخرج منه أولًا.", "Street-level photos are hidden in the current view. Leave it first.": "صور مستوى الشارع مخفية في العرض الحالي. اخرج منه أولًا.",
"STATIONS": "المحطات", "STATIONS": "المحطات",
"Crewed stations and the craft that visit them": "المحطات المأهولة والمركبات التي تزورها", "Crewed stations and the craft that visit them": "المحطات المأهولة والمركبات التي تزورها",
+1
View File
@@ -3420,6 +3420,7 @@
"Switching map": "Karte wird gewechselt", "Switching map": "Karte wird gewechselt",
"Opening imagery": "Bilder werden geöffnet", "Opening imagery": "Bilder werden geöffnet",
"Street View is ready: press {open} to load it": "Street View ist bereit: Auf {open} klicken, um es zu laden", "Street View is ready: press {open} to load it": "Street View ist bereit: Auf {open} klicken, um es zu laden",
"{source} cannot open this link's street-level photo without a working key": "{source} kann das Straßenfoto dieses Links ohne gültigen Schlüssel nicht öffnen",
"Street-level photos are hidden in the current view. Leave it first.": "Fotos auf Straßenebene sind in dieser Ansicht ausgeblendet. Zuerst die Ansicht verlassen.", "Street-level photos are hidden in the current view. Leave it first.": "Fotos auf Straßenebene sind in dieser Ansicht ausgeblendet. Zuerst die Ansicht verlassen.",
"STATIONS": "STATIONEN", "STATIONS": "STATIONEN",
"Crewed stations and the craft that visit them": "Bemannte Stationen und die Raumfahrzeuge, die sie anfliegen", "Crewed stations and the craft that visit them": "Bemannte Stationen und die Raumfahrzeuge, die sie anfliegen",
+1
View File
@@ -3501,6 +3501,7 @@
"Switching map": "Cambiando de mapa", "Switching map": "Cambiando de mapa",
"Opening imagery": "Abriendo imágenes", "Opening imagery": "Abriendo imágenes",
"Street View is ready: press {open} to load it": "Street View está listo: pulsa {open} para cargarlo", "Street View is ready: press {open} to load it": "Street View está listo: pulsa {open} para cargarlo",
"{source} cannot open this link's street-level photo without a working key": "{source} no puede abrir la foto a pie de calle de este enlace sin una clave válida",
"Street-level photos are hidden in the current view. Leave it first.": "Las fotos a pie de calle están ocultas en la vista actual. Sal de ella primero.", "Street-level photos are hidden in the current view. Leave it first.": "Las fotos a pie de calle están ocultas en la vista actual. Sal de ella primero.",
"STATIONS": "ESTACIONES", "STATIONS": "ESTACIONES",
"Crewed stations and the craft that visit them": "Estaciones tripuladas y las naves que las visitan", "Crewed stations and the craft that visit them": "Estaciones tripuladas y las naves que las visitan",
+1
View File
@@ -3501,6 +3501,7 @@
"Switching map": "Changement de carte", "Switching map": "Changement de carte",
"Opening imagery": "Ouverture des images", "Opening imagery": "Ouverture des images",
"Street View is ready: press {open} to load it": "Street View est prêt : appuyez sur {open} pour le charger", "Street View is ready: press {open} to load it": "Street View est prêt : appuyez sur {open} pour le charger",
"{source} cannot open this link's street-level photo without a working key": "{source} ne peut pas ouvrir la photo au niveau de la rue de ce lien sans clé valide",
"Street-level photos are hidden in the current view. Leave it first.": "Les photos au niveau de la rue sont masquées dans la vue actuelle. Quittez-la d’abord.", "Street-level photos are hidden in the current view. Leave it first.": "Les photos au niveau de la rue sont masquées dans la vue actuelle. Quittez-la d’abord.",
"STATIONS": "STATIONS", "STATIONS": "STATIONS",
"Crewed stations and the craft that visit them": "Stations habitées et les vaisseaux qui s'y rendent", "Crewed stations and the craft that visit them": "Stations habitées et les vaisseaux qui s'y rendent",
+1
View File
@@ -3302,6 +3302,7 @@
"Switching map": "מחליף מפה", "Switching map": "מחליף מפה",
"Opening imagery": "פותח צילומים", "Opening imagery": "פותח צילומים",
"Street View is ready: press {open} to load it": "Street View מוכן: לחץ על {open} כדי לטעון אותו", "Street View is ready: press {open} to load it": "Street View מוכן: לחץ על {open} כדי לטעון אותו",
"{source} cannot open this link's street-level photo without a working key": "{source} לא יכול לפתוח את תמונת רמת הרחוב של הקישור הזה בלי מפתח תקף",
"Street-level photos are hidden in the current view. Leave it first.": "תמונות ברמת הרחוב מוסתרות בתצוגה הנוכחית. צא ממנה קודם.", "Street-level photos are hidden in the current view. Leave it first.": "תמונות ברמת הרחוב מוסתרות בתצוגה הנוכחית. צא ממנה קודם.",
"Ship bridge view": "תצוגת גשר האונייה", "Ship bridge view": "תצוגת גשר האונייה",
"Satellite orbital view": "התצוגה המסלולית של הלוויין", "Satellite orbital view": "התצוגה המסלולית של הלוויין",
+1
View File
@@ -3501,6 +3501,7 @@
"Switching map": "Cambio mappa", "Switching map": "Cambio mappa",
"Opening imagery": "Apertura delle immagini", "Opening imagery": "Apertura delle immagini",
"Street View is ready: press {open} to load it": "Street View è pronto: premi {open} per caricarlo", "Street View is ready: press {open} to load it": "Street View è pronto: premi {open} per caricarlo",
"{source} cannot open this link's street-level photo without a working key": "{source} non può aprire la foto a livello stradale di questo link senza una chiave valida",
"Street-level photos are hidden in the current view. Leave it first.": "Le foto a livello stradale sono nascoste nella vista attuale. Esci prima da questa vista.", "Street-level photos are hidden in the current view. Leave it first.": "Le foto a livello stradale sono nascoste nella vista attuale. Esci prima da questa vista.",
"STATIONS": "STAZIONI", "STATIONS": "STAZIONI",
"Crewed stations and the craft that visit them": "Stazioni con equipaggio e i veicoli che le visitano", "Crewed stations and the craft that visit them": "Stazioni con equipaggio e i veicoli che le visitano",
+1
View File
@@ -3339,6 +3339,7 @@
"Switching map": "地図を切り替え中", "Switching map": "地図を切り替え中",
"Opening imagery": "画像を開いています", "Opening imagery": "画像を開いています",
"Street View is ready: press {open} to load it": "ストリートビューの準備ができました:{open} を押して読み込みます", "Street View is ready: press {open} to load it": "ストリートビューの準備ができました:{open} を押して読み込みます",
"{source} cannot open this link's street-level photo without a working key": "{source} は有効なキーがないため、このリンクのストリートレベル写真を開けません",
"Street-level photos are hidden in the current view. Leave it first.": "現在の表示ではストリートレベルの写真は非表示です。先にこの表示を終了してください。", "Street-level photos are hidden in the current view. Leave it first.": "現在の表示ではストリートレベルの写真は非表示です。先にこの表示を終了してください。",
"STATIONS": "ステーション", "STATIONS": "ステーション",
"Crewed stations and the craft that visit them": "有人宇宙ステーションと、そこを訪れる宇宙機", "Crewed stations and the craft that visit them": "有人宇宙ステーションと、そこを訪れる宇宙機",
+1
View File
@@ -3501,6 +3501,7 @@
"Switching map": "Mudando de mapa", "Switching map": "Mudando de mapa",
"Opening imagery": "Abrindo imagens", "Opening imagery": "Abrindo imagens",
"Street View is ready: press {open} to load it": "O Street View está pronto: clique em {open} para carregar", "Street View is ready: press {open} to load it": "O Street View está pronto: clique em {open} para carregar",
"{source} cannot open this link's street-level photo without a working key": "{source} não pode abrir a foto ao nível da rua deste link sem uma chave válida",
"Street-level photos are hidden in the current view. Leave it first.": "As fotos ao nível da rua estão ocultas na vista atual. Saia dela primeiro.", "Street-level photos are hidden in the current view. Leave it first.": "As fotos ao nível da rua estão ocultas na vista atual. Saia dela primeiro.",
"STATIONS": "ESTAÇÕES", "STATIONS": "ESTAÇÕES",
"Crewed stations and the craft that visit them": "Estações tripuladas e as naves que as visitam", "Crewed stations and the craft that visit them": "Estações tripuladas e as naves que as visitam",
+1
View File
@@ -3582,6 +3582,7 @@
"Switching map": "Смена карты", "Switching map": "Смена карты",
"Opening imagery": "Открытие снимков", "Opening imagery": "Открытие снимков",
"Street View is ready: press {open} to load it": "Просмотр улиц готов: нажмите {open}, чтобы загрузить", "Street View is ready: press {open} to load it": "Просмотр улиц готов: нажмите {open}, чтобы загрузить",
"{source} cannot open this link's street-level photo without a working key": "{source} не может открыть уличное фото по этой ссылке без рабочего ключа",
"Street-level photos are hidden in the current view. Leave it first.": "Уличные снимки скрыты в текущем режиме. Сначала выйдите из него.", "Street-level photos are hidden in the current view. Leave it first.": "Уличные снимки скрыты в текущем режиме. Сначала выйдите из него.",
"STATIONS": "СТАНЦИИ", "STATIONS": "СТАНЦИИ",
"Crewed stations and the craft that visit them": "Пилотируемые станции и прилетающие к ним корабли", "Crewed stations and the craft that visit them": "Пилотируемые станции и прилетающие к ним корабли",
+1
View File
@@ -3582,6 +3582,7 @@
"Switching map": "Перемикання карти", "Switching map": "Перемикання карти",
"Opening imagery": "Відкриття знімків", "Opening imagery": "Відкриття знімків",
"Street View is ready: press {open} to load it": "Перегляд вулиць готовий: натисніть {open}, щоб завантажити", "Street View is ready: press {open} to load it": "Перегляд вулиць готовий: натисніть {open}, щоб завантажити",
"{source} cannot open this link's street-level photo without a working key": "{source} не може відкрити вуличне фото за цим посиланням без робочого ключа",
"Street-level photos are hidden in the current view. Leave it first.": "Вуличні знімки приховані в поточному режимі. Спершу вийдіть із нього.", "Street-level photos are hidden in the current view. Leave it first.": "Вуличні знімки приховані в поточному режимі. Спершу вийдіть із нього.",
"STATIONS": "СТАНЦІЇ", "STATIONS": "СТАНЦІЇ",
"Crewed stations and the craft that visit them": "Пілотовані станції та кораблі, що до них прилітають", "Crewed stations and the craft that visit them": "Пілотовані станції та кораблі, що до них прилітають",
+1
View File
@@ -3339,6 +3339,7 @@
"Switching map": "正在切换地图", "Switching map": "正在切换地图",
"Opening imagery": "正在打开影像", "Opening imagery": "正在打开影像",
"Street View is ready: press {open} to load it": "街景已就绪:按 {open} 加载", "Street View is ready: press {open} to load it": "街景已就绪:按 {open} 加载",
"{source} cannot open this link's street-level photo without a working key": "没有有效密钥,{source} 无法打开此链接的街景照片",
"Street-level photos are hidden in the current view. Leave it first.": "当前视图隐藏了街景照片。请先退出该视图。", "Street-level photos are hidden in the current view. Leave it first.": "当前视图隐藏了街景照片。请先退出该视图。",
"STATIONS": "空间站", "STATIONS": "空间站",
"Crewed stations and the craft that visit them": "载人空间站及来访飞行器", "Crewed stations and the craft that visit them": "载人空间站及来访飞行器",
+1
View File
@@ -3339,6 +3339,7 @@
"Switching map": "正在切換地圖", "Switching map": "正在切換地圖",
"Opening imagery": "正在打開影像", "Opening imagery": "正在打開影像",
"Street View is ready: press {open} to load it": "街景已就緒:按 {open} 載入", "Street View is ready: press {open} to load it": "街景已就緒:按 {open} 載入",
"{source} cannot open this link's street-level photo without a working key": "沒有有效金鑰,{source} 無法開啟此連結的街景照片",
"Street-level photos are hidden in the current view. Leave it first.": "目前的檢視隱藏了街景照片。請先離開此檢視。", "Street-level photos are hidden in the current view. Leave it first.": "目前的檢視隱藏了街景照片。請先離開此檢視。",
"STATIONS": "太空站", "STATIONS": "太空站",
"Crewed stations and the craft that visit them": "載人太空站及來訪飛行器", "Crewed stations and the craft that visit them": "載人太空站及來訪飛行器",