nsEventStates Link::LinkState() const { // We are a constant method, but we are just lazily doing things and have to // track that state. Cast away that constness! Link *self = const_cast<Link *>(this); // If we are not in the document, default to not visited. Element *element = self->mElement; if (!element->IsInDoc()) { self->mLinkState = eLinkState_Unvisited; } // If we have not yet registered for notifications and are in an unknown // state, register now! if (!mRegistered && mLinkState == eLinkState_Unknown) { // First, make sure the href attribute has a valid link (bug 23209). nsCOMPtr<nsIURI> hrefURI(GetURI()); if (!hrefURI) { self->mLinkState = eLinkState_NotLink; return nsEventStates(); } // Assume that we are not visited until we are told otherwise. self->mLinkState = eLinkState_Unvisited; // We have a good href, so register with History. if (mHistory) { nsresult rv = mHistory->RegisterVisitedCallback(hrefURI, self); if (NS_SUCCEEDED(rv)) { self->mRegistered = true; // And make sure we are in the document's link map. nsIDocument *doc = element->GetCurrentDoc(); if (doc) { doc->AddStyleRelevantLink(self); } } } } // Otherwise, return our known state. if (mLinkState == eLinkState_Visited) { return NS_EVENT_STATE_VISITED; } if (mLinkState == eLinkState_Unvisited) { return NS_EVENT_STATE_UNVISITED; } return nsEventStates(); }
EventStates Link::LinkState() const { // We are a constant method, but we are just lazily doing things and have to // track that state. Cast away that constness! Link *self = const_cast<Link *>(this); Element *element = self->mElement; // If we have not yet registered for notifications and need to, // due to our href changing, register now! if (!mRegistered && mNeedsRegistration && element->IsInComposedDoc()) { // Only try and register once. self->mNeedsRegistration = false; nsCOMPtr<nsIURI> hrefURI(GetURI()); // Assume that we are not visited until we are told otherwise. self->mLinkState = eLinkState_Unvisited; // Make sure the href attribute has a valid link (bug 23209). // If we have a good href, register with History if available. if (mHistory && hrefURI) { nsresult rv = mHistory->RegisterVisitedCallback(hrefURI, self); if (NS_SUCCEEDED(rv)) { self->mRegistered = true; // And make sure we are in the document's link map. element->GetComposedDoc()->AddStyleRelevantLink(self); } } } // Otherwise, return our known state. if (mLinkState == eLinkState_Visited) { return NS_EVENT_STATE_VISITED; } if (mLinkState == eLinkState_Unvisited) { return NS_EVENT_STATE_UNVISITED; } return EventStates(); }