code: def test_editing_updates_source(
      self, bokeh_model_page: BokehModelPage
  ) -> None:
      table = make_table(self.editor, self.values)
      page = bokeh_model_page(table)
  
      # Click row 1 (which triggers the selection callback)
      cell = get_table_cell(page.driver, table, 1, 1)
      cell.click()
      results = page.results
      assert results["values"] == self.values
  
      # Now double click, enter the text new value and <enter>
      enter_text_in_cell(page.driver, table, 1, 1, "baz")
  
      # Click row 2 (which triggers callback again so we can inspect the data)
      cell = get_table_cell(page.driver, table, 2, 1)
      cell.click()
      results = page.results
      assert results["values"] == ["baz", "bar"]
  
      assert page.has_no_console_errors()
  
file_path: bokeh/tests/integration/widgets/tables/test_cell_editors.py
imports: from __future__ import annotations
  import pytest
  from time import sleep
  from bokeh.models import ColumnDataSource, CustomJS, DataTable, IntEditor, NumberEditor, StringEditor, TableColumn
  from tests.support.plugins.project import BokehModelPage
  from tests.support.util.selenium import RECORD, enter_text_in_cell, enter_text_in_cell_with_click_enter, escape_cell, get_table_cell
label_desc: Use image node_id 2 for calling the Test_StringEditor obj's underlying member method code with example usage: obj.test_editing_updates_source(bokeh_model_page) without return types