@joshdmiller Canceling a ```$timeout``` that doesn't exist simply returns false, though I agree checking if the tooltip is open first allows for more efficient execution and could avoid an unnecessary ```$timeout```.

@pkozlowski-opensource The leak this fix addresses is data retained in the ```angular.element.cache``` that remains after the parent element is removed. Calling ```.remove``` clears the data stored in the angular.element.cache for the element it is called on. Therefore, calling ```tooltip.remove()``` removes the data for the tooltip element in the ```angular.element.cache``` in the case that ```tooltip.remove()``` was not called before.

In regards to calling ```$destroy``` instead of ```.remove``` in the test, I don't see that as contrived. My understanding is calling ```.remove``` on an element will not destroy it's associated scope. I think it should be the responsibility of a parent scope to call ```$destroy``` when necessary, which will cascade to the children.

FYI, I have updated the pull request with @joshdmiller recommended change.