I checked the event router code again.
In ApplicationEventRouter::AttachObserver, we directly call ObserverList's AddObserver
observers_[event_name]->AddObserver(observer);
which will trigger NOTREACHED() << "Observers can only be added once!"; when an observer is added more than once. To keep the JS API away from such risk, I think it's better keep the check in extension code.