Applies to: PRISM — contextual gesture shortcuts (demonstrator), extension version 0.1.0 Last updated: 23 September 2026 Effective date: 2026-09-23
PRISM is a research demonstrator written for a Human–Computer Interaction course project at Stony Brook University. It exists to let a person try one interaction technique — direction gestures drawn with the right mouse button, with an on-screen guide that shows what the gesture would do — on real web pages instead of only inside a lab instrument.
It is not a supported consumer product. It has no company behind it, no support desk, and no guarantee of continued maintenance. No study results are claimed here, because the study has not been run yet.
This policy describes what the published extension actually does. Every statement below was checked against the extension’s source code rather than written from memory.
chrome.storage.local on your own machine.| Where | chrome.storage.local — local to this browser profile on this computer |
| Key | exactly one: prism.custom-bindings |
| What is in it | the custom gestures you recorded on the extension’s options page |
| Per binding | the context (page, link, image or selection), the direction tokens (e.g. U,L), the id and label of the command it runs, and the time it was created |
| Written by | the options page, when you save a gesture |
| Read by | the content script, once per page load, so a saved gesture works after a browser restart |
No page content, no URLs, no page titles, no timing data and no identifiers are stored — the options page has no free-text field to type any into; its only inputs are two drop-down lists and a pad you draw on.
chrome.storage.sync is not used, so nothing is uploaded to your Google account. The extension
also uses no localStorage, no sessionStorage, no IndexedDB and no cookies.
Deleting a binding on the options page removes it. Uninstalling the extension removes the key and everything in it.
bookmarksSpent by one call in the whole extension: chrome.bookmarks.create({ title, url }) in
background.js, in the handler for the bookmark action. It is reachable only one way — by drawing
the R gesture on a link, the “Bookmark link” command. The title and URL passed to it are the
title and URL of that link.
The extension never reads, searches, lists, edits, moves or deletes bookmarks. create is the
only bookmarks API it calls, and without this permission that one command cannot work.
storageSpent by two calls, a get and a set on chrome.storage.local, both in bindings.js, both
against the single key described in §2. A custom gesture has to survive a browser restart; a content
script’s localStorage belongs to the website you are visiting, so it is per-site, cleared with site
data, and invisible to the options page. chrome.storage.local is the only store the options page
and the content script can share.
downloadsSpent by one command: Save image, the D gesture on an image. background.js calls
chrome.downloads.download({ url, filename, saveAs: false }) with the address of the image you
gestured on (or, for an inline SVG figure, a data: address built from its own markup, which
involves no request), so the file is saved straight to your browser’s default Downloads folder
without a Save-As dialog. The file name is made from the image’s description or address and cleaned
of anything that is not safe in a file name. The browser makes the download request, exactly as it
would for “Save image as…”; the file appears in Chrome’s own downloads list, and you can delete it
like any other download.
To report truthfully whether the file actually finished, the worker also looks up that one
download’s state (chrome.downloads.search by its id, and onChanged filtered to that id). It
never lists, reads, opens, deletes or otherwise touches any other entry in your download history.
http://*/* and https://*/*Spent by one command: Copy image, the L gesture on an image (§5). A web page is not
allowed to read the pixels of a picture that came from another website, so the content script
cannot turn such a picture into clipboard data itself. The extension’s background worker can, but
only for websites it holds host permission for — and the picture can be on any website, which is why
the grant is broad. It is used for exactly one request: a fetch of the address of the picture you
gestured on, inside the Copy image handler in background.js, described in §5. The host permission
is not used to read, change or inject into any page; the content script’s page access is
described separately in §4.
There is no tabs, cookies, history, identity, management, webRequest, scripting,
clipboardRead or clipboardWrite permission.
The extension does open, close and create tabs and windows, but those APIs are ungated and buy no
access to your data: the tab it closes is the one the gesture came from, identified by the message
sender, and when it reads the geometry of your current window in order to size a new one, it does so
without populate, so no tab list, URL or title is returned to it.
http:// and https:// pageThe manifest declares a content script matching http://*/* and https://*/*. The technique is a
replacement for the right-click context menu, so it has to be available wherever you right-drag; the
extension cannot know in advance which pages those will be, and a narrower match would make it work
on some sites and silently do nothing on others. It does not run on chrome:// pages, the Chrome
Web Store or the new tab page, and it checks the page’s scheme itself before starting.
What it does on a page you visit:
pointerdown, pointermove, pointerup) to the document;chrome.storage.local once, on load;href, an image’s src — and the current text selection, purely to decide which of the
four contexts applies and which command a stroke would run;What it does not do: it does not read or index page text beyond the selection you have made
yourself; it does not read form fields, passwords, cookies, localStorage or site data; it does not
scrape, copy or store page content; it does not record your browsing history; it does not capture
keystrokes; it does not modify the page apart from adding its own overlay and stylesheet; and it
writes nothing about any page you visit to disk. Nothing it reads is retained after the gesture
ends. It also installs no contextmenu handler and calls preventDefault() nowhere, so a short
right-click still opens the website’s own menu exactly as that site intended.
Three commands write to your system clipboard, each only when you draw its gesture:
| Gesture | Command | What is copied |
|---|---|---|
L on a text selection |
Copy | the text you selected |
L on a link |
Copy link | that link’s URL |
L on an image |
Copy image | the picture itself, as a PNG image; if that fails, the image’s address (or, for an inline SVG, its markup) instead, and the on-screen message says which |
Copy and Copy link use the browser’s Clipboard API (navigator.clipboard.writeText), with the older
document.execCommand('copy') as a fallback if the first is refused. Copy image uses
navigator.clipboard.write with an image/png item.
How Copy image gets the picture, including its one network request:
data: image, or an image the page itself generated (blob:), the
picture is drawn and converted to PNG inside the page, with no request of any kind.http:// or https://), the extension’s background worker
makes one request to re-fetch that image from the same address the page loaded it from. The
request sends no cookies, and asks the browser to answer from its HTTP cache where it can.
Chrome keeps a separate cache per site, so the answer may come from the cache or may be a fresh
request to the image’s server; that server sees an ordinary image request from your browser, as
it did when the page first loaded the picture. The worker decodes the image, re-encodes it as a
PNG and hands the bytes back to the content script, which writes them to your clipboard. The
bytes go only to your local clipboard. Nothing is stored, logged or sent anywhere else.The extension never reads the clipboard. It holds no clipboardRead permission and writes only
what the command you ran is defined to write.
Two commands in the selection context open a new tab at a public website, with the text you selected placed in the URL:
| Gesture | Command | Opens |
|---|---|---|
D on a text selection |
Define | https://en.wiktionary.org/wiki/Special:Search?search=<your selection> |
U on a text selection |
Search this | https://duckduckgo.com/?q=<your selection> |
The selection is URL-encoded and trimmed to 200 characters. The resulting request is made by your browser to that website, exactly as it would be if you typed the address yourself or used Chrome’s own “Search with…” menu item. Those sites’ own privacy policies then apply to that visit. PRISM has no API key, no account and no relationship with either site, and it never sees or reads what comes back.
These two gestures and Copy image’s re-fetch of the picture you gestured on (§5) are the only times a request goes out because of PRISM, and each happens only when you deliberately draw that gesture. Save image’s download (§3) is likewise a request for a file you chose, made by the browser as any download is.
chrome://extensions → PRISM → Details, on disk in the Extensions folder of your Chrome
profile, or with a CRX viewer. Start with manifest.json; the permission reasoning is written in
the header comments of background.js, commands-bridge.js and bindings.js, next to the lines
that spend them. (The project’s development repository is not public; you do not need it to check
any claim here.)@import, localStorage /
sessionStorage / indexedDB / document.cookie, and analytics or telemetry names, and found
0 hits in every category. The extension’s own files are searched for the same primitives —
fetch, XMLHttpRequest, sendBeacon, WebSocket, EventSource, importScripts, and the
common analytics names — by an automated source audit that is part of the project’s checks. The
one permitted match is Copy image’s fetch in background.js (§5); the audit allows it only
in that file, only inside that handler, and only once, and fails on any other fetch anywhere in
the extension.http://localhost:8080, none external.--disable-extensions
so that other installed extensions stayed out of the measurement. It is therefore evidence about
the engine, guide and command modules this extension loads — not a recording of a browsing session
with PRISM installed. No such capture has been taken yet. The network claims for the extension’s
own files rest on the source review above, and anyone can verify them in a minute with the service
worker’s Network panel open while gesturing: the only request it makes is Copy image’s re-fetch of
the picture.There is nothing to retain, because nothing is sent to PRISM and there is no server. A picture you copy stays on your clipboard until you copy something else; an image you save stays in your Downloads folder until you delete it. Your custom bindings stay on your computer until you delete them on the options page or uninstall the extension, which removes them with it. There is no account to close and no deletion request to file — but if you want to ask about any of this, the contact is in §11.
The extension is not directed at children and collects nothing from anyone, so it holds no sensitive category of data — no health, financial, location, authentication or personal-communications data.
If this policy changes, the updated version will be published at the same URL with a new date at the top. An extension that started collecting data would be a materially different one, and this page would say so plainly before it shipped.
Questions, corrections, or anything in this policy that does not match what you observe:
Manush Patel
Department of Computer Science, Stony Brook University
manushsachin.patel@stonybrook.edu