Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Implements the Chrome Extensions WebNavigation API. | 5 // Implements the Chrome Extensions WebNavigation API. |
| 6 | 6 |
| 7 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h" | 7 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h" |
| 8 | 8 |
| 9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
| 10 #include "chrome/browser/chrome_notification_types.h" | 10 #include "chrome/browser/chrome_notification_types.h" |
| 11 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api_consta nts.h" | 11 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api_consta nts.h" |
| 12 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api_helper s.h" | 12 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api_helper s.h" |
| 13 #include "chrome/browser/extensions/extension_tab_util.h" | 13 #include "chrome/browser/extensions/extension_tab_util.h" |
| 14 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" |
| 15 #include "chrome/browser/tab_contents/retargeting_details.h" | |
| 16 #include "chrome/browser/ui/browser.h" | 15 #include "chrome/browser/ui/browser.h" |
| 17 #include "chrome/browser/ui/browser_list.h" | 16 #include "chrome/browser/ui/browser_list.h" |
| 18 #include "chrome/common/extensions/api/web_navigation.h" | 17 #include "chrome/common/extensions/api/web_navigation.h" |
| 19 #include "content/public/browser/navigation_details.h" | 18 #include "content/public/browser/navigation_details.h" |
| 20 #include "content/public/browser/navigation_handle.h" | 19 #include "content/public/browser/navigation_handle.h" |
| 21 #include "content/public/browser/notification_service.h" | 20 #include "content/public/browser/notification_service.h" |
| 22 #include "content/public/browser/notification_types.h" | 21 #include "content/public/browser/notification_types.h" |
| 23 #include "content/public/browser/render_frame_host.h" | 22 #include "content/public/browser/render_frame_host.h" |
| 24 #include "content/public/browser/render_process_host.h" | 23 #include "content/public/browser/render_process_host.h" |
| 25 #include "content/public/browser/resource_request_details.h" | 24 #include "content/public/browser/resource_request_details.h" |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 69 target_web_contents(target_web_contents), | 68 target_web_contents(target_web_contents), |
| 70 target_url(target_url) { | 69 target_url(target_url) { |
| 71 } | 70 } |
| 72 | 71 |
| 73 WebNavigationEventRouter::PendingWebContents::~PendingWebContents() {} | 72 WebNavigationEventRouter::PendingWebContents::~PendingWebContents() {} |
| 74 | 73 |
| 75 WebNavigationEventRouter::WebNavigationEventRouter(Profile* profile) | 74 WebNavigationEventRouter::WebNavigationEventRouter(Profile* profile) |
| 76 : profile_(profile), browser_tab_strip_tracker_(this, this, nullptr) { | 75 : profile_(profile), browser_tab_strip_tracker_(this, this, nullptr) { |
| 77 CHECK(registrar_.IsEmpty()); | 76 CHECK(registrar_.IsEmpty()); |
| 78 registrar_.Add(this, | 77 registrar_.Add(this, |
| 79 chrome::NOTIFICATION_RETARGETING, | |
| 80 content::NotificationService::AllSources()); | |
| 81 registrar_.Add(this, | |
| 82 chrome::NOTIFICATION_TAB_ADDED, | 78 chrome::NOTIFICATION_TAB_ADDED, |
| 83 content::NotificationService::AllSources()); | 79 content::NotificationService::AllSources()); |
| 84 registrar_.Add(this, | 80 registrar_.Add(this, |
| 85 content::NOTIFICATION_WEB_CONTENTS_DESTROYED, | 81 content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
| 86 content::NotificationService::AllSources()); | 82 content::NotificationService::AllSources()); |
| 87 | 83 |
| 88 browser_tab_strip_tracker_.Init( | 84 browser_tab_strip_tracker_.Init( |
| 89 BrowserTabStripTracker::InitWith::ALL_BROWERS); | 85 BrowserTabStripTracker::InitWith::ALL_BROWERS); |
| 90 } | 86 } |
| 91 | 87 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 114 return; | 110 return; |
| 115 | 111 |
| 116 helpers::DispatchOnTabReplaced(old_contents, profile_, new_contents); | 112 helpers::DispatchOnTabReplaced(old_contents, profile_, new_contents); |
| 117 } | 113 } |
| 118 | 114 |
| 119 void WebNavigationEventRouter::Observe( | 115 void WebNavigationEventRouter::Observe( |
| 120 int type, | 116 int type, |
| 121 const content::NotificationSource& source, | 117 const content::NotificationSource& source, |
| 122 const content::NotificationDetails& details) { | 118 const content::NotificationDetails& details) { |
| 123 switch (type) { | 119 switch (type) { |
| 124 case chrome::NOTIFICATION_RETARGETING: { | |
| 125 Profile* profile = content::Source<Profile>(source).ptr(); | |
| 126 if (profile->GetOriginalProfile() == profile_) { | |
| 127 Retargeting( | |
| 128 content::Details<const RetargetingDetails>(details).ptr()); | |
| 129 } | |
| 130 break; | |
| 131 } | |
| 132 | 120 |
| 133 case chrome::NOTIFICATION_TAB_ADDED: | 121 case chrome::NOTIFICATION_TAB_ADDED: |
| 134 TabAdded(content::Details<content::WebContents>(details).ptr()); | 122 TabAdded(content::Details<content::WebContents>(details).ptr()); |
| 135 break; | 123 break; |
| 136 | 124 |
| 137 case content::NOTIFICATION_WEB_CONTENTS_DESTROYED: | 125 case content::NOTIFICATION_WEB_CONTENTS_DESTROYED: |
| 138 TabDestroyed(content::Source<content::WebContents>(source).ptr()); | 126 TabDestroyed(content::Source<content::WebContents>(source).ptr()); |
| 139 break; | 127 break; |
| 140 | 128 |
| 141 default: | 129 default: |
| 142 NOTREACHED(); | 130 NOTREACHED(); |
| 143 } | 131 } |
| 144 } | 132 } |
| 145 | 133 |
| 146 void WebNavigationEventRouter::Retargeting(const RetargetingDetails* details) { | 134 void WebNavigationEventRouter::RecordNewWebContents( |
| 147 if (details->source_render_frame_id == 0) | 135 content::WebContents* source_web_contents, |
| 136 int source_render_process_id, | |
| 137 int64_t source_render_frame_id, | |
|
nasko
2017/03/01 00:48:37
nit: Why use int64_t when the routing id is just a
Patrick Noland
2017/03/01 00:57:09
No clue, I copied this from RetargetingDetails. I'
Patrick Noland
2017/03/01 23:58:59
Done.
| |
| 138 GURL target_url, | |
| 139 content::WebContents* target_web_contents, | |
| 140 bool not_yet_in_tabstrip) { | |
| 141 if (source_render_frame_id == 0) | |
| 148 return; | 142 return; |
| 149 WebNavigationTabObserver* tab_observer = | 143 WebNavigationTabObserver* tab_observer = |
| 150 WebNavigationTabObserver::Get(details->source_web_contents); | 144 WebNavigationTabObserver::Get(source_web_contents); |
| 151 if (!tab_observer) { | 145 if (!tab_observer) { |
| 152 // If you hit this DCHECK(), please add reproduction steps to | 146 // If you hit this DCHECK(), please add reproduction steps to |
| 153 // http://crbug.com/109464. | 147 // http://crbug.com/109464. |
| 154 DCHECK(GetViewType(details->source_web_contents) != VIEW_TYPE_TAB_CONTENTS); | 148 DCHECK(GetViewType(source_web_contents) != VIEW_TYPE_TAB_CONTENTS); |
| 155 return; | 149 return; |
| 156 } | 150 } |
| 157 const FrameNavigationState& frame_navigation_state = | 151 const FrameNavigationState& frame_navigation_state = |
| 158 tab_observer->frame_navigation_state(); | 152 tab_observer->frame_navigation_state(); |
| 159 | 153 |
| 160 content::RenderFrameHost* frame_host = content::RenderFrameHost::FromID( | 154 content::RenderFrameHost* frame_host = content::RenderFrameHost::FromID( |
| 161 details->source_render_process_id, details->source_render_frame_id); | 155 source_render_process_id, source_render_frame_id); |
| 162 if (!frame_navigation_state.CanSendEvents(frame_host)) | 156 if (!frame_navigation_state.CanSendEvents(frame_host)) |
| 163 return; | 157 return; |
| 164 | 158 |
| 165 // If the WebContents isn't yet inserted into a tab strip, we need to delay | 159 // If the WebContents isn't yet inserted into a tab strip, we need to delay |
| 166 // the extension event until the WebContents is fully initialized. | 160 // the extension event until the WebContents is fully initialized. |
| 167 if (details->not_yet_in_tabstrip) { | 161 if (not_yet_in_tabstrip) { |
| 168 pending_web_contents_[details->target_web_contents] = | 162 pending_web_contents_[target_web_contents] = PendingWebContents( |
| 169 PendingWebContents(details->source_web_contents, | 163 source_web_contents, frame_host, target_web_contents, target_url); |
| 170 frame_host, | |
| 171 details->target_web_contents, | |
| 172 details->target_url); | |
| 173 } else { | 164 } else { |
| 174 helpers::DispatchOnCreatedNavigationTarget( | 165 helpers::DispatchOnCreatedNavigationTarget( |
| 175 details->source_web_contents, | 166 source_web_contents, target_web_contents->GetBrowserContext(), |
| 176 details->target_web_contents->GetBrowserContext(), | 167 frame_host, target_web_contents, target_url); |
| 177 frame_host, | |
| 178 details->target_web_contents, | |
| 179 details->target_url); | |
| 180 } | 168 } |
| 181 } | 169 } |
| 182 | 170 |
| 183 void WebNavigationEventRouter::TabAdded(content::WebContents* tab) { | 171 void WebNavigationEventRouter::TabAdded(content::WebContents* tab) { |
| 184 std::map<content::WebContents*, PendingWebContents>::iterator iter = | 172 std::map<content::WebContents*, PendingWebContents>::iterator iter = |
| 185 pending_web_contents_.find(tab); | 173 pending_web_contents_.find(tab); |
| 186 if (iter == pending_web_contents_.end()) | 174 if (iter == pending_web_contents_.end()) |
| 187 return; | 175 return; |
| 188 | 176 |
| 189 WebNavigationTabObserver* tab_observer = | 177 WebNavigationTabObserver* tab_observer = |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 377 navigation_state_.SetErrorOccurredInFrame(render_frame_host); | 365 navigation_state_.SetErrorOccurredInFrame(render_frame_host); |
| 378 } | 366 } |
| 379 | 367 |
| 380 void WebNavigationTabObserver::DidOpenRequestedURL( | 368 void WebNavigationTabObserver::DidOpenRequestedURL( |
| 381 content::WebContents* new_contents, | 369 content::WebContents* new_contents, |
| 382 content::RenderFrameHost* source_render_frame_host, | 370 content::RenderFrameHost* source_render_frame_host, |
| 383 const GURL& url, | 371 const GURL& url, |
| 384 const content::Referrer& referrer, | 372 const content::Referrer& referrer, |
| 385 WindowOpenDisposition disposition, | 373 WindowOpenDisposition disposition, |
| 386 ui::PageTransition transition, | 374 ui::PageTransition transition, |
| 387 bool started_from_context_menu) { | 375 bool started_from_context_menu, |
| 376 bool not_yet_in_tabstrip) { | |
| 388 if (!navigation_state_.CanSendEvents(source_render_frame_host)) | 377 if (!navigation_state_.CanSendEvents(source_render_frame_host)) |
| 389 return; | 378 return; |
| 390 | 379 |
| 391 // We only send the onCreatedNavigationTarget if we end up creating a new | 380 // We only send the onCreatedNavigationTarget if we end up creating a new |
| 392 // window. | 381 // window. |
| 393 if (disposition != WindowOpenDisposition::SINGLETON_TAB && | 382 if (disposition != WindowOpenDisposition::SINGLETON_TAB && |
| 394 disposition != WindowOpenDisposition::NEW_FOREGROUND_TAB && | 383 disposition != WindowOpenDisposition::NEW_FOREGROUND_TAB && |
| 395 disposition != WindowOpenDisposition::NEW_BACKGROUND_TAB && | 384 disposition != WindowOpenDisposition::NEW_BACKGROUND_TAB && |
| 396 disposition != WindowOpenDisposition::NEW_POPUP && | 385 disposition != WindowOpenDisposition::NEW_POPUP && |
| 397 disposition != WindowOpenDisposition::NEW_WINDOW && | 386 disposition != WindowOpenDisposition::NEW_WINDOW && |
| 398 disposition != WindowOpenDisposition::OFF_THE_RECORD) | 387 disposition != WindowOpenDisposition::OFF_THE_RECORD) |
| 399 return; | 388 return; |
| 400 | 389 |
| 401 helpers::DispatchOnCreatedNavigationTarget(web_contents(), | 390 WebNavigationAPI* api = WebNavigationAPI::GetFactoryInstance()->Get( |
| 402 new_contents->GetBrowserContext(), | 391 web_contents()->GetBrowserContext()); |
| 403 source_render_frame_host, | 392 if (api) { |
|
nasko
2017/03/01 00:48:37
Would api ever be null?
Patrick Noland
2017/03/01 00:57:09
I don't know enough to say for sure. The fact that
nasko
2017/03/01 18:36:31
Since you've added the flag, I expect this will ne
Patrick Noland
2017/03/01 23:58:59
Done.
| |
| 404 new_contents, | 393 WebNavigationEventRouter* router = api->web_navigation_event_router_.get(); |
| 405 url); | 394 if (router) { |
|
nasko
2017/03/01 00:48:37
Since this is the last code in the method, it is b
Patrick Noland
2017/03/01 23:58:59
Done.
| |
| 395 router->RecordNewWebContents( | |
| 396 web_contents(), source_render_frame_host->GetProcess()->GetID(), | |
| 397 source_render_frame_host->GetRoutingID(), url, new_contents, | |
| 398 not_yet_in_tabstrip); | |
| 399 } | |
| 400 } | |
| 406 } | 401 } |
| 407 | 402 |
| 408 void WebNavigationTabObserver::WebContentsDestroyed() { | 403 void WebNavigationTabObserver::WebContentsDestroyed() { |
| 409 g_tab_observer.Get().erase(web_contents()); | 404 g_tab_observer.Get().erase(web_contents()); |
| 410 registrar_.RemoveAll(); | 405 registrar_.RemoveAll(); |
| 411 } | 406 } |
| 412 | 407 |
| 413 void WebNavigationTabObserver::DispatchCachedOnBeforeNavigate() { | 408 void WebNavigationTabObserver::DispatchCachedOnBeforeNavigate() { |
| 414 if (!pending_on_before_navigate_event_) | 409 if (!pending_on_before_navigate_event_) |
| 415 return; | 410 return; |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 588 return g_factory.Pointer(); | 583 return g_factory.Pointer(); |
| 589 } | 584 } |
| 590 | 585 |
| 591 void WebNavigationAPI::OnListenerAdded(const EventListenerInfo& details) { | 586 void WebNavigationAPI::OnListenerAdded(const EventListenerInfo& details) { |
| 592 web_navigation_event_router_.reset(new WebNavigationEventRouter( | 587 web_navigation_event_router_.reset(new WebNavigationEventRouter( |
| 593 Profile::FromBrowserContext(browser_context_))); | 588 Profile::FromBrowserContext(browser_context_))); |
| 594 EventRouter::Get(browser_context_)->UnregisterObserver(this); | 589 EventRouter::Get(browser_context_)->UnregisterObserver(this); |
| 595 } | 590 } |
| 596 | 591 |
| 597 } // namespace extensions | 592 } // namespace extensions |
| OLD | NEW |