visibility state should transition to hidden whenever a page might go away. Unlike unload/pagehide, we can fire these reliably. See https://github.com/w3c/page-visibility/issues/18 for more details, particularly, igrigorik's table near the top that shows where browser's don't fire this. The Firefox behavior of having green for all of the visibility-change-->hidden column is the one that matches the spec and makes for the best developer platform.
Ryosuke, are you the right person on WebKit to talk to about this?
FWIW, test page: http://output.jsbin.com/zubiyid/latest/quiet - load it, unload the page and visit it again.
Related issue https://bugs.webkit.org/show_bug.cgi?id=151610, and some additional context: https://www.igvita.com/2015/11/20/dont-lose-user-and-app-state-use-page-visibility/