DeepSeek Native Setter Injector

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

Versione datata 15/05/2025. Vedi la nuova versione l'ultima versione.

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==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.20250515142644
// @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;
    }

    if (message && message.type === 'reasonButtonClicked') {
      // 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 “DeepThink (R1)”
      for (const btn of buttons) {
        if (btn.textContent.trim() === 'DeepThink (R1)') {
          btn.click();
          break;
        }
      }
      return;
    }

    // Only respond to string messages
    if (typeof event.data !== 'string') return;

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

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

    // 2. Notify React/Vue/etc. of the change
    textarea.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();
  });
})();