@@ -235,6 +235,14 @@ def __init__(
235235
236236 super ().__init__ ()
237237
238+ def _get_dom_base (self ) -> DOMNode :
239+ """Get the DOM base node (typically self).
240+
241+ Returns:
242+ DOMNode.
243+ """
244+ return self
245+
238246 def set_reactive (
239247 self , reactive : Reactive [ReactiveType ], value : ReactiveType
240248 ) -> None :
@@ -1380,10 +1388,11 @@ def query(
13801388 from textual .css .query import DOMQuery , QueryType
13811389 from textual .widget import Widget
13821390
1391+ node = self ._get_dom_base ()
13831392 if isinstance (selector , str ) or selector is None :
1384- return DOMQuery [Widget ](self , filter = selector )
1393+ return DOMQuery [Widget ](node , filter = selector )
13851394 else :
1386- return DOMQuery [QueryType ](self , filter = selector .__name__ )
1395+ return DOMQuery [QueryType ](node , filter = selector .__name__ )
13871396
13881397 if TYPE_CHECKING :
13891398
@@ -1411,10 +1420,11 @@ def query_children(
14111420 from textual .css .query import DOMQuery , QueryType
14121421 from textual .widget import Widget
14131422
1423+ node = self ._get_dom_base ()
14141424 if isinstance (selector , str ) or selector is None :
1415- return DOMQuery [Widget ](self , deep = False , filter = selector )
1425+ return DOMQuery [Widget ](node , deep = False , filter = selector )
14161426 else :
1417- return DOMQuery [QueryType ](self , deep = False , filter = selector .__name__ )
1427+ return DOMQuery [QueryType ](node , deep = False , filter = selector .__name__ )
14181428
14191429 if TYPE_CHECKING :
14201430
@@ -1449,6 +1459,8 @@ def query_one(
14491459 """
14501460 _rich_traceback_omit = True
14511461
1462+ base_node = self ._get_dom_base ()
1463+
14521464 if isinstance (selector , str ):
14531465 query_selector = selector
14541466 else :
@@ -1462,20 +1474,20 @@ def query_one(
14621474 ) from None
14631475
14641476 if all (selectors .is_simple for selectors in selector_set ):
1465- cache_key = (self ._nodes ._updates , query_selector , expect_type )
1466- cached_result = self ._query_one_cache .get (cache_key )
1477+ cache_key = (base_node ._nodes ._updates , query_selector , expect_type )
1478+ cached_result = base_node ._query_one_cache .get (cache_key )
14671479 if cached_result is not None :
14681480 return cached_result
14691481 else :
14701482 cache_key = None
14711483
1472- for node in walk_depth_first (self , with_root = False ):
1484+ for node in walk_depth_first (base_node , with_root = False ):
14731485 if not match (selector_set , node ):
14741486 continue
14751487 if expect_type is not None and not isinstance (node , expect_type ):
14761488 continue
14771489 if cache_key is not None :
1478- self ._query_one_cache [cache_key ] = node
1490+ base_node ._query_one_cache [cache_key ] = node
14791491 return node
14801492
14811493 raise NoMatches (f"No nodes match { selector !r} on { self !r} " )
@@ -1518,6 +1530,8 @@ def query_exactly_one(
15181530 """
15191531 _rich_traceback_omit = True
15201532
1533+ base_node = self ._get_dom_base ()
1534+
15211535 if isinstance (selector , str ):
15221536 query_selector = selector
15231537 else :
@@ -1531,14 +1545,14 @@ def query_exactly_one(
15311545 ) from None
15321546
15331547 if all (selectors .is_simple for selectors in selector_set ):
1534- cache_key = (self ._nodes ._updates , query_selector , expect_type )
1535- cached_result = self ._query_one_cache .get (cache_key )
1548+ cache_key = (base_node ._nodes ._updates , query_selector , expect_type )
1549+ cached_result = base_node ._query_one_cache .get (cache_key )
15361550 if cached_result is not None :
15371551 return cached_result
15381552 else :
15391553 cache_key = None
15401554
1541- children = walk_depth_first (self , with_root = False )
1555+ children = walk_depth_first (base_node , with_root = False )
15421556 iter_children = iter (children )
15431557 for node in iter_children :
15441558 if not match (selector_set , node ):
@@ -1553,7 +1567,7 @@ def query_exactly_one(
15531567 "Call to query_one resulted in more than one matched node"
15541568 )
15551569 if cache_key is not None :
1556- self ._query_one_cache [cache_key ] = node
1570+ base_node ._query_one_cache [cache_key ] = node
15571571 return node
15581572
15591573 raise NoMatches (f"No nodes match { selector !r} on { self !r} " )
@@ -1589,6 +1603,7 @@ def query_ancestor(
15891603 Returns:
15901604 A DOMNode or subclass if `expect_type` is provided.
15911605 """
1606+ base_node = self ._get_dom_base ()
15921607 if isinstance (selector , str ):
15931608 query_selector = selector
15941609 else :
@@ -1600,8 +1615,8 @@ def query_ancestor(
16001615 raise InvalidQueryFormat (
16011616 f"Unable to parse { query_selector !r} as a query; check for syntax errors"
16021617 ) from None
1603- if self .parent is not None :
1604- for node in self .parent .ancestors_with_self :
1618+ if base_node .parent is not None :
1619+ for node in base_node .parent .ancestors_with_self :
16051620 if not match (selector_set , node ):
16061621 continue
16071622 if expect_type is not None and not isinstance (node , expect_type ):
0 commit comments