| Index: third_party/WebKit/Source/core/page/Page.cpp
|
| diff --git a/third_party/WebKit/Source/core/page/Page.cpp b/third_party/WebKit/Source/core/page/Page.cpp
|
| index 4a083020409fba2b7999b1c52cfb1bf00e5c6589..1a12f7a059098223958b1aa4c38303d29dd1cf55 100644
|
| --- a/third_party/WebKit/Source/core/page/Page.cpp
|
| +++ b/third_party/WebKit/Source/core/page/Page.cpp
|
| @@ -78,6 +78,16 @@ Page::PageSet& Page::OrdinaryPages() {
|
| return pages;
|
| }
|
|
|
| +HeapVector<Member<Page>> Page::RelatedPages() {
|
| + HeapVector<Member<Page>> result;
|
| + Page* ptr = this->next_related_page_;
|
| + while (ptr != this) {
|
| + result.push_back(ptr);
|
| + ptr = ptr->next_related_page_;
|
| + }
|
| + return result;
|
| +}
|
| +
|
| float DeviceScaleFactorDeprecated(LocalFrame* frame) {
|
| if (!frame)
|
| return 1;
|
| @@ -87,8 +97,19 @@ float DeviceScaleFactorDeprecated(LocalFrame* frame) {
|
| return page->DeviceScaleFactorDeprecated();
|
| }
|
|
|
| -Page* Page::CreateOrdinary(PageClients& page_clients) {
|
| +Page* Page::CreateOrdinary(PageClients& page_clients, Page* opener) {
|
| Page* page = Create(page_clients);
|
| +
|
| + if (opener) {
|
| + // Before: ... -> opener -> next -> ...
|
| + // After: ... -> opener -> page -> next -> ...
|
| + Page* next = opener->next_related_page_;
|
| + opener->next_related_page_ = page;
|
| + page->prev_related_page_ = opener;
|
| + page->next_related_page_ = next;
|
| + next->prev_related_page_ = page;
|
| + }
|
| +
|
| OrdinaryPages().insert(page);
|
| if (ScopedPageSuspender::IsActive())
|
| page->SetSuspended(true);
|
| @@ -130,7 +151,9 @@ Page::Page(PageClients& page_clients)
|
| device_scale_factor_(1),
|
| visibility_state_(kPageVisibilityStateVisible),
|
| is_cursor_visible_(true),
|
| - subframe_count_(0) {
|
| + subframe_count_(0),
|
| + next_related_page_(this),
|
| + prev_related_page_(this) {
|
| DCHECK(editor_client_);
|
|
|
| DCHECK(!AllPages().Contains(this));
|
| @@ -639,6 +662,8 @@ DEFINE_TRACE(Page) {
|
| visitor->Trace(plugin_data_);
|
| visitor->Trace(validation_message_client_);
|
| visitor->Trace(use_counter_);
|
| + visitor->Trace(next_related_page_);
|
| + visitor->Trace(prev_related_page_);
|
| Supplementable<Page>::Trace(visitor);
|
| PageVisibilityNotifier::Trace(visitor);
|
| }
|
| @@ -667,6 +692,18 @@ void Page::WillBeDestroyed() {
|
| AllPages().erase(this);
|
| OrdinaryPages().erase(this);
|
|
|
| + {
|
| + // Before: ... -> prev -> this -> next -> ...
|
| + // After: ... -> prev -> next -> ...
|
| + // (this is ok even if |this| is the only element on the list).
|
| + Page* prev = this->prev_related_page_;
|
| + Page* next = this->next_related_page_;
|
| + next->prev_related_page_ = prev;
|
| + prev->next_related_page_ = next;
|
| + this->prev_related_page_ = nullptr;
|
| + this->next_related_page_ = nullptr;
|
| + }
|
| +
|
| if (scrolling_coordinator_)
|
| scrolling_coordinator_->WillBeDestroyed();
|
|
|
|
|