Skip to content

Address issue #376: Re-initialize task list handlers after DOM replacement#400

Merged
schuyler merged 1 commit into
mainfrom
claude/resolve-issue-376-QDPZl
Apr 22, 2026
Merged

Address issue #376: Re-initialize task list handlers after DOM replacement#400
schuyler merged 1 commit into
mainfrom
claude/resolve-issue-376-QDPZl

Conversation

@schuyler

Copy link
Copy Markdown
Owner

Summary

  • Checkbox click handlers set up by tasklist.js were lost whenever the preview re-rendered via DOM replacement (body.innerHTML = …), because browsers do not re-execute <script> tags injected through innerHTML
  • Expose the initialization logic as window.macdownInitTaskList so it can be called explicitly after each DOM replacement, matching the existing pattern used for Prism (Prism.highlightAll())
  • Add an explanatory comment to the break statement in the inner loop, which intentionally prevents duplicate handlers from being attached to nested checkboxes

Related Issue

Related to #376

Manual Testing Plan

  1. Open a document containing - [ ] task and - [x] done
  2. Confirm checkboxes appear in the preview
  3. Type a character in the editor to trigger a DOM-replacement re-render
  4. Click an unchecked checkbox in the preview — the editor text should change to [x]
  5. Click a checked checkbox in the preview — the editor text should change to [ ]
  6. Repeat steps 3–5 several times to confirm handlers survive repeated re-renders
  7. Test with nested checkboxes (e.g. - [ ] parent\n - [ ] child) and confirm depth-first index ordering works correctly

Review Notes

The root cause and fix are analogous to the Prism syntax highlighting re-initialization already present in the same DOM-replacement script. No new unit tests were added; the toggle logic and security token validation are covered by existing tests in MPCheckboxToggleTests.m and MPScrollSyncTests.m.

When the preview body is updated via innerHTML (the DOM-replacement path
used to preserve scroll position), WebKit does not re-execute script tags
in the new content. This left all newly-rendered checkboxes without click
handlers, so toggling them had no effect on the editor.

Fix: expose the tasklist.js initialization as window.macdownInitTaskList
and call it from the DOM-replacement update script, alongside the existing
Prism.highlightAll() call that solves the same problem for syntax
highlighting.

Related to #376
@github-actions

github-actions Bot commented Apr 22, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Report

Current Coverage: 60.49%

Coverage Details (Summary)
Name                                                                                                                                   Coverage            
-------------------------------------------------------------------------------------------------------------------------------------- ------------------- 
MASPreferences.bundle                                                                                                                  0.00% (0/0)         
MacDown 3000.app                                                                                                                       62.09% (8725/14052) 
    /Users/runner/work/macdown3000/macdown3000/MacDown/Code/Document/MPAsset.m                                                         93.69% (104/111)    
        -[MPAsset typeName]                                                                                                            100.00% (3/3)       
        -[MPAsset defaultTypeName]                                                                                                     100.00% (3/3)       
        +[MPAsset assetWithURL:andType:]                                                                                               100.00% (3/3)       
        -[MPAsset initWithURL:andType:]                                                                                                87.50% (7/8)        
        -[MPAsset init]                                                                                                                100.00% (3/3)       
        -[MPAsset templateForOption:]                                                                                                  0.00% (0/6)         
        -[MPAsset htmlForOption:]                                                                                                      100.00% (28/28)     
        -[MPStyleSheet defaultTypeName]                                                                                                100.00% (3/3)       
        +[MPStyleSheet CSSWithURL:]                                                                                                    100.00% (3/3)       
        -[MPStyleSheet templateForOption:]                                                                                             100.00% (20/20)     
        -[MPScript defaultTypeName]                                                                                                    100.00% (3/3)       
        +[MPScript javaScriptWithURL:]                                                                                                 100.00% (3/3)       
        -[MPScript templateForOption:]                                                                                                 100.00% (20/20)     
        -[MPEmbeddedScript htmlForOption:]                                                                                             100.00% (5/5)       
    /Users/runner/work/macdown3000/macdown3000/MacDown/Code/Preferences/MPHtmlPreferencesViewController.m                              0.00% (0/112)       
        MPPrismDefaultThemeName                                                                                                        0.00% (0/2)         
        -[MPHtmlPreferencesViewController viewIdentifier]                                                                              0.00% (0/3)         
        -[MPHtmlPreferencesViewController toolbarItemImage]                                                                            0.00% (0/3)         
        -[MPHtmlPreferencesViewController toolbarItemLabel]                                                                            0.00% (0/2)         
        -[MPHtmlPreferencesViewController viewWillAppear]                                                                              0.00% (0/4)         
        -[MPHtmlPreferencesViewController changeStylesheet:]                                                                           0.00% (0/7)         
        -[MPHtmlPreferencesViewController changeHighlightingTheme:]                                                                    0.00% (0/7)         
        -[MPHtmlPreferencesViewController invokeStylesheetFunction:]                                                                   0.00% (0/23)        
        -[MPHtmlPreferencesViewController invokeHighlightingThemeFunction:]                                                            0.00% (0/33)        
        -[MPHtmlPreferencesViewController loadStylesheets]                                                                             0.00% (0/13)        
        -[MPHtmlPreferencesViewController loadHighlightingThemes]                                                                      0.00% (0/15)        
    /Users/runner/work/macdown3000/macdown3000/MacDown/Code/Utility/FileURLInlining.m                                                  26.60% (25/94)      
        +[FileURLInlining inlineFromIterable:]                                                                                         0.00% (0/11)        
        -[FileURLInlining initWithURL:]                                                                                                0.00% (0/6)         
        -[FileURLInlining init]                                                                                                        100.00% (3/3)       
        -[FileURLInlining inlineContent]                                                                                               0.00% (0/9)         
        -[FileURLInlining imageContent]                                                                                                0.00% (0/12)        
        +[FileURLInlining mimeTypeForFilePath:]                                                                                        100.00% (22/22)     
        -[FileURLInlining clippingContent]                                                                                             0.00% (0/4)         
        +[FileURLInlining isTextClippingAtPath:]                                                                                       0.00% (0/12)        
        +[FileURLInlining textContentFromClipping:]                                                                                    0.00% (0/15)        
    /Users/runner/work/macdown3000/macdown3000/Dependency/peg-markdown-highlight/HGMarkdownHighlightingStyle.m                         87.69% (57/65)      
        +[HGMarkdownHighlightingStyle colorFromARGBColor:]                                                                             100.00% (6/6)       
        -[HGMarkdownHighlightingStyle initWithType:attributesToAdd:toRemove:fontTraitsToAdd:]                                          88.89% (8/9)        
        -[HGMarkdownHighlightingStyle initWithStyleAttributes:baseFont:]                                                               86.00% (43/50)      
    /Users/runner/work/macdown3000/macdown3000/MacDown/Code/Utility/MPResourceWatcherSet.m                                             93.62% (88/94)      
        -[MPResourceWatcherSet init]                                                                                                   100.00% (6/6)       
        -[MPResourceWatcherSet dealloc]                                                                                                0.00% (0/3)         
        -[MPResourceWatcherSet watchedPaths]                                                                                           100.00% (3/3)       
        -[MPResourceWatcherSet updateWatchedPaths:]                                                                                    100.00% (16/16)     

... (3167 more lines truncated)

📊 **Full coverage report available in workflow artifacts**

@schuyler schuyler merged commit f3b7f97 into main Apr 22, 2026
8 of 9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants