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

Unified Diff: chrome/browser/ui/browser.cc

Issue 5716003: View source after POST command isn't what you expected. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Reviewers comments addressed. Created 10 years 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
Index: chrome/browser/ui/browser.cc
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 8794fcd7869a6e234d65d13ca169af1f3b752154..4bf067d18de4f52c9d6b31f0a6ebc5127a531f6a 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -1527,15 +1527,8 @@ void Browser::SavePage() {
GetSelectedTabContents()->OnSavePage();
}
-void Browser::ViewSource() {
- UserMetrics::RecordAction(UserMetricsAction("ViewSource"), profile_);
-
- TabContents* current_tab = GetSelectedTabContents();
- NavigationEntry* entry = current_tab->controller().GetLastCommittedEntry();
- if (entry) {
- OpenURL(GURL(chrome::kViewSourceScheme + std::string(":") +
- entry->url().spec()), GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK);
- }
+void Browser::ViewSelectedSource() {
+ ViewSource(GetSelectedTabContentsWrapper());
}
void Browser::ShowFindBar() {
@@ -2153,7 +2146,7 @@ void Browser::ExecuteCommandWithDisposition(
case IDC_SAVE_PAGE: SavePage(); break;
case IDC_BOOKMARK_PAGE: BookmarkCurrentPage(); break;
case IDC_BOOKMARK_ALL_TABS: BookmarkAllTabs(); break;
- case IDC_VIEW_SOURCE: ViewSource(); break;
+ case IDC_VIEW_SOURCE: ViewSelectedSource(); break;
case IDC_EMAIL_PAGE_LOCATION: EmailPageLocation(); break;
case IDC_PRINT: Print(); break;
case IDC_ENCODING_AUTO_DETECT: ToggleEncodingAutoDetect(); break;
@@ -2452,52 +2445,10 @@ bool Browser::CanDuplicateContentsAt(int index) {
void Browser::DuplicateContentsAt(int index) {
TabContentsWrapper* contents = GetTabContentsWrapperAt(index);
- TabContents* new_contents = NULL;
DCHECK(contents);
- bool pinned = false;
- if (CanSupportWindowFeature(FEATURE_TABSTRIP)) {
- // If this is a tabbed browser, just create a duplicate tab inside the same
- // window next to the tab being duplicated.
- TabContentsWrapper* wrapper = contents->Clone();
- new_contents = wrapper->tab_contents();
- pinned = tab_handler_->GetTabStripModel()->IsTabPinned(index);
- int add_types = TabStripModel::ADD_SELECTED |
- TabStripModel::ADD_INHERIT_GROUP |
- (pinned ? TabStripModel::ADD_PINNED : 0);
- tab_handler_->GetTabStripModel()->InsertTabContentsAt(index + 1,
- wrapper,
- add_types);
- } else {
- Browser* browser = NULL;
- if (type_ & TYPE_APP) {
- DCHECK((type_ & TYPE_POPUP) == 0);
- DCHECK(type_ != TYPE_APP_PANEL);
- browser = Browser::CreateForApp(app_name_, extension_app_, profile_,
- false);
- } else if (type_ == TYPE_POPUP) {
- browser = Browser::CreateForType(TYPE_POPUP, profile_);
- }
-
- // Preserve the size of the original window. The new window has already
- // been given an offset by the OS, so we shouldn't copy the old bounds.
- BrowserWindow* new_window = browser->window();
- new_window->SetBounds(gfx::Rect(new_window->GetRestoredBounds().origin(),
- window()->GetRestoredBounds().size()));
-
- // We need to show the browser now. Otherwise ContainerWin assumes the
- // TabContents is invisible and won't size it.
- browser->window()->Show();
-
- // The page transition below is only for the purpose of inserting the tab.
- new_contents = browser->AddTab(contents->Clone(), PageTransition::LINK);
- }
-
- if (profile_->HasSessionService()) {
- SessionService* session_service = profile_->GetSessionService();
- if (session_service)
- session_service->TabRestored(&new_contents->controller(), pinned);
- }
+ TabContentsWrapper* contents_dupe = contents->Clone();
+ InsertContentsDupe(contents, contents_dupe);
}
void Browser::CloseFrameAfterDragSession() {
@@ -3101,6 +3052,13 @@ void Browser::ShowPageInfo(Profile* profile,
window()->ShowPageInfo(profile, url, ssl, show_history);
}
+void Browser::ViewSourceForTab(TabContents* contents) {
+ DCHECK(contents);
+ int index = tabstrip_model()->GetWrapperIndex(contents);
+ TabContentsWrapper* wrapper = tabstrip_model()->GetTabContentsAt(index);
+ ViewSource(wrapper);
+}
+
bool Browser::PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
bool* is_keyboard_shortcut) {
return window()->PreHandleKeyboardEvent(event, is_keyboard_shortcut);
@@ -4167,3 +4125,69 @@ void Browser::CreateInstantIfNecessary() {
instant_unload_handler_.reset(new InstantUnloadHandler(this));
}
}
+
+void Browser::ViewSource(TabContentsWrapper* contents) {
+ UserMetrics::RecordAction(UserMetricsAction("ViewSource"), profile_);
+ DCHECK(contents);
+
+ TabContentsWrapper* view_source_contents = contents->Clone();
+ view_source_contents->controller().PruneAllButActive();
+ NavigationEntry* active_entry =
+ view_source_contents->controller().GetActiveEntry();
+ GURL url = GURL(chrome::kViewSourceScheme + std::string(":") +
+ active_entry->url().spec());
+ active_entry->set_virtual_url(url);
+ InsertContentsDupe(contents, view_source_contents);
+}
+
+void Browser::InsertContentsDupe(
+ TabContentsWrapper* contents,
+ TabContentsWrapper* contents_dupe) {
+ DCHECK(contents);
+
+ TabContents* new_contents = contents_dupe->tab_contents();
+ bool pinned = false;
+
+ if (CanSupportWindowFeature(FEATURE_TABSTRIP)) {
+ // If this is a tabbed browser, just create a duplicate tab inside the same
+ // window next to the tab being duplicated.
+ int index = tab_handler_->GetTabStripModel()->
+ GetIndexOfTabContents(contents);
+ pinned = tab_handler_->GetTabStripModel()->IsTabPinned(index);
+ int add_types = TabStripModel::ADD_SELECTED |
+ TabStripModel::ADD_INHERIT_GROUP |
+ (pinned ? TabStripModel::ADD_PINNED : 0);
+ tab_handler_->GetTabStripModel()->InsertTabContentsAt(index + 1,
+ contents_dupe,
+ add_types);
+ } else {
+ Browser* browser = NULL;
+ if (type_ & TYPE_APP) {
+ DCHECK((type_ & TYPE_POPUP) == 0);
+ DCHECK(type_ != TYPE_APP_PANEL);
+ browser = Browser::CreateForApp(app_name_, extension_app_, profile_,
+ false);
+ } else if (type_ == TYPE_POPUP) {
+ browser = Browser::CreateForType(TYPE_POPUP, profile_);
+ }
+
+ // Preserve the size of the original window. The new window has already
+ // been given an offset by the OS, so we shouldn't copy the old bounds.
+ BrowserWindow* new_window = browser->window();
+ new_window->SetBounds(gfx::Rect(new_window->GetRestoredBounds().origin(),
+ window()->GetRestoredBounds().size()));
+
+ // We need to show the browser now. Otherwise ContainerWin assumes the
+ // TabContents is invisible and won't size it.
+ browser->window()->Show();
+
+ // The page transition below is only for the purpose of inserting the tab.
+ browser->AddTab(contents_dupe, PageTransition::LINK);
+ }
+
+ if (profile_->HasSessionService()) {
+ SessionService* session_service = profile_->GetSessionService();
+ if (session_service)
+ session_service->TabRestored(&new_contents->controller(), pinned);
+ }
+}
« chrome/browser/tab_contents/navigation_controller_unittest.cc ('K') | « chrome/browser/ui/browser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698