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

Side by Side Diff: chrome/browser/extensions/extension_webnavigation_api.cc

Issue 9068001: Merge 114806 - Include the information whether the tab is already in a tab strip with the retarge... (Closed) Base URL: svn://svn.chromium.org/chrome/branches/963/src/
Patch Set: Created 8 years, 11 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/extension_webnavigation_api.h" 7 #include "chrome/browser/extensions/extension_webnavigation_api.h"
8 8
9 #include "base/json/json_writer.h" 9 #include "base/json/json_writer.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
11 #include "base/string_number_conversions.h" 11 #include "base/string_number_conversions.h"
12 #include "base/time.h" 12 #include "base/time.h"
13 #include "base/values.h" 13 #include "base/values.h"
14 #include "chrome/browser/extensions/extension_event_router.h" 14 #include "chrome/browser/extensions/extension_event_router.h"
15 #include "chrome/browser/extensions/extension_tab_util.h" 15 #include "chrome/browser/extensions/extension_tab_util.h"
16 #include "chrome/browser/extensions/extension_webnavigation_api_constants.h" 16 #include "chrome/browser/extensions/extension_webnavigation_api_constants.h"
17 #include "chrome/browser/profiles/profile.h" 17 #include "chrome/browser/profiles/profile.h"
18 #include "chrome/browser/tab_contents/retargeting_details.h"
18 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 19 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
20 #include "chrome/common/chrome_notification_types.h"
19 #include "chrome/common/url_constants.h" 21 #include "chrome/common/url_constants.h"
20 #include "content/browser/tab_contents/navigation_details.h" 22 #include "content/browser/tab_contents/navigation_details.h"
21 #include "content/browser/tab_contents/tab_contents.h" 23 #include "content/browser/tab_contents/tab_contents.h"
22 #include "content/public/browser/notification_service.h" 24 #include "content/public/browser/notification_service.h"
23 #include "content/public/browser/notification_types.h" 25 #include "content/public/browser/notification_types.h"
24 #include "net/base/net_errors.h" 26 #include "net/base/net_errors.h"
25 27
26 namespace keys = extension_webnavigation_api_constants; 28 namespace keys = extension_webnavigation_api_constants;
27 29
28 namespace { 30 namespace {
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 } 166 }
165 167
166 // Constructs and dispatches an onCreatedNavigationTarget event. 168 // Constructs and dispatches an onCreatedNavigationTarget event.
167 void DispatchOnCreatedNavigationTarget( 169 void DispatchOnCreatedNavigationTarget(
168 TabContents* tab_contents, 170 TabContents* tab_contents,
169 content::BrowserContext* browser_context, 171 content::BrowserContext* browser_context,
170 int64 source_frame_id, 172 int64 source_frame_id,
171 bool source_frame_is_main_frame, 173 bool source_frame_is_main_frame,
172 TabContents* target_tab_contents, 174 TabContents* target_tab_contents,
173 const GURL& target_url) { 175 const GURL& target_url) {
176 // Check that the tab is already inserted into a tab strip model. This code
177 // path is exercised by ExtensionApiTest.WebNavigationRequestOpenTab.
178 DCHECK(ExtensionTabUtil::GetTabById(
179 ExtensionTabUtil::GetTabId(target_tab_contents),
180 Profile::FromBrowserContext(target_tab_contents->browser_context()),
181 false, NULL, NULL, NULL, NULL));
182
174 ListValue args; 183 ListValue args;
175 DictionaryValue* dict = new DictionaryValue(); 184 DictionaryValue* dict = new DictionaryValue();
176 dict->SetInteger(keys::kSourceTabIdKey, 185 dict->SetInteger(keys::kSourceTabIdKey,
177 ExtensionTabUtil::GetTabId(tab_contents)); 186 ExtensionTabUtil::GetTabId(tab_contents));
178 dict->SetInteger(keys::kSourceFrameIdKey, 187 dict->SetInteger(keys::kSourceFrameIdKey,
179 GetFrameId(source_frame_is_main_frame, source_frame_id)); 188 GetFrameId(source_frame_is_main_frame, source_frame_id));
180 dict->SetString(keys::kUrlKey, target_url.possibly_invalid_spec()); 189 dict->SetString(keys::kUrlKey, target_url.possibly_invalid_spec());
181 dict->SetInteger(keys::kTabIdKey, 190 dict->SetInteger(keys::kTabIdKey,
182 ExtensionTabUtil::GetTabId(target_tab_contents)); 191 ExtensionTabUtil::GetTabId(target_tab_contents));
183 dict->SetDouble(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now())); 192 dict->SetDouble(keys::kTimeStampKey, MilliSecondsFromTime(base::Time::Now()));
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 ExtensionWebNavigationEventRouter::PendingTabContents::~PendingTabContents() {} 365 ExtensionWebNavigationEventRouter::PendingTabContents::~PendingTabContents() {}
357 366
358 ExtensionWebNavigationEventRouter::ExtensionWebNavigationEventRouter( 367 ExtensionWebNavigationEventRouter::ExtensionWebNavigationEventRouter(
359 Profile* profile) : profile_(profile) {} 368 Profile* profile) : profile_(profile) {}
360 369
361 ExtensionWebNavigationEventRouter::~ExtensionWebNavigationEventRouter() {} 370 ExtensionWebNavigationEventRouter::~ExtensionWebNavigationEventRouter() {}
362 371
363 void ExtensionWebNavigationEventRouter::Init() { 372 void ExtensionWebNavigationEventRouter::Init() {
364 if (registrar_.IsEmpty()) { 373 if (registrar_.IsEmpty()) {
365 registrar_.Add(this, 374 registrar_.Add(this,
366 content::NOTIFICATION_RETARGETING, 375 chrome::NOTIFICATION_RETARGETING,
367 content::Source<content::BrowserContext>(profile_)); 376 content::Source<Profile>(profile_));
368 registrar_.Add(this, 377 registrar_.Add(this,
369 content::NOTIFICATION_TAB_ADDED, 378 content::NOTIFICATION_TAB_ADDED,
370 content::NotificationService::AllSources()); 379 content::NotificationService::AllSources());
371 registrar_.Add(this, 380 registrar_.Add(this,
372 content::NOTIFICATION_TAB_CONTENTS_DESTROYED, 381 content::NOTIFICATION_TAB_CONTENTS_DESTROYED,
373 content::NotificationService::AllSources()); 382 content::NotificationService::AllSources());
374 } 383 }
375 } 384 }
376 385
377 void ExtensionWebNavigationEventRouter::Observe( 386 void ExtensionWebNavigationEventRouter::Observe(
378 int type, 387 int type,
379 const content::NotificationSource& source, 388 const content::NotificationSource& source,
380 const content::NotificationDetails& details) { 389 const content::NotificationDetails& details) {
381 switch (type) { 390 switch (type) {
382 case content::NOTIFICATION_RETARGETING: 391 case chrome::NOTIFICATION_RETARGETING:
383 Retargeting( 392 Retargeting(
384 content::Details<const content::RetargetingDetails>(details).ptr()); 393 content::Details<const RetargetingDetails>(details).ptr());
385 break; 394 break;
386 395
387 case content::NOTIFICATION_TAB_ADDED: 396 case content::NOTIFICATION_TAB_ADDED:
388 TabAdded(content::Details<TabContents>(details).ptr()); 397 TabAdded(content::Details<TabContents>(details).ptr());
389 break; 398 break;
390 399
391 case content::NOTIFICATION_TAB_CONTENTS_DESTROYED: 400 case content::NOTIFICATION_TAB_CONTENTS_DESTROYED:
392 TabDestroyed(content::Source<TabContents>(source).ptr()); 401 TabDestroyed(content::Source<TabContents>(source).ptr());
393 break; 402 break;
394 403
395 default: 404 default:
396 NOTREACHED(); 405 NOTREACHED();
397 } 406 }
398 } 407 }
399 408
400 void ExtensionWebNavigationEventRouter::Retargeting( 409 void ExtensionWebNavigationEventRouter::Retargeting(
401 const content::RetargetingDetails* details) { 410 const RetargetingDetails* details) {
402 if (details->source_frame_id == 0) 411 if (details->source_frame_id == 0)
403 return; 412 return;
404 ExtensionWebNavigationTabObserver* tab_observer = 413 ExtensionWebNavigationTabObserver* tab_observer =
405 ExtensionWebNavigationTabObserver::Get(details->source_tab_contents); 414 ExtensionWebNavigationTabObserver::Get(details->source_tab_contents);
406 if (!tab_observer) { 415 if (!tab_observer) {
407 CHECK(details->source_tab_contents->GetRenderViewType() != 416 CHECK(details->source_tab_contents->GetRenderViewType() !=
408 content::VIEW_TYPE_TAB_CONTENTS); 417 content::VIEW_TYPE_TAB_CONTENTS);
409 return; 418 return;
410 } 419 }
411 const FrameNavigationState& frame_navigation_state = 420 const FrameNavigationState& frame_navigation_state =
412 tab_observer->frame_navigation_state(); 421 tab_observer->frame_navigation_state();
413 422
414 if (!frame_navigation_state.CanSendEvents(details->source_frame_id)) 423 if (!frame_navigation_state.CanSendEvents(details->source_frame_id))
415 return; 424 return;
416 425
417 // If the TabContents was created as a response to an IPC from a renderer, it 426 // If the TabContents was created as a response to an IPC from a renderer
418 // doesn't yet have a wrapper, and we need to delay the extension event until 427 // (and therefore doesn't yet have a wrapper), or if it isn't yet inserted
419 // the TabContents is fully initialized. 428 // into a tab strip, we need to delay the extension event until the
420 if (TabContentsWrapper::GetCurrentWrapperForContents( 429 // TabContents is fully initialized.
421 details->target_tab_contents) == NULL) { 430 if ((TabContentsWrapper::GetCurrentWrapperForContents(
431 details->target_tab_contents) == NULL) ||
432 details->not_yet_in_tabstrip) {
422 pending_tab_contents_[details->target_tab_contents] = 433 pending_tab_contents_[details->target_tab_contents] =
423 PendingTabContents( 434 PendingTabContents(
424 details->source_tab_contents, 435 details->source_tab_contents,
425 details->source_frame_id, 436 details->source_frame_id,
426 frame_navigation_state.IsMainFrame(details->source_frame_id), 437 frame_navigation_state.IsMainFrame(details->source_frame_id),
427 details->target_tab_contents, 438 details->target_tab_contents,
428 details->target_url); 439 details->target_url);
429 } else { 440 } else {
430 DispatchOnCreatedNavigationTarget( 441 DispatchOnCreatedNavigationTarget(
431 details->source_tab_contents, 442 details->source_tab_contents,
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 keys::kFrameIdKey, 739 keys::kFrameIdKey,
729 GetFrameId(navigation_state.IsMainFrame(*frame), *frame)); 740 GetFrameId(navigation_state.IsMainFrame(*frame), *frame));
730 frameDict->SetBoolean( 741 frameDict->SetBoolean(
731 keys::kErrorOccurredKey, 742 keys::kErrorOccurredKey,
732 navigation_state.GetErrorOccurredInFrame(*frame)); 743 navigation_state.GetErrorOccurredInFrame(*frame));
733 resultList->Append(frameDict); 744 resultList->Append(frameDict);
734 } 745 }
735 result_.reset(resultList); 746 result_.reset(resultList);
736 return true; 747 return true;
737 } 748 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_webnavigation_api.h ('k') | chrome/browser/tab_contents/render_view_context_menu.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698