Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2177)

Unified Diff: content/renderer/render_frame_impl.cc

Issue 2902253003: Refactor UniqueNameHelper to use an adapter pattern for code sharing. (Closed)
Patch Set: Fix off by one bug Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/unique_name_helper.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/render_frame_impl.cc
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 3ca56c4a5a62aba13b2e82e4fe3d29e1ef8da93e..e36d88eaab223b1c5e3e9ed0fbd3ee57c7b3e821 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -907,6 +907,100 @@ struct RenderFrameImpl::PendingFileChooser {
blink::WebFileChooserCompletion* completion; // MAY BE NULL to skip callback.
};
+const std::string& UniqueNameForWebFrame(blink::WebFrame* frame) {
+ return frame->IsWebLocalFrame()
+ ? RenderFrameImpl::FromWebFrame(frame)->unique_name()
+ : RenderFrameProxy::FromWebFrame(frame)->unique_name();
+}
+
+RenderFrameImpl::UniqueNameFrameAdapter::UniqueNameFrameAdapter(
+ RenderFrameImpl* render_frame)
+ : render_frame_(render_frame) {}
+
+RenderFrameImpl::UniqueNameFrameAdapter::~UniqueNameFrameAdapter() {}
+
+bool RenderFrameImpl::UniqueNameFrameAdapter::IsMainFrame() const {
+ return render_frame_->IsMainFrame();
+}
+
+bool RenderFrameImpl::UniqueNameFrameAdapter::IsCandidateUnique(
+ const std::string& name) const {
+ // This method is currently O(N), where N = number of frames in the tree.
+ DCHECK(!name.empty());
+
+ for (blink::WebFrame* frame = GetWebFrame()->Top(); frame;
+ frame = frame->TraverseNext()) {
+ if (UniqueNameForWebFrame(frame) == name)
+ return false;
+ }
+
+ return true;
+}
+
+int RenderFrameImpl::UniqueNameFrameAdapter::GetSiblingCount() const {
+ int sibling_count = 0;
+ for (blink::WebFrame* frame = GetWebFrame()->Parent()->FirstChild(); frame;
+ frame = frame->NextSibling()) {
+ if (frame == GetWebFrame())
+ continue;
+ ++sibling_count;
+ }
+ return sibling_count;
+}
+
+int RenderFrameImpl::UniqueNameFrameAdapter::GetChildCount() const {
+ int child_count = 0;
+ for (blink::WebFrame* frame = GetWebFrame()->FirstChild(); frame;
+ frame = frame->NextSibling()) {
+ ++child_count;
+ }
+ return child_count;
+}
+
+std::vector<base::StringPiece>
+RenderFrameImpl::UniqueNameFrameAdapter::CollectAncestorNames(
+ BeginPoint begin_point,
+ bool (*should_stop)(base::StringPiece)) const {
+ std::vector<base::StringPiece> result;
+ for (blink::WebFrame* frame = begin_point == BeginPoint::kParentFrame
+ ? GetWebFrame()->Parent()
+ : GetWebFrame();
+ frame; frame = frame->Parent()) {
+ result.push_back(UniqueNameForWebFrame(frame));
+ if (should_stop(result.back()))
+ break;
+ }
+ return result;
+}
+
+std::vector<int> RenderFrameImpl::UniqueNameFrameAdapter::GetFramePosition(
+ BeginPoint begin_point) const {
+ std::vector<int> result;
+ blink::WebFrame* parent = begin_point == BeginPoint::kParentFrame
+ ? GetWebFrame()->Parent()
+ : GetWebFrame();
+ blink::WebFrame* child =
+ begin_point == BeginPoint::kParentFrame ? GetWebFrame() : nullptr;
+ while (parent) {
+ int position_in_parent = 0;
+ blink::WebFrame* sibling = parent->FirstChild();
+ while (sibling != child) {
+ sibling = sibling->NextSibling();
+ ++position_in_parent;
+ }
+ result.push_back(position_in_parent);
+
+ child = parent;
+ parent = parent->Parent();
+ }
+ return result;
+}
+
+blink::WebLocalFrame* RenderFrameImpl::UniqueNameFrameAdapter::GetWebFrame()
+ const {
+ return render_frame_->frame_;
+}
+
// static
RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view,
int32_t routing_id) {
@@ -1106,7 +1200,8 @@ blink::WebURL RenderFrameImpl::OverrideFlashEmbedWithHTML(
RenderFrameImpl::RenderFrameImpl(const CreateParams& params)
: frame_(NULL),
is_main_frame_(true),
- unique_name_helper_(this),
+ unique_name_frame_adapter_(this),
+ unique_name_helper_(&unique_name_frame_adapter_),
in_browser_initiated_detach_(false),
in_frame_tree_(false),
render_view_(params.render_view),
@@ -3140,6 +3235,8 @@ blink::WebLocalFrame* RenderFrameImpl::CreateChildFrame(
blink::WebSandboxFlags sandbox_flags,
const blink::WebParsedFeaturePolicy& container_policy,
const blink::WebFrameOwnerProperties& frame_owner_properties) {
+ DCHECK_EQ(frame_, parent);
+
// Synchronously notify the browser of a child frame creation to get the
// routing_id for the RenderFrame.
int child_routing_id = MSG_ROUTING_NONE;
@@ -3161,8 +3258,7 @@ blink::WebLocalFrame* RenderFrameImpl::CreateChildFrame(
// Note that Blink can't be changed to just pass |fallback_name| as |name| in
// the case |name| is empty: |fallback_name| should never affect the actual
// browsing context name, only unique name generation.
- params.frame_unique_name = UniqueNameHelper::GenerateNameForNewChildFrame(
- parent,
+ params.frame_unique_name = unique_name_helper_.GenerateNameForNewChildFrame(
params.frame_name.empty() ? fallback_name.Utf8() : params.frame_name);
params.sandbox_flags = sandbox_flags;
params.container_policy = FeaturePolicyHeaderFromWeb(container_policy);
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/unique_name_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698