diff --git a/content/signup-page.js b/content/signup-page.js index 9b6975e..6fdf820 100644 --- a/content/signup-page.js +++ b/content/signup-page.js @@ -369,6 +369,25 @@ function getSignupEntryDiagnostics() { const actionCandidates = document.querySelectorAll( 'a, button, [role="button"], [role="link"], input[type="button"], input[type="submit"]' ); + const allActions = Array.from(actionCandidates).map((el) => { + const rect = typeof el?.getBoundingClientRect === 'function' + ? el.getBoundingClientRect() + : null; + const text = getActionText(el); + return { + tag: (el.tagName || '').toLowerCase(), + type: el.getAttribute?.('type') || '', + text: text.slice(0, 80), + visible: isVisibleElement(el), + enabled: isActionEnabled(el), + rect: rect + ? { + width: Math.round(rect.width || 0), + height: Math.round(rect.height || 0), + } + : null, + }; + }); const visibleActions = Array.from(actionCandidates) .filter(isVisibleElement) .slice(0, 12) @@ -379,6 +398,9 @@ function getSignupEntryDiagnostics() { enabled: isActionEnabled(el), })) .filter((item) => item.text); + const signupLikeActions = allActions + .filter((item) => item.text && SIGNUP_ENTRY_TRIGGER_PATTERN.test(item.text)) + .slice(0, 12); return { url: location.href, @@ -386,6 +408,8 @@ function getSignupEntryDiagnostics() { readyState: document.readyState || '', hasEmailInput: Boolean(getSignupEmailInput()), hasPasswordInput: Boolean(getSignupPasswordInput()), + bodyContainsSignupText: SIGNUP_ENTRY_TRIGGER_PATTERN.test(getPageTextSnapshot()), + signupLikeActions, visibleActions, bodyTextPreview: getPageTextSnapshot().slice(0, 240), }; diff --git a/tests/signup-entry-diagnostics.test.js b/tests/signup-entry-diagnostics.test.js index d1795bd..2e99d06 100644 --- a/tests/signup-entry-diagnostics.test.js +++ b/tests/signup-entry-diagnostics.test.js @@ -52,7 +52,8 @@ function extractFunction(name) { } test('signup entry diagnostics summarizes current page inputs and visible actions', () => { - const api = new Function(` +const api = new Function(` +const SIGNUP_ENTRY_TRIGGER_PATTERN = /免费注册|立即注册|注册|sign\\s*up|register|create\\s*account|create\\s+account/i; const location = { href: 'https://chatgpt.com/' }; const document = { title: 'ChatGPT', @@ -67,6 +68,9 @@ const document = { tagName: 'BUTTON', textContent: 'Get started', disabled: false, + getBoundingClientRect() { + return { width: 120, height: 40 }; + }, getAttribute(name) { return name === 'type' ? 'button' : ''; }, @@ -75,6 +79,9 @@ const document = { tagName: 'A', textContent: 'Log in', disabled: false, + getBoundingClientRect() { + return { width: 96, height: 40 }; + }, getAttribute() { return ''; }, @@ -129,6 +136,8 @@ return { assert.equal(result.readyState, 'complete'); assert.equal(result.hasEmailInput, false); assert.equal(result.hasPasswordInput, false); + assert.equal(result.bodyContainsSignupText, false); + assert.deepStrictEqual(result.signupLikeActions, []); assert.deepStrictEqual(result.visibleActions, [ { tag: 'button', type: 'button', text: 'Get started', enabled: true }, { tag: 'a', type: '', text: 'Log in', enabled: true },