#include "base/logging.h"
#include "chrome/common/url_constants.h"
+#include "content/public/browser/render_frame_host.h"
#include "extensions/common/constants.h"
namespace extensions {
// URL schemes for which we'll send events.
const char* kValidSchemes[] = {
- chrome::kChromeUIScheme,
- content::kHttpScheme,
- content::kHttpsScheme,
- content::kFileScheme,
- content::kFtpScheme,
- content::kJavaScriptScheme,
- content::kDataScheme,
- content::kFileSystemScheme,
+ content::kChromeUIScheme,
+ url::kHttpScheme,
+ url::kHttpsScheme,
+ url::kFileScheme,
+ url::kFtpScheme,
+ url::kJavaScriptScheme,
+ url::kDataScheme,
+ url::kFileSystemScheme,
};
} // namespace
-FrameNavigationState::FrameID::FrameID()
- : frame_num(-1),
- render_view_host(NULL) {
-}
-
-FrameNavigationState::FrameID::FrameID(
- int64 frame_num,
- content::RenderViewHost* render_view_host)
- : frame_num(frame_num),
- render_view_host(render_view_host) {
-}
-
-bool FrameNavigationState::FrameID::operator<(
- const FrameNavigationState::FrameID& other) const {
- return frame_num < other.frame_num ||
- (frame_num == other.frame_num &&
- render_view_host < other.render_view_host);
-}
-
-bool FrameNavigationState::FrameID::operator==(
- const FrameNavigationState::FrameID& other) const {
- return frame_num == other.frame_num &&
- render_view_host == other.render_view_host;
-}
-
-bool FrameNavigationState::FrameID::operator!=(
- const FrameNavigationState::FrameID& other) const {
- return !(*this == other);
-}
-
FrameNavigationState::FrameState::FrameState() {}
// static
bool FrameNavigationState::allow_extension_scheme_ = false;
-FrameNavigationState::FrameNavigationState() {}
+FrameNavigationState::FrameNavigationState() : main_frame_host_(NULL) {
+}
FrameNavigationState::~FrameNavigationState() {}
-bool FrameNavigationState::CanSendEvents(FrameID frame_id) const {
- FrameIdToStateMap::const_iterator frame_state =
- frame_state_map_.find(frame_id);
- if (frame_state == frame_state_map_.end() ||
- frame_state->second.error_occurred) {
+bool FrameNavigationState::CanSendEvents(
+ content::RenderFrameHost* frame_host) const {
+ FrameHostToStateMap::const_iterator it =
+ frame_host_state_map_.find(frame_host);
+ if (it == frame_host_state_map_.end() || it->second.error_occurred) {
return false;
}
- return IsValidUrl(frame_state->second.url);
+ return IsValidUrl(it->second.url);
}
bool FrameNavigationState::IsValidUrl(const GURL& url) const {
return true;
}
// Allow about:blank and about:srcdoc.
- if (url.spec() == content::kAboutBlankURL ||
+ if (url.spec() == url::kAboutBlankURL ||
url.spec() == content::kAboutSrcDocURL) {
return true;
}
- if (allow_extension_scheme_ && url.scheme() == extensions::kExtensionScheme)
- return true;
- return false;
+ return allow_extension_scheme_ && url.scheme() == kExtensionScheme;
}
-void FrameNavigationState::TrackFrame(FrameID frame_id,
- FrameID parent_frame_id,
+void FrameNavigationState::TrackFrame(content::RenderFrameHost* frame_host,
const GURL& url,
- bool is_main_frame,
bool is_error_page,
bool is_iframe_srcdoc) {
- FrameState& frame_state = frame_state_map_[frame_id];
+ FrameState& frame_state = frame_host_state_map_[frame_host];
frame_state.error_occurred = is_error_page;
frame_state.url = url;
- frame_state.is_main_frame = is_main_frame;
frame_state.is_iframe_srcdoc = is_iframe_srcdoc;
- DCHECK(!is_iframe_srcdoc || url == GURL(content::kAboutBlankURL));
+ DCHECK(!is_iframe_srcdoc || url == GURL(url::kAboutBlankURL));
frame_state.is_navigating = true;
frame_state.is_committed = false;
frame_state.is_server_redirected = false;
frame_state.is_parsing = true;
- if (!is_main_frame) {
- frame_state.parent_frame_num = parent_frame_id.frame_num;
- } else {
- DCHECK(parent_frame_id.frame_num == -1);
- frame_state.parent_frame_num = -1;
- }
- frame_ids_.insert(frame_id);
+ frame_hosts_.insert(frame_host);
}
-void FrameNavigationState::FrameDetached(FrameID frame_id) {
- FrameIdToStateMap::const_iterator frame_state =
- frame_state_map_.find(frame_id);
- if (frame_state == frame_state_map_.end())
- return;
- if (frame_id == main_frame_id_)
- main_frame_id_ = FrameID();
- frame_state_map_.erase(frame_id);
- frame_ids_.erase(frame_id);
-#ifndef NDEBUG
- // Check that the deleted frame was not the parent of any other frame. WebKit
- // should always detach frames starting with the children.
- for (FrameIdToStateMap::const_iterator frame = frame_state_map_.begin();
- frame != frame_state_map_.end(); ++frame) {
- if (frame->first.render_view_host != frame_id.render_view_host)
- continue;
- if (frame->second.parent_frame_num != frame_id.frame_num)
- continue;
- NOTREACHED();
- }
-#endif
+void FrameNavigationState::FrameDetached(content::RenderFrameHost* frame_host) {
+ if (frame_host == main_frame_host_)
+ main_frame_host_ = NULL;
+ frame_host_state_map_.erase(frame_host);
+ frame_hosts_.erase(frame_host);
}
void FrameNavigationState::StopTrackingFramesInRVH(
content::RenderViewHost* render_view_host,
- FrameID id_to_skip) {
- for (std::set<FrameID>::iterator frame = frame_ids_.begin();
- frame != frame_ids_.end();) {
- if (frame->render_view_host != render_view_host || *frame == id_to_skip) {
- ++frame;
+ content::RenderFrameHost* frame_host_to_skip) {
+ for (std::set<content::RenderFrameHost*>::iterator it = frame_hosts_.begin();
+ it != frame_hosts_.end();) {
+ if ((*it)->GetRenderViewHost() != render_view_host ||
+ *it == frame_host_to_skip) {
+ ++it;
continue;
}
- FrameID frame_id = *frame;
- ++frame;
- if (frame_id == main_frame_id_)
- main_frame_id_ = FrameID();
- frame_state_map_.erase(frame_id);
- frame_ids_.erase(frame_id);
+ if (*it == main_frame_host_)
+ main_frame_host_ = NULL;
+ frame_host_state_map_.erase(*it);
+ frame_hosts_.erase(it++);
}
}
-void FrameNavigationState::UpdateFrame(FrameID frame_id, const GURL& url) {
- FrameIdToStateMap::iterator frame_state = frame_state_map_.find(frame_id);
- if (frame_state == frame_state_map_.end()) {
+void FrameNavigationState::UpdateFrame(content::RenderFrameHost* frame_host,
+ const GURL& url) {
+ FrameHostToStateMap::iterator it = frame_host_state_map_.find(frame_host);
+ if (it == frame_host_state_map_.end()) {
NOTREACHED();
return;
}
- frame_state->second.url = url;
+ it->second.url = url;
}
-bool FrameNavigationState::IsValidFrame(FrameID frame_id) const {
- FrameIdToStateMap::const_iterator frame_state =
- frame_state_map_.find(frame_id);
- return (frame_state != frame_state_map_.end());
+bool FrameNavigationState::IsValidFrame(
+ content::RenderFrameHost* frame_host) const {
+ return frame_host_state_map_.find(frame_host) != frame_host_state_map_.end();
}
-GURL FrameNavigationState::GetUrl(FrameID frame_id) const {
- FrameIdToStateMap::const_iterator frame_state =
- frame_state_map_.find(frame_id);
- if (frame_state == frame_state_map_.end()) {
+GURL FrameNavigationState::GetUrl(content::RenderFrameHost* frame_host) const {
+ FrameHostToStateMap::const_iterator it =
+ frame_host_state_map_.find(frame_host);
+ if (it == frame_host_state_map_.end()) {
NOTREACHED();
return GURL();
}
- if (frame_state->second.is_iframe_srcdoc)
+ if (it->second.is_iframe_srcdoc)
return GURL(content::kAboutSrcDocURL);
- return frame_state->second.url;
+ return it->second.url;
}
-bool FrameNavigationState::IsMainFrame(FrameID frame_id) const {
- FrameIdToStateMap::const_iterator frame_state =
- frame_state_map_.find(frame_id);
- return (frame_state != frame_state_map_.end() &&
- frame_state->second.is_main_frame);
+content::RenderFrameHost* FrameNavigationState::GetLastCommittedMainFrameHost()
+ const {
+ return main_frame_host_;
}
-FrameNavigationState::FrameID FrameNavigationState::GetMainFrameID() const {
- return main_frame_id_;
-}
-
-FrameNavigationState::FrameID FrameNavigationState::GetParentFrameID(
- FrameID frame_id) const {
- FrameIdToStateMap::const_iterator frame_state =
- frame_state_map_.find(frame_id);
- if (frame_state == frame_state_map_.end()) {
+void FrameNavigationState::SetErrorOccurredInFrame(
+ content::RenderFrameHost* frame_host) {
+ FrameHostToStateMap::iterator it = frame_host_state_map_.find(frame_host);
+ if (it == frame_host_state_map_.end()) {
NOTREACHED();
- return FrameID();
+ return;
}
- return FrameID(frame_state->second.parent_frame_num,
- frame_id.render_view_host);
-}
-
-void FrameNavigationState::SetErrorOccurredInFrame(FrameID frame_id) {
- DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end());
- frame_state_map_[frame_id].error_occurred = true;
+ it->second.error_occurred = true;
}
-bool FrameNavigationState::GetErrorOccurredInFrame(FrameID frame_id) const {
- FrameIdToStateMap::const_iterator frame_state =
- frame_state_map_.find(frame_id);
- return (frame_state == frame_state_map_.end() ||
- frame_state->second.error_occurred);
+bool FrameNavigationState::GetErrorOccurredInFrame(
+ content::RenderFrameHost* frame_host) const {
+ FrameHostToStateMap::const_iterator it =
+ frame_host_state_map_.find(frame_host);
+ DCHECK(it != frame_host_state_map_.end());
+ return it == frame_host_state_map_.end() || it->second.error_occurred;
}
-void FrameNavigationState::SetNavigationCompleted(FrameID frame_id) {
- DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end());
- frame_state_map_[frame_id].is_navigating = false;
+void FrameNavigationState::SetNavigationCompleted(
+ content::RenderFrameHost* frame_host) {
+ FrameHostToStateMap::iterator it = frame_host_state_map_.find(frame_host);
+ if (it == frame_host_state_map_.end()) {
+ NOTREACHED();
+ return;
+ }
+ it->second.is_navigating = false;
}
-bool FrameNavigationState::GetNavigationCompleted(FrameID frame_id) const {
- FrameIdToStateMap::const_iterator frame_state =
- frame_state_map_.find(frame_id);
- return (frame_state == frame_state_map_.end() ||
- !frame_state->second.is_navigating);
+bool FrameNavigationState::GetNavigationCompleted(
+ content::RenderFrameHost* frame_host) const {
+ FrameHostToStateMap::const_iterator it =
+ frame_host_state_map_.find(frame_host);
+ DCHECK(it != frame_host_state_map_.end());
+ return it == frame_host_state_map_.end() || !it->second.is_navigating;
}
-void FrameNavigationState::SetParsingFinished(FrameID frame_id) {
- DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end());
- frame_state_map_[frame_id].is_parsing = false;
+void FrameNavigationState::SetParsingFinished(
+ content::RenderFrameHost* frame_host) {
+ FrameHostToStateMap::iterator it = frame_host_state_map_.find(frame_host);
+ if (it == frame_host_state_map_.end()) {
+ NOTREACHED();
+ return;
+ }
+ it->second.is_parsing = false;
}
-bool FrameNavigationState::GetParsingFinished(FrameID frame_id) const {
- FrameIdToStateMap::const_iterator frame_state =
- frame_state_map_.find(frame_id);
- return (frame_state == frame_state_map_.end() ||
- !frame_state->second.is_parsing);
+bool FrameNavigationState::GetParsingFinished(
+ content::RenderFrameHost* frame_host) const {
+ FrameHostToStateMap::const_iterator it =
+ frame_host_state_map_.find(frame_host);
+ DCHECK(it != frame_host_state_map_.end());
+ return it == frame_host_state_map_.end() || !it->second.is_parsing;
}
-void FrameNavigationState::SetNavigationCommitted(FrameID frame_id) {
- DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end());
- frame_state_map_[frame_id].is_committed = true;
- if (frame_state_map_[frame_id].is_main_frame)
- main_frame_id_ = frame_id;
+void FrameNavigationState::SetNavigationCommitted(
+ content::RenderFrameHost* frame_host) {
+ FrameHostToStateMap::iterator it = frame_host_state_map_.find(frame_host);
+ if (it == frame_host_state_map_.end()) {
+ NOTREACHED();
+ return;
+ }
+ it->second.is_committed = true;
+ if (!frame_host->GetParent())
+ main_frame_host_ = frame_host;
}
-bool FrameNavigationState::GetNavigationCommitted(FrameID frame_id) const {
- FrameIdToStateMap::const_iterator frame_state =
- frame_state_map_.find(frame_id);
- return (frame_state != frame_state_map_.end() &&
- frame_state->second.is_committed);
+bool FrameNavigationState::GetNavigationCommitted(
+ content::RenderFrameHost* frame_host) const {
+ FrameHostToStateMap::const_iterator it =
+ frame_host_state_map_.find(frame_host);
+ DCHECK(it != frame_host_state_map_.end());
+ return it != frame_host_state_map_.end() && it->second.is_committed;
}
-void FrameNavigationState::SetIsServerRedirected(FrameID frame_id) {
- DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end());
- frame_state_map_[frame_id].is_server_redirected = true;
+void FrameNavigationState::SetIsServerRedirected(
+ content::RenderFrameHost* frame_host) {
+ FrameHostToStateMap::iterator it = frame_host_state_map_.find(frame_host);
+ if (it == frame_host_state_map_.end()) {
+ NOTREACHED();
+ return;
+ }
+ it->second.is_server_redirected = true;
}
-bool FrameNavigationState::GetIsServerRedirected(FrameID frame_id) const {
- FrameIdToStateMap::const_iterator frame_state =
- frame_state_map_.find(frame_id);
- return (frame_state != frame_state_map_.end() &&
- frame_state->second.is_server_redirected);
+bool FrameNavigationState::GetIsServerRedirected(
+ content::RenderFrameHost* frame_host) const {
+ FrameHostToStateMap::const_iterator it =
+ frame_host_state_map_.find(frame_host);
+ DCHECK(it != frame_host_state_map_.end());
+ return it != frame_host_state_map_.end() && it->second.is_server_redirected;
}
} // namespace extensions