qt "github.com/frankban/quicktest"
 )
 
+func TestRenderHookEditNestedPartial(t *testing.T) {
+       config := `
+baseURL="https://example.org"
+workingDir="/mywork"
+`
+       b := newTestSitesBuilder(t).WithWorkingDir("/mywork").WithConfigFile("toml", config).Running()
+
+       b.WithTemplates("_default/single.html", "{{ .Content }}")
+       b.WithTemplates("partials/mypartial1.html", `PARTIAL1 {{ partial "mypartial2.html" }}`)
+       b.WithTemplates("partials/mypartial2.html", `PARTIAL2`)
+       b.WithTemplates("_default/_markup/render-link.html", `Link {{ .Text | safeHTML }}|{{ partial "mypartial1.html" . }}END`)
+
+       b.WithContent("p1.md", `---
+title: P1
+---
+
+[First Link](https://www.google.com "Google's Homepage")
+
+`)
+       b.Build(BuildCfg{})
+
+       b.AssertFileContent("public/p1/index.html", `Link First Link|PARTIAL1 PARTIAL2END`)
+
+       b.EditFiles("layouts/partials/mypartial1.html", `PARTIAL1_EDITED {{ partial "mypartial2.html" }}`)
+
+       b.Build(BuildCfg{})
+
+       b.AssertFileContent("public/p1/index.html", `Link First Link|PARTIAL1_EDITED PARTIAL2END`)
+
+       b.EditFiles("layouts/partials/mypartial2.html", `PARTIAL2_EDITED`)
+
+       b.Build(BuildCfg{})
+
+       b.AssertFileContent("public/p1/index.html", `Link First Link|PARTIAL1_EDITED PARTIAL2_EDITEDEND`)
+
+}
+
 func TestRenderHooks(t *testing.T) {
        config := `
 baseURL="https://example.org"
 
        if templFound {
                renderers.LinkRenderer = hookRenderer{
                        templateHandler: p.s.Tmpl(),
-                       Provider:        templ.(tpl.Info),
+                       SearchProvider:  templ.(identity.SearchProvider),
                        templ:           templ,
                }
        }
        if templFound {
                renderers.ImageRenderer = hookRenderer{
                        templateHandler: p.s.Tmpl(),
-                       Provider:        templ.(tpl.Info),
+                       SearchProvider:  templ.(identity.SearchProvider),
                        templ:           templ,
                }
        }
        if templFound {
                renderers.HeadingRenderer = hookRenderer{
                        templateHandler: p.s.Tmpl(),
-                       Provider:        templ.(tpl.Info),
+                       SearchProvider:  templ.(identity.SearchProvider),
                        templ:           templ,
                }
        }
 
 // where ITEM is the thing being hooked.
 type hookRenderer struct {
        templateHandler tpl.TemplateHandler
-       identity.Provider
+       identity.SearchProvider
        templ tpl.Template
 }
 
 
 
 // Manager manages identities, and is itself a Provider of Identity.
 type Manager interface {
-       IdentitiesProvider
-       Provider
+       SearchProvider
        Add(ids ...Provider)
-       Search(id Identity) Provider
        Reset()
 }
 
+// SearchProvider provides access to the chained set of identities.
+type SearchProvider interface {
+       Provider
+       IdentitiesProvider
+       Search(id Identity) Provider
+}
+
 // A PathIdentity is a common identity identified by a type and a path, e.g. "layouts" and "_default/single.html".
 type PathIdentity struct {
        Type string
 
 type renderContextData interface {
        RenderContext() converter.RenderContext
        DocumentContext() converter.DocumentContext
-       AddIdentity(id identity.Identity)
+       AddIdentity(id identity.Provider)
 }
 
 type renderContextDataHolder struct {
        return ctx.dctx
 }
 
-func (ctx *renderContextDataHolder) AddIdentity(id identity.Identity) {
+func (ctx *renderContextDataHolder) AddIdentity(id identity.Provider) {
        ctx.ids.Add(id)
 }
 
 
                },
        )
 
-       ctx.AddIdentity(h.ImageRenderer.GetIdentity())
+       ctx.AddIdentity(h.ImageRenderer)
 
        return ast.WalkContinue, err
 
                },
        )
 
-       ctx.AddIdentity(h.LinkRenderer.GetIdentity())
+       // TODO(bep) I have a working branch that fixes these rather confusing identity types,
+       // but for now it's important that it's not .GetIdentity() that's added here,
+       // to make sure we search the entire chain on changes.
+       ctx.AddIdentity(h.LinkRenderer)
 
        return ast.WalkContinue, err
 }
                },
        )
 
-       ctx.AddIdentity(h.HeadingRenderer.GetIdentity())
+       ctx.AddIdentity(h.HeadingRenderer)
 
        return ast.WalkContinue, err
 }