PasteNinja test page

Paste sample text into each field and observe. Green outline pulse = PasteNinja intervened. No pulse = browser-native paste worked (or nothing happened).

Standard blocker

The classic: onpaste="return false" or its equivalent addEventListener("paste", (e) => e.preventDefault())

unblocked
blocked
Expected: both fields end up with the pasted text. Blocked field gets a green pulse.

React-style controlled input

Simulates a controlled component that reverts when inputType === "insertFromPaste". Immune to solutions that stop propagation of paste events (eg the "Don't F*** With Paste" extension).

unblocked
blocked
Expected: both fields end up with the pasted text. Blocked field gets a green pulse.

Replace at caret

Select "Good" and paste "Great".

unblocked
blocked
Expected: both end up with The Great Gatsby. Blocked field gets a green pulse. Undo works in both.

Normalization in <input type="number">

Number inputs attempt to convert incoming text to numeric values. Behavior is quirky but should be the same in both fields.

unblocked
blocked
Expected: fields show same results for all inputs. Blocked field gets a green pulse.

Field inside a shadow root

A web component wrapping its own <input>, the shape Chase's mds-text-input uses. Shadow DOM retargets the paste event on its way out, so a listener on document sees the host custom element rather than the field — the bug that made PasteNinja fail silently on a Chase wire transfer.

unblocked
blocked
Expected: both fields end up with the pasted text. Blocked field gets a green pulse. A closed root would be unreachable — PasteNinja warns and stands down.

Virtuous paste listener

Some inputs intercept paste events to implement some sort of desired functionality. Anti-paste-blocker tools that suppress propagation of paste events (eg "Don't F*** With Paste") can break these. PasteNinja doesn't.

This example detects URLs and turns them into markdown links.

Expected: URLs are converted to [https://...](https://...) markdown links. No green pulse — PasteNinja stays out of the way.