| 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);
|
|
|