* Create new SelectorObserver class
* Update DOMDataBinder to use SelectorObserver
* Update names to be more clear
* Remove attributeOldValue parameter, clarify attributes parameter
* Add documentation
* Add helper function _getElementRelativeToAncestor
* Move helper functions
* Add setVisibility transform
* Add support for data-transform attribute shorthand
* Add support for using the document element as the ancestor
* Remove redundant assignment of select value
* Update TTS preparation
* Don't hide options
* Improve voice sorting
* Update event handler
* Apply options to all selects targeting audio.textToSpeechVoice
* Update selector
* Use IDs
* Move test text to a hidden text input
* Rename TemplateHandler to HtmlTemplateCollection
* Rename _templateHandler to _templates
* Allow creation from both string and element
* Simplify setup of templates, don't throw errors on invalid ID
* Simplify variable name
* Add dictionaryNames array
* Update how the dictionary field is assigned
* Use "dictionary" instead of "title" for consistency
* Remove redundant dictionary name
* Use _expandTags to create pitch accent tags
* Add abstraction: _getDefinitionPrimaryExpressionAndReading
* Reuse existing definitions in a sequence
* Revert change to related definition source/rawSource/sourceTerm
* Update _getDefinitionPrimaryExpressionAndReading to return best match
* Group reduction functions together
* Group simple helpers
* Add label comments
* Move core _findTerms functions to top
* Move _getSecondarySearchDictionaryMap and _getDictionaryPriority
* Move tag helpers
* Move _getTextOptionEntryVariants
* Move functions up
* Move functions up
* Update label comments
* Add sourceTerm field to 'term' and 'termGrouped' definitions
* Fix comparison of expressions which are always the same
* Rename/restructure term info map
* Add source term
* Add sourceTerm to expressions array
* Reuse furiganaSegments
* Add helper function _createExpressionDetailsListFromTermInfoMap
* Add expressions array to termMergedByGlossary
* Add expressions to definition types 'term' and 'termGrouped'
* Rename expressionDetails* to termDetails*
* Correct the source/rawSource/sourceTerm for related sequenced definitions
* Simplify structure of sequencedDefinitions
* Remove TODO
* Refactor internal options for findTerms to not use the settings object
* Move findTerms/findKanji options creation
* Deconstruct used options values to variables before any await calls
* Rename findTermsOptions to just options
* Add documentation comments
* Add type information about definitions
* Add helper function _getSecondarySearchDictionaryMap
* Use spreads instead of concat
* Create helper function for assigning disambiguation info
* Add _getTermTagsScoreSum helper
* Rename variables
* Move assignment of definition details
* Convert databaseDefinitions to standard definitions
* Move creation of definitions
* Always pass definitionsByGlossary directly to _mergeByGlossary
* Refactor how used definitions are tracked
* Change _mergeByGlossary parameters
* Simplify _mergeByGlossary
* Generate definition structure at the end of the function
* Add reusable function to clone a tag
* Restructure merged sub-definition creation
* Move setup of totalExpressionSet/totalReadingSet
* Track all definitions with matching glossary
* Move creation of definitionTags
* Update score calculation for multiple definitions
* Disambiguate function name
* Rename variables
* Add helper function _createMergedGlossaryTermDefinition
* Remove rarely used check for secondary search results
Unclear what the purpose was since it was almost never used
* Update data structure
* Rename function/variable
* Add helper functions _createMergedTermDefinition
* Assign expressionDetails to variable
* Add rawSource to grouped definitions
* Use shared function for creating unused definition entries
* Add helper function _createMapKey
* Refactor _createExpressionDetails
* Change argument order
* Add _getTagNamesWithCategory helper
* Optimize _compressDefinitionTags
* Add _createGroupedTermDefinition helper
* Add type information
* Use consistent order for term definition fields, add comments for omitted fields
* Remove unused index field
* Add helper function _createKanjiDefinition
* Update types
* Add frequencies/pitches arrays
* Update terms array setup
* Simplify for loop
* Remove redundant property assignment
* Simplify how deinflections with no definitions are ignored
* Ensure duplicates are removed
* Rename variable
* Add comments about duplicate data
* Refactor variable/parameter names
* Move functions
* Rename functions
* Rename variable
* Add dictionaryPriority field
* Simplify priority comparison
* Rename argument
* Optimize comparison function when dictionary priority is not needed
* Add length check
* Remove unused parameter
* Rename variables/parameters
* Rename dictionaries to enabledDictionaryMap
* Store compactTags/mainDictionary options to variables
* Refactor _getSearchableText
* Simplify object structure of deinflections
* Modify existing array when removing duplicates
* Update _sortDefinitions to not return a value
* Use explicit argument value
* Use a Collator for string comparisons
* Simplify order comparison
* Improve tag creation and sanitization
* Switch .map to a for loop, skip null meta
* Add _createKanjiStat
* Move _sortDefinitions definition
* Fix kanji stat sorting
* Remove return value from _sortTags
* Add _sortKanji
* Add fast exits for sorting
* Add _sortDefinitionsByIndex
* Combine sort function
* Improve creation of kanji definition data
* Use "databaseDefinitions" instead of "definitions" to disambiguate
* Simplify
* Simplify further
* Simplify max length calculation
* More destructuring
* Use databaseDefinitions variable name
* Move _mergeBySequence body into _getSequencedDefinitions
* Use databaseDefinitions field name
* Move maxLength calculation
* Use shared _createTermDefinitionFromDatabaseDefinition
* Simplify map
* Move definition sorts for better consistency and less redundancy
* Move _createExpression function
* Update setup of sequenced definitions
* Simplify for loop
* Add scanOnTouchMove/preventTouchScrolling scanning input options
* Add settings controls
* Support scanOnTouchMove in TextScanner
* Support preventTouchScrolling in TextScanner
* Use _sendMessageTab
* Move _sendMessageAllTabs next to _sendMessageTab
* Rename function
* Add and use _sendMessageTabIgnoreResponse
* Add and use _sendMessageIgnoreResponse
* Always include params
* Update function consistency
* Move loadImageBase64 into DictionaryImporter
* Convert mediaUtility to a class
* Add getFileExtensionFromImageMediaType to MediaUtility
* Use MediaUtility instead of _getImageExtensionFromMediaType
* Use MediaUtility in ClipboardReader to validate images before reading
* Create ClipboardReader class
* Use ClipboardReader in Backend
* Update ClipboardMonitor to use ClipboardReader
* Replace _onApiClipboardImageGet call
* Assign clipboard reader browser
* Add options for searchTerms and searchKanji
* Add settings HTML
* Add options to TextScanner
* Update _search/_findDefinitions to include searchTerms/searchKanji args
* Update _searchAtFromMouseMove args
* Change argument structure for _searchAt
* Use scanning options for searchTerms and searchKanji
* Add options for scanning input types
* Move buttons in layout, refactor CSS
* Add options for input types
* Use input type filters
* Add _getMatchingInputGroupFromEvent
* Use input filters for touch events
* Add _getTemplates function
* Add template renderer to display pages
* Add AnkiNoteBuilder to Display
* Update AnkiTemplatesController to directly use TemplateRenderer
* Remove old APIs
* Add inputs to options.scanning
* Update CSS for mouse buttons
* Update list counters
* Set up HTML/CSS
* Add input controller
* Use new inputs
* Include mouse buttons
* Update how button inputs are detected
* Add index/empty fields to the input details object
* Update none check for scanning modifier
* Remove old settings
* Remove unused global
* Update AnkiNoteBuilder to not store a reference to an AniConnect instance
* Use more consistent details format
* Organize options assignment
* Move media injection
* Inject images before injecting audio
* Make functions private
* Make static functions private
* Add function guiBrowseNote
* Assign default server as null
* Use get/set properties for server/enabled
* Refactor option values
* Refactor createNote/Data functions to not use options format directly
* Use createNote for testing
* Add errors
* Add hideDelay option
* Add _clearSelection
* Use hideDelay
* Prevent repeated delayed selection clears
* Fix popup hide timer being cleared when the cursor is moved into the frame
* Add functions for getting keyboard key information
* Use os + DocumentUtil to get modifier key names
* Remove keyboard modifier info from environment info
* Create searchAt wrappers
* Add optional support for searching on the click event
* Update QueryParser to use TextScanner's searchOnClick functionality
* Move/rename searchAt
* Move pendingLookup checks
* Add 'searched' event to TextScanner
* Use common searched event for Frontend and QueryParser
* Move functions, make private
* Refactor Popup.setVisibleOverride
* Use event to observe visibility changes
* Add setAllVisibleOverride/clearAllVisibleOverride
* Add setAllVisibleOverride/clearAllVisibleOverride cross frame handlers
* Update how visibility is changed
* Wait for next frame to ensure visibility has been updated
* Simplify how parent/child are set
* Remove unused public frameId property
* Change use of getFrame
* Simplify parent access
* Use property for the container
* Remove isProxy
* Public function API parity
* Public property API parity
* Remove JsonSchema.clone
* Move createProxy function
* Group public properties first
* Create private version of getPropertySchema
* Mark functions as private
* Use non-static getValidValueOrDefault
* Mark private
* Make public validate function not take an info parameter
* Remove JsonSchema
* Add isValid function
* Use isValid for some tests
* Fix incorrect type
* Add support for regex pattern testing
* Add tests
* Separate JsonSchemaProxyHandler statics into JsonSchemaValidator
* Use this instead of JsonSchemaValidator
* Make JsonSchemaValidator non-static
* Use cache map for regex
* Refactor document.js into a class
* Move public functions first
* Rename private functions
* Rename
* Rename argument
* Use instance of DocumentUtil
* Update tests
* Refactor
* Rename (test-)document.js to (test-)document-util.js
* Move simple find sort into translator.js
* Remove unused
* Use direct reference to database
* Make field private
* Remove statics
* Convert functions to private
* Organize by public/private
* Refactor manifest.json
* Change end-of-line convention for built plain-text files
* Ignore builds directory
* Mark the "dev" directory as using the node environment
* Create build script
* Register build scripts
* Remove old build script
* Fix 64x64 icon
* Add test to ensure manifest data is updated properly
* Add _invokeSafe function to silently ignore extension unload errors
* Remove "Api" from function names
* Add invokeSafe to Popup
* Don't redundantly set content type to 'unloaded'
* Update TextSourceElement.equals check to match TextSourceRange.equals
* Force full query to be visible when scanning buttons or images with more text
* Update style of query parser
* Revert audio fetching functionality to use XMLHttpRequest
* Replace requestJson
* Replace requestJson
* Replace requestJson
* Replace requestJson and requestText
* Fix tests
* Include support for vulgar word searches
* Remove request.js
* Template helper updates
* Add pitch data to exported field formatting data
* Reuse note data
* Add no-op
* Set up pitch accent templates
* Refactor version update functions
* Implement upgrade process for new Anki templates
* Consistency
* Update README and anki.js to have matching markers
* Remove some unnecessary _setQuery calls
* Add support for forcing the query parser to be visible or hidden
* Move _setEventListenersActive calls
* Remove URL for kanji links
* Refactor _setContentTermsOrKanji
* Move search query text assignment into Display
* Move title updates into Display
* Move popup close calls
* Prevent infinite loop of extension unload events
* Move options functions into a class
* Rename and privatize
* Organize by public/private
* Refactor to use async function
* Simplify update function signature
* Add comment for update
* Rename
* Copy _applyUpdates into _legacyProfileUpdateUpdateVersion
* Organize
* Move profile options updates
* Refactor update details
* Add async support
* Formatting
* Standardize setContent calls
* Rename _queryText to _fullQuery
* Move query parser into Display and update float.html
* Generalize params
* Add "full" parameter to maintain the original full query
* Create DisplayHistory
* Change arguments for _setContentTermsOrKanji
* Set up history-driven content updates
* Use new history only
* Load definitions if missing
* Refactor definitions getting
* Add support for wildcards
* Move definitions setup
* Add events
* Allow state change even if there is no history state
* Update search page to use history
* Fix history overwriting
* Fix search page not seeing state chang events during prepare
* Update state if necessary
* Don't reassign query text if the same
* Remove DisplayContext
* Initialize with real history state
* Track URL
* Update DisplayHistory to support pseudo-history
* Configure history settings on search page
* Fix state
* Use full URL
* Change data format of setContent
* Rename details to content
* Update event arguments
* Fix animation
* Remove old state changes
* Clear content properly
* Remove set/clear content overrides
* Fix setting up event listeners for content clear
* Make clearContent private
* Make focus opt-in
* Validate source
* Add unloaded type
* Generalize content params
* Update how extension unload content is assigned
* Restore query blurring
* Simplify invoke
* Pass isTerms instead of type
* Update DisplaySearch.setContent to pass argument array
* Simplify argument object structure for setContent
* Move focus and disableHistory level
* Always include focus and disableHistory options
* Change disableHistory to history
* Pass source text to setContent
* Use consistent argument/object field order
* Remove unused previous field
* Combine logic for forward/back navigation
* Update eslint to 7.5.0
* Update eslint-plugin-no-unsanitized to 3.1.2
* Update fake-indexeddb to 3.1.1
* Rename DictionaryImporter.import to .importDictionary
Conflicts with o-unsanitized/method
* Update _updateSearchQuery to return the promise
* Update how the clipboard search popup is opened
* Create an API function to open the search popup
* Skip animation on popup creation
* Add API function
* Use a stringified JSON details object for extension port names
* Fix incorrect frame ID check
* Add support for connecting to different tabs
* Add function for invoking on a different tab
* Remove unused function
* Rename field
* Change extensionUnloaded trigger function
* Update how extension unloaded content is shown
* Ignore certain errors caused by extension unload
* Add _showExtensionUnloaded function
* Wrap internals of updateOptions
* Suppress errors caued by extension unload
* Make the frontend trigger the popup's extensionUnloaded event
* Refactor searchQueryUpdate action
* Use standard message handler style
* Use name "promiseOrResult" for consistency
* Use standard message handler convention for Yomichan message handlers
* Use common message handler invoker
* Add support for dynamic message handlers
* Pass messages using crossFrame.invoke instead of contentWindow.postMessage
* Set up async handlers
* Simplify configure call and response
* Remove bindings
* Fast exit if same window
* Simplify selector
* Rename functions, reuse _getFrameOffsetParent
* Update message style
* Send reply message to a specific frame
* Create FrameClient and FrameEndpoint
* Use new Frame* classes for Popup=>frame connection
* Update api.sendMessageToFrame and api.broadcastTab to include the sender's frameId
* Update FrameClient to store the frame's frameId
* Change getOrCreatePopup arguments to be an object
* Add ownerFrameId to popup and DisplayFloat
* Refactor DisplayFloat host action invocation
* Use CrossFrameAPI instead of window.postMessage
* Update popup closing functionality on the search page
* Organize by public/private
* Don't access super class's private members
* Make _autoPlayAudioTimer private
* Refactor constructors
* Make functions private
* Organize by public/private
* Organize window message handlers
* Make fields private
* Refactor DisplaySearch constructor
* Make functions private
* Organize by public/private
* Remove statics
* Move orphan detection and error handling to Display
* Add clearContent function
* Add/use public get/set functions for optionsContext
* Add public getOptions
* Move interactive assignment
* Mark fields as private
* Mark functions as private
* Change stray getter into a function
* Add page exit prevention functionality to SettingsController
* Update dictionary controller to use new page exit prevention system
* Remove page-exit-prevention.js
* Add clone function
* Replace utilIsolate with clone
* Replace JsonSchema.isolate with clone function
* Include core.js for tests which use json-schema.js
* Update visisted set
* Move "yomichan" object setup to a separate file
* Update script imports
* Align message handlers
* Rename Yomichan.prepare to Yomichan.ready
* Add new prepare function
* Improve isExtensionUrl
* Add support for injecting stylesheets into a custom parent node
* Add api.getStylesheetContent
* Add support for injecting a CSS file's content
* Add usePopupShadowDom option
* Use a per-parentNode cache
* Add support for using a shadow DOM wrapper around popup iframes
* Ignore the popup container instead of the frame
* Create member functions for ignoreElements and ignorePoint
* Create addFullscreenChangeEventListener utility
* Move popup creation management into Frontend
* Move getUrl implementation
* Remove old setup
* Remove try/catch block
* Error wrap
* Add prepare call to TextScanner
* Update depth when popup changes
* Refactor how Frontend gets PopupFactory and frameId
* Update popup preview to work
* Update popup preview frame to use the frontend's popup
* Update how nested popups are set up
* Error wrap
* Update how popups are set up on the search page
* Error wrap
* Error unwrap
* Add missing prepare
* Remove use of frontendInitializationData
* Catch and log errors
* Update test
* Rename db to _db
* Create GenericDatabase class
* Catch prepare error
* Allow database to be purged even if it was not open
* Remove unused functions
* Change static functions to non-static
* Delete and count using the media object store
* Update tests
* Add link to the help button
* Update context.html to not use bootstrap
Styles moved into a separate file
Update icons
* Update terminology to correspond to new icons