mirror of
https://forge.fsky.io/oneflux/omegafox.git
synced 2026-02-10 14:02:04 -08:00
136 lines
5.1 KiB
Python
136 lines
5.1 KiB
Python
# Copyright (c) Microsoft Corporation.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
|
|
import pytest
|
|
from playwright.async_api import Browser, BrowserContext, Error, Page
|
|
|
|
from tests.server import Server
|
|
|
|
|
|
async def test_should_work(page: Page, server: Server, context: BrowserContext) -> None:
|
|
await context.grant_permissions(["geolocation"])
|
|
await page.goto(server.EMPTY_PAGE)
|
|
await context.set_geolocation({"latitude": 10, "longitude": 10})
|
|
geolocation = await page.evaluate(
|
|
"""() => new Promise(resolve => navigator.geolocation.getCurrentPosition(position => {
|
|
resolve({latitude: position.coords.latitude, longitude: position.coords.longitude});
|
|
}))"""
|
|
)
|
|
assert geolocation == {"latitude": 10, "longitude": 10}
|
|
|
|
|
|
async def test_should_throw_when_invalid_longitude(context: BrowserContext) -> None:
|
|
with pytest.raises(Error) as exc:
|
|
await context.set_geolocation({"latitude": 10, "longitude": 200})
|
|
assert (
|
|
"geolocation.longitude: precondition -180 <= LONGITUDE <= 180 failed." in exc.value.message
|
|
)
|
|
|
|
|
|
async def test_should_isolate_contexts(
|
|
page: Page, server: Server, context: BrowserContext, browser: Browser
|
|
) -> None:
|
|
await context.grant_permissions(["geolocation"])
|
|
await context.set_geolocation({"latitude": 10, "longitude": 10})
|
|
await page.goto(server.EMPTY_PAGE)
|
|
|
|
context2 = await browser.new_context(
|
|
permissions=["geolocation"], geolocation={"latitude": 20, "longitude": 20}
|
|
)
|
|
|
|
page2 = await context2.new_page()
|
|
await page2.goto(server.EMPTY_PAGE)
|
|
|
|
geolocation = await page.evaluate(
|
|
"""() => new Promise(resolve => navigator.geolocation.getCurrentPosition(position => {
|
|
resolve({latitude: position.coords.latitude, longitude: position.coords.longitude})
|
|
}))"""
|
|
)
|
|
assert geolocation == {"latitude": 10, "longitude": 10}
|
|
|
|
geolocation2 = await page2.evaluate(
|
|
"""() => new Promise(resolve => navigator.geolocation.getCurrentPosition(position => {
|
|
resolve({latitude: position.coords.latitude, longitude: position.coords.longitude})
|
|
}))"""
|
|
)
|
|
assert geolocation2 == {"latitude": 20, "longitude": 20}
|
|
|
|
await context2.close()
|
|
|
|
|
|
async def test_should_use_context_options(browser: Browser, server: Server) -> None:
|
|
context = await browser.new_context(
|
|
geolocation={"latitude": 10, "longitude": 10}, permissions=["geolocation"]
|
|
)
|
|
page = await context.new_page()
|
|
await page.goto(server.EMPTY_PAGE)
|
|
|
|
geolocation = await page.evaluate(
|
|
"""() => new Promise(resolve => navigator.geolocation.getCurrentPosition(position => {
|
|
resolve({latitude: position.coords.latitude, longitude: position.coords.longitude});
|
|
}))"""
|
|
)
|
|
assert geolocation == {"latitude": 10, "longitude": 10}
|
|
await context.close()
|
|
|
|
|
|
async def test_watch_position_should_be_notified(
|
|
page: Page, server: Server, context: BrowserContext
|
|
) -> None:
|
|
await context.grant_permissions(["geolocation"])
|
|
await page.goto(server.EMPTY_PAGE)
|
|
messages = []
|
|
page.on("console", lambda message: messages.append(message.text))
|
|
|
|
await context.set_geolocation({"latitude": 0, "longitude": 0})
|
|
await page.evaluate(
|
|
"""() => {
|
|
navigator.geolocation.watchPosition(pos => {
|
|
const coords = pos.coords;
|
|
console.log(`lat=${coords.latitude} lng=${coords.longitude}`);
|
|
}, err => {});
|
|
}"""
|
|
)
|
|
|
|
async with page.expect_console_message(lambda m: "lat=0 lng=10" in m.text):
|
|
await context.set_geolocation({"latitude": 0, "longitude": 10})
|
|
|
|
async with page.expect_console_message(lambda m: "lat=20 lng=30" in m.text):
|
|
await context.set_geolocation({"latitude": 20, "longitude": 30})
|
|
|
|
async with page.expect_console_message(lambda m: "lat=40 lng=50" in m.text):
|
|
await context.set_geolocation({"latitude": 40, "longitude": 50})
|
|
|
|
all_messages = "|".join(messages)
|
|
assert "lat=0 lng=10" in all_messages
|
|
assert "lat=20 lng=30" in all_messages
|
|
assert "lat=40 lng=50" in all_messages
|
|
|
|
|
|
@pytest.mark.skip(reason="Not supported by Camoufox")
|
|
async def test_should_use_context_options_for_popup(
|
|
page: Page, context: BrowserContext, server: Server
|
|
) -> None:
|
|
await context.grant_permissions(["geolocation"])
|
|
await context.set_geolocation({"latitude": 10, "longitude": 10})
|
|
async with page.expect_popup() as popup_info:
|
|
await page.evaluate(
|
|
"url => window._popup = window.open(url)",
|
|
server.PREFIX + "/geolocation.html",
|
|
)
|
|
popup = await popup_info.value
|
|
await popup.wait_for_load_state()
|
|
geolocation = await popup.evaluate("() => window.geolocationPromise")
|
|
assert geolocation == {"latitude": 10, "longitude": 10}
|