mirror of
https://github.com/GoogleChrome/chrome-extensions-samples.git
synced 2026-03-27 13:29:34 +07:00
* add geolocation samples Co-authored-by: amysteamdev <37001393+AmySteam@users.noreply.github.com> Co-authored-by: Oliver Dunk <oliverdunk@google.com>
67 lines
2.2 KiB
JavaScript
67 lines
2.2 KiB
JavaScript
// Copyright 2023 Google LLC
|
|
//
|
|
// 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
|
|
//
|
|
// https://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.
|
|
|
|
// Registering this listener when the script is first executed ensures that the
|
|
// offscreen document will be able to receive messages when the promise returned
|
|
// by `offscreen.createDocument()` resolves.
|
|
|
|
chrome.runtime.onMessage.addListener(handleMessages);
|
|
|
|
function handleMessages(message, sender, sendResponse) {
|
|
// Return early if this message isn't meant for the offscreen document.
|
|
if (message.target !== 'offscreen') {
|
|
return false;
|
|
}
|
|
|
|
if (message.type !== 'get-geolocation') {
|
|
console.warn(`Unexpected message type received: '${message.type}'.`);
|
|
return;
|
|
}
|
|
|
|
getGeolocation().then((geolocation) => sendResponse(geolocation));
|
|
|
|
// we need to explictly return true in our chrome.runtime.onMessage handler
|
|
// in order to allow the requestor to handle the request asynchronous.
|
|
return true;
|
|
}
|
|
|
|
// getCurrentPosition returns a prototype based object, so the properties
|
|
// end up being stripped off when sent over to our service worker. To get
|
|
// around this, we deeply clone it
|
|
function clone(obj) {
|
|
const copy = {};
|
|
|
|
// Return the value of any non true object (typeof(null) is "object") directly.
|
|
// null will throw an error if you try to for/in it. We can just return
|
|
// the value early.
|
|
if (obj === null || !(obj instanceof Object)) {
|
|
return obj;
|
|
} else {
|
|
for (const p in obj) {
|
|
copy[p] = clone(obj[p]);
|
|
}
|
|
}
|
|
return copy;
|
|
}
|
|
|
|
async function getGeolocation() {
|
|
return new Promise((resolve, reject) => {
|
|
navigator.geolocation.getCurrentPosition(
|
|
(loc) => resolve(clone(loc)),
|
|
// in case the user doesnt have or is blocking `geolocation`
|
|
(err) => reject(err)
|
|
);
|
|
});
|
|
}
|