@@ -154,25 +154,72 @@ function showCompanyTags(problemTitle: string) {
154154 return ;
155155 }
156156
157- if ( companyTagContainer ) {
158- while ( companyTagContainer . firstChild ) {
159- companyTagContainer . firstChild . remove ( ) ;
160- }
161- } else {
162- companyTagContainer = document . createElement ( 'div' ) ;
163- companyTagContainer . id = 'companyTagContainer' ;
164- companyTagContainer . style . display = 'flex' ;
165- companyTagContainer . style . flexDirection = 'row' ;
166- companyTagContainer . style . marginBottom = '20px' ;
167- companyTagContainer . style . gap = '5px' ;
157+ // Try to find the description element with retries
158+ const maxRetries = 10 ;
159+ const baseDelay = 300 ;
160+ let retryCount = 0 ;
168161
162+ const tryInsertCompanyTags = ( ) => {
169163 const description = document . getElementsByClassName ( 'elfjS' ) [ 0 ] ;
170- if ( description ) {
164+
165+ if ( ! description && retryCount < maxRetries ) {
166+ // Use exponential backoff for retry delay
167+ const delay = baseDelay * Math . pow ( 1.5 , retryCount ) ;
168+ retryCount ++ ;
169+ console . log ( `Attempt ${ retryCount } : Waiting for description element to load... Retrying in ${ delay } ms` ) ;
170+ setTimeout ( tryInsertCompanyTags , delay ) ;
171+ return ;
172+ }
173+
174+ if ( ! description ) {
175+ console . log ( 'Failed to find description element after all retries' ) ;
176+
177+ // If still not found, set up a MutationObserver to watch for DOM changes
178+ const observer = new MutationObserver ( ( mutations , obs ) => {
179+ const description = document . getElementsByClassName ( 'elfjS' ) [ 0 ] ;
180+ if ( description ) {
181+ obs . disconnect ( ) ; // Stop observing once we find the element
182+ insertCompanyTags ( description ) ;
183+ }
184+ } ) ;
185+
186+ // Start observing the document with the configured parameters
187+ observer . observe ( document . body , {
188+ childList : true ,
189+ subtree : true
190+ } ) ;
191+
192+ return ;
193+ }
194+
195+ insertCompanyTags ( description ) ;
196+ } ;
197+
198+ const insertCompanyTags = ( description : Element ) => {
199+ // Check if container already exists
200+ if ( companyTagContainer ) {
201+ // Clear existing tags
202+ while ( companyTagContainer . firstChild ) {
203+ companyTagContainer . firstChild . remove ( ) ;
204+ }
205+ } else {
206+ // Create new container
207+ companyTagContainer = document . createElement ( 'div' ) ;
208+ companyTagContainer . id = 'companyTagContainer' ;
209+ companyTagContainer . style . display = 'flex' ;
210+ companyTagContainer . style . flexDirection = 'row' ;
211+ companyTagContainer . style . marginBottom = '20px' ;
212+ companyTagContainer . style . gap = '5px' ;
213+
171214 description . insertBefore ( companyTagContainer , description . firstChild ) ;
172215 }
173- }
174216
175- loadCompanyTags ( problemTitle , companyTagContainer ) ;
217+ // Load and inject company tags
218+ loadCompanyTags ( problemTitle , companyTagContainer ) ;
219+ } ;
220+
221+ // Start the retry process
222+ tryInsertCompanyTags ( ) ;
176223 } ) ;
177224}
178225
@@ -319,3 +366,41 @@ chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
319366 return true ;
320367} ) ;
321368
369+ // Self-initialization function that runs when the content script loads
370+ function initializeContentScript ( ) {
371+ // Wait for the DOM to be fully loaded
372+ if ( document . readyState === 'loading' ) {
373+ document . addEventListener ( 'DOMContentLoaded' , onDOMReady ) ;
374+ } else {
375+ onDOMReady ( ) ;
376+ }
377+
378+ function onDOMReady ( ) {
379+ // Check if we're on a LeetCode problem page
380+ const isProblemPage = / ^ h t t p s : \/ \/ l e e t c o d e \. c o m \/ p r o b l e m s \/ .* \/ ? / . test ( window . location . href ) ;
381+
382+ if ( isProblemPage ) {
383+ console . log ( 'LeetCode problem page detected, initializing content script...' ) ;
384+
385+ // Extract the problem title from the page title
386+ const pageTitle = document . title ;
387+ const problemTitle = pageTitle . split ( '-' ) [ 0 ] . trim ( ) ;
388+
389+ // Detect theme on first load of a problem page
390+ detectAndSyncTheme ( ) ;
391+ showExamples ( ) ;
392+ showCompanyTags ( problemTitle ) ;
393+ showDifficulty ( ) ;
394+ showRating ( problemTitle ) ;
395+
396+ // Add theme change listener after creating company tags
397+ setupDescriptionThemeListener ( ) ;
398+
399+ console . log ( 'Content script initialized for problem:' , problemTitle ) ;
400+ }
401+ }
402+ }
403+
404+ // Run the initialization
405+ initializeContentScript ( ) ;
406+
0 commit comments