<!DOCTYPE html>
<html>

  <head>
    <script data-require="zone.js@*" data-semver="0.4.1" src="https://cdn.rawgit.com/angular/zone.js/v0.8.11/dist/zone.js"></script>
    <script data-require="zone.js@*" data-semver="0.4.1" src="https://cdn.rawgit.com/angular/zone.js/v0.8.11/dist/long-stack-trace-zone.js"></script>
    <link rel="stylesheet" href="style.css" />
  </head>

  <body>
    <h1>Hello Zone!</h1>
    <button id="gen-error">Generate error</button>
    <button id="user-error">Generate user error</button>
    <div style="margin-top: 20px">
      All Messages
      <pre id="all-messages"></pre>
      User Messages
      <pre id="user-messages"></pre>
    </div>
    <script src="script.js"></script>
  </body>

</html>
// Code goes here

class UserError extends Error {
}

Zone.current.fork({ 
  onHandleError(parent, currentZone, targetZone, error) {
    document.getElementById('all-messages').textContent += error.message + '\n'
  }
}).run(() => {
  Zone.current.fork({ 
    onHandleError(parent, currentZone, targetZone, error) {
      if (error instanceof UserError) {
        document.getElementById('user-messages').textContent += error.message + '\n'
      } else {
        parent.handleError(targetZone, error)
      }
    }
  }).run(() => {
    document.getElementById('gen-error').addEventListener('click', () => {
      throw new Error('general error ' + Date.now())
    }, false)
    
    document.getElementById('user-error').addEventListener('click', () => {
      throw new UserError('user error ' + Date.now())
    }, false)
  })
})
/* Styles go here */