DeepSeek Native Setter Injector

Listens for postMessage events on chat.deepseek.com and logs them

As of 12.05.2025. See апошняя версія.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name        DeepSeek Native Setter Injector
// @description  Listens for postMessage events on chat.deepseek.com and logs them
// @match       https://chat.deepseek.com/*
// @version 0.0.1.20250512140634
// @namespace https://greasyfork.org/users/1435046
// ==/UserScript==

(function () {
  'use strict';

  // Cache the native setter for HTMLTextAreaElement.value
  const valueSetter = Object.getOwnPropertyDescriptor(
    HTMLTextAreaElement.prototype, 'value'
  ).set;

  window.addEventListener('message', event => {
    const message = event.data;

if (message && message.type === 'searchButtonClicked') {
  // find all primary filled buttons
  const buttons = document.querySelectorAll(
    'div[role="button"].ds-button--primary.ds-button--filled'
  );
  // click the one whose visible label is “Search”
  for (const btn of buttons) {
    if (btn.textContent.trim() === 'Search') {
      btn.click();
      break;
    }
  }
  return;
}

    const ta = document.getElementById('chat-input');
    if (!ta) return;

    // 1. Update both DOM and React state without shifting focus
    valueSetter.call(ta, message);

    // 2. Notify React/Vue/etc. of the change
    ta.dispatchEvent(new InputEvent('input', { bubbles: true }));

    // 3. Click the send button if enabled
    const sendBtn = document.querySelector('div[role="button"][aria-disabled="false"]');
    if (sendBtn) sendBtn.click();
  });
})();