loadFromURL () {
    const self = this
    const { search, searchParams } = new URL(location)
    if (search) {
      this.urldata = {}
      const entries = searchParams.entries()
      for (const entry of entries) {
        this.urldata[entry[0]] = entry[1]
      }

      ['initStroke', 'initFill'].forEach((prop) => {
        if (searchParams.has(`${prop}[color]`)) {
          // Restore back to original non-deparamed value to avoid color
          //  strings being converted to numbers
          if (this.urldata[prop] === undefined) { this.urldata[prop] = {} }
          this.urldata[prop].color = searchParams.get(`${prop}[color]`)
        }
      })

      if (searchParams.has('bkgd_color')) {
        this.urldata.bkgd_color = '#' + searchParams.get('bkgd_color')
      }

      if (this.urldata.dimensions) {
        this.urldata.dimensions = this.urldata.dimensions.split(',')
      }

      if (this.urldata.extensions) {
        // For security reasons, disallow cross-domain or cross-folder
        //  extensions via URL
        this.urldata.extensions = (/[:/\\]/).test(this.urldata.extensions)
          ? ''
          : this.urldata.extensions.split(',')
      }

      // Disallowing extension paths via URL for
      // security reasons, even for same-domain
      // ones given potential to interact in undesirable
      // ways with other script resources
      ['userExtensions', 'imgPath']
        .forEach(function (pathConfig) {
          if (self.urldata[pathConfig]) {
            delete self.urldata[pathConfig]
          }
        })

      // Note: `source` and `url` (as with `storagePrompt` later) are not
      //  set on config but are used below
      this.setConfig(this.urldata, { overwrite: false })
      this.setupCurConfig()

      if (!this.curConfig.preventURLContentLoading) {
        let { source } = this.urldata
        if (!source) { // urldata.source may have been null if it ended with '='
          const src = searchParams.get('source')
          if (src?.startsWith('data:')) {
            source = src
          }
        }
        if (source) {
          if (source.startsWith('data:')) {
            this.editor.loadFromDataURI(source)
          } else {
            this.editor.loadFromString(source)
          }
          return
        }
        if (this.urldata.url) {
          this.editor.loadFromURL(this.urldata.url)
          return
        }
      }
      if (!this.urldata.noStorageOnLoad || this.curConfig.forceStorage) {
        this.loadContentAndPrefs()
      }
    } else {
      this.setupCurConfig()
      this.loadContentAndPrefs()
    }
  }
@function loadFromURL Load config/data from URL if given
@returns {void}